first commit

This commit is contained in:
stuce-bot 2025-06-30 20:47:33 +02:00
commit 5893b00dd2
1669 changed files with 1982740 additions and 0 deletions

View file

@ -0,0 +1,212 @@
#include <Arduino.h>
#include <M5GFX.h>
M5GFX display;
//#include <M5UnitOLED.h>
//M5UnitOLED display; // default setting
//M5UnitOLED display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitLCD.h>
//M5UnitLCD display; // default setting
//M5UnitLCD display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitGLASS2.h>
//M5UnitGLASS2 display; // default setting
//M5UnitGLASS2 display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5AtomDisplay.h>
//M5AtomDisplay display; // default setting
//M5AtomDisplay display ( 320, 180 ); // width, height
static constexpr float deg_to_rad = 0.017453292519943295769236907684886;
static constexpr int TFT_GREY = 0x5AEB;
static constexpr int LOOP_PERIOD = 35; // Display updates every 35 ms
int value[6] = {0, 0, 0, 0, 0, 0};
int old_value[6] = { -1, -1, -1, -1, -1, -1};
int liner_count = 6;
int d = 0;
int liner_height;
int meter_height;
int needle_x;
int needle_y;
int needle_r;
int osx, osy; // Saved x & y coords
uint32_t updateTime = 0; // time for next update
void plotNeedle(int value)
{
float sdeg = map(value, 0, 100, -135, -45); // Map value to angle
// Calcualte tip of needle coords
float sx = cosf(sdeg * deg_to_rad);
float sy = sinf(sdeg * deg_to_rad);
display.setClipRect(0, 0, display.width(), meter_height - 5);
// Erase old needle image
display.drawLine(needle_x - 1, needle_y, osx - 1, osy, TFT_WHITE);
display.drawLine(needle_x + 1, needle_y, osx + 1, osy, TFT_WHITE);
display.drawLine(needle_x , needle_y, osx , osy, TFT_WHITE);
// Re-plot text under needle
display.setTextColor(TFT_BLACK);
if (display.width() > 100)
{
display.setFont(&fonts::Font4);
display.setTextDatum(textdatum_t::middle_center);
display.drawString("%RH", needle_x, needle_y>>1);
}
display.setFont(&fonts::Font2);
display.setTextDatum(textdatum_t::bottom_left);
display.drawString("%RH", display.width() - 36, meter_height - 8);
display.setTextColor(TFT_BLACK, TFT_WHITE);
display.setTextDatum(textdatum_t::bottom_right);
display.drawNumber(value, 36, meter_height - 8);
// Store new needle end coords for next erase
osx = roundf(sx * needle_r) + needle_x;
osy = roundf(sy * needle_r) + needle_y;
// Draw the needle in the new postion, magenta makes needle a bit bolder
// draws 3 lines to thicken needle
display.drawLine(needle_x - 1, needle_y, osx - 1, osy, TFT_RED);
display.drawLine(needle_x + 1, needle_y, osx + 1, osy, TFT_RED);
display.drawLine(needle_x , needle_y, osx , osy, TFT_MAGENTA);
display.clearClipRect();
}
void analogMeter()
{
display.fillRect(0, 0, display.width() , meter_height , TFT_WHITE);
display.drawRect(1, 1, display.width()-2 , meter_height-2, TFT_BLACK);
int r3 = needle_y * 13 / 15;
int r2 = needle_y * 12 / 15;
int r1 = needle_y * 11 / 15;
needle_r = r1 - 3;
display.fillArc(needle_x, needle_y, r1, r3, 270, 292, TFT_GREEN);
display.fillArc(needle_x, needle_y, r1, r3, 292, 315, TFT_ORANGE);
display.fillArc(needle_x, needle_y, r1, r1, 225, 315, TFT_BLACK);
display.setTextColor(TFT_BLACK);
display.setFont(&fonts::Font2);
display.setTextDatum(textdatum_t::bottom_center);
for (int i = 0; i <= 20; i++)
{
display.fillArc(needle_x, needle_y, r1, (i % 5) ? r2 : r3, 225 + i * 4.5f, 225 + i * 4.5f, TFT_BLACK);
if (0 == (i % 5) && display.width() > 100)
{
display.drawNumber(i * 5, needle_x - cosf((45+i*4.5) * deg_to_rad) * r3
, needle_y - sinf((45+i*4.5) * deg_to_rad) * r3 - 2);
}
}
}
void plotLinear(const char *label, int x, int y, int w, int h)
{
display.drawRect(x, y, w, h, TFT_GREY);
display.fillRect(x + 2, y + 18, w - 3, h - 36, TFT_WHITE);
display.setTextColor(TFT_CYAN, TFT_BLACK);
display.setTextDatum(textdatum_t::middle_center);
display.setFont(&fonts::Font2);
display.setTextPadding(display.textWidth("100"));
display.drawString(label, x + w / 2, y + 10);
int plot_height = h - (19*2);
for (int i = 0; i <= 10; i ++)
{
display.drawFastHLine(x + w/2, y + 19 + (i+1) * plot_height / 12, w*(3+(0==(i%5)))/16, TFT_BLACK);
}
}
void plotPointer(void)
{
display.setTextColor(TFT_GREEN, TFT_BLACK);
display.setTextDatum(textdatum_t::middle_right);
int plot_height = liner_height - (19*2);
int pw = (display.width() / liner_count) / 3;
for (int i = 0; i < liner_count; i++)
{
display.drawNumber(value[i], display.width() * (i + 0.8) / liner_count, display.height() - 10);
int dx = display.width() * i / liner_count + 3;
int dy = meter_height + 19 + (old_value[i]+10) * plot_height / 120;
display.fillTriangle(dx, dy - 5, dx, dy + 5, dx + pw, dy, TFT_WHITE);
old_value[i] = value[i];
dy = meter_height + 19 + (old_value[i]+10) * plot_height / 120;
display.fillTriangle(dx, dy - 5, dx, dy + 5, dx + pw, dy, TFT_RED);
}
}
void setup(void)
{
display.begin();
display.setEpdMode(epd_mode_t::epd_fastest);
if (display.width() > display.height())
{
display.setRotation(display.getRotation() ^ 1);
}
display.startWrite();
display.fillScreen(TFT_BLACK);
liner_height = display.height() * 3 / 5;
meter_height = display.height() * 2 / 5;
needle_x = display.width() / 2;
needle_y = (meter_height*2 + display.width()) / 3;
osx = needle_x;
osy = needle_y;
liner_count = std::min(6, display.width() / 40);
analogMeter(); // Draw analogue meter
int w = display.width() / liner_count;
char name[] = "A0";
// Draw linear meters
for (int i = 0; i < liner_count; i++)
{
name[1] = '0' + i;
plotLinear(name, display.width() * i / liner_count, meter_height, w, liner_height);
}
display.endWrite();
updateTime = millis(); // Next update time
}
void loop(void)
{
auto msec = millis();
if (updateTime <= msec)
{
d = (msec >> 3) % 360;
// Create a Sine wave for testing
value[0] = 50 + roundf(50 * sinf((d + 0) * deg_to_rad));
value[1] = 50 + roundf(50 * sinf((d + 60) * deg_to_rad));
value[2] = 50 + roundf(50 * sinf((d + 120) * deg_to_rad));
value[3] = 50 + roundf(50 * sinf((d + 180) * deg_to_rad));
value[4] = 50 + roundf(50 * sinf((d + 240) * deg_to_rad));
value[5] = 50 + roundf(50 * sinf((d + 300) * deg_to_rad));
//value[0] = map(analogRead(36), 0, 4095, 0, 100); // Test with value form GPIO36
if (!display.displayBusy())
{
updateTime = msec + LOOP_PERIOD;
//unsigned long t = millis();
display.startWrite();
plotPointer();
plotNeedle(roundf(value[0]));
display.endWrite();
//Serial.println(millis()-t); // Print time taken for meter update
}
}
}

View file

@ -0,0 +1,103 @@
#include <M5GFX.h>
M5GFX display;
//#include <M5UnitOLED.h>
//M5UnitOLED display; // default setting
//M5UnitOLED display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitLCD.h>
//M5UnitLCD display; // default setting
//M5UnitLCD display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitGLASS2.h>
//M5UnitGLASS2 display; // default setting
//M5UnitGLASS2 display ( 21, 22, 400000 ); // SDA, SCL, FREQ
// #include <M5AtomDisplay.h>
// M5AtomDisplay display;
static constexpr size_t BAR_COUNT = 64;
static int max_y[BAR_COUNT];
static int prev_y[BAR_COUNT];
static uint32_t colors[BAR_COUNT];
void setup(void)
{
display.init();
display.startWrite();
display.fillScreen(TFT_BLACK);
if (display.isEPD())
{
display.setEpdMode(epd_mode_t::epd_fastest);
}
if (display.width() < display.height())
{
display.setRotation(display.getRotation() ^ 1);
}
for (int x = 0; x < BAR_COUNT; ++x)
{
prev_y[x] = display.height();
max_y[x] = display.height();
int r=0,g=0,b=0;
switch (x >> 4)
{
case 0:
b = 255;
g = x*0x11;
break;
case 1:
b = 255 - (x&15)*0x11;
g = 255;
break;
case 2:
g = 255;
r = (x&15)*0x11;
break;
case 3:
r = 255;
g = 255 - (x&15)*0x11;
break;
}
colors[x] = display.color888(r,g,b);
}
}
void loop(void)
{
int h = display.height();
static int i;
++i;
display.waitDisplay();
for (int x = 0; x < BAR_COUNT; ++x)
{
int y = (h>>1) - (sinf((float)((x-24)*i) / 3210.0f) + sinf((float)((x-40)*i) / 1234.0f)) * (h>>2);
int xpos = x * display.width() / BAR_COUNT;
int w = ((x+1) * display.width() / BAR_COUNT) - xpos - 1;
if (max_y[x]+1 >= y) { max_y[x] = y-1; }
else
{
if ((i & 3) ==0 )
{
display.fillRect(xpos, max_y[x]-3, w, 1, TFT_BLACK);
max_y[x]++;
}
}
display.fillRect(xpos, max_y[x]-3, w, 3, TFT_WHITE);
if (prev_y[x] < y)
{
display.fillRect(xpos, prev_y[x], w, y - prev_y[x], TFT_BLACK);
}
else
{
display.fillRect(xpos, y, w, prev_y[x] - y, colors[x]);
}
prev_y[x] = y;
}
display.display();
}

View file

@ -0,0 +1,141 @@
//The Game of Life, also known simply as Life, is a cellular automaton
//devised by the British mathematician John Horton Conway in 1970.
// https://en.wikipedia.org/wiki/Conway's_Game_of_Life
#include <Arduino.h>
#include <M5GFX.h>
M5GFX display;
//#include <M5UnitOLED.h>
//M5UnitOLED display; // default setting
//M5UnitOLED display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitLCD.h>
//M5UnitLCD display; // default setting
//M5UnitLCD display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitGLASS2.h>
//M5UnitGLASS2 display; // default setting
//M5UnitGLASS2 display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5AtomDisplay.h>
//M5AtomDisplay display;
M5Canvas canvas[2];
void setup(void)
{
display.begin();
display.setColorDepth(8);
display.setEpdMode(epd_mode_t::epd_fastest);
if (display.width() < display.height())
{
display.setRotation(display.getRotation() ^ 1);
display.setPivot(display.width() /2 -0.5, display.height() /2 - 0.5);
}
int z = 0;
int width;
do
{
width = display.width() / ++z;
} while (width > 192);
z = 0;
int height;
do
{
height = display.height() / ++z;
} while (height > 160);
for (int i = 0; i < 2; i++)
{
canvas[i].setColorDepth(8);
canvas[i].createSprite(width, height);
canvas[i].createPalette();
canvas[i].setPaletteColor(1, TFT_WHITE);
canvas[i].setPivot(canvas[i].width() /2 -0.5, canvas[i].height() /2 - 0.5);
}
canvas[0].setTextColor(1);
canvas[0].setTextDatum(textdatum_t::bottom_center);
canvas[0].drawString("Conway's", canvas[0].width() >> 1, canvas[0].height() >> 1);
canvas[0].setTextDatum(textdatum_t::top_center);
canvas[0].drawString("Game of Life", canvas[0].width() >> 1, canvas[0].height() >> 1);
canvas[0].pushRotateZoom(&display, 0, (float)display.width() / canvas[0].width(), (float)display.height() / canvas[0].height());
delay(2000);
display.clear();
}
void loop(void)
{
bool flip = false;
int width = canvas[flip].width();
int height = canvas[flip].height();
int xz = display.width() / width;
int yz = display.height() / height;
int y = 1;
do
{
int x = 1;
do
{
if (random(6) == 0) { canvas[flip].drawPixel(x, y, 1); }
} while (++x < width - 1);
} while (++y < height - 1);
int diff;
display.startWrite();
do
{
flip = !flip;
diff = 0;
auto old_buf = (uint8_t*)canvas[!flip].getBuffer();
auto new_buf = (uint8_t*)canvas[ flip].getBuffer();
int width = canvas[flip].width();
int height = canvas[flip].height();
int py;
int y = height - 1;
int ny = 0;
do
{
py = y;
y = ny;
if (++ny == height) ny = 0;
int px;
int x = width - 1;
int nx = 0;
do
{
px = x;
x = nx;
if (++nx == width) nx = 0;
int neighbors = old_buf[px + py * width]
+ old_buf[ x + py * width]
+ old_buf[nx + py * width]
+ old_buf[px + y * width]
+ old_buf[nx + y * width]
+ old_buf[px + ny * width]
+ old_buf[ x + ny * width]
+ old_buf[nx + ny * width];
int idx = x + y * width;
bool flg = (neighbors == 3) || (neighbors == 2 && old_buf[idx]);
if (flg != new_buf[idx])
{
display.fillRect(x * xz, y * yz, xz, yz, flg ? TFT_WHITE : TFT_BLACK);
new_buf[idx] = flg;
++diff;
}
} while (nx);
} while (ny);
display.display();
// canvas[flip].pushRotateZoom(&display, 0, (float)display.width() / width, (float)display.height() / height);
} while (diff);
display.endWrite();
}

View file

@ -0,0 +1,77 @@
#include <M5GFX.h>
M5GFX display;
//#include <M5UnitOLED.h>
//M5UnitOLED display; // default setting
//M5UnitOLED display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitLCD.h>
//M5UnitLCD display; // default setting
//M5UnitLCD display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitGLASS2.h>
//M5UnitGLASS2 display; // default setting
//M5UnitGLASS2 display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5AtomDisplay.h>
//M5AtomDisplay display;
M5Canvas canvas(&display);
static constexpr char text[] = "Hello world ! こんにちは世界! this is long long string sample. 寿限無、寿限無、五劫の擦り切れ、海砂利水魚の、水行末・雲来末・風来末、喰う寝る処に住む処、藪ら柑子の藪柑子、パイポ・パイポ・パイポのシューリンガン、シューリンガンのグーリンダイ、グーリンダイのポンポコピーのポンポコナの、長久命の長助";
static constexpr size_t textlen = sizeof(text) / sizeof(text[0]);
int textpos = 0;
int scrollstep = 2;
void setup(void)
{
display.begin();
display.setColorDepth(8);
if (display.isEPD())
{
scrollstep = 16;
display.setEpdMode(epd_mode_t::epd_fastest);
display.invertDisplay(true);
display.clear(TFT_BLACK);
}
if (display.width() < display.height())
{
display.setRotation(display.getRotation() ^ 1);
}
canvas.setColorDepth(1); // mono color
canvas.setFont(&fonts::lgfxJapanMinchoP_32);
canvas.setTextWrap(false);
canvas.setTextSize(2);
canvas.createSprite(display.width() + 64, 72);
}
void loop(void)
{
int32_t cursor_x = canvas.getCursorX() - scrollstep;
if (cursor_x <= 0)
{
textpos = 0;
cursor_x = display.width();
}
canvas.setCursor(cursor_x, 0);
canvas.scroll(-scrollstep, 0);
while (textpos < textlen && cursor_x <= display.width())
{
canvas.print(text[textpos++]);
cursor_x = canvas.getCursorX();
}
display.waitDisplay();
int y = (display.height() - canvas.height()) >> 1;
/*
display.copyRect(0, y, display.width(), canvas.height(), scrollstep, y);
display.setClipRect(display.width()-scrollstep, y, scrollstep, canvas.height());
canvas.pushSprite(&display, 0, (display.height() - canvas.height()) >> 1);
display.clearClipRect();
/*/
canvas.pushSprite(&display, 0, y);
//*/
}

View file

@ -0,0 +1,124 @@
#include <Arduino.h>
#include <vector>
#include <M5GFX.h>
M5GFX display;
//#include <M5UnitOLED.h>
//M5UnitOLED display; // default setting
//M5UnitOLED display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitLCD.h>
//M5UnitLCD display; // default setting
//M5UnitLCD display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitGLASS2.h>
//M5UnitGLASS2 display; // default setting
//M5UnitGLASS2 display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5AtomDisplay.h>
//M5AtomDisplay display;
#define LINE_COUNT 6
std::vector<int> points[LINE_COUNT];
int colors[] = { TFT_RED, TFT_GREEN, TFT_BLUE, TFT_CYAN, TFT_MAGENTA, TFT_YELLOW };
int xoffset, yoffset, point_count;
int virtual_width;
int virtual_height;
int zoom = 1;
int getBaseColor(int x, int y)
{
return ((x^y)&3 || ((x-xoffset)&31 && y&31) ? TFT_BLACK : ((!y || x == xoffset) ? TFT_WHITE : TFT_DARKGREEN));
}
void setup(void)
{
display.begin();
if (display.isEPD())
{
display.setEpdMode(epd_mode_t::epd_fastest);
display.invertDisplay(true);
display.clear(TFT_BLACK);
}
if (display.width() < display.height())
{
display.setRotation(display.getRotation() ^ 1);
}
if (display.getBoard() == m5gfx::boards::board_t::board_M5StackCoreInk)
{
zoom = 2;
}
else if (display.getBoard() == m5gfx::boards::board_t::board_M5Paper)
{
zoom = 3;
}
else
{
zoom = (display.width() / 480) + 1;
}
virtual_width = display.width() / zoom;
virtual_height = display.height()/ zoom;
xoffset = virtual_width >> 1;
yoffset = virtual_height >> 1;
point_count = virtual_width + 1;
for (int i = 0; i < LINE_COUNT; i++)
{
points[i].resize(point_count);
}
display.startWrite();
for (int y = 0; y < virtual_height; y++)
{
for (int x = 0; x < virtual_width; x++)
{
auto color = getBaseColor(x, y - yoffset);
if (color)
{
display.fillRect(x * zoom, y * zoom, zoom, zoom, color);
}
}
}
display.endWrite();
}
void loop(void)
{
static int count;
for (int i = 0; i < LINE_COUNT; i++)
{
points[i][count % point_count] = (sinf((float)count / (10 + 30 * i))+sinf((float)count / (13 + 37 * i))) * (virtual_height >> 2);
}
++count;
display.waitDisplay();
display.startWrite();
int index1 = count % point_count;
for (int x = 0; x < point_count-1; x++)
{
int index0 = index1;
index1 = (index0 +1) % point_count;
for (int i = 0; i < LINE_COUNT; i++)
{
int y = points[i][index0];
if (y != points[i][index1])
{
display.fillRect(x * zoom, (y + yoffset) * zoom, zoom, zoom, getBaseColor(x, y));
}
}
for (int i = 0; i < LINE_COUNT; i++)
{
int y = points[i][index1];
display.fillRect(x * zoom, (y + yoffset) * zoom, zoom, zoom, colors[i]);
}
}
display.endWrite();
}

View file

@ -0,0 +1,196 @@
#include <M5GFX.h>
M5GFX display;
//#include <M5UnitOLED.h>
//M5UnitOLED display; // default setting
//M5UnitOLED display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitLCD.h>
//M5UnitLCD display; // default setting
//M5UnitLCD display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitGLASS2.h>
//M5UnitGLASS2 display; // default setting
//M5UnitGLASS2 display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5AtomDisplay.h>
//M5AtomDisplay display; // default setting
//M5AtomDisplay display ( 320, 180 ); // width, height
static constexpr const int qsintab[256]={
0x8000,0x80c9,0x8192,0x825b,0x8324,0x83ee,0x84b7,0x8580,
0x8649,0x8712,0x87db,0x88a4,0x896c,0x8a35,0x8afe,0x8bc6,
0x8c8e,0x8d57,0x8e1f,0x8ee7,0x8fae,0x9076,0x913e,0x9205,
0x92cc,0x9393,0x945a,0x9521,0x95e7,0x96ad,0x9773,0x9839,
0x98fe,0x99c4,0x9a89,0x9b4d,0x9c12,0x9cd6,0x9d9a,0x9e5e,
0x9f21,0x9fe4,0xa0a7,0xa169,0xa22b,0xa2ed,0xa3af,0xa470,
0xa530,0xa5f1,0xa6b1,0xa770,0xa830,0xa8ef,0xa9ad,0xaa6b,
0xab29,0xabe6,0xaca3,0xad5f,0xae1b,0xaed7,0xaf92,0xb04d,
0xb107,0xb1c0,0xb27a,0xb332,0xb3ea,0xb4a2,0xb559,0xb610,
0xb6c6,0xb77c,0xb831,0xb8e5,0xb999,0xba4d,0xbb00,0xbbb2,
0xbc64,0xbd15,0xbdc6,0xbe76,0xbf25,0xbfd4,0xc082,0xc12f,
0xc1dc,0xc288,0xc334,0xc3df,0xc489,0xc533,0xc5dc,0xc684,
0xc72c,0xc7d3,0xc879,0xc91f,0xc9c3,0xca67,0xcb0b,0xcbae,
0xcc4f,0xccf1,0xcd91,0xce31,0xced0,0xcf6e,0xd00b,0xd0a8,
0xd144,0xd1df,0xd279,0xd313,0xd3ac,0xd443,0xd4db,0xd571,
0xd606,0xd69b,0xd72f,0xd7c2,0xd854,0xd8e5,0xd975,0xda05,
0xda93,0xdb21,0xdbae,0xdc3a,0xdcc5,0xdd4f,0xddd9,0xde61,
0xdee9,0xdf6f,0xdff5,0xe07a,0xe0fd,0xe180,0xe202,0xe283,
0xe303,0xe382,0xe400,0xe47d,0xe4fa,0xe575,0xe5ef,0xe668,
0xe6e0,0xe758,0xe7ce,0xe843,0xe8b7,0xe92b,0xe99d,0xea0e,
0xea7e,0xeaed,0xeb5b,0xebc8,0xec34,0xec9f,0xed09,0xed72,
0xedda,0xee41,0xeea7,0xef0b,0xef6f,0xefd1,0xf033,0xf093,
0xf0f2,0xf150,0xf1ad,0xf209,0xf264,0xf2be,0xf316,0xf36e,
0xf3c4,0xf41a,0xf46e,0xf4c1,0xf513,0xf564,0xf5b3,0xf602,
0xf64f,0xf69b,0xf6e6,0xf730,0xf779,0xf7c1,0xf807,0xf84d,
0xf891,0xf8d4,0xf916,0xf956,0xf996,0xf9d4,0xfa11,0xfa4d,
0xfa88,0xfac1,0xfafa,0xfb31,0xfb67,0xfb9c,0xfbd0,0xfc02,
0xfc33,0xfc63,0xfc92,0xfcc0,0xfcec,0xfd17,0xfd42,0xfd6a,
0xfd92,0xfdb8,0xfdde,0xfe01,0xfe24,0xfe46,0xfe66,0xfe85,
0xfea3,0xfec0,0xfedb,0xfef5,0xff0e,0xff26,0xff3c,0xff52,
0xff66,0xff79,0xff8a,0xff9b,0xffaa,0xffb8,0xffc4,0xffd0,
0xffda,0xffe3,0xffeb,0xfff1,0xfff6,0xfffa,0xfffd,0xffff,
};
static int isin(int i) {
i=(i&1023);
if (i>=512) return -isin(i-512);
if (i>=256) i=(511-i);
return qsintab[i]-0x8000;
}
static int icos(int i) {
return isin(i+256);
}
int32_t lcd_width;
int32_t lcd_height;
uint32_t f;
uint8_t colors[8];
size_t scale = 1;
void setup(void)
{
display.init();
display.startWrite();
display.fillScreen(TFT_BLACK);
if (display.isEPD())
{
display.setEpdMode(epd_mode_t::epd_fastest);
}
if (display.width() < display.height())
{
display.setRotation(display.getRotation() ^ 1);
}
if (display.width() > 800)
{
scale = 4;
}
lcd_width = display.width() / scale;
lcd_height = display.height() / scale;
display.startWrite();
display.setColorDepth(8);
display.fillScreen(TFT_BLACK);
f = 0;
for (int i = 0; i < 8; ++i)
{
uint32_t p = 0;
if (i & 1) p =0x03;
if (i & 2) p+=0x1C;
if (i & 4) p+=0xE0;
colors[i] = p;
}
}
uint32_t p_dxx = 0;
uint32_t p_dxy = 0;
uint32_t p_dyx = 0;
uint32_t p_dyy = 0;
int rcos = 0;
int rsin = 0;
int zoom = 0;
int px = 0;
int py = 0;
void loop(void)
{
uint32_t p_cxx = (zoom * ((px) * rcos - (py) * rsin) ) >> (20 - 8);
uint32_t p_cxy = (zoom * ((py) * rcos + (px) * rsin) ) >> (20 - 8);
++f;
rcos=icos(f*3);
rsin=isin(f*3);
zoom=((isin(f*5)+0x10000)>>8)+128;
px=(isin(f)>>7)-110;
py=(icos(f)>>7)-110;
uint32_t cxx = (zoom * ((px) * rcos - (py) * rsin) ) >> (20 - 8);
uint32_t cxy = (zoom * ((py) * rcos + (px) * rsin) ) >> (20 - 8);
uint32_t dxx = (zoom * (( 1) * rcos - ( 0) * rsin) ) >> (20 - 8);
uint32_t dxy = (zoom * (( 0) * rcos + ( 1) * rsin) ) >> (20 - 8);
uint32_t dyx = (zoom * (( 0) * rcos - ( 1) * rsin) ) >> (20 - 8);
uint32_t dyy = (zoom * (( 1) * rcos + ( 0) * rsin) ) >> (20 - 8);
display.waitDisplay();
for (uint32_t y = 0; y < lcd_height; y++)
{
uint32_t ypos = y * scale;
p_cxx+=p_dxx;
p_cxy+=p_dxy;
cxx+=dxx;
cxy+=dxy;
uint32_t cx=cxx;
uint32_t cy=cxy;
uint32_t p_cx = p_cxx;
uint32_t p_cy = p_cxy;
uint32_t x = 0;
uint32_t prev_x = 0;
uint32_t prev_color = 0xAA;
bool flg = false;
do
{
p_cx+=p_dyx;
p_cy+=p_dyy;
cx+=dyx;
cy+=dyy;
auto color = ((cx^cy) >> 16) & 7;
bool diff = color != (((p_cx ^ p_cy) >> 16) & 7);
if (flg)
{
if (!diff || prev_color != color)
{
if (x)
{
display.writeFillRectPreclipped(prev_x * scale, ypos, (x - prev_x) * scale, scale, colors[prev_color]);
}
flg = diff;
prev_x = x;
prev_color = color;
}
}
else
{
if (diff)
{
flg = true;
prev_x = x;
prev_color = color;
}
}
} while (++x < lcd_width);
if (flg)
{
display.writeFillRect(prev_x * scale, ypos, (x - prev_x) * scale, scale, colors[prev_color]);
}
}
display.display();
p_dxx = dxx;
p_dxy = dxy;
p_dyx = dyx;
p_dyy = dyy;
}

View file

@ -0,0 +1,764 @@
/*
Adapted from the Adafruit and Xark's PDQ graphicstest sketch.
See end of file for original header text and MIT license info.
This sketch uses the GLCD font only.
*/
#include <M5GFX.h>
M5GFX tft;
// #include <M5AtomDisplay.h>
// M5AtomDisplay tft(1920, 1080);
// M5AtomDisplay tft(1280, 720);
// M5AtomDisplay tft(960, 540);
// M5AtomDisplay tft(640, 360);
// M5AtomDisplay tft(480, 270);
// M5AtomDisplay tft(320, 180);
/*
M5AtomDisplay tft( 240 // width
, 360 // height
, 60 // refresh rate
, 1280 // output width
, 720 // output height
, 2 // X scaling
, 2 // Y scaling
);
//*/
unsigned long total = 0;
unsigned long tn = 0;
void setup() {
Serial.begin(115200);
Serial.println(""); Serial.println("");
Serial.println("M5GFX library Test!");
tft.init();
//tft.setRotation(0);
tft.startWrite();
}
void loop(void)
{
Serial.println(F("Benchmark Time (microseconds)"));
uint32_t usecHaD = testHaD();
Serial.print(F("HaD pushColor "));
Serial.println(usecHaD);
delay(100);
uint32_t usecFillScreen = testFillScreen();
Serial.print(F("Screen fill "));
Serial.println(usecFillScreen);
delay(100);
uint32_t usecText = testText();
Serial.print(F("Text "));
Serial.println(usecText);
delay(100);
uint32_t usecPixels = testPixels();
Serial.print(F("Pixels "));
Serial.println(usecPixels);
delay(100);
uint32_t usecLines = testLines(TFT_BLUE);
Serial.print(F("Lines "));
Serial.println(usecLines);
delay(100);
uint32_t usecFastLines = testFastLines(TFT_RED, TFT_BLUE);
Serial.print(F("Horiz/Vert Lines "));
Serial.println(usecFastLines);
delay(100);
uint32_t usecRects = testRects(TFT_GREEN);
Serial.print(F("Rectangles (outline) "));
Serial.println(usecRects);
delay(100);
uint32_t usecFilledRects = testFilledRects(TFT_YELLOW, TFT_MAGENTA);
Serial.print(F("Rectangles (filled) "));
Serial.println(usecFilledRects);
delay(100);
uint32_t usecFilledCircles = testFilledCircles(10, TFT_MAGENTA);
Serial.print(F("Circles (filled) "));
Serial.println(usecFilledCircles);
delay(100);
uint32_t usecCircles = testCircles(10, TFT_WHITE);
Serial.print(F("Circles (outline) "));
Serial.println(usecCircles);
delay(100);
uint32_t usecTriangles = testTriangles();
Serial.print(F("Triangles (outline) "));
Serial.println(usecTriangles);
delay(100);
uint32_t usecFilledTrangles = testFilledTriangles();
Serial.print(F("Triangles (filled) "));
Serial.println(usecFilledTrangles);
delay(100);
uint32_t usecRoundRects = testRoundRects();
Serial.print(F("Rounded rects (outline) "));
Serial.println(usecRoundRects);
delay(100);
uint32_t usedFilledRoundRects = testFilledRoundRects();
Serial.print(F("Rounded rects (filled) "));
Serial.println(usedFilledRoundRects);
delay(100);
Serial.println(F("Done!"));
uint16_t c = 4;
int8_t d = 1;
for (int32_t i = 0; i < tft.height(); i++)
{
tft.drawFastHLine(0, i, tft.width(), c);
c += d;
if (c <= 4 || c >= 11)
d = -d;
}
tft.setCursor(0, 0);
tft.setTextColor(TFT_MAGENTA);
tft.setTextSize(2);
tft.println(F(" M5GFX test"));
tft.setTextSize(1);
tft.setTextColor(TFT_WHITE);
tft.println(F(""));
tft.setTextSize(1);
tft.println(F(""));
tft.setTextColor(tft.color565(0x80, 0x80, 0x80));
tft.println(F(""));
tft.setTextColor(TFT_GREEN);
tft.println(F(" Benchmark microseconds"));
tft.println(F(""));
tft.setTextColor(TFT_YELLOW);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("HaD pushColor "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecHaD);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Screen fill "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecFillScreen);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Text "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecText);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Pixels "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecPixels);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Lines "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecLines);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Horiz/Vert Lines "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecFastLines);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Rectangles "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecRects);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Rectangles-filled "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecFilledRects);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Circles "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecCircles);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Circles-filled "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecFilledCircles);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Triangles "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecTriangles);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Triangles-filled "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecFilledTrangles);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Rounded rects "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usecRoundRects);
tft.setTextColor(TFT_CYAN); tft.setTextSize(1);
tft.print(F("Rounded rects-fill "));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
printnice(usedFilledRoundRects);
tft.setTextSize(1);
tft.println(F(""));
tft.setTextColor(TFT_GREEN); tft.setTextSize(2);
tft.print(F("Benchmark Complete!"));
delay(60 * 1000L);
}
void printnice(int32_t v)
{
char str[32] = { 0 };
sprintf(str, "%d", v);
for (char *p = (str+strlen(str))-3; p > str; p -= 3)
{
memmove(p+1, p, strlen(p)+1);
*p = ',';
}
while (strlen(str) < 10)
{
memmove(str+1, str, strlen(str)+1);
*str = ' ';
}
tft.println(str);
}
static inline uint32_t micros_start() __attribute__ ((always_inline));
static inline uint32_t micros_start()
{
uint8_t oms = millis();
while ((uint8_t)millis() == oms)
;
return micros();
}
uint32_t testHaD()
{
// pseudo-code for cheesy RLE
// start with color1
// while more input data remaining
// count = 0nnnnnnn = 1 byte or 1nnnnnnn nnnnnnnn 2 bytes (0 - 32767)
// repeat color count times
// toggle color1/color2
static const uint8_t HaD_240x320[] PROGMEM =
{
0xb9, 0x50, 0x0e, 0x80, 0x93, 0x0e, 0x41, 0x11, 0x80, 0x8d, 0x11, 0x42, 0x12, 0x80, 0x89, 0x12,
0x45, 0x12, 0x80, 0x85, 0x12, 0x48, 0x12, 0x80, 0x83, 0x12, 0x4a, 0x13, 0x7f, 0x13, 0x4c, 0x13,
0x7d, 0x13, 0x4e, 0x13, 0x7b, 0x13, 0x50, 0x13, 0x79, 0x13, 0x52, 0x13, 0x77, 0x13, 0x54, 0x13,
0x75, 0x13, 0x57, 0x11, 0x75, 0x11, 0x5a, 0x11, 0x73, 0x11, 0x5c, 0x11, 0x71, 0x11, 0x5e, 0x10,
0x71, 0x10, 0x60, 0x10, 0x6f, 0x10, 0x61, 0x10, 0x6f, 0x10, 0x60, 0x11, 0x6f, 0x11, 0x5e, 0x13,
0x6d, 0x13, 0x5c, 0x14, 0x6d, 0x14, 0x5a, 0x15, 0x6d, 0x15, 0x58, 0x17, 0x6b, 0x17, 0x37, 0x01,
0x1f, 0x17, 0x6b, 0x17, 0x1f, 0x01, 0x17, 0x02, 0x1d, 0x18, 0x6b, 0x18, 0x1d, 0x02, 0x17, 0x03,
0x1b, 0x19, 0x6b, 0x19, 0x1b, 0x03, 0x17, 0x05, 0x18, 0x1a, 0x6b, 0x1a, 0x18, 0x05, 0x17, 0x06,
0x16, 0x1b, 0x6b, 0x1b, 0x16, 0x06, 0x17, 0x07, 0x14, 0x1c, 0x6b, 0x1c, 0x14, 0x07, 0x17, 0x08,
0x12, 0x1d, 0x6b, 0x1d, 0x12, 0x08, 0x17, 0x09, 0x10, 0x1e, 0x6b, 0x1e, 0x10, 0x09, 0x17, 0x0a,
0x0e, 0x1f, 0x6b, 0x1f, 0x0e, 0x0a, 0x17, 0x0b, 0x0c, 0x20, 0x6b, 0x20, 0x0c, 0x0b, 0x17, 0x0c,
0x0b, 0x21, 0x69, 0x21, 0x0b, 0x0c, 0x18, 0x0d, 0x08, 0x23, 0x67, 0x23, 0x08, 0x0d, 0x19, 0x0e,
0x06, 0x26, 0x63, 0x26, 0x06, 0x0e, 0x19, 0x0f, 0x04, 0x28, 0x61, 0x28, 0x04, 0x0f, 0x19, 0x10,
0x02, 0x2a, 0x5f, 0x2a, 0x02, 0x10, 0x1a, 0x3c, 0x5d, 0x3c, 0x1b, 0x3d, 0x5b, 0x3d, 0x1c, 0x3d,
0x59, 0x3d, 0x1d, 0x3e, 0x57, 0x3e, 0x1e, 0x3e, 0x55, 0x3e, 0x1f, 0x40, 0x51, 0x40, 0x20, 0x40,
0x4f, 0x40, 0x22, 0x40, 0x22, 0x09, 0x22, 0x40, 0x24, 0x40, 0x1a, 0x17, 0x1a, 0x40, 0x26, 0x40,
0x16, 0x1d, 0x16, 0x40, 0x28, 0x40, 0x12, 0x23, 0x12, 0x40, 0x2a, 0x40, 0x0f, 0x27, 0x0f, 0x40,
0x2c, 0x41, 0x0b, 0x2b, 0x0b, 0x41, 0x2f, 0x3f, 0x09, 0x2f, 0x09, 0x3f, 0x32, 0x3d, 0x08, 0x33,
0x08, 0x3d, 0x35, 0x3a, 0x08, 0x35, 0x08, 0x3a, 0x3a, 0x36, 0x07, 0x39, 0x07, 0x36, 0x41, 0x09,
0x05, 0x23, 0x07, 0x3b, 0x07, 0x23, 0x05, 0x09, 0x54, 0x21, 0x07, 0x3d, 0x07, 0x21, 0x64, 0x1f,
0x06, 0x41, 0x06, 0x1f, 0x66, 0x1d, 0x06, 0x43, 0x06, 0x1d, 0x68, 0x1b, 0x06, 0x45, 0x06, 0x1b,
0x6b, 0x18, 0x06, 0x47, 0x06, 0x18, 0x6e, 0x16, 0x06, 0x49, 0x06, 0x16, 0x70, 0x14, 0x06, 0x4b,
0x06, 0x14, 0x72, 0x13, 0x06, 0x4b, 0x06, 0x13, 0x74, 0x11, 0x06, 0x4d, 0x06, 0x11, 0x76, 0x0f,
0x06, 0x4f, 0x06, 0x0f, 0x78, 0x0e, 0x05, 0x51, 0x05, 0x0e, 0x7a, 0x0c, 0x06, 0x51, 0x06, 0x0c,
0x7d, 0x09, 0x06, 0x53, 0x06, 0x09, 0x80, 0x80, 0x08, 0x05, 0x55, 0x05, 0x08, 0x80, 0x82, 0x06,
0x05, 0x57, 0x05, 0x06, 0x80, 0x84, 0x05, 0x05, 0x57, 0x05, 0x05, 0x80, 0x86, 0x03, 0x05, 0x59,
0x05, 0x03, 0x80, 0x88, 0x02, 0x05, 0x59, 0x05, 0x02, 0x80, 0x8f, 0x5b, 0x80, 0x95, 0x5b, 0x80,
0x94, 0x5d, 0x80, 0x93, 0x5d, 0x80, 0x92, 0x5e, 0x80, 0x92, 0x5f, 0x80, 0x91, 0x5f, 0x80, 0x90,
0x61, 0x80, 0x8f, 0x61, 0x80, 0x8f, 0x61, 0x80, 0x8e, 0x63, 0x80, 0x8d, 0x63, 0x80, 0x8d, 0x63,
0x80, 0x8d, 0x63, 0x80, 0x8c, 0x19, 0x07, 0x25, 0x07, 0x19, 0x80, 0x8b, 0x16, 0x0d, 0x1f, 0x0d,
0x16, 0x80, 0x8b, 0x14, 0x11, 0x1b, 0x11, 0x14, 0x80, 0x8b, 0x13, 0x13, 0x19, 0x13, 0x13, 0x80,
0x8b, 0x12, 0x15, 0x17, 0x15, 0x12, 0x80, 0x8a, 0x12, 0x17, 0x15, 0x17, 0x12, 0x80, 0x89, 0x11,
0x19, 0x13, 0x19, 0x11, 0x80, 0x89, 0x11, 0x19, 0x13, 0x19, 0x11, 0x80, 0x89, 0x10, 0x1b, 0x11,
0x1b, 0x10, 0x80, 0x89, 0x0f, 0x1c, 0x11, 0x1c, 0x0f, 0x80, 0x89, 0x0f, 0x1c, 0x11, 0x1c, 0x0f,
0x80, 0x89, 0x0f, 0x1c, 0x11, 0x1c, 0x0f, 0x80, 0x89, 0x0e, 0x1d, 0x11, 0x1d, 0x0e, 0x80, 0x89,
0x0e, 0x1c, 0x13, 0x1c, 0x0e, 0x80, 0x89, 0x0e, 0x1b, 0x15, 0x1b, 0x0e, 0x80, 0x89, 0x0e, 0x1b,
0x15, 0x1b, 0x0e, 0x80, 0x89, 0x0e, 0x1a, 0x17, 0x1a, 0x0e, 0x80, 0x89, 0x0e, 0x18, 0x1b, 0x18,
0x0e, 0x80, 0x89, 0x0e, 0x16, 0x1f, 0x16, 0x0e, 0x80, 0x89, 0x0e, 0x14, 0x23, 0x14, 0x0e, 0x80,
0x89, 0x0f, 0x11, 0x27, 0x11, 0x0f, 0x80, 0x89, 0x0f, 0x0e, 0x2d, 0x0e, 0x0f, 0x80, 0x89, 0x0f,
0x0c, 0x31, 0x0c, 0x0f, 0x80, 0x89, 0x0f, 0x0b, 0x33, 0x0b, 0x0f, 0x80, 0x8a, 0x0f, 0x09, 0x35,
0x09, 0x0f, 0x80, 0x8b, 0x10, 0x08, 0x35, 0x08, 0x10, 0x80, 0x8b, 0x10, 0x07, 0x37, 0x07, 0x10,
0x80, 0x8b, 0x11, 0x06, 0x37, 0x06, 0x11, 0x80, 0x8b, 0x12, 0x05, 0x37, 0x05, 0x12, 0x80, 0x8c,
0x13, 0x03, 0x1b, 0x01, 0x1b, 0x03, 0x13, 0x80, 0x8d, 0x30, 0x03, 0x30, 0x80, 0x8d, 0x30, 0x04,
0x2f, 0x80, 0x8d, 0x2f, 0x05, 0x2f, 0x80, 0x8e, 0x2e, 0x06, 0x2d, 0x80, 0x8f, 0x2d, 0x07, 0x2d,
0x80, 0x8f, 0x2d, 0x07, 0x2d, 0x80, 0x90, 0x2c, 0x08, 0x2b, 0x80, 0x91, 0x2b, 0x09, 0x2b, 0x80,
0x8c, 0x01, 0x05, 0x2a, 0x09, 0x2a, 0x05, 0x01, 0x80, 0x85, 0x03, 0x05, 0x2a, 0x09, 0x2a, 0x05,
0x03, 0x80, 0x82, 0x04, 0x05, 0x2a, 0x09, 0x2a, 0x04, 0x05, 0x80, 0x80, 0x06, 0x05, 0x29, 0x04,
0x02, 0x03, 0x29, 0x05, 0x06, 0x7e, 0x07, 0x05, 0x29, 0x03, 0x03, 0x03, 0x29, 0x05, 0x07, 0x7c,
0x09, 0x05, 0x28, 0x02, 0x05, 0x02, 0x28, 0x05, 0x09, 0x7a, 0x0a, 0x05, 0x28, 0x02, 0x05, 0x02,
0x28, 0x05, 0x0a, 0x78, 0x0c, 0x05, 0x27, 0x02, 0x05, 0x02, 0x27, 0x05, 0x0c, 0x76, 0x0d, 0x06,
0x26, 0x01, 0x07, 0x01, 0x26, 0x06, 0x0d, 0x73, 0x10, 0x05, 0x55, 0x05, 0x10, 0x70, 0x12, 0x05,
0x53, 0x05, 0x12, 0x6e, 0x13, 0x06, 0x51, 0x06, 0x13, 0x6c, 0x15, 0x05, 0x51, 0x05, 0x15, 0x6a,
0x16, 0x06, 0x4f, 0x06, 0x16, 0x68, 0x18, 0x06, 0x4d, 0x06, 0x18, 0x66, 0x1a, 0x06, 0x4b, 0x06,
0x1a, 0x64, 0x1c, 0x06, 0x49, 0x06, 0x1c, 0x55, 0x07, 0x05, 0x1e, 0x06, 0x49, 0x06, 0x1e, 0x05,
0x07, 0x42, 0x30, 0x06, 0x47, 0x06, 0x30, 0x3a, 0x34, 0x06, 0x45, 0x06, 0x34, 0x35, 0x37, 0x06,
0x43, 0x06, 0x37, 0x32, 0x39, 0x07, 0x3f, 0x07, 0x39, 0x2f, 0x3c, 0x07, 0x3d, 0x07, 0x3c, 0x2c,
0x3e, 0x07, 0x3b, 0x07, 0x3e, 0x2a, 0x40, 0x06, 0x3b, 0x06, 0x40, 0x28, 0x40, 0x06, 0x3c, 0x07,
0x40, 0x26, 0x3f, 0x08, 0x3d, 0x08, 0x3f, 0x24, 0x3f, 0x09, 0x3d, 0x09, 0x3f, 0x22, 0x3f, 0x0a,
0x14, 0x01, 0x13, 0x02, 0x13, 0x0a, 0x3f, 0x20, 0x3f, 0x0b, 0x14, 0x01, 0x13, 0x02, 0x13, 0x0b,
0x3f, 0x1f, 0x3e, 0x0c, 0x14, 0x01, 0x13, 0x02, 0x13, 0x0c, 0x3e, 0x1e, 0x3e, 0x0d, 0x13, 0x02,
0x13, 0x02, 0x13, 0x0d, 0x3e, 0x1d, 0x3d, 0x0e, 0x13, 0x02, 0x13, 0x02, 0x13, 0x0e, 0x3d, 0x1c,
0x3c, 0x11, 0x11, 0x04, 0x11, 0x04, 0x11, 0x11, 0x3c, 0x1b, 0x10, 0x01, 0x2a, 0x12, 0x11, 0x04,
0x11, 0x04, 0x11, 0x12, 0x2a, 0x01, 0x10, 0x1a, 0x0f, 0x04, 0x28, 0x14, 0x0f, 0x06, 0x0f, 0x06,
0x0f, 0x14, 0x28, 0x04, 0x0f, 0x19, 0x0e, 0x06, 0x26, 0x16, 0x0d, 0x08, 0x0d, 0x08, 0x0d, 0x16,
0x26, 0x06, 0x0e, 0x19, 0x0d, 0x07, 0x25, 0x18, 0x0b, 0x0a, 0x0b, 0x0a, 0x0b, 0x18, 0x25, 0x07,
0x0d, 0x19, 0x0c, 0x09, 0x23, 0x1c, 0x06, 0x0f, 0x05, 0x10, 0x05, 0x1c, 0x23, 0x09, 0x0c, 0x18,
0x0c, 0x0b, 0x21, 0x69, 0x21, 0x0b, 0x0c, 0x17, 0x0b, 0x0d, 0x1f, 0x6b, 0x1f, 0x0d, 0x0b, 0x17,
0x0a, 0x0f, 0x1e, 0x6b, 0x1e, 0x0f, 0x0a, 0x17, 0x09, 0x11, 0x1d, 0x6b, 0x1d, 0x11, 0x09, 0x17,
0x07, 0x14, 0x1c, 0x6b, 0x1c, 0x14, 0x07, 0x17, 0x06, 0x16, 0x1b, 0x6b, 0x1b, 0x16, 0x06, 0x17,
0x05, 0x18, 0x1a, 0x6b, 0x1a, 0x18, 0x05, 0x17, 0x04, 0x1a, 0x19, 0x6b, 0x19, 0x1a, 0x04, 0x17,
0x03, 0x1b, 0x19, 0x6b, 0x19, 0x1b, 0x03, 0x17, 0x02, 0x1d, 0x18, 0x6b, 0x18, 0x1d, 0x02, 0x37,
0x17, 0x6b, 0x17, 0x58, 0x16, 0x6b, 0x16, 0x5a, 0x14, 0x6d, 0x14, 0x5c, 0x13, 0x6d, 0x13, 0x5e,
0x12, 0x6d, 0x12, 0x60, 0x10, 0x6f, 0x10, 0x61, 0x10, 0x6f, 0x10, 0x60, 0x11, 0x6f, 0x11, 0x5e,
0x11, 0x71, 0x11, 0x5c, 0x12, 0x71, 0x12, 0x5a, 0x12, 0x73, 0x12, 0x58, 0x12, 0x75, 0x12, 0x56,
0x13, 0x75, 0x13, 0x54, 0x13, 0x77, 0x13, 0x51, 0x14, 0x79, 0x14, 0x4e, 0x14, 0x7b, 0x14, 0x4c,
0x14, 0x7d, 0x14, 0x4a, 0x14, 0x7f, 0x14, 0x48, 0x13, 0x80, 0x83, 0x13, 0x46, 0x13, 0x80, 0x85,
0x13, 0x44, 0x12, 0x80, 0x89, 0x12, 0x42, 0x11, 0x80, 0x8d, 0x11, 0x40, 0x0f, 0x80, 0x93, 0x0f,
0x45, 0x04, 0x80, 0x9d, 0x04, 0xb9, 0x56,
};
tft.fillScreen(TFT_BLACK);
uint32_t start = micros_start();
for (int i = 0; i < 0x10; i++)
{
tft.setAddrWindow(0, 0, 240, 320);
uint16_t cnt = 0;
uint16_t color = tft.color565((i << 4) | i, (i << 4) | i, (i << 4) | i);
uint16_t curcolor = 0;
const uint8_t *cmp = &HaD_240x320[0];
tft.startWrite();
while (cmp < &HaD_240x320[sizeof(HaD_240x320)])
{
cnt = pgm_read_byte(cmp++);
if (cnt & 0x80) cnt = ((cnt & 0x7f) << 8) | pgm_read_byte(cmp++);
tft.pushBlock(curcolor, cnt); // PDQ_GFX has count
curcolor ^= color;
}
tft.endWrite();
}
uint32_t t = micros() - start;
tft.setTextColor(TFT_YELLOW);
tft.setTextSize(2);
tft.setCursor(8, 285);
tft.print(F("http://hackaday.io/"));
tft.setCursor(96, 302);
tft.print(F("Xark"));
delay(3 * 1000L);
return t;
}
uint32_t testFillScreen()
{
uint32_t start = micros_start();
// Shortened this tedious test!
tft.fillScreen(TFT_WHITE);
tft.fillScreen(TFT_RED);
tft.fillScreen(TFT_GREEN);
tft.fillScreen(TFT_BLUE);
tft.fillScreen(TFT_BLACK);
return (micros() - start)/5;
}
uint32_t testText()
{
tft.fillScreen(TFT_BLACK);
uint32_t start = micros_start();
tft.setCursor(0, 0);
tft.setTextColor(TFT_WHITE,TFT_BLACK); tft.setTextSize(1);
tft.println(F("Hello World!"));
tft.setTextSize(2);
tft.setTextColor(tft.color565(0xff, 0x00, 0x00));
tft.print(F("RED "));
tft.setTextColor(tft.color565(0x00, 0xff, 0x00));
tft.print(F("GREEN "));
tft.setTextColor(tft.color565(0x00, 0x00, 0xff));
tft.println(F("BLUE"));
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
tft.println(1234.56);
tft.setTextColor(TFT_RED); tft.setTextSize(3);
tft.println(0xDEADBEEF, HEX);
tft.println();
tft.setTextColor(TFT_GREEN);
tft.setTextSize(5);
tft.println(F("Groop"));
tft.setTextSize(2);
tft.println(F("I implore thee,"));
tft.setTextColor(TFT_GREEN);
tft.setTextSize(1);
tft.println(F("my foonting turlingdromes."));
tft.println(F("And hooptiously drangle me"));
tft.println(F("with crinkly bindlewurdles,"));
tft.println(F("Or I will rend thee"));
tft.println(F("in the gobberwarts"));
tft.println(F("with my blurglecruncheon,"));
tft.println(F("see if I don't!"));
tft.println(F(""));
tft.println(F(""));
tft.setTextColor(TFT_MAGENTA);
tft.setTextSize(6);
tft.println(F("Woot!"));
uint32_t t = micros() - start;
delay(1000);
return t;
}
uint32_t testPixels()
{
int32_t w = tft.width();
int32_t h = tft.height();
uint32_t start = micros_start();
tft.startWrite();
for (uint16_t y = 0; y < h; y++)
{
for (uint16_t x = 0; x < w; x++)
{
tft.drawPixel(x, y, tft.color565(x<<3, y<<3, x*y));
}
}
tft.endWrite();
return micros() - start;
}
uint32_t testLines(uint16_t color)
{
uint32_t start, t;
int32_t x1, y1, x2, y2;
int32_t w = tft.width();
int32_t h = tft.height();
tft.fillScreen(TFT_BLACK);
x1 = y1 = 0;
y2 = h - 1;
start = micros_start();
for (x2 = 0; x2 < w; x2 += 6)
{
tft.drawLine(x1, y1, x2, y2, color);
}
x2 = w - 1;
for (y2 = 0; y2 < h; y2 += 6)
{
tft.drawLine(x1, y1, x2, y2, color);
}
t = micros() - start; // fillScreen doesn't count against timing
tft.fillScreen(TFT_BLACK);
x1 = w - 1;
y1 = 0;
y2 = h - 1;
start = micros_start();
for (x2 = 0; x2 < w; x2 += 6)
{
tft.drawLine(x1, y1, x2, y2, color);
}
x2 = 0;
for (y2 = 0; y2 < h; y2 += 6)
{
tft.drawLine(x1, y1, x2, y2, color);
}
t += micros() - start;
tft.fillScreen(TFT_BLACK);
x1 = 0;
y1 = h - 1;
y2 = 0;
start = micros_start();
for (x2 = 0; x2 < w; x2 += 6)
{
tft.drawLine(x1, y1, x2, y2, color);
}
x2 = w - 1;
for (y2 = 0; y2 < h; y2 += 6)
{
tft.drawLine(x1, y1, x2, y2, color);
}
t += micros() - start;
tft.fillScreen(TFT_BLACK);
x1 = w - 1;
y1 = h - 1;
y2 = 0;
start = micros_start();
for (x2 = 0; x2 < w; x2 += 6)
{
tft.drawLine(x1, y1, x2, y2, color);
}
x2 = 0;
for (y2 = 0; y2 < h; y2 += 6)
{
tft.drawLine(x1, y1, x2, y2, color);
}
t += micros() - start;
return t;
}
uint32_t testFastLines(uint16_t color1, uint16_t color2)
{
uint32_t start;
int32_t x, y;
int32_t w = tft.width();
int32_t h = tft.height();
tft.fillScreen(TFT_BLACK);
start = micros_start();
for (y = 0; y < h; y += 5)
tft.drawFastHLine(0, y, w, color1);
for (x = 0; x < w; x += 5)
tft.drawFastVLine(x, 0, h, color2);
return micros() - start;
}
uint32_t testRects(uint16_t color)
{
uint32_t start;
int32_t n, i, i2;
int32_t cx = tft.width() / 2;
int32_t cy = tft.height() / 2;
tft.fillScreen(TFT_BLACK);
n = min(tft.width(), tft.height());
start = micros_start();
for (i = 2; i < n; i += 6)
{
i2 = i / 2;
tft.drawRect(cx-i2, cy-i2, i, i, color);
}
return micros() - start;
}
uint32_t testFilledRects(uint16_t color1, uint16_t color2)
{
uint32_t start, t = 0;
int32_t n, i, i2;
int32_t cx = tft.width() / 2 - 1;
int32_t cy = tft.height() / 2 - 1;
tft.fillScreen(TFT_BLACK);
n = min(tft.width(), tft.height());
for (i = n; i > 0; i -= 6)
{
i2 = i / 2;
start = micros_start();
tft.fillRect(cx-i2, cy-i2, i, i, color1);
t += micros() - start;
// Outlines are not included in timing results
tft.drawRect(cx-i2, cy-i2, i, i, color2);
}
return t;
}
uint32_t testFilledCircles(uint8_t radius, uint16_t color)
{
uint32_t start;
int32_t x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;
tft.fillScreen(TFT_BLACK);
start = micros_start();
for (x = radius; x < w; x += r2)
{
for (y = radius; y < h; y += r2)
{
tft.fillCircle(x, y, radius, color);
}
}
return micros() - start;
}
uint32_t testCircles(uint8_t radius, uint16_t color)
{
uint32_t start;
int32_t x, y, r2 = radius * 2;
int32_t w = tft.width() + radius;
int32_t h = tft.height() + radius;
// Screen is not cleared for this one -- this is
// intentional and does not affect the reported time.
start = micros_start();
for (x = 0; x < w; x += r2)
{
for (y = 0; y < h; y += r2)
{
tft.drawCircle(x, y, radius, color);
}
}
return micros() - start;
}
uint32_t testTriangles()
{
uint32_t start;
int32_t n, i;
int32_t cx = tft.width()/ 2 - 1;
int32_t cy = tft.height() / 2 - 1;
tft.fillScreen(TFT_BLACK);
n = min(cx, cy);
start = micros_start();
for (i = 0; i < n; i += 5)
{
tft.drawTriangle(
cx , cy - i, // peak
cx - i, cy + i, // bottom left
cx + i, cy + i, // bottom right
tft.color565(0, 0, i));
}
return micros() - start;
}
uint32_t testFilledTriangles()
{
uint32_t start, t = 0;
int32_t i;
int32_t cx = tft.width() / 2 - 1;
int32_t cy = tft.height() / 2 - 1;
tft.fillScreen(TFT_BLACK);
start = micros_start();
for (i = min(cx,cy); i > 10; i -= 5) {
start = micros_start();
tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(0, i, i));
t += micros() - start;
tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(i, i, 0));
}
return t;
}
uint32_t testRoundRects()
{
uint32_t start;
int32_t w, i, i2;
int32_t cx = tft.width() / 2 - 1;
int32_t cy = tft.height() / 2 - 1;
tft.fillScreen(TFT_BLACK);
w = min(tft.width(), tft.height());
start = micros_start();
for (i = 0; i < w; i += 6)
{
i2 = i / 2;
tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));
}
return micros() - start;
}
uint32_t testFilledRoundRects()
{
uint32_t start;
int32_t i, i2;
int32_t cx = tft.width() / 2 - 1;
int32_t cy = tft.height() / 2 - 1;
tft.fillScreen(TFT_BLACK);
start = micros_start();
for (i = min(tft.width(), tft.height()); i > 20; i -= 6)
{
i2 = i / 2;
tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
}
return micros() - start;
}
/***************************************************
Original sketch text:
This is an example sketch for the Adafruit 2.2" SPI display.
This library works with the Adafruit 2.2" TFT Breakout w/SD card
----> http://www.adafruit.com/products/1480
Check out the links above for our tutorials and wiring diagrams
These displays use SPI to communicate, 4 or 5 pins are required to
interface (RST is optional)
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
MIT license, all text above must be included in any redistribution
****************************************************/

View file

@ -0,0 +1,93 @@
#include <M5GFX.h>
M5GFX display;
//#include <M5UnitOLED.h>
//M5UnitOLED display; // default setting
//M5UnitOLED display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitLCD.h>
//M5UnitLCD display; // default setting
//M5UnitLCD display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5UnitGLASS2.h>
//M5UnitGLASS2 display; // default setting
//M5UnitGLASS2 display ( 21, 22, 400000 ); // SDA, SCL, FREQ
//#include <M5AtomDisplay.h>
//M5AtomDisplay display; // default setting
//M5AtomDisplay display ( 320, 180 ); // width, height
static constexpr char text0[] = "hello world";
static constexpr char text1[] = "this";
static constexpr char text2[] = "is";
static constexpr char text3[] = "text";
static constexpr char text4[] = "log";
static constexpr char text5[] = "vertical";
static constexpr char text6[] = "scroll";
static constexpr char text7[] = "sample";
static constexpr const char* text[] = { text0, text1, text2, text3, text4, text5, text6, text7 };
//*
/// Example of using canvas
M5Canvas canvas(&display);
void setup(void)
{
display.begin();
if (display.isEPD())
{
display.setEpdMode(epd_mode_t::epd_fastest);
display.invertDisplay(true);
display.clear(TFT_BLACK);
}
if (display.width() < display.height())
{
display.setRotation(display.getRotation() ^ 1);
}
canvas.setColorDepth(1); // mono color
canvas.createSprite(display.width(), display.height());
canvas.setTextSize((float)canvas.width() / 160);
canvas.setTextScroll(true);
}
void loop(void)
{
static int count = 0;
canvas.printf("%04d:%s\r\n", count, text[count & 7]);
canvas.pushSprite(0, 0);
++count;
}
/*/
/// Example without canvas
void setup(void)
{
display.begin();
if (display.isEPD())
{
display.setEpdMode(epd_mode_t::epd_fastest);
display.invertDisplay(true);
display.clear(TFT_BLACK);
}
if (display.width() < display.height())
{
display.setRotation(display.getRotation() ^ 1);
}
display.setTextSize((float)display.width() / 160);
display.setTextScroll(true);
}
void loop(void)
{
static int count = 0;
display.printf("%04d:%s\r\n", count, text[count & 7]);
++count;
}
//*/

View file

@ -0,0 +1,73 @@
#include <M5GFX.h>
M5GFX display;
void setup(void)
{
display.init();
display.setFont(&fonts::Font4);
if (!display.touch())
{
display.setTextDatum(textdatum_t::middle_center);
display.drawString("Touch not found.", display.width() / 2, display.height() / 2);
}
display.setEpdMode(epd_mode_t::epd_fastest);
display.startWrite();
}
void loop(void)
{
static bool drawed = false;
lgfx::touch_point_t tp[3];
int nums = display.getTouchRaw(tp, 3);
if (nums)
{
for (int i = 0; i < nums; ++i)
{
display.setCursor(16, 16 + i * 24);
display.printf("Raw X:%03d Y:%03d", tp[i].x, tp[i].y);
}
display.convertRawXY(tp, nums);
for (int i = 0; i < nums; ++i)
{
display.setCursor(16, 128 + i * 24);
display.printf("Convert X:%03d Y:%03d", tp[i].x, tp[i].y);
}
display.display();
display.setColor(display.isEPD() ? TFT_BLACK : TFT_WHITE);
for (int i = 0; i < nums; ++i)
{
int s = tp[i].size + 3;
switch (tp[i].id)
{
case 0:
display.fillCircle(tp[i].x, tp[i].y, s);
break;
case 1:
display.drawLine(tp[i].x-s, tp[i].y-s, tp[i].x+s, tp[i].y+s);
display.drawLine(tp[i].x-s, tp[i].y+s, tp[i].x+s, tp[i].y-s);
break;
default:
display.fillTriangle(tp[i].x-s, tp[i].y +s, tp[i].x+s, tp[i].y+s, tp[i].x, tp[i].y-s);
break;
}
display.display();
}
drawed = true;
}
else if (drawed)
{
drawed = false;
display.waitDisplay();
display.clear();
display.display();
}
vTaskDelay(1);
}

View file

@ -0,0 +1,55 @@
#include <SD.h>
#include <SPIFFS.h>
#include <M5GFX.h>
M5GFX display;
static constexpr const uint8_t PIN_SD_CS = GPIO_NUM_4;
void setup(void)
{
display.init();
display.print("SD wait.\n");
SPIFFS.begin();
if (!display.loadFont(SPIFFS, "/font.vlw"))
{
#if defined (_SD_H_)
while (!SD.begin(PIN_SD_CS, SPI, 25000000))
{
ESP_LOGD("debug","SD begin failed");
delay(500);
}
if (!display.loadFont(SD, "/font.vlw"))
#endif
{
display.print("Font data not found...");
}
}
}
void loop(void)
{
display.print("Hello World !");
delay(500);
}
#if !defined ( ARDUINO )
extern "C" {
void loopTask(void*)
{
setup();
for (;;) {
loop();
}
vTaskDelete(NULL);
}
void app_main()
{
xTaskCreatePinnedToCore(loopTask, "loopTask", 8192, NULL, 1, NULL, 1);
}
}
#endif

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,795 @@
static constexpr const unsigned char png_logo[12701] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x01, 0xb8, 0x00, 0x00, 0x00, 0x82, 0x08, 0x03, 0x00, 0x00, 0x00, 0x03, 0x82, 0x2d,
0xfe, 0x00, 0x00, 0x03, 0x00, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff,
0xff, 0xfd, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff,
0xff, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfd, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd,
0xfd, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfc, 0xfd, 0xff, 0xfc, 0xfd, 0xfd, 0xfb, 0xfd, 0xfe, 0xfd,
0xfc, 0xfc, 0xf9, 0xfc, 0xfe, 0xfb, 0xfb, 0xfb, 0xf8, 0xfc, 0xfd, 0xf7, 0xfb, 0xfd, 0xfa, 0xfa,
0xfa, 0xf6, 0xfa, 0xfc, 0xf9, 0xf9, 0xf8, 0xf4, 0xf9, 0xfd, 0xf8, 0xf8, 0xf7, 0xf4, 0xf9, 0xfb,
0xf7, 0xf7, 0xf6, 0xf2, 0xf8, 0xfb, 0xf7, 0xf6, 0xf5, 0xf0, 0xf7, 0xfb, 0xf6, 0xf5, 0xf5, 0xf4,
0xf4, 0xf3, 0xed, 0xf5, 0xfa, 0xf3, 0xf3, 0xf2, 0xeb, 0xf4, 0xf9, 0xf2, 0xf1, 0xf1, 0xe9, 0xf3,
0xf9, 0xf1, 0xf0, 0xef, 0xe6, 0xf2, 0xf8, 0xef, 0xef, 0xee, 0xe5, 0xf1, 0xf6, 0xe4, 0xf0, 0xf8,
0xee, 0xed, 0xed, 0xe1, 0xef, 0xf7, 0xec, 0xeb, 0xeb, 0xde, 0xed, 0xf6, 0xea, 0xe9, 0xe9, 0xdc,
0xec, 0xf5, 0xe9, 0xe7, 0xe6, 0xd9, 0xeb, 0xf4, 0xe7, 0xe5, 0xe4, 0xd6, 0xe9, 0xf4, 0xe5, 0xe3,
0xe3, 0xd4, 0xe8, 0xf3, 0xe3, 0xe2, 0xe1, 0xd2, 0xe7, 0xf2, 0xd1, 0xe6, 0xf3, 0xe2, 0xe0, 0xdf,
0xcf, 0xe5, 0xf2, 0xe1, 0xdf, 0xde, 0xce, 0xe4, 0xf1, 0xdf, 0xdd, 0xdd, 0xcb, 0xe3, 0xf0, 0xc8,
0xe2, 0xf0, 0xdd, 0xdb, 0xda, 0xdb, 0xda, 0xd9, 0xc6, 0xe0, 0xef, 0xc3, 0xdf, 0xee, 0xd9, 0xd7,
0xd7, 0xc0, 0xdd, 0xed, 0xd7, 0xd5, 0xd4, 0xbd, 0xdc, 0xed, 0xd5, 0xd2, 0xd1, 0xba, 0xda, 0xec,
0xd2, 0xd0, 0xcf, 0xb6, 0xd8, 0xeb, 0xd1, 0xce, 0xcd, 0xb3, 0xd6, 0xea, 0xb1, 0xd5, 0xe9, 0xce,
0xcc, 0xcb, 0xaf, 0xd4, 0xe9, 0xcd, 0xca, 0xc9, 0xac, 0xd3, 0xe8, 0xaa, 0xd1, 0xe7, 0xca, 0xc7,
0xc6, 0xc9, 0xc6, 0xc5, 0xa6, 0xcf, 0xe6, 0xc7, 0xc4, 0xc3, 0xc5, 0xc4, 0xc2, 0xc6, 0xc3, 0xc1,
0xa3, 0xcd, 0xe5, 0x9f, 0xcc, 0xe4, 0xc3, 0xc0, 0xbf, 0xc2, 0xbf, 0xbd, 0x9d, 0xca, 0xe3, 0x9a,
0xc9, 0xe3, 0xbf, 0xbc, 0xbb, 0x97, 0xc7, 0xe2, 0x94, 0xc6, 0xe1, 0xbc, 0xb9, 0xb8, 0xbb, 0xb7,
0xb6, 0x90, 0xc4, 0xe1, 0xb9, 0xb5, 0xb4, 0x8c, 0xc1, 0xdf, 0xb6, 0xb3, 0xb1, 0x88, 0xbf, 0xde,
0xb4, 0xb0, 0xaf, 0xb2, 0xaf, 0xad, 0x84, 0xbd, 0xdd, 0x80, 0xbb, 0xdc, 0xb0, 0xac, 0xaa, 0xaf,
0xab, 0xaa, 0xae, 0xaa, 0xa8, 0x7c, 0xb9, 0xdb, 0xac, 0xa7, 0xa7, 0x79, 0xb7, 0xda, 0xaa, 0xa6,
0xa5, 0x75, 0xb5, 0xd9, 0xa8, 0xa3, 0xa3, 0x71, 0xb3, 0xd8, 0xa5, 0xa1, 0x9f, 0x6d, 0xb1, 0xd6,
0xa3, 0x9e, 0x9d, 0x69, 0xae, 0xd5, 0xa1, 0x9c, 0x9b, 0x66, 0xad, 0xd4, 0x9f, 0x9b, 0x99, 0x63,
0xab, 0xd3, 0x9d, 0x98, 0x97, 0x60, 0xa9, 0xd3, 0x9a, 0x96, 0x94, 0x5e, 0xa8, 0xd2, 0x98, 0x93,
0x92, 0x5a, 0xa6, 0xd1, 0x57, 0xa5, 0xd0, 0x96, 0x91, 0x90, 0x96, 0x91, 0x8f, 0x95, 0x8f, 0x8e,
0x54, 0xa3, 0xcf, 0x94, 0x8f, 0x8e, 0x93, 0x8f, 0x8d, 0x92, 0x8d, 0x8c, 0x50, 0xa1, 0xce, 0x91,
0x8b, 0x8a, 0x4d, 0x9f, 0xcd, 0x8f, 0x8a, 0x88, 0x8d, 0x88, 0x86, 0x49, 0x9d, 0xcc, 0x8a, 0x85,
0x83, 0x44, 0x9a, 0xcb, 0x88, 0x82, 0x81, 0x40, 0x98, 0xca, 0x3c, 0x96, 0xc9, 0x84, 0x7e, 0x7c,
0x39, 0x95, 0xc8, 0x82, 0x7b, 0x7a, 0x35, 0x93, 0xc7, 0x81, 0x7a, 0x79, 0x80, 0x79, 0x78, 0x33,
0x91, 0xc6, 0x7e, 0x78, 0x76, 0x30, 0x90, 0xc5, 0x7c, 0x76, 0x74, 0x2d, 0x8e, 0xc4, 0x7a, 0x73,
0x72, 0x29, 0x8c, 0xc3, 0x78, 0x71, 0x70, 0x25, 0x8a, 0xc2, 0x22, 0x89, 0xc1, 0x75, 0x6e, 0x6d,
0x1f, 0x87, 0xc1, 0x1d, 0x86, 0xbf, 0x72, 0x6b, 0x6a, 0x1d, 0x85, 0xc0, 0x1b, 0x84, 0xbf, 0x70,
0x69, 0x67, 0x17, 0x82, 0xbe, 0x6d, 0x67, 0x65, 0x15, 0x81, 0xbe, 0x6c, 0x65, 0x64, 0x12, 0x80,
0xbc, 0x6b, 0x63, 0x61, 0x10, 0x7e, 0xbc, 0x0e, 0x7d, 0xbb, 0x68, 0x61, 0x5f, 0x0b, 0x7c, 0xbb,
0x66, 0x5f, 0x5d, 0x09, 0x7b, 0xba, 0x64, 0x5d, 0x5c, 0x07, 0x79, 0xba, 0x06, 0x79, 0xb9, 0x63,
0x5b, 0x59, 0x04, 0x78, 0xb9, 0x03, 0x77, 0xb8, 0x01, 0x77, 0xb9, 0x00, 0x77, 0xb8, 0x00, 0x77,
0xb7, 0x01, 0x76, 0xb8, 0x01, 0x76, 0xb7, 0x00, 0x76, 0xb9, 0x01, 0x76, 0xb6, 0x60, 0x58, 0x57,
0x00, 0x76, 0xb8, 0x02, 0x75, 0xb7, 0x00, 0x76, 0xb7, 0x00, 0x76, 0xb6, 0x00, 0x76, 0xb5, 0x00,
0x75, 0xb9, 0x00, 0x75, 0xb8, 0x00, 0x75, 0xb7, 0x00, 0x75, 0xb6, 0x00, 0x75, 0xb5, 0x00, 0x74,
0xb8, 0x5e, 0x56, 0x54, 0x5b, 0x53, 0x51, 0x57, 0x50, 0x4e, 0x55, 0x4d, 0x4b, 0x53, 0x4b, 0x49,
0x51, 0x49, 0x47, 0x4f, 0x47, 0x45, 0x4d, 0x45, 0x43, 0x4b, 0x42, 0x40, 0x48, 0x3f, 0x3d, 0x46,
0x3d, 0x3b, 0x44, 0x3b, 0x38, 0x41, 0x38, 0x36, 0x3f, 0x36, 0x34, 0x3d, 0x33, 0x31, 0x3b, 0x31,
0x2f, 0x38, 0x2e, 0x2c, 0x35, 0x2b, 0x29, 0x32, 0x29, 0x26, 0x30, 0x26, 0x24, 0x2e, 0x24, 0x21,
0x2b, 0x21, 0x1f, 0x29, 0x1f, 0x1d, 0x28, 0x1d, 0x1b, 0x26, 0x1b, 0x19, 0x24, 0x1a, 0x17, 0x24,
0x19, 0x16, 0x23, 0x19, 0x16, 0x22, 0x19, 0x14, 0x23, 0x18, 0x16, 0x23, 0x18, 0x14, 0x24, 0x17,
0x16, 0x22, 0x18, 0x16, 0x24, 0x17, 0x14, 0x22, 0x18, 0x14, 0x23, 0x17, 0x16, 0x23, 0x17, 0x14,
0x22, 0x17, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x44, 0x2e, 0xfd, 0x00, 0x00, 0x20,
0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x7d, 0x07, 0x58, 0x14, 0x57, 0xbb, 0xff, 0xcc,
0xce, 0x30, 0xae, 0xbb, 0x86, 0x88, 0x05, 0xe5, 0x2f, 0xf1, 0x82, 0x5d, 0xa3, 0x18, 0x2b, 0xea,
0x67, 0x2c, 0xb1, 0x1b, 0xac, 0xb1, 0x5f, 0x6b, 0xd4, 0x24, 0x76, 0x93, 0x58, 0xb1, 0x45, 0x8d,
0x35, 0x31, 0x37, 0x96, 0xa8, 0xc1, 0x96, 0xa0, 0x41, 0xc5, 0x16, 0xc0, 0x86, 0x05, 0x45, 0xca,
0xce, 0xec, 0x3a, 0x99, 0x91, 0x99, 0xfd, 0x3e, 0x45, 0xa3, 0xd8, 0x90, 0xb2, 0x74, 0x66, 0x1c,
0x27, 0xee, 0xf3, 0xfc, 0xcf, 0x99, 0x05, 0x61, 0x1b, 0x2c, 0x86, 0x04, 0x73, 0xef, 0xbe, 0x2a,
0xb2, 0x3b, 0xb3, 0x33, 0x67, 0xcf, 0xef, 0xbc, 0xfd, 0x3d, 0xef, 0x20, 0x48, 0xa5, 0x11, 0xae,
0x42, 0x31, 0x04, 0x41, 0x51, 0x04, 0xab, 0xbc, 0x6b, 0xba, 0xe9, 0x6f, 0x20, 0x82, 0x40, 0x51,
0x1c, 0xe0, 0x56, 0x1d, 0x55, 0xa3, 0x55, 0x3d, 0x16, 0x37, 0x55, 0x80, 0x30, 0x0c, 0xf7, 0xf0,
0x0e, 0xe8, 0x1f, 0xd4, 0xbf, 0xa3, 0x77, 0x8d, 0xaa, 0x1e, 0x8b, 0x9b, 0x2a, 0x40, 0x28, 0xe2,
0xd5, 0x79, 0xf5, 0x81, 0xa8, 0x0b, 0x11, 0x47, 0x56, 0x8f, 0xa9, 0x5d, 0xd5, 0x83, 0x71, 0x53,
0xd9, 0x44, 0x00, 0x01, 0x89, 0x15, 0xe9, 0xb4, 0xda, 0xed, 0x17, 0xec, 0xbe, 0x64, 0x48, 0x4a,
0x4a, 0xd4, 0x5f, 0x3a, 0xb6, 0x68, 0x60, 0x7d, 0x9c, 0x20, 0x4a, 0xce, 0xc3, 0x10, 0xe2, 0xf5,
0x6e, 0xe0, 0xa6, 0xbf, 0x84, 0x50, 0xc5, 0x18, 0x21, 0x10, 0x15, 0xee, 0xdd, 0x6d, 0xd2, 0x81,
0x18, 0x9e, 0x64, 0x39, 0x96, 0x31, 0xd2, 0x34, 0xcb, 0xc4, 0x87, 0xad, 0xec, 0xdd, 0x54, 0x0b,
0x0e, 0xd5, 0x50, 0x6b, 0x51, 0x4c, 0x83, 0x20, 0x2a, 0x8f, 0xaa, 0x1e, 0xac, 0x9b, 0x6c, 0x09,
0x45, 0xde, 0xee, 0x32, 0x66, 0x7b, 0x94, 0x91, 0xa3, 0x69, 0x86, 0x49, 0x4c, 0x22, 0x79, 0x3d,
0x6d, 0x64, 0x78, 0x3e, 0x64, 0xc1, 0x07, 0x4d, 0x09, 0x1c, 0x87, 0x46, 0x26, 0x81, 0x22, 0xea,
0xaa, 0x1e, 0xa5, 0x9b, 0x4a, 0x11, 0x8a, 0x03, 0x50, 0xf0, 0xba, 0xfd, 0x16, 0x84, 0x45, 0x73,
0x8c, 0x9e, 0xa4, 0x79, 0x2e, 0x81, 0xa3, 0x59, 0x00, 0x1f, 0x09, 0xff, 0xc4, 0x9f, 0xd8, 0xfd,
0x51, 0x4b, 0xcb, 0x89, 0x18, 0xa6, 0x72, 0x5b, 0x9a, 0x6f, 0x12, 0xe1, 0x28, 0xa6, 0xed, 0x3d,
0x77, 0x5f, 0x14, 0xcf, 0x33, 0x89, 0xba, 0x5b, 0x8c, 0x91, 0xa2, 0xe3, 0xa2, 0x63, 0x69, 0x9e,
0xd6, 0x93, 0x14, 0x43, 0xf2, 0x5c, 0x7c, 0xd8, 0xe6, 0x11, 0xcd, 0xe1, 0x79, 0x1e, 0x38, 0x82,
0x57, 0xf5, 0x58, 0xdd, 0x54, 0x42, 0x68, 0xc3, 0x6e, 0x9f, 0xed, 0x8c, 0x23, 0xf5, 0x24, 0x93,
0x44, 0x51, 0x0c, 0x15, 0x1f, 0xb5, 0x65, 0xc6, 0x7b, 0x0d, 0x03, 0x86, 0x6e, 0x3c, 0x12, 0x4b,
0xd3, 0x14, 0x95, 0x40, 0x73, 0x00, 0xbf, 0x73, 0xc1, 0x23, 0x5a, 0xd7, 0x45, 0x50, 0xb7, 0x57,
0xfe, 0xc6, 0x10, 0x8a, 0x78, 0x07, 0xcc, 0xd8, 0x76, 0x85, 0xa1, 0x28, 0xf2, 0x37, 0x8a, 0xa6,
0xb8, 0xb8, 0x73, 0x7b, 0x17, 0xb5, 0x24, 0xa0, 0x44, 0x6c, 0x3a, 0x7c, 0x67, 0xf8, 0x75, 0x8e,
0x4a, 0xd4, 0x19, 0xf4, 0x24, 0xc7, 0xc5, 0x9e, 0x58, 0x36, 0xa2, 0xb1, 0xc6, 0x6d, 0x55, 0x56,
0x35, 0x69, 0xd4, 0x40, 0xea, 0xc1, 0xe0, 0x88, 0x6f, 0xbf, 0x95, 0x07, 0xae, 0x73, 0x06, 0x1d,
0x4f, 0x1b, 0x12, 0x8c, 0x46, 0x32, 0x6a, 0xc9, 0xd0, 0xe6, 0x5e, 0x96, 0x53, 0xb4, 0x58, 0xe3,
0xde, 0x73, 0xf7, 0xc6, 0xeb, 0x81, 0xba, 0x4b, 0x64, 0x59, 0x8e, 0xa3, 0x2e, 0x6c, 0x9f, 0xdd,
0xbe, 0xa6, 0x0a, 0x7c, 0x16, 0xb8, 0x0e, 0xc0, 0x4b, 0x70, 0xb3, 0x5f, 0x95, 0x90, 0x1a, 0xe8,
0x35, 0x0c, 0xd7, 0xbe, 0x17, 0x7c, 0x20, 0x5a, 0x47, 0x51, 0x1c, 0xcd, 0xeb, 0x99, 0x44, 0x2a,
0x7a, 0xe3, 0xe4, 0x77, 0x6b, 0x6b, 0x2d, 0x80, 0xc0, 0xd0, 0x97, 0xb6, 0x69, 0xcf, 0xe0, 0xd0,
0x38, 0x86, 0xa7, 0x58, 0x86, 0xfb, 0x0f, 0xaf, 0x8f, 0x3d, 0xbd, 0x7d, 0x76, 0x63, 0x1c, 0x1a,
0x28, 0x6e, 0x1b, 0xa5, 0x8a, 0x08, 0x45, 0x09, 0x8c, 0xf0, 0xee, 0x37, 0x73, 0xdf, 0x15, 0x86,
0x61, 0x19, 0x3d, 0xcd, 0xf3, 0xba, 0xb8, 0x53, 0x7b, 0x47, 0xb7, 0x06, 0x7c, 0x84, 0x57, 0x47,
0xb5, 0x8a, 0xd5, 0x5f, 0x24, 0x16, 0xbd, 0xfb, 0x2f, 0x0c, 0xbb, 0x44, 0x27, 0x18, 0xc1, 0x69,
0x0c, 0xc3, 0xf1, 0xe7, 0x76, 0x8e, 0xef, 0xe6, 0xa5, 0x82, 0x16, 0xa6, 0x1a, 0x75, 0xc3, 0xf7,
0xb7, 0x13, 0x86, 0x68, 0xbd, 0x3b, 0x8f, 0x09, 0x89, 0x26, 0x19, 0x86, 0xa6, 0xf5, 0xf0, 0xc7,
0xe9, 0xbd, 0x9f, 0x75, 0x53, 0x38, 0x09, 0x23, 0xd4, 0xc8, 0xab, 0xf8, 0x32, 0x04, 0x0f, 0xf7,
0x1a, 0xbd, 0x3a, 0xec, 0x12, 0xc9, 0x33, 0xc0, 0x3f, 0xe0, 0x18, 0xa3, 0x31, 0x6a, 0xfb, 0xd0,
0xf6, 0x5e, 0x28, 0xea, 0x96, 0x94, 0x55, 0x40, 0x98, 0xe6, 0xed, 0xe1, 0x2b, 0xc3, 0x2e, 0x71,
0x80, 0xdb, 0x74, 0x00, 0x34, 0xd6, 0x70, 0xe2, 0xeb, 0x7e, 0x2d, 0x6b, 0xa0, 0x98, 0x06, 0x03,
0xbe, 0x36, 0x86, 0x11, 0x9a, 0xe2, 0x13, 0x01, 0x3e, 0x6a, 0x0d, 0x82, 0xd6, 0x55, 0x40, 0xd6,
0x01, 0xdb, 0x85, 0x66, 0x93, 0x80, 0xb2, 0x3b, 0xb4, 0x64, 0x30, 0x8a, 0xe0, 0xee, 0x28, 0xca,
0xdf, 0x4d, 0x58, 0xcd, 0x9e, 0xb3, 0x8f, 0x44, 0xeb, 0x75, 0x46, 0x03, 0x07, 0x80, 0x63, 0xa9,
0xd3, 0x9b, 0x3f, 0x6a, 0x8f, 0x41, 0x8b, 0x43, 0x0d, 0x8d, 0x0e, 0xf0, 0x4b, 0x71, 0xe0, 0x12,
0xad, 0x8e, 0xaa, 0x55, 0x28, 0x14, 0x89, 0xde, 0xfd, 0x66, 0x84, 0x5c, 0xa2, 0x69, 0x06, 0xf2,
0x1d, 0xcb, 0xea, 0xce, 0x1d, 0x9a, 0xd9, 0xcd, 0xcb, 0x9d, 0xf7, 0xf9, 0xcb, 0x09, 0x05, 0x7f,
0x30, 0x68, 0x53, 0xa8, 0x11, 0x54, 0xd5, 0xb0, 0xcb, 0xc2, 0x7d, 0xb1, 0xbc, 0x9e, 0xd2, 0xd1,
0x46, 0x8e, 0xa1, 0x62, 0x7f, 0xdd, 0x36, 0xb3, 0xa1, 0x9a, 0x40, 0x71, 0x88, 0x82, 0xa6, 0xcc,
0xab, 0x04, 0x2c, 0xda, 0x7b, 0x2e, 0x8e, 0xa2, 0x0d, 0x14, 0x4f, 0xd3, 0xba, 0xa4, 0xeb, 0x21,
0x0b, 0x3a, 0x37, 0x44, 0x31, 0x14, 0xf5, 0x80, 0xf2, 0xd5, 0x6d, 0xae, 0xfc, 0x05, 0x84, 0x42,
0xcc, 0xc0, 0x4f, 0x82, 0x40, 0xd5, 0x5a, 0xdf, 0x8e, 0x1f, 0x6f, 0x89, 0xd5, 0x33, 0x06, 0x5a,
0x4f, 0xeb, 0xb9, 0x24, 0xdd, 0x85, 0xed, 0x9f, 0xb5, 0xf6, 0x42, 0x30, 0x1c, 0xc6, 0x44, 0x08,
0x18, 0x90, 0xac, 0xd7, 0xa6, 0x9d, 0xbf, 0xe3, 0xab, 0x00, 0x8f, 0xef, 0xfd, 0x25, 0x7b, 0xaf,
0x00, 0xb5, 0x68, 0x30, 0xd2, 0xc0, 0x0c, 0x4d, 0xba, 0xbe, 0x65, 0x46, 0xe7, 0x86, 0xd0, 0xc6,
0x54, 0xb9, 0x61, 0xfb, 0x4b, 0x08, 0x85, 0x4e, 0x17, 0x82, 0x54, 0xd3, 0x10, 0x1e, 0xbe, 0xbd,
0xbf, 0x0e, 0x8b, 0xe1, 0x79, 0x8a, 0x01, 0xbe, 0xb6, 0xd1, 0x10, 0x77, 0x6a, 0xd9, 0x08, 0x3f,
0x8d, 0x92, 0x19, 0x40, 0x08, 0x28, 0x1d, 0x89, 0x7a, 0x03, 0x0e, 0xdf, 0x4e, 0x3e, 0x3b, 0xc8,
0x61, 0x2c, 0x59, 0xab, 0xc2, 0xb0, 0xb7, 0x5b, 0x4e, 0xfa, 0xea, 0x5c, 0xfc, 0xbf, 0xff, 0x9d,
0xc4, 0x52, 0xc6, 0xa4, 0xa4, 0x5b, 0xb1, 0x61, 0x9b, 0xfb, 0x35, 0x24, 0x34, 0xa8, 0x0a, 0x75,
0x43, 0xf7, 0x17, 0x10, 0x0a, 0x70, 0x53, 0x21, 0xc0, 0xe2, 0xa8, 0xdf, 0x73, 0x59, 0x48, 0x0c,
0x4f, 0xb3, 0xc0, 0x8a, 0x64, 0x69, 0x8a, 0x8a, 0x0e, 0xfe, 0xe8, 0xdd, 0xba, 0x60, 0xce, 0x01,
0xbb, 0xa1, 0x2a, 0x88, 0x9b, 0x4f, 0x9f, 0x1d, 0x37, 0x4d, 0x05, 0x2f, 0x73, 0x7e, 0x6c, 0xe0,
0xf0, 0x32, 0x5a, 0xe8, 0xdc, 0x79, 0xb7, 0x9f, 0xb4, 0xee, 0x0a, 0x50, 0x75, 0x06, 0x23, 0x97,
0x44, 0xea, 0xe9, 0x98, 0x03, 0x2b, 0xfb, 0x35, 0xd4, 0xe2, 0x6a, 0x60, 0x8c, 0x56, 0xf5, 0xd7,
0xfc, 0x5f, 0x48, 0xc0, 0xec, 0xd0, 0x68, 0x7d, 0x7b, 0xcf, 0x3c, 0x16, 0x47, 0xd3, 0x34, 0xb4,
0x47, 0xc0, 0x9f, 0x63, 0xdb, 0xc6, 0xb4, 0x46, 0x08, 0x8b, 0xb3, 0xad, 0x94, 0x97, 0x34, 0x18,
0xb4, 0xf8, 0x41, 0xb6, 0x20, 0x09, 0x42, 0xf6, 0xd3, 0x2f, 0xea, 0x38, 0xbc, 0x0c, 0x70, 0xdc,
0x80, 0xd0, 0x05, 0xb6, 0x4a, 0xfb, 0xc9, 0x3b, 0xc3, 0x29, 0x5d, 0x02, 0x03, 0xc0, 0xa7, 0x28,
0x3a, 0xe1, 0xc4, 0xdc, 0x81, 0x8d, 0xbd, 0xc0, 0xd2, 0x70, 0x53, 0x65, 0x13, 0x98, 0xf0, 0xba,
0xbd, 0xa7, 0x85, 0x44, 0x33, 0x2c, 0x99, 0xc8, 0x02, 0xbf, 0x8d, 0x8e, 0xff, 0x35, 0x64, 0x7c,
0x00, 0x14, 0x91, 0x5a, 0x80, 0x04, 0xa1, 0x56, 0x69, 0x09, 0xcf, 0x01, 0xf3, 0xaf, 0x65, 0x88,
0x66, 0x59, 0xca, 0x49, 0x3d, 0xbb, 0xc2, 0xc7, 0xc9, 0x55, 0xa0, 0x04, 0x85, 0x52, 0x17, 0xd5,
0xb6, 0x9f, 0xbc, 0x2f, 0x22, 0x81, 0xe7, 0x38, 0x56, 0x67, 0x00, 0x2e, 0x45, 0x4c, 0xe8, 0xec,
0x81, 0xf5, 0xab, 0xfa, 0x4b, 0xfe, 0xaf, 0x22, 0x68, 0x48, 0x42, 0x4e, 0xa8, 0x1f, 0x14, 0x1c,
0x1e, 0x93, 0xa4, 0x67, 0x38, 0x1d, 0xab, 0x67, 0x58, 0xfa, 0x48, 0xf0, 0xc0, 0xd6, 0xa5, 0x4f,
0xc3, 0x7c, 0xc6, 0xee, 0x78, 0x64, 0x12, 0x04, 0x51, 0x14, 0x52, 0xd7, 0x8e, 0x6c, 0xe2, 0x52,
0x91, 0x50, 0xeb, 0xc1, 0xcb, 0x42, 0x79, 0x92, 0xe4, 0x8d, 0x0c, 0x63, 0xa4, 0xf5, 0xf1, 0x11,
0x1b, 0xa7, 0x35, 0x56, 0xd4, 0x1c, 0xbc, 0x1f, 0x5a, 0x72, 0x7b, 0x37, 0x55, 0x8c, 0x50, 0xc5,
0x42, 0x54, 0x34, 0x17, 0x98, 0xbd, 0xa0, 0x25, 0xa1, 0x17, 0x68, 0x96, 0x27, 0x19, 0x4a, 0x4f,
0x32, 0x5c, 0xc4, 0x96, 0xc1, 0x01, 0x45, 0x71, 0x64, 0x65, 0x66, 0x31, 0x74, 0xd8, 0xb7, 0x77,
0xd3, 0x25, 0x59, 0x14, 0xf2, 0xd2, 0x0e, 0xce, 0x6a, 0xe1, 0xd2, 0xf5, 0x81, 0xf9, 0x5f, 0x33,
0x60, 0xe0, 0xe6, 0x53, 0x7a, 0xe0, 0xd6, 0x71, 0x9c, 0x0e, 0x18, 0x99, 0x31, 0xe1, 0xeb, 0x26,
0x79, 0x23, 0xaf, 0xc2, 0x98, 0x84, 0x72, 0x92, 0x9b, 0x2a, 0x4e, 0x98, 0x1a, 0x58, 0x23, 0x28,
0xaa, 0x6a, 0xfa, 0xc1, 0x82, 0x10, 0x63, 0x92, 0xc1, 0x40, 0x72, 0xbc, 0x81, 0xd3, 0xc7, 0x9e,
0x5e, 0x37, 0xde, 0x8f, 0xc0, 0x4b, 0xb1, 0x44, 0x93, 0x01, 0x6b, 0x6f, 0x14, 0x08, 0x82, 0xf0,
0x3c, 0xe7, 0xc9, 0xd5, 0x29, 0x2d, 0x5c, 0x9d, 0x6c, 0xd4, 0x82, 0x90, 0xef, 0x47, 0x2b, 0x4f,
0xc4, 0xdc, 0x62, 0x39, 0x23, 0xcb, 0xe9, 0x75, 0x2c, 0x1b, 0xbe, 0x6e, 0x78, 0x7b, 0x4c, 0x43,
0x00, 0xc9, 0x8c, 0x63, 0xb0, 0xcc, 0xc1, 0xcd, 0x71, 0x15, 0x26, 0x60, 0x6d, 0xa0, 0x38, 0x46,
0xa0, 0xbe, 0x1d, 0xe7, 0xee, 0x8d, 0xa1, 0x79, 0x8e, 0x62, 0x69, 0xf6, 0x37, 0x3e, 0x36, 0x62,
0xfb, 0xec, 0xc6, 0x30, 0x9d, 0xa3, 0xa4, 0x65, 0x20, 0xf9, 0x74, 0x5d, 0x75, 0xd1, 0x24, 0x01,
0x6e, 0x13, 0x53, 0x6f, 0x2e, 0xef, 0x81, 0x58, 0x82, 0x94, 0x5a, 0x17, 0x6e, 0xa0, 0x05, 0xec,
0x0c, 0x2e, 0x83, 0x36, 0x9c, 0xb1, 0xf9, 0x54, 0x6c, 0x12, 0xcd, 0x24, 0xd1, 0x14, 0xe4, 0xe9,
0xf0, 0x75, 0xfd, 0x5a, 0xbe, 0x05, 0xf8, 0x0d, 0x1e, 0x53, 0x63, 0x6e, 0xe0, 0x2a, 0x4e, 0x8a,
0x6f, 0xe6, 0x17, 0xb4, 0xf1, 0x48, 0x3c, 0xa5, 0x03, 0x36, 0x24, 0xc7, 0x50, 0xa4, 0xfe, 0xd4,
0xdc, 0xfe, 0x8d, 0x35, 0x8a, 0x10, 0x2b, 0x4a, 0x88, 0x36, 0x1a, 0x75, 0xf8, 0x5e, 0x76, 0x01,
0x80, 0xad, 0xe0, 0xc9, 0xf1, 0x61, 0x6d, 0x6b, 0x20, 0xae, 0x57, 0xdf, 0x61, 0xc0, 0xac, 0x81,
0x66, 0x8a, 0xaa, 0xba, 0xb6, 0x61, 0xef, 0x19, 0x61, 0xb1, 0x34, 0x6d, 0xa0, 0x19, 0x1d, 0xe0,
0x3a, 0x18, 0xac, 0xfe, 0x17, 0x4e, 0x28, 0xba, 0xce, 0x2d, 0x2a, 0x5f, 0x87, 0x08, 0xbc, 0xee,
0xbf, 0xbe, 0x0a, 0xbd, 0xc2, 0xe9, 0xf9, 0xc4, 0x44, 0x9e, 0x61, 0xfe, 0x1d, 0x1f, 0xb1, 0x72,
0x74, 0xd3, 0xb7, 0xc1, 0x8c, 0xc3, 0xf9, 0x56, 0xa6, 0xb4, 0x7a, 0xf7, 0xfd, 0xf7, 0x4c, 0x50,
0x4a, 0xca, 0xcf, 0x22, 0x3f, 0xed, 0xa1, 0x56, 0x6b, 0x11, 0x0c, 0x73, 0x85, 0xd9, 0x14, 0xd2,
0x40, 0x79, 0x08, 0x3e, 0x00, 0x99, 0xaa, 0x61, 0xd0, 0xc2, 0xb0, 0xeb, 0x3c, 0xcd, 0xd0, 0x3a,
0x8a, 0x32, 0x18, 0xe3, 0x4e, 0xed, 0x1d, 0x1f, 0x00, 0xee, 0xa1, 0x76, 0x57, 0x61, 0xbe, 0x0e,
0xf9, 0x0e, 0x5e, 0x10, 0x76, 0x9d, 0xe1, 0x48, 0x96, 0x85, 0xd5, 0x76, 0xb1, 0xe1, 0xdb, 0x83,
0xfc, 0x8a, 0xc5, 0x23, 0x42, 0x00, 0x3d, 0xe4, 0x33, 0x6a, 0xcd, 0xbd, 0x2c, 0x51, 0x2e, 0x10,
0x72, 0x9e, 0x5d, 0x5e, 0xdf, 0x0c, 0xbe, 0x8b, 0x22, 0x88, 0x25, 0xc2, 0x62, 0x4d, 0x75, 0x9a,
0x74, 0xea, 0x31, 0xe0, 0xc3, 0x0f, 0x07, 0xf5, 0xea, 0xda, 0xa2, 0x94, 0x5b, 0xae, 0x5c, 0x8a,
0x50, 0x3c, 0x04, 0xa8, 0xed, 0x3c, 0xea, 0x76, 0x5b, 0x7d, 0xe8, 0x4a, 0xa2, 0x81, 0xd5, 0xff,
0xc6, 0x1b, 0x13, 0x29, 0xfa, 0xd2, 0xb6, 0xc9, 0xde, 0xb8, 0xbb, 0xae, 0xc8, 0x55, 0x52, 0x0a,
0x5b, 0x09, 0x30, 0x9f, 0x78, 0xfd, 0xf7, 0xa7, 0x85, 0xc6, 0xe8, 0x29, 0x5a, 0xaf, 0xd3, 0x01,
0x5b, 0xd2, 0x10, 0xbe, 0x73, 0xf2, 0x7b, 0x56, 0xab, 0xdf, 0xa7, 0xef, 0x9c, 0x64, 0x93, 0x28,
0x02, 0xe5, 0x66, 0xba, 0xb1, 0xa9, 0x7b, 0x1d, 0xa7, 0x57, 0xf4, 0x6c, 0x3b, 0x60, 0xd6, 0xda,
0xfd, 0xc7, 0x2f, 0xdf, 0xbc, 0x7d, 0xf5, 0xe4, 0xe1, 0x4d, 0x5f, 0x8e, 0xea, 0xd3, 0xac, 0x16,
0x52, 0x62, 0xe5, 0xbf, 0xba, 0x24, 0xaa, 0xd6, 0x78, 0xf8, 0x0d, 0x5e, 0x77, 0x28, 0x96, 0xa5,
0x79, 0x8a, 0x61, 0x28, 0x8e, 0xa4, 0xa3, 0x3e, 0x40, 0xd5, 0x6e, 0xe4, 0x5c, 0x24, 0x14, 0x1a,
0x0c, 0x80, 0x0d, 0xea, 0x4e, 0x5a, 0x17, 0x7e, 0x05, 0x70, 0x1b, 0x97, 0x08, 0x0b, 0xec, 0xe2,
0x8e, 0x04, 0xf7, 0x6c, 0x4c, 0xe0, 0xc5, 0x0a, 0x07, 0xfc, 0x5f, 0xe3, 0x93, 0xfd, 0x29, 0x99,
0x66, 0x20, 0x22, 0x0b, 0xd2, 0x8f, 0xce, 0x6b, 0x5b, 0xc3, 0xa9, 0x09, 0x41, 0x0c, 0x5a, 0x7f,
0xfb, 0x51, 0x56, 0x9e, 0x2c, 0x01, 0x71, 0x0a, 0x43, 0x2a, 0x39, 0xcf, 0x52, 0xae, 0xee, 0x19,
0xd2, 0xc4, 0x3e, 0xf1, 0xad, 0xd1, 0x12, 0x88, 0x4a, 0x55, 0xbf, 0xfd, 0x67, 0xdb, 0xaf, 0x24,
0xb2, 0xc0, 0x2d, 0xa7, 0x58, 0xe6, 0xd6, 0xec, 0xaa, 0x9e, 0x8d, 0x7f, 0x14, 0xa9, 0x80, 0x4d,
0xe2, 0x3d, 0x70, 0xd1, 0xb1, 0x2b, 0x34, 0x74, 0xaf, 0x38, 0x96, 0xd5, 0x25, 0x1d, 0x5b, 0x19,
0x14, 0x00, 0x0d, 0x05, 0x0b, 0x7b, 0x68, 0x11, 0x4d, 0x9d, 0x0f, 0x37, 0xa4, 0x64, 0x0a, 0xc0,
0x8e, 0x14, 0x73, 0xce, 0x2c, 0xee, 0xde, 0x00, 0x26, 0xe1, 0x6c, 0x88, 0xb0, 0xc8, 0xd4, 0xb6,
0x9f, 0xde, 0x7e, 0x96, 0x2b, 0xc8, 0x16, 0xdc, 0x04, 0x00, 0xb4, 0x54, 0x58, 0x98, 0x9b, 0x91,
0xfc, 0xcb, 0xd4, 0x56, 0x48, 0xd1, 0xb5, 0x8a, 0x09, 0x28, 0x34, 0x35, 0xee, 0xa1, 0x42, 0xfd,
0xba, 0x7d, 0xb6, 0x3d, 0xc6, 0x68, 0xe4, 0xf5, 0x86, 0xd8, 0xd0, 0x7f, 0x55, 0xf5, 0x5c, 0xfc,
0x73, 0x08, 0x98, 0xf9, 0x9a, 0xc6, 0x3d, 0x57, 0x86, 0xe9, 0x74, 0x30, 0xd7, 0x46, 0xea, 0x59,
0x23, 0x70, 0x8a, 0xc7, 0x7b, 0x03, 0xab, 0x1c, 0x2b, 0x16, 0x6b, 0xea, 0x46, 0x7d, 0x77, 0x24,
0xe7, 0x00, 0x30, 0x64, 0xf9, 0xd9, 0x9d, 0x35, 0x03, 0xe0, 0x5b, 0x98, 0x43, 0xdb, 0x0f, 0x6d,
0x35, 0xe7, 0x97, 0xf4, 0x7c, 0x59, 0x92, 0xa4, 0xb4, 0xdf, 0x4f, 0xee, 0x5a, 0x3a, 0x6b, 0xfa,
0x9c, 0xf5, 0x3f, 0x44, 0xde, 0x49, 0x35, 0x09, 0x00, 0x46, 0x39, 0x7d, 0xd7, 0x38, 0x7f, 0x6b,
0xbb, 0x03, 0xbc, 0x52, 0xab, 0x61, 0xb4, 0x5a, 0xad, 0x6a, 0xda, 0x2d, 0x68, 0xf4, 0xe8, 0xc1,
0x01, 0x75, 0x61, 0xb5, 0xba, 0xdb, 0x1d, 0x70, 0x89, 0x70, 0xcc, 0xef, 0xfd, 0xd9, 0xbb, 0x59,
0x9a, 0xe1, 0x79, 0x9e, 0xd2, 0x1b, 0xb9, 0xf8, 0xa8, 0xcd, 0xd3, 0x1a, 0x13, 0x40, 0x76, 0x56,
0x87, 0x47, 0x35, 0x80, 0x45, 0x7c, 0x7a, 0x2c, 0x8f, 0xcc, 0x01, 0x60, 0x08, 0x62, 0xe6, 0xc3,
0x0d, 0x43, 0x8a, 0x55, 0x9b, 0x35, 0x72, 0x00, 0x03, 0x4c, 0xeb, 0x3f, 0x6c, 0x7d, 0x2a, 0x50,
0x80, 0x85, 0x72, 0xd6, 0xe3, 0xef, 0xc7, 0x35, 0xf1, 0x54, 0x0e, 0x68, 0x5b, 0x0c, 0x58, 0x7b,
0xf4, 0x41, 0xba, 0x04, 0xc3, 0xd0, 0xf7, 0xbf, 0xe8, 0x6a, 0xf3, 0x31, 0x35, 0x0e, 0x5d, 0x40,
0x1c, 0xf5, 0x80, 0xdc, 0x0a, 0x53, 0x74, 0x6e, 0x27, 0xce, 0x65, 0xf2, 0x0b, 0xda, 0x1e, 0x7e,
0x1d, 0xf8, 0xc1, 0x46, 0x9a, 0x32, 0x32, 0x5c, 0x4c, 0xd8, 0x82, 0x20, 0x5f, 0x02, 0x53, 0x82,
0xc8, 0xe0, 0x20, 0x70, 0xad, 0x30, 0x62, 0xce, 0xfd, 0xec, 0x17, 0xb2, 0xf0, 0xe2, 0x65, 0xea,
0xc5, 0x39, 0x7d, 0x8a, 0x03, 0x92, 0x18, 0x62, 0xa7, 0xb3, 0x7c, 0xbe, 0x3c, 0x93, 0x9a, 0x03,
0x98, 0x52, 0x30, 0x25, 0x2f, 0x1d, 0x54, 0xab, 0x34, 0xdf, 0xf8, 0xf4, 0x98, 0x7a, 0x36, 0x0d,
0x48, 0x59, 0x29, 0xf3, 0xde, 0xc8, 0x52, 0x6f, 0x5b, 0xb6, 0x84, 0x60, 0x28, 0xa1, 0xb5, 0x24,
0xd2, 0x51, 0x25, 0x6d, 0xeb, 0x46, 0xce, 0x25, 0xf2, 0xee, 0xbd, 0xfa, 0x50, 0x2c, 0x05, 0x0c,
0x83, 0x44, 0x23, 0xcf, 0xd0, 0xfa, 0x88, 0x85, 0x41, 0x4d, 0xbd, 0x6c, 0xfc, 0x28, 0xf4, 0x5b,
0xe1, 0x05, 0xb0, 0x24, 0x5f, 0x88, 0x17, 0x27, 0xfa, 0x38, 0xbf, 0x50, 0xbd, 0x51, 0xbb, 0x1e,
0x67, 0x01, 0x85, 0x26, 0xcb, 0xa9, 0xeb, 0x87, 0x35, 0xb2, 0x75, 0xec, 0x6a, 0xf5, 0xfd, 0x1c,
0xd8, 0xa3, 0x92, 0x90, 0x77, 0x63, 0x96, 0x23, 0x63, 0xd4, 0x11, 0x58, 0x9e, 0xcd, 0x5b, 0x7b,
0xb9, 0xc5, 0xa6, 0x13, 0xc2, 0xb0, 0x65, 0x31, 0x46, 0x16, 0x70, 0x9a, 0x2e, 0x91, 0xe6, 0xe2,
0x8e, 0x7c, 0x1d, 0xd4, 0x18, 0x73, 0x90, 0x94, 0xee, 0xb4, 0x26, 0x39, 0x4d, 0x16, 0x80, 0xac,
0x34, 0x9d, 0x5f, 0xd1, 0xb5, 0x81, 0x12, 0x8a, 0x2e, 0xb5, 0x71, 0x0a, 0x72, 0xa6, 0x7f, 0x9f,
0x1d, 0xf7, 0x72, 0x0b, 0x65, 0x41, 0x2c, 0x78, 0x78, 0x66, 0x62, 0x13, 0xc7, 0xf7, 0xaa, 0x35,
0xec, 0x5e, 0x96, 0x24, 0x3d, 0x37, 0x7d, 0xdb, 0xa9, 0x8c, 0xf1, 0xe0, 0x04, 0x01, 0x4c, 0x4d,
0x02, 0xad, 0x3f, 0x70, 0x76, 0x68, 0x4c, 0x4c, 0x68, 0x90, 0x3b, 0xeb, 0xe3, 0x8c, 0xc2, 0x8c,
0x0c, 0xcd, 0x1b, 0x0d, 0x2c, 0x1f, 0x17, 0xbe, 0x73, 0x78, 0x73, 0x20, 0xbe, 0xaa, 0xdb, 0x6f,
0x66, 0xc3, 0xea, 0x8d, 0xfc, 0x06, 0x58, 0x94, 0x22, 0xc0, 0xce, 0x74, 0x78, 0x7e, 0x57, 0x1f,
0xc4, 0xe2, 0x46, 0xbf, 0x22, 0x9f, 0xae, 0x8b, 0xcf, 0xe4, 0x02, 0x56, 0x13, 0xf3, 0xd3, 0x92,
0x67, 0xb5, 0x73, 0xec, 0x86, 0xc1, 0xd5, 0x30, 0xe5, 0x72, 0x8e, 0xf9, 0xf9, 0xf3, 0x67, 0x2b,
0x9c, 0x47, 0x46, 0x60, 0x0d, 0x0b, 0x30, 0x96, 0xbc, 0xbb, 0x4d, 0x3a, 0x74, 0x85, 0xd3, 0x73,
0xd4, 0xe6, 0xce, 0x55, 0x3d, 0x3f, 0x6f, 0x28, 0x55, 0x47, 0x7f, 0xe5, 0x18, 0x8e, 0x26, 0x0d,
0x0c, 0x79, 0x69, 0x51, 0x47, 0x54, 0xa9, 0x6b, 0x45, 0x1c, 0xe4, 0xa4, 0xd1, 0x1a, 0x7d, 0x66,
0x45, 0x3e, 0x13, 0x0a, 0x24, 0x39, 0xdf, 0x74, 0xff, 0x97, 0x41, 0x8a, 0xc4, 0xb4, 0x4c, 0x3f,
0x86, 0x61, 0x3d, 0x7e, 0xba, 0x9f, 0x25, 0x0a, 0x05, 0xb2, 0xf4, 0xe4, 0x97, 0x89, 0x1d, 0x10,
0xc2, 0x31, 0x2c, 0x30, 0x3e, 0x5d, 0xa3, 0xd3, 0xb5, 0x6c, 0x60, 0xba, 0x3c, 0x73, 0x9e, 0x02,
0x52, 0xb2, 0x07, 0xb5, 0xc7, 0x7f, 0x75, 0xec, 0x0a, 0xcb, 0x33, 0x2c, 0x9f, 0x14, 0x35, 0xd4,
0xed, 0x8d, 0x3b, 0x24, 0x14, 0x39, 0x46, 0xb2, 0xbc, 0x2e, 0x91, 0xe1, 0x13, 0x63, 0x8f, 0x6d,
0x19, 0xe8, 0x87, 0x02, 0xe0, 0x6c, 0xed, 0x7c, 0x25, 0xbe, 0x8c, 0x21, 0xf5, 0xfa, 0xcc, 0xb9,
0x9d, 0x01, 0x2d, 0x4b, 0xc1, 0x74, 0x7b, 0xcf, 0xa0, 0x77, 0x94, 0x43, 0x00, 0x35, 0xcf, 0x76,
0x6b, 0x2e, 0x67, 0x9a, 0x65, 0xa1, 0x40, 0x34, 0xdd, 0xf9, 0xa4, 0x7b, 0x2d, 0xa7, 0x71, 0x46,
0x42, 0x4d, 0xa8, 0x31, 0xcf, 0x79, 0x8f, 0x24, 0x73, 0x61, 0xde, 0x38, 0xa7, 0xe3, 0x51, 0xa9,
0x10, 0xc5, 0x9f, 0x4c, 0xa4, 0x69, 0x8e, 0xbd, 0xc5, 0xd2, 0x17, 0x46, 0xb8, 0xe3, 0x96, 0x0e,
0x09, 0x47, 0xc6, 0x1f, 0x8a, 0xe5, 0x80, 0xfb, 0xc6, 0xb3, 0x0c, 0x45, 0xc6, 0xc1, 0x80, 0xb2,
0xc6, 0xb1, 0x3d, 0x00, 0xdf, 0xf4, 0x6c, 0xb7, 0xe2, 0x7c, 0x7a, 0xae, 0x28, 0x4b, 0x72, 0xee,
0xa3, 0x35, 0x23, 0x5b, 0x78, 0x22, 0xb5, 0x02, 0xa7, 0xde, 0xc8, 0x90, 0x0a, 0x80, 0x49, 0x92,
0x75, 0x73, 0x6b, 0x60, 0xad, 0xa2, 0xe4, 0x82, 0xc3, 0xb9, 0x56, 0x32, 0xb4, 0x88, 0xff, 0x19,
0x11, 0x78, 0x83, 0xeb, 0x9d, 0x0d, 0x47, 0xdb, 0xb4, 0xf7, 0xca, 0xb0, 0x38, 0x9a, 0x65, 0xb9,
0x24, 0xe0, 0x9c, 0x70, 0x0c, 0x75, 0x61, 0x78, 0x55, 0xcf, 0xd0, 0x1b, 0x4b, 0x7e, 0x41, 0xdb,
0x8e, 0xc5, 0x73, 0x0c, 0x98, 0x25, 0x8e, 0xfc, 0x37, 0x43, 0xfe, 0x3a, 0x77, 0x60, 0xe3, 0xb7,
0xcb, 0xd8, 0xb1, 0xdd, 0x61, 0xd7, 0xed, 0xf4, 0x5c, 0xc5, 0xe4, 0xbf, 0xbb, 0x66, 0x54, 0xe0,
0xb8, 0xfd, 0x0f, 0x65, 0x59, 0x12, 0x85, 0xec, 0x87, 0x27, 0x07, 0xd4, 0xb1, 0x78, 0x68, 0x4e,
0x73, 0x32, 0x8a, 0x37, 0xdf, 0xf5, 0x9a, 0x08, 0x3e, 0xbc, 0xd6, 0xea, 0x40, 0xc9, 0x26, 0x9e,
0xc6, 0x3d, 0xe7, 0xee, 0x65, 0x68, 0x86, 0xe4, 0xa9, 0x24, 0x4e, 0xc7, 0x70, 0x0c, 0xcd, 0x5e,
0x18, 0xfe, 0xe6, 0x70, 0x5c, 0x55, 0x8c, 0x04, 0x2b, 0x2b, 0xc5, 0xe5, 0xd7, 0x65, 0xd1, 0xbe,
0x58, 0x8e, 0x67, 0x78, 0xca, 0xc8, 0xd3, 0xe4, 0xf5, 0x88, 0x9d, 0x73, 0x9b, 0x02, 0xc6, 0xa9,
0x0e, 0x3c, 0x2b, 0x58, 0x6f, 0x6c, 0xfb, 0xc9, 0x3a, 0x6d, 0xa7, 0xec, 0x48, 0x03, 0x2c, 0x26,
0x99, 0xb3, 0x53, 0xef, 0x3d, 0xcb, 0x83, 0x6e, 0x79, 0xc1, 0x8d, 0x35, 0x7d, 0xfd, 0x91, 0x72,
0x08, 0xaa, 0xbe, 0x3a, 0x81, 0xc7, 0x33, 0x60, 0xf8, 0x65, 0x6c, 0xf1, 0x9b, 0x8a, 0xf3, 0x06,
0x7e, 0x78, 0xa8, 0xc0, 0xf1, 0xa6, 0x43, 0x77, 0x86, 0x5f, 0x37, 0xea, 0x28, 0x20, 0xb8, 0x49,
0x92, 0xe1, 0x78, 0x96, 0xe5, 0xd9, 0x12, 0x8e, 0x23, 0x88, 0x0f, 0x77, 0x9d, 0xdd, 0xdf, 0xd5,
0x69, 0xfe, 0xc8, 0x67, 0xd8, 0xd1, 0xf3, 0xcb, 0x5b, 0xd9, 0xbd, 0x5d, 0x7d, 0xe2, 0xe7, 0x5f,
0x40, 0xfa, 0xdc, 0x42, 0xe0, 0xb7, 0x59, 0x1d, 0x6a, 0x39, 0x02, 0x05, 0xf3, 0x9f, 0xb8, 0xe6,
0x97, 0x93, 0x67, 0xcf, 0x9f, 0x3d, 0x73, 0xf4, 0xf0, 0xaa, 0x4f, 0x3a, 0xd5, 0xb3, 0x5a, 0x82,
0x60, 0xec, 0xbd, 0x66, 0xcd, 0x9b, 0x3f, 0x7f, 0xfe, 0x3c, 0x48, 0x96, 0xff, 0x8a, 0x5e, 0x4c,
0xef, 0xee, 0x60, 0x30, 0x0d, 0xbe, 0x3c, 0x7e, 0x72, 0x45, 0x59, 0x53, 0x02, 0x67, 0xa3, 0x5e,
0xf7, 0x15, 0x3f, 0x1e, 0x8f, 0x3c, 0x7f, 0x3e, 0xf2, 0xf8, 0x9e, 0x15, 0xc3, 0x5a, 0x21, 0x36,
0xc6, 0x81, 0x0a, 0xe9, 0xbe, 0x29, 0x72, 0x57, 0x3b, 0xbb, 0x52, 0xef, 0xb5, 0x67, 0x0e, 0x17,
0x6b, 0x1a, 0x8c, 0x68, 0xde, 0x7f, 0xd1, 0x01, 0x46, 0xd9, 0x74, 0xcf, 0xd0, 0x1c, 0x19, 0x1b,
0xf1, 0xf5, 0xa4, 0xc6, 0x98, 0x1a, 0x55, 0x43, 0xef, 0xdb, 0xc1, 0xde, 0x9a, 0x5a, 0x6d, 0xe7,
0x1d, 0x4d, 0xcb, 0x2b, 0x50, 0x22, 0x29, 0x22, 0xb0, 0x24, 0x1f, 0xfd, 0xfc, 0x61, 0xb3, 0x72,
0x77, 0x4e, 0x41, 0x09, 0xda, 0x6c, 0xed, 0xc5, 0x8c, 0x02, 0x00, 0xf9, 0xd3, 0x66, 0x96, 0xf7,
0x70, 0xcb, 0xa0, 0x50, 0xa5, 0xcc, 0xbd, 0x71, 0xd0, 0xd7, 0xa1, 0xb1, 0x14, 0x05, 0x2c, 0x12,
0x32, 0x01, 0xb8, 0x95, 0x51, 0xdb, 0x7e, 0xa5, 0xac, 0x80, 0x43, 0x88, 0x3d, 0xe9, 0x05, 0x99,
0xdf, 0xb6, 0x2b, 0x2a, 0xc1, 0xb5, 0xa3, 0x01, 0x91, 0xd9, 0xf2, 0x83, 0x2f, 0xed, 0x96, 0xd9,
0xac, 0xfb, 0x8f, 0x1e, 0x5b, 0xd3, 0xc3, 0xc8, 0xb1, 0x36, 0x83, 0x85, 0xb9, 0x46, 0xf5, 0x27,
0x3f, 0xdf, 0x4f, 0xcd, 0x06, 0x6a, 0x40, 0xcc, 0xcd, 0xce, 0x4a, 0x4d, 0xb9, 0xbc, 0xa3, 0x83,
0xf5, 0x49, 0x6d, 0xae, 0xa6, 0x3c, 0x72, 0x48, 0x29, 0x67, 0xba, 0xdb, 0x7f, 0xf7, 0x01, 0xbf,
0xe7, 0xe4, 0x3e, 0x1c, 0xe9, 0x59, 0x16, 0x93, 0xd6, 0xe9, 0xb5, 0xe3, 0xda, 0xd3, 0xcc, 0x9c,
0x3c, 0x51, 0xcc, 0xcb, 0xc9, 0x7c, 0x7a, 0xf7, 0xcc, 0xd4, 0x16, 0xd6, 0xfb, 0xe4, 0xd5, 0xb5,
0xb6, 0xa6, 0xe6, 0xa5, 0x7f, 0x52, 0xcf, 0xfa, 0x53, 0xe8, 0xc8, 0xd4, 0xfc, 0xac, 0xc3, 0x25,
0x2f, 0x3d, 0x10, 0xcd, 0xf0, 0xe0, 0x23, 0xd1, 0x24, 0x45, 0xd3, 0xc0, 0xbe, 0xa4, 0x74, 0x5c,
0xd4, 0xf6, 0xa0, 0xf7, 0xbc, 0x60, 0xd2, 0xd3, 0xe1, 0xae, 0x00, 0x0c, 0x69, 0x31, 0xe5, 0xf2,
0xe3, 0x1c, 0x20, 0x25, 0x73, 0x9f, 0xfd, 0xf2, 0x69, 0xa3, 0xf2, 0x7d, 0x64, 0x60, 0xc3, 0xf4,
0x99, 0x73, 0xfe, 0x99, 0x59, 0x12, 0x04, 0x39, 0xfb, 0xc6, 0xb8, 0xe2, 0xad, 0x21, 0xca, 0xc2,
0x42, 0x70, 0xcc, 0xab, 0xf9, 0xd0, 0x85, 0x51, 0xff, 0x26, 0x13, 0x38, 0x98, 0x55, 0xd5, 0x93,
0xf1, 0x47, 0x36, 0x0e, 0x6f, 0xda, 0xff, 0x10, 0x63, 0x05, 0x9c, 0x96, 0x38, 0x2f, 0x89, 0xe6,
0xac, 0xf5, 0x8a, 0xcb, 0xe0, 0x60, 0x44, 0xc7, 0x05, 0x51, 0x36, 0xfd, 0xec, 0x69, 0xf3, 0xfe,
0x94, 0x07, 0xe2, 0x4b, 0xb0, 0xc0, 0x64, 0xc9, 0x12, 0xf1, 0x16, 0xe4, 0x42, 0xd9, 0x2c, 0xfd,
0x68, 0xb7, 0xa8, 0x1a, 0x7c, 0x72, 0x51, 0xc9, 0x64, 0x40, 0x67, 0x15, 0x16, 0xad, 0xc9, 0xb2,
0x39, 0xed, 0xc7, 0x46, 0xa5, 0x2e, 0x8f, 0x6e, 0x82, 0xab, 0x14, 0x10, 0x3c, 0xcb, 0xac, 0x2c,
0x59, 0xb3, 0x0c, 0x7f, 0x01, 0xb4, 0xbe, 0x19, 0xa2, 0x46, 0xad, 0x20, 0x0a, 0x3c, 0x08, 0x25,
0xd2, 0x8d, 0x0f, 0x9d, 0x4f, 0x88, 0xb6, 0xfb, 0xe5, 0xcc, 0x97, 0x2f, 0xc1, 0x04, 0x4a, 0x66,
0x78, 0x4b, 0x30, 0x31, 0x79, 0xa9, 0xab, 0xac, 0xfd, 0xdb, 0x46, 0x37, 0x80, 0x9d, 0xfe, 0x7d,
0x5b, 0xab, 0xf7, 0x7c, 0x56, 0x3c, 0x06, 0x37, 0x3c, 0x5e, 0x0c, 0x1b, 0x8a, 0x68, 0x35, 0x28,
0xe2, 0x3b, 0x3c, 0xf8, 0x44, 0x8c, 0x4e, 0xc7, 0x91, 0x7a, 0xa5, 0x72, 0x0e, 0x66, 0x07, 0x3c,
0x54, 0xce, 0x65, 0x6c, 0xd7, 0xcf, 0xaf, 0x3e, 0x4a, 0x4f, 0xbd, 0xb1, 0xa9, 0x45, 0xb9, 0x7d,
0x83, 0x08, 0x2d, 0x56, 0xa7, 0xd3, 0x84, 0xc8, 0x54, 0x30, 0x48, 0x30, 0xbe, 0x47, 0x67, 0x47,
0x16, 0x27, 0x56, 0x51, 0xd8, 0xb8, 0x0d, 0x4c, 0x8a, 0x6f, 0xd0, 0x82, 0x63, 0xd7, 0x19, 0x96,
0xa6, 0x93, 0x12, 0xf4, 0x8c, 0x3e, 0xee, 0xc4, 0xee, 0x11, 0xcd, 0xb5, 0xda, 0xfe, 0xa1, 0xd6,
0xa2, 0x12, 0x41, 0xcf, 0x4b, 0x80, 0xcb, 0xef, 0xd4, 0x71, 0x2c, 0xf7, 0x9b, 0xa4, 0x82, 0x19,
0x37, 0xfd, 0x64, 0x0b, 0xdc, 0x17, 0x8f, 0xcd, 0x62, 0x5e, 0xae, 0x15, 0xe5, 0x3c, 0x59, 0x6e,
0xfb, 0x61, 0x9f, 0x91, 0xbf, 0xe7, 0x42, 0xe0, 0x72, 0x32, 0x9e, 0x01, 0xca, 0xcc, 0x95, 0xcd,
0x40, 0x89, 0x3f, 0xec, 0x5b, 0x1a, 0xb8, 0x2f, 0x73, 0x8a, 0x80, 0x93, 0x20, 0x26, 0x16, 0x69,
0x03, 0x43, 0x12, 0x92, 0x60, 0xfa, 0xdc, 0xdf, 0x12, 0x92, 0x28, 0xa1, 0x51, 0xbf, 0x8b, 0xc2,
0x1f, 0x62, 0xfa, 0x3c, 0xe7, 0xb8, 0xf5, 0xdd, 0x2f, 0x40, 0x13, 0x2f, 0xe3, 0xe1, 0xbd, 0xe4,
0xe4, 0xe4, 0xfb, 0xe9, 0x39, 0x60, 0x6d, 0xc9, 0xcf, 0xd6, 0x5b, 0x71, 0x80, 0xff, 0xb5, 0x7c,
0x41, 0xfa, 0x9f, 0x36, 0xa5, 0x57, 0x69, 0x9d, 0x0f, 0x1f, 0xe4, 0x09, 0xf2, 0xd3, 0xc5, 0x45,
0x37, 0x53, 0x76, 0x66, 0xab, 0x09, 0x1c, 0xa9, 0xdd, 0xfb, 0xe3, 0x90, 0x4b, 0x3a, 0x4a, 0xcf,
0xd3, 0x34, 0x4d, 0xf1, 0xf1, 0x51, 0x87, 0x3e, 0xee, 0xa8, 0x75, 0x18, 0xf3, 0x55, 0x8c, 0x17,
0x6d, 0xab, 0x01, 0xe3, 0x46, 0xb6, 0xa9, 0x03, 0xbb, 0x42, 0x95, 0x89, 0x1b, 0xf8, 0xd6, 0x43,
0x36, 0x25, 0xa7, 0xc1, 0xd5, 0x25, 0xe5, 0xde, 0xdd, 0x35, 0xa0, 0x09, 0x5e, 0x52, 0x75, 0x8e,
0x69, 0x08, 0x4d, 0xe3, 0x8f, 0xb7, 0x44, 0xc5, 0x53, 0x2c, 0x45, 0xd1, 0x46, 0x60, 0x8d, 0x18,
0x60, 0x63, 0x1b, 0x5c, 0x83, 0xe3, 0xfd, 0x43, 0x75, 0xd6, 0xc0, 0x21, 0xe7, 0x9f, 0x83, 0xf5,
0x9e, 0x33, 0xca, 0x21, 0x7f, 0xab, 0x17, 0xcb, 0xf2, 0xf3, 0xe7, 0xa6, 0x83, 0xb6, 0xc0, 0x7d,
0xf9, 0x58, 0xc8, 0x3f, 0xb3, 0x62, 0xe9, 0xe2, 0x52, 0x34, 0x7f, 0x88, 0x5d, 0x64, 0x67, 0xca,
0xbd, 0x7c, 0x80, 0x49, 0xc6, 0xcd, 0xa5, 0x53, 0x47, 0x02, 0x9a, 0xbe, 0xe6, 0x76, 0xba, 0x24,
0x4b, 0x0f, 0x7a, 0x95, 0x3e, 0xa5, 0xd1, 0xaa, 0x9f, 0x8e, 0x17, 0xd1, 0x8d, 0x74, 0xd1, 0x9c,
0x71, 0xa3, 0xf8, 0xd5, 0xfe, 0xcf, 0x5b, 0xd8, 0x8d, 0x68, 0x7d, 0x36, 0xe0, 0x59, 0xb1, 0xe0,
0xa8, 0x53, 0x51, 0xd4, 0xe3, 0x76, 0x16, 0xc0, 0xfd, 0xe9, 0x86, 0x29, 0x7d, 0x3b, 0xb5, 0x6b,
0xd7, 0xa1, 0xfb, 0xc4, 0x55, 0x77, 0x4d, 0xb2, 0x28, 0xa4, 0x59, 0x69, 0x45, 0xff, 0x6b, 0x05,
0x85, 0x85, 0xff, 0xd3, 0xa6, 0xf4, 0x5b, 0x63, 0x6f, 0xe7, 0x49, 0x72, 0xda, 0xac, 0x62, 0x51,
0x00, 0x04, 0x25, 0xa2, 0x52, 0x96, 0x0c, 0xee, 0xdb, 0x7b, 0xc6, 0xb1, 0x38, 0x9a, 0x02, 0x02,
0x8b, 0xe6, 0x81, 0xd2, 0x3b, 0xb1, 0x73, 0x5a, 0x47, 0xe7, 0xa8, 0x10, 0x96, 0x1f, 0x98, 0x92,
0x60, 0x73, 0x2e, 0x2e, 0xf1, 0xc0, 0x2f, 0x92, 0xd3, 0xf2, 0xa0, 0xf8, 0x91, 0xef, 0xef, 0x19,
0x0b, 0xb4, 0x2d, 0x51, 0xbc, 0x88, 0x08, 0x20, 0x89, 0x7d, 0xa7, 0x7d, 0x7d, 0x02, 0x58, 0x46,
0x24, 0x43, 0x19, 0xf4, 0x0c, 0x93, 0x70, 0x6c, 0x75, 0xef, 0xa6, 0x1a, 0x02, 0xc7, 0x89, 0x6a,
0xfd, 0x43, 0x69, 0x6b, 0x51, 0x89, 0x9c, 0x87, 0xb9, 0x21, 0x69, 0xcf, 0x3b, 0x8e, 0x6e, 0xd2,
0xe9, 0xac, 0x28, 0x0b, 0xa2, 0x3d, 0x70, 0x8b, 0x9f, 0x88, 0xb9, 0xcb, 0x5b, 0x34, 0xf0, 0x69,
0x50, 0x42, 0xf5, 0xb4, 0x76, 0x12, 0xe2, 0x64, 0x8e, 0x2c, 0xe4, 0xa7, 0xae, 0x19, 0xe2, 0xaf,
0x7c, 0xbc, 0x56, 0x93, 0x21, 0xf3, 0xcf, 0xdc, 0xbd, 0xb9, 0xe6, 0xbf, 0xac, 0xce, 0x69, 0x12,
0xd8, 0xa3, 0x88, 0xe6, 0xa5, 0x98, 0xe5, 0x47, 0xf3, 0x8b, 0x5f, 0x75, 0xf2, 0xb7, 0x93, 0xdc,
0x44, 0xa4, 0xac, 0x30, 0xe7, 0x03, 0x67, 0x15, 0xc2, 0x6d, 0xd6, 0x03, 0xdc, 0xf2, 0x6e, 0x7f,
0xd1, 0xaa, 0x68, 0xb8, 0x9e, 0x4d, 0x46, 0x7e, 0x6b, 0x02, 0x2b, 0xc7, 0x06, 0xb8, 0x7c, 0x51,
0xb6, 0x02, 0xae, 0xce, 0xf9, 0x2c, 0x59, 0xce, 0xf8, 0xa9, 0x99, 0xc5, 0xe8, 0xc7, 0x3d, 0xac,
0x58, 0x06, 0xf5, 0xee, 0xb6, 0x64, 0xef, 0x15, 0x9a, 0x37, 0xe8, 0xf5, 0x14, 0x0f, 0xb4, 0x5d,
0xcc, 0xd7, 0x93, 0xdb, 0x7b, 0x23, 0xaf, 0x76, 0xee, 0xb8, 0x4a, 0xc5, 0x53, 0xe3, 0xd3, 0x75,
0xd5, 0x65, 0x93, 0xa2, 0x5f, 0x4c, 0x0f, 0x0f, 0x7e, 0x5a, 0xc3, 0x02, 0xb0, 0xa5, 0xe6, 0x84,
0xc0, 0x34, 0xed, 0x87, 0xaf, 0x0b, 0x07, 0xe6, 0x10, 0x4f, 0x51, 0x7a, 0x96, 0xe2, 0xae, 0x84,
0x2f, 0x0b, 0xf2, 0x7e, 0x35, 0x8e, 0xfe, 0xa1, 0x1c, 0xcd, 0xf0, 0x17, 0x86, 0x97, 0xd4, 0x3b,
0x9c, 0x87, 0xfa, 0x47, 0x7a, 0xba, 0x42, 0x6b, 0x7f, 0xaf, 0x7a, 0xfb, 0x33, 0x61, 0xaa, 0xdd,
0x1e, 0xb8, 0xe5, 0x4f, 0x84, 0xdc, 0xc5, 0x0d, 0x90, 0xb2, 0x69, 0x54, 0x81, 0x64, 0x36, 0x1f,
0xef, 0xe5, 0xea, 0x77, 0x9b, 0x70, 0x5f, 0x90, 0x52, 0xc6, 0x3a, 0x3d, 0x8c, 0x21, 0xad, 0x32,
0x45, 0x31, 0xdb, 0x24, 0x88, 0xf9, 0xc3, 0x1c, 0x1c, 0x46, 0x71, 0x04, 0x5b, 0x63, 0x92, 0xa4,
0x8c, 0xc3, 0xd6, 0xf1, 0xa3, 0x3e, 0x2b, 0x76, 0x4d, 0xb1, 0x7a, 0x03, 0x70, 0x9c, 0x28, 0x42,
0xe0, 0x8a, 0xe7, 0xb2, 0xd3, 0x7e, 0x59, 0x7e, 0x91, 0x5d, 0xb4, 0x3f, 0x03, 0x85, 0xdd, 0x81,
0x70, 0x2b, 0x44, 0xd0, 0xfa, 0x3d, 0xd7, 0x1d, 0x81, 0x55, 0x5e, 0xd0, 0xce, 0xa4, 0x38, 0xf2,
0xdc, 0x57, 0xe3, 0x9b, 0x7b, 0x21, 0x9a, 0x72, 0x25, 0xa2, 0x85, 0x8a, 0x66, 0x55, 0xab, 0x44,
0x33, 0x7d, 0x02, 0xe7, 0x1d, 0x36, 0x89, 0x30, 0x17, 0x9e, 0x93, 0x7a, 0x78, 0x4e, 0x13, 0xb5,
0xc5, 0xe4, 0xc5, 0x31, 0x54, 0xad, 0x52, 0xa1, 0x6f, 0x35, 0xff, 0xe0, 0xab, 0x63, 0xf1, 0x0c,
0xcb, 0xb2, 0x94, 0x81, 0xa2, 0xa8, 0x98, 0xf0, 0xaf, 0x27, 0xd5, 0x2f, 0xb9, 0x85, 0x23, 0xe0,
0x14, 0xf3, 0x22, 0xfb, 0x7c, 0x33, 0xfb, 0xbb, 0x06, 0xde, 0x2b, 0x10, 0xcd, 0x92, 0xd9, 0x5e,
0xc7, 0xad, 0x4a, 0x15, 0x72, 0xbf, 0x2c, 0x23, 0xa5, 0x01, 0xa9, 0xc6, 0x26, 0xd9, 0x2c, 0x66,
0x8f, 0x72, 0x79, 0x59, 0x96, 0x09, 0x1c, 0xfc, 0xde, 0x63, 0x05, 0x49, 0x7c, 0x94, 0x0c, 0xc6,
0xba, 0xc6, 0xde, 0x79, 0x81, 0x13, 0xe3, 0x79, 0x13, 0x98, 0x41, 0x57, 0x07, 0xd9, 0x1c, 0x50,
0x57, 0xb7, 0x1e, 0xc1, 0x2b, 0xe0, 0x8a, 0x5f, 0x7f, 0xff, 0x4c, 0x90, 0x73, 0x6f, 0xfb, 0x5b,
0xe6, 0x48, 0x0d, 0xa3, 0x56, 0x08, 0x5a, 0x6a, 0xef, 0x36, 0x94, 0x64, 0xf5, 0x3b, 0x4e, 0xdb,
0x18, 0xcb, 0x70, 0x1c, 0xad, 0x67, 0x01, 0x3f, 0xe8, 0xaf, 0xec, 0x5d, 0xd4, 0xa5, 0x7e, 0x85,
0x7a, 0xf6, 0x2a, 0x27, 0xd7, 0xea, 0xf3, 0xf3, 0xef, 0xa6, 0xe7, 0x2f, 0x81, 0xb0, 0x37, 0xdd,
0x5b, 0x35, 0xca, 0xa7, 0xb8, 0x54, 0x0c, 0x51, 0x54, 0x79, 0x8d, 0x2e, 0x33, 0xf7, 0x9e, 0xe2,
0xa0, 0xb3, 0x46, 0xf3, 0xfa, 0x04, 0x32, 0x26, 0x74, 0x5a, 0xcf, 0xfa, 0x1a, 0xac, 0x6c, 0xe0,
0x2c, 0x06, 0x5f, 0xfa, 0x44, 0x3b, 0x3f, 0xcc, 0x7f, 0x71, 0x96, 0x20, 0x02, 0x31, 0x6a, 0xcf,
0x71, 0x6b, 0x00, 0x70, 0x5f, 0x94, 0x03, 0x5c, 0xbb, 0x8b, 0xc0, 0xcc, 0xb8, 0xe3, 0x72, 0x81,
0x61, 0x79, 0x1c, 0x87, 0xd4, 0xd9, 0x23, 0x4b, 0xe2, 0xc1, 0xb5, 0xb9, 0x82, 0x78, 0xb9, 0x83,
0x5d, 0x40, 0x02, 0x02, 0xd7, 0x35, 0x1b, 0x7c, 0x8f, 0x29, 0xe5, 0x05, 0x61, 0x4b, 0x03, 0x07,
0x06, 0xd7, 0x6c, 0x69, 0x86, 0x28, 0xe4, 0x45, 0x0e, 0x29, 0xae, 0x94, 0x23, 0x70, 0x70, 0x29,
0xad, 0xfa, 0x95, 0xf3, 0x87, 0x12, 0x6a, 0x00, 0x24, 0xee, 0xdb, 0x71, 0xc1, 0xde, 0x18, 0x60,
0x9a, 0xb3, 0xac, 0x9e, 0xe6, 0xa9, 0xf8, 0xa8, 0xbd, 0x8b, 0x5a, 0x62, 0x18, 0xee, 0x32, 0x76,
0x00, 0x38, 0x9f, 0x5e, 0x5b, 0x6f, 0x64, 0xca, 0xd0, 0xdd, 0xce, 0x7b, 0xb2, 0x7e, 0x54, 0xb3,
0xa2, 0x19, 0x45, 0x61, 0x1f, 0x4b, 0x02, 0xf5, 0x68, 0x39, 0x7a, 0xf7, 0x29, 0x58, 0x72, 0xcb,
0xf3, 0x34, 0x6f, 0xa4, 0x62, 0x8e, 0x2c, 0x18, 0xec, 0x0b, 0x9d, 0xfd, 0x52, 0xe5, 0x28, 0xb6,
0xc0, 0x01, 0xe3, 0x04, 0x48, 0x43, 0x51, 0x12, 0x73, 0xf7, 0x74, 0xb0, 0xbe, 0x19, 0x86, 0x0c,
0xb8, 0x98, 0x0f, 0x8d, 0x6a, 0xc9, 0x9e, 0xe3, 0xb6, 0xa6, 0x09, 0x59, 0x73, 0xea, 0x94, 0x6d,
0xf6, 0x7e, 0x98, 0x0c, 0x4c, 0xf2, 0xfd, 0x2e, 0xe3, 0x56, 0x0e, 0x70, 0x18, 0xd1, 0xf5, 0x5a,
0xa1, 0x94, 0xb5, 0x74, 0x7a, 0xaa, 0x20, 0x3e, 0x98, 0x6e, 0x1f, 0x49, 0x02, 0xd3, 0xfd, 0x09,
0xe0, 0xc8, 0x74, 0x5b, 0xb9, 0x41, 0x20, 0x36, 0xa5, 0xe0, 0x36, 0x1c, 0xf7, 0xe9, 0x03, 0xf0,
0xf2, 0xc9, 0x84, 0x12, 0xb1, 0xef, 0xdb, 0xf3, 0xe3, 0xcf, 0xfa, 0xf9, 0x15, 0x3b, 0xd0, 0x90,
0xfd, 0x50, 0x25, 0x27, 0x8d, 0x7b, 0x76, 0x99, 0x79, 0xe8, 0x9c, 0x8e, 0xe3, 0x38, 0x23, 0xc7,
0x80, 0xbf, 0xd1, 0x7b, 0x27, 0xf7, 0xae, 0xeb, 0xea, 0x5e, 0xb6, 0x06, 0x83, 0xbe, 0xfc, 0x3d,
0x0b, 0x3a, 0x4f, 0xe6, 0xec, 0xbb, 0xfb, 0x87, 0x41, 0x9d, 0x5b, 0x82, 0x09, 0x5a, 0xbb, 0xf5,
0xe4, 0x8d, 0x17, 0x94, 0x7e, 0x1b, 0x4c, 0x12, 0x67, 0xd4, 0x5d, 0x39, 0xb4, 0xba, 0xb3, 0x17,
0x94, 0xd9, 0xe0, 0x5f, 0x89, 0xd7, 0xe8, 0x10, 0x38, 0x21, 0xe7, 0x7e, 0xda, 0x4b, 0xd9, 0xb4,
0xc6, 0xf6, 0x76, 0x07, 0xf3, 0x64, 0xe9, 0xc9, 0x7d, 0x47, 0xee, 0xc0, 0x8e, 0x74, 0x29, 0x73,
0xaa, 0xd6, 0x59, 0xc6, 0xc2, 0x42, 0x53, 0x1f, 0xc8, 0x72, 0xf6, 0xf2, 0xb2, 0xcf, 0xa9, 0x00,
0x70, 0xda, 0x0d, 0xc0, 0x5f, 0xbd, 0x3c, 0x28, 0x70, 0x7f, 0x81, 0x98, 0x75, 0xd2, 0x01, 0xb3,
0x13, 0x3e, 0x07, 0x01, 0x87, 0x47, 0xda, 0x1f, 0xb0, 0xe1, 0x79, 0x2b, 0xe0, 0x6a, 0x0c, 0xcb,
0x04, 0x1a, 0xe7, 0xea, 0x48, 0xcc, 0x12, 0xf0, 0x87, 0xc5, 0x1e, 0x41, 0x3b, 0x63, 0xe2, 0x43,
0x26, 0xd5, 0x2d, 0x99, 0x1f, 0xf8, 0x36, 0x6c, 0x8b, 0x0d, 0x34, 0xd2, 0xe0, 0x25, 0x87, 0xce,
0xe9, 0x39, 0x92, 0xe1, 0x92, 0x80, 0xc6, 0xe3, 0x2e, 0xec, 0x1e, 0xd1, 0xd1, 0xa5, 0xa6, 0xbd,
0x9e, 0x03, 0xe6, 0x5f, 0x4d, 0x07, 0x42, 0xcd, 0x2c, 0xe7, 0x3c, 0x8c, 0x1c, 0xdb, 0xa8, 0xc4,
0xd1, 0x83, 0x43, 0xab, 0xdd, 0x72, 0xf8, 0x92, 0x0b, 0xb4, 0xe1, 0x96, 0x1e, 0xe0, 0x42, 0x71,
0x5c, 0x6c, 0xe8, 0xba, 0xc1, 0x7e, 0xf0, 0xeb, 0x00, 0xa5, 0x5d, 0xba, 0x37, 0xa2, 0x63, 0x8e,
0xcb, 0xfe, 0xe1, 0x26, 0xe0, 0xe1, 0x9b, 0x36, 0xf0, 0xbc, 0xf3, 0x48, 0x90, 0xcd, 0x3f, 0x1f,
0x96, 0xec, 0x81, 0xd3, 0x1e, 0x34, 0x09, 0x19, 0x13, 0xcb, 0x91, 0x82, 0x9f, 0x02, 0x2b, 0x31,
0xeb, 0x0b, 0x17, 0x51, 0x2b, 0x0f, 0x38, 0x14, 0xf1, 0x8f, 0xcc, 0x91, 0xf2, 0xb6, 0xb6, 0x79,
0xe7, 0xcb, 0x6c, 0x31, 0xff, 0xae, 0x6d, 0xce, 0x18, 0x1a, 0xe1, 0xed, 0x2e, 0xcb, 0x82, 0xb0,
0xcb, 0xc1, 0x67, 0xad, 0xc7, 0x69, 0x05, 0x5c, 0x9f, 0x33, 0xc0, 0xbf, 0xc8, 0x9c, 0x5a, 0x12,
0xc7, 0xd2, 0x12, 0x21, 0x14, 0xc7, 0x50, 0x47, 0xec, 0xf2, 0x95, 0x96, 0x60, 0x94, 0xd7, 0x7b,
0x43, 0x77, 0x9e, 0xd3, 0x27, 0x32, 0xbc, 0x1e, 0x58, 0x98, 0x49, 0xf4, 0x85, 0xd0, 0x65, 0x41,
0xb0, 0xba, 0x5f, 0x69, 0x97, 0x60, 0xe9, 0x0e, 0x8b, 0xd8, 0xed, 0x28, 0xc5, 0x5a, 0xad, 0x7a,
0x64, 0x92, 0x80, 0x07, 0x2b, 0xe4, 0x5e, 0x5d, 0xd3, 0xb7, 0x51, 0xd1, 0x4a, 0x80, 0x85, 0xe7,
0x90, 0x02, 0x96, 0x84, 0x5c, 0x88, 0x67, 0x38, 0x92, 0x24, 0xf5, 0xbc, 0x91, 0xbe, 0xb2, 0xf3,
0xb3, 0xf6, 0xde, 0x8e, 0xb7, 0xc5, 0x01, 0x77, 0x80, 0xe1, 0x19, 0x2b, 0x3f, 0x4e, 0x90, 0x72,
0xe7, 0xcf, 0x02, 0xc0, 0x65, 0x0f, 0x29, 0xbe, 0x95, 0x65, 0x5f, 0xec, 0xac, 0x3c, 0xe9, 0x0f,
0xd3, 0x90, 0xfd, 0x85, 0x05, 0x76, 0xc0, 0x79, 0x1e, 0xcd, 0x12, 0xd2, 0xc6, 0x96, 0x63, 0x0e,
0x4f, 0x4f, 0x01, 0xc6, 0xd3, 0xaa, 0x4a, 0x02, 0x0e, 0xcc, 0x71, 0x8a, 0x20, 0xa4, 0x4f, 0xf4,
0x44, 0x3e, 0x7c, 0x22, 0x8b, 0xe9, 0x13, 0xb4, 0x0e, 0xe2, 0x61, 0xc9, 0xb2, 0x90, 0xb5, 0xb4,
0xdc, 0xdb, 0x00, 0xe0, 0x04, 0xc1, 0x02, 0x1c, 0x11, 0x78, 0x2d, 0xab, 0x50, 0x4c, 0xff, 0xd6,
0xca, 0xbd, 0x38, 0x61, 0xa4, 0x69, 0xf2, 0xd4, 0x07, 0x8e, 0x3e, 0x0a, 0xf9, 0xc4, 0xeb, 0xfd,
0x49, 0x3b, 0x2f, 0x70, 0x54, 0x12, 0x4b, 0x72, 0x0c, 0x98, 0xed, 0x0b, 0xa1, 0x9f, 0xbd, 0x5f,
0xb3, 0x18, 0x2a, 0x14, 0x36, 0x36, 0x51, 0xdb, 0xa5, 0x12, 0xa6, 0xdf, 0x13, 0x24, 0xb3, 0x28,
0xe4, 0xdc, 0xdb, 0x33, 0xa8, 0x59, 0x31, 0x22, 0xa8, 0xb2, 0x9e, 0xbc, 0x5a, 0xcf, 0xdc, 0x76,
0x2e, 0x5e, 0x0f, 0xab, 0xc9, 0x78, 0x52, 0xcf, 0x19, 0x76, 0xcf, 0x7e, 0xdf, 0xcf, 0xd9, 0xb8,
0xfb, 0x87, 0x32, 0x0e, 0x80, 0xfb, 0xa2, 0x5d, 0x1a, 0x40, 0x6e, 0x47, 0xbd, 0xa2, 0x4c, 0x84,
0xf2, 0xb3, 0xd5, 0xf1, 0x97, 0xf2, 0xcb, 0x9b, 0x5d, 0x7f, 0x72, 0x00, 0x5c, 0xad, 0xa3, 0xd9,
0xe6, 0xb4, 0x51, 0x96, 0x2f, 0xe3, 0x54, 0x14, 0x4e, 0xbc, 0x2f, 0xfd, 0x91, 0xbf, 0x07, 0x81,
0x89, 0x47, 0x97, 0x1a, 0xd9, 0x96, 0x0d, 0x9c, 0xe7, 0x94, 0x0c, 0xb3, 0x90, 0xd2, 0x0b, 0xd8,
0x3c, 0x77, 0xf2, 0xc5, 0xdc, 0x55, 0x4d, 0x54, 0x0e, 0x3e, 0x2f, 0x49, 0x69, 0xb3, 0x2a, 0x00,
0x1c, 0xd1, 0x6e, 0x83, 0xa9, 0xe0, 0x45, 0xce, 0xfe, 0x1e, 0xa5, 0x74, 0x35, 0x86, 0x9c, 0xa6,
0x81, 0x1a, 0xfb, 0xd5, 0x21, 0x70, 0x18, 0xae, 0xb0, 0x14, 0xde, 0x7c, 0xc1, 0xee, 0xa8, 0x38,
0x8a, 0xd4, 0x93, 0x2c, 0x93, 0x44, 0x71, 0xd7, 0x43, 0x16, 0x76, 0x6e, 0xa8, 0x54, 0x65, 0x29,
0x97, 0xb1, 0xe9, 0x36, 0x03, 0xa6, 0xb2, 0xd7, 0xe1, 0x8c, 0xec, 0x8c, 0x94, 0xad, 0xc3, 0xea,
0x59, 0x5e, 0x22, 0x2a, 0x15, 0x86, 0x6b, 0x31, 0xa4, 0x6e, 0xe7, 0x31, 0x7b, 0x2f, 0x24, 0xfd,
0x87, 0x65, 0x60, 0x39, 0x19, 0x97, 0x14, 0xb5, 0x6f, 0x41, 0x3f, 0xd4, 0xa3, 0x86, 0x87, 0x33,
0x7b, 0xc7, 0x31, 0x70, 0x8b, 0x1b, 0x6c, 0xc8, 0x92, 0xa4, 0xc7, 0x8b, 0x95, 0x3d, 0xe8, 0x84,
0x22, 0x5c, 0xea, 0xfc, 0x90, 0x2e, 0x8b, 0x29, 0x53, 0x02, 0x7f, 0x2e, 0x94, 0xed, 0x80, 0xab,
0x73, 0x3c, 0x5b, 0x78, 0x36, 0xb2, 0x38, 0x57, 0xef, 0xe4, 0x4e, 0x5d, 0x6f, 0x08, 0xa2, 0xfc,
0xb8, 0xdc, 0xf4, 0x86, 0x6b, 0xc0, 0x69, 0x03, 0x7f, 0x82, 0x31, 0x53, 0xe0, 0x6c, 0xa9, 0xbf,
0x49, 0x93, 0xa4, 0x64, 0x07, 0xae, 0xdc, 0xbc, 0x47, 0x92, 0x94, 0x3a, 0x05, 0x29, 0x8f, 0xfc,
0xaf, 0x09, 0x10, 0x38, 0xb0, 0xde, 0xfc, 0x2f, 0xe6, 0xbf, 0x78, 0x91, 0xbe, 0xbf, 0x59, 0xe9,
0x99, 0xc6, 0x31, 0x00, 0x1c, 0xed, 0x04, 0x38, 0xb8, 0x00, 0x31, 0xe8, 0xbf, 0xd5, 0xee, 0xb8,
0x70, 0x77, 0x34, 0xa5, 0x07, 0xac, 0xc2, 0xb0, 0x34, 0xa5, 0x8b, 0xdd, 0xfc, 0x71, 0x47, 0x5f,
0xb8, 0x8d, 0x0e, 0x77, 0x38, 0x1f, 0x68, 0x8f, 0x1f, 0x8e, 0xff, 0xf0, 0xa9, 0xe7, 0xab, 0x03,
0x40, 0x5b, 0x6a, 0x71, 0x6d, 0xc7, 0x8f, 0x36, 0x9f, 0xd6, 0xd1, 0x7a, 0xc0, 0x6b, 0xac, 0x31,
0xd1, 0x70, 0x29, 0x6c, 0x61, 0x7f, 0x6f, 0xdc, 0x92, 0x77, 0xad, 0x18, 0x70, 0x23, 0x93, 0x05,
0x29, 0x2b, 0xb2, 0x24, 0x6a, 0x45, 0x74, 0xba, 0x9b, 0x5f, 0x08, 0x2c, 0x4d, 0x87, 0xc0, 0xd5,
0x3b, 0xa9, 0x00, 0xa7, 0x9c, 0xe7, 0x74, 0x86, 0x80, 0xb1, 0x20, 0xca, 0x79, 0x13, 0x5c, 0x7e,
0x5a, 0x42, 0x99, 0xc0, 0x61, 0xa3, 0xee, 0x89, 0xf2, 0x13, 0x28, 0x08, 0xb1, 0x29, 0x0f, 0x24,
0x31, 0xe3, 0x73, 0xfb, 0x53, 0xe6, 0x3c, 0x92, 0x04, 0x97, 0x80, 0x53, 0x38, 0x4e, 0x8b, 0xf8,
0x4c, 0xcf, 0x7e, 0xf1, 0x42, 0x3c, 0xd9, 0xc7, 0x26, 0xc3, 0x73, 0x2a, 0x91, 0x66, 0xe8, 0xd3,
0x0e, 0x81, 0xb3, 0xe8, 0x30, 0x54, 0xa3, 0xc6, 0x55, 0x6f, 0x37, 0x1f, 0xb3, 0x3a, 0x22, 0x41,
0x6f, 0x04, 0x42, 0x0e, 0xb8, 0xcb, 0xcc, 0xf5, 0xb0, 0x8d, 0xfd, 0x7c, 0x81, 0x00, 0x04, 0xd0,
0x69, 0x1c, 0x2c, 0x64, 0x6d, 0x9d, 0x1a, 0xaf, 0xa2, 0xae, 0xc0, 0x4f, 0xc4, 0xd1, 0x9a, 0xbd,
0xe7, 0x1e, 0x89, 0xe6, 0x60, 0x3f, 0xb6, 0x44, 0x20, 0x23, 0xe9, 0xa8, 0xed, 0x63, 0xba, 0xbc,
0x85, 0x13, 0x36, 0x25, 0x47, 0xae, 0x01, 0xe7, 0xff, 0x65, 0x96, 0x59, 0x7c, 0x36, 0xee, 0x55,
0x79, 0xa7, 0xcf, 0x1c, 0xa0, 0x50, 0x9f, 0x0c, 0xf1, 0x04, 0xc0, 0x89, 0x76, 0xc0, 0x35, 0x88,
0xcc, 0x11, 0x52, 0x87, 0x01, 0x3f, 0xd5, 0xf3, 0xbf, 0x9a, 0x35, 0xf1, 0xf1, 0x74, 0x7c, 0x27,
0xed, 0x28, 0x49, 0x94, 0x85, 0xbb, 0xb3, 0xea, 0xb8, 0xb8, 0xbf, 0xab, 0x6c, 0x8e, 0x5b, 0x9f,
0x2d, 0x98, 0xaf, 0x75, 0x85, 0xbf, 0x36, 0x3b, 0x29, 0xc9, 0xe2, 0x49, 0x07, 0xc0, 0x3d, 0x94,
0xa4, 0x67, 0xae, 0x01, 0x27, 0x7d, 0xd7, 0x06, 0xa9, 0xb5, 0x38, 0x45, 0x16, 0xa5, 0x14, 0x98,
0x66, 0xb2, 0x0a, 0x65, 0x9f, 0x62, 0x78, 0x1d, 0x7f, 0xba, 0x9f, 0xd3, 0xcf, 0x17, 0x57, 0xa8,
0x7a, 0xbf, 0x37, 0xfe, 0xab, 0x2b, 0xb0, 0x53, 0x76, 0xa2, 0x91, 0xa7, 0x58, 0x5d, 0x4c, 0x48,
0x70, 0x6f, 0x5f, 0x18, 0x4c, 0x71, 0x28, 0x80, 0x30, 0xa8, 0x51, 0xe0, 0x11, 0x2d, 0x94, 0xb7,
0x48, 0xcf, 0xd9, 0x21, 0x11, 0xd0, 0xd9, 0xe6, 0xa9, 0x5b, 0xc0, 0xad, 0xbf, 0x72, 0x60, 0x52,
0xb7, 0xfa, 0x08, 0x8e, 0xc3, 0x48, 0x01, 0x8a, 0x3b, 0xab, 0x5c, 0x76, 0x06, 0x1c, 0xda, 0xf7,
0xa1, 0x2c, 0xe6, 0x96, 0xa4, 0x3b, 0x7a, 0x1d, 0xcf, 0x37, 0x67, 0x9f, 0x6f, 0xa6, 0x56, 0x80,
0xb3, 0x75, 0xc0, 0xdf, 0x39, 0x9b, 0x0b, 0x80, 0x43, 0x07, 0xcc, 0xdb, 0x75, 0xfc, 0x6c, 0xe4,
0x2f, 0xdf, 0x4f, 0xed, 0xe4, 0x90, 0xad, 0x1a, 0xa5, 0x48, 0x92, 0x98, 0x7d, 0xff, 0xf3, 0xb6,
0xae, 0x79, 0x04, 0x65, 0xeb, 0xb8, 0x48, 0xc1, 0x2c, 0xed, 0x51, 0xbc, 0x00, 0xed, 0x1a, 0x49,
0x32, 0x3f, 0xb4, 0xcf, 0xda, 0x02, 0xe0, 0xcc, 0xae, 0x71, 0x9c, 0x24, 0x01, 0x51, 0xd9, 0xf7,
0x6e, 0x8e, 0x5c, 0xf8, 0x74, 0x85, 0xf2, 0x5e, 0xe9, 0xf1, 0xfd, 0xaa, 0x88, 0x4a, 0x87, 0xc0,
0xa1, 0x96, 0xfd, 0x87, 0x00, 0x01, 0xf0, 0x3f, 0x2c, 0x69, 0x0e, 0x98, 0xb4, 0x33, 0x9c, 0xe6,
0x8c, 0x7a, 0x4a, 0x0f, 0x2d, 0xf9, 0xb8, 0xf0, 0xcf, 0x3e, 0xf0, 0x7b, 0x4b, 0x11, 0x97, 0x56,
0x93, 0x6f, 0x29, 0x13, 0xc3, 0x8a, 0x96, 0x47, 0xc3, 0x2e, 0x33, 0xb7, 0xc7, 0x27, 0x32, 0x46,
0x86, 0x61, 0x79, 0x9a, 0xd6, 0x47, 0xef, 0x9c, 0xfb, 0x9e, 0x97, 0xc5, 0x14, 0x55, 0x2e, 0xee,
0xb4, 0x3f, 0x0d, 0xb0, 0x2a, 0x79, 0xce, 0x06, 0x38, 0x25, 0xee, 0xa8, 0x5e, 0x9b, 0xfa, 0x42,
0xcc, 0x78, 0x95, 0x9a, 0xd9, 0x95, 0x23, 0x3c, 0xbf, 0x33, 0x04, 0x18, 0x5e, 0x3f, 0xcb, 0xf6,
0xa2, 0xb2, 0xd9, 0xcd, 0x3c, 0xe1, 0xd9, 0xc1, 0x1b, 0xb9, 0xe2, 0x4b, 0xa1, 0x10, 0x98, 0xb9,
0x42, 0xd6, 0x8d, 0x35, 0x6d, 0x1c, 0xdc, 0x6b, 0xd8, 0xd5, 0x1c, 0x59, 0x78, 0xfe, 0x22, 0x6d,
0xcf, 0xa7, 0x5d, 0xfd, 0x6d, 0xe7, 0xa7, 0x82, 0xc0, 0xb5, 0xc9, 0x34, 0x0b, 0x79, 0x45, 0x56,
0x6f, 0x60, 0x36, 0x60, 0xb9, 0x91, 0x76, 0x2b, 0x7b, 0xce, 0x43, 0xb3, 0xcb, 0xc0, 0x7d, 0xd7,
0x66, 0xce, 0x03, 0x49, 0xce, 0x7d, 0x38, 0xaa, 0x0e, 0x81, 0x6a, 0x11, 0x4d, 0xe9, 0x79, 0x3e,
0x0d, 0x14, 0x97, 0x33, 0x1d, 0x67, 0x47, 0xda, 0xf7, 0x26, 0x1f, 0x88, 0x00, 0xd6, 0x3c, 0x07,
0xdc, 0x03, 0xe0, 0xdf, 0x5d, 0xda, 0x37, 0xa3, 0x9f, 0x37, 0xa2, 0x55, 0xca, 0x8b, 0x08, 0xcc,
0xd2, 0xca, 0xc4, 0x12, 0x43, 0x46, 0x8b, 0xba, 0xd7, 0xd4, 0x0e, 0x98, 0xb1, 0xed, 0x12, 0x49,
0x91, 0x06, 0x0a, 0x9c, 0x4e, 0x91, 0x97, 0x0e, 0x04, 0xb7, 0x7f, 0xdb, 0xb5, 0x5b, 0x01, 0x3f,
0x0e, 0x30, 0xa9, 0x95, 0x1f, 0x27, 0x59, 0x02, 0xc6, 0xbd, 0xae, 0xbe, 0x78, 0x2e, 0x5d, 0xb5,
0x40, 0x84, 0x36, 0x78, 0xf0, 0x52, 0x78, 0xbe, 0xc3, 0x87, 0x20, 0x1c, 0x72, 0x5c, 0x0b, 0x00,
0x5c, 0x6e, 0x2e, 0x6c, 0x0c, 0x61, 0xc9, 0x9d, 0xc9, 0x42, 0xe6, 0xda, 0xae, 0xf6, 0x41, 0xd7,
0x7a, 0x63, 0xef, 0x65, 0x09, 0xf9, 0xa2, 0x9c, 0xf3, 0xf4, 0xf0, 0xd2, 0xbe, 0x2d, 0xca, 0xf1,
0xd7, 0x21, 0x70, 0x82, 0x53, 0xe0, 0x26, 0x48, 0xd2, 0xf3, 0xf4, 0x22, 0x0d, 0x5c, 0x0b, 0x58,
0x21, 0x2f, 0xd6, 0xbc, 0x65, 0x0f, 0x9c, 0xe0, 0x9a, 0x8e, 0xcb, 0x97, 0xa4, 0x4d, 0xdd, 0xef,
0x08, 0x42, 0x61, 0x1a, 0xfc, 0x82, 0xb6, 0xc7, 0x2b, 0x04, 0x1c, 0x00, 0xa5, 0xf5, 0xe0, 0xe0,
0x23, 0x4a, 0x41, 0x88, 0x81, 0xa3, 0x79, 0x2a, 0xf6, 0xd4, 0xea, 0xd1, 0x0d, 0x6b, 0x68, 0x80,
0x40, 0xd4, 0x60, 0x44, 0xf1, 0x16, 0xc9, 0x6a, 0xd5, 0xe0, 0x33, 0x22, 0x30, 0x14, 0x6d, 0x08,
0xfb, 0x36, 0xd3, 0x9c, 0x9e, 0x32, 0xb0, 0x0c, 0x47, 0x25, 0x46, 0xaf, 0x1c, 0x13, 0x50, 0x57,
0x69, 0x48, 0xfa, 0xa7, 0x80, 0x53, 0xcf, 0x02, 0x28, 0x64, 0x0d, 0x52, 0xbe, 0x8a, 0x76, 0x4a,
0x9e, 0x2c, 0x98, 0x02, 0xc1, 0x49, 0x0e, 0x81, 0x6b, 0x97, 0x2c, 0xcb, 0x52, 0xa1, 0x9c, 0x93,
0x7a, 0x71, 0xff, 0x37, 0xbb, 0x22, 0x81, 0xb1, 0x00, 0x2c, 0xbe, 0x1b, 0x3d, 0x70, 0xbb, 0x49,
0xf0, 0xec, 0xb3, 0x01, 0x16, 0xc3, 0x88, 0x85, 0x85, 0xd9, 0x0f, 0xaf, 0xad, 0x1f, 0x55, 0x43,
0xd9, 0xeb, 0xe2, 0xcc, 0xfb, 0x2b, 0x0b, 0xb8, 0x7a, 0x3f, 0x82, 0xe5, 0x71, 0xb1, 0xf8, 0xd5,
0x61, 0x20, 0x82, 0x2f, 0x77, 0xb0, 0x3d, 0xc7, 0x65, 0xe0, 0x9e, 0x4b, 0xd2, 0xc1, 0x5f, 0x0a,
0x44, 0x41, 0x4a, 0xdb, 0xe5, 0x63, 0xdf, 0x1a, 0xa1, 0x62, 0xc0, 0x01, 0x73, 0xa4, 0x66, 0xc0,
0xe0, 0x2d, 0x11, 0x80, 0x89, 0x8c, 0xac, 0x9e, 0xa6, 0x19, 0xee, 0x52, 0xd8, 0xca, 0x11, 0x35,
0xd5, 0x1a, 0x1c, 0x27, 0x2c, 0x7d, 0x0c, 0x81, 0x84, 0xd4, 0x78, 0x28, 0x65, 0xe9, 0x5e, 0x1d,
0x61, 0xdf, 0x66, 0x25, 0x54, 0x6d, 0xa0, 0x69, 0xea, 0xd2, 0xb6, 0x19, 0x01, 0xde, 0x4a, 0x45,
0xd7, 0x9f, 0x01, 0x0e, 0x6a, 0x8f, 0x36, 0x69, 0xb2, 0x24, 0x6e, 0xaa, 0x03, 0xb5, 0x68, 0xa3,
0xfd, 0x60, 0xba, 0x6f, 0x42, 0x3d, 0xe2, 0x10, 0xb8, 0x0e, 0x77, 0x65, 0xf3, 0x4b, 0x31, 0x73,
0xcf, 0xa7, 0x03, 0x3a, 0xb5, 0x6a, 0xd7, 0x77, 0xec, 0xe1, 0xa7, 0x82, 0x28, 0x66, 0xfd, 0x60,
0x5f, 0x02, 0x8f, 0xa1, 0x6d, 0x56, 0x5d, 0xcb, 0x82, 0x7b, 0xfa, 0x24, 0x31, 0xf7, 0xd9, 0xbd,
0x0d, 0xc3, 0xea, 0x94, 0x21, 0x2f, 0xcb, 0x02, 0xae, 0xc7, 0x4d, 0x41, 0xce, 0xfd, 0xb6, 0xf8,
0xd5, 0x52, 0x53, 0xa1, 0x0c, 0xe3, 0x95, 0xaf, 0x09, 0x5c, 0x81, 0x59, 0x78, 0x0a, 0x5c, 0x1d,
0xa0, 0xda, 0x1f, 0x0c, 0xd2, 0x42, 0xdc, 0xac, 0xb0, 0xab, 0x18, 0x70, 0x38, 0x06, 0x65, 0x22,
0xe6, 0x37, 0xfe, 0xab, 0x5f, 0x63, 0x39, 0x23, 0x9b, 0xc8, 0xf0, 0x24, 0x45, 0xf1, 0xa1, 0xcb,
0x8a, 0x3a, 0x0e, 0xc1, 0xc6, 0xbd, 0x40, 0x7f, 0xe1, 0x2a, 0xb4, 0x7e, 0xff, 0xcf, 0x0e, 0x5d,
0x01, 0x2e, 0x3b, 0xcd, 0xea, 0x59, 0x36, 0x29, 0x21, 0x22, 0x64, 0x7c, 0x80, 0x45, 0x69, 0xa2,
0xa8, 0x6b, 0x2d, 0x99, 0xcb, 0x00, 0x8e, 0xd8, 0x60, 0x12, 0x0a, 0x1f, 0xce, 0x03, 0x47, 0x6a,
0x6d, 0x78, 0x26, 0xcb, 0x29, 0x13, 0x61, 0x33, 0x08, 0x47, 0xc0, 0x69, 0x7d, 0xbe, 0x7d, 0x64,
0x7a, 0xb4, 0xa9, 0x07, 0x56, 0xbc, 0xd1, 0xaf, 0xdd, 0xd1, 0x74, 0x51, 0x2e, 0x38, 0xee, 0xd0,
0x44, 0xd1, 0x76, 0x9a, 0x75, 0xf6, 0x7e, 0x06, 0x2c, 0x61, 0x90, 0xa4, 0x9c, 0x1b, 0x9f, 0x3b,
0x4f, 0x29, 0x94, 0x01, 0x5c, 0x0d, 0xe0, 0xbb, 0xc9, 0x77, 0x5f, 0xf9, 0x6e, 0x03, 0xce, 0x17,
0xca, 0x59, 0x27, 0x6d, 0xd3, 0x81, 0xae, 0x03, 0x27, 0xfd, 0x01, 0x84, 0x7b, 0x16, 0x1c, 0xd3,
0xbd, 0xa9, 0x76, 0xc7, 0x2b, 0x06, 0x1c, 0x98, 0x02, 0x60, 0xc6, 0x03, 0x3f, 0xa1, 0xf1, 0xec,
0xed, 0x11, 0xb1, 0x14, 0xcd, 0x50, 0xba, 0x44, 0x8a, 0xa2, 0x63, 0x0f, 0x2d, 0x79, 0xdf, 0x0f,
0xb5, 0xd4, 0x34, 0xc0, 0x56, 0x86, 0xf0, 0x21, 0x49, 0x57, 0x98, 0x44, 0xbd, 0x9e, 0x22, 0x59,
0x9e, 0xa7, 0x23, 0x42, 0x66, 0xf7, 0x84, 0x92, 0x14, 0xc7, 0x01, 0x53, 0xaa, 0x50, 0xcc, 0x95,
0x24, 0x83, 0x73, 0x51, 0x09, 0x8c, 0x89, 0x3b, 0x7f, 0x14, 0x66, 0x9d, 0x04, 0x76, 0x44, 0xdb,
0x9b, 0xb9, 0x32, 0xf0, 0xe1, 0x08, 0x27, 0xc0, 0x21, 0xda, 0x0e, 0x8b, 0x7f, 0xfa, 0xbc, 0x11,
0x01, 0x57, 0xaa, 0xc5, 0xf9, 0xe8, 0x75, 0x1c, 0x4c, 0x45, 0x5a, 0x5b, 0x07, 0xf7, 0x83, 0x82,
0xbe, 0xed, 0xc4, 0x3d, 0xd7, 0xd2, 0x72, 0x80, 0x6f, 0x20, 0xfc, 0xf1, 0x74, 0xe2, 0x3b, 0xce,
0x58, 0xae, 0x0c, 0xe0, 0x1a, 0x9d, 0xcf, 0x11, 0x84, 0xfd, 0xaf, 0x38, 0xba, 0xcd, 0xd6, 0x3c,
0xb9, 0xc0, 0x2e, 0x5e, 0x59, 0x01, 0x1d, 0xf7, 0x52, 0x94, 0xb3, 0x93, 0x0f, 0x3e, 0x15, 0x65,
0x29, 0xb2, 0x9e, 0xed, 0xf1, 0x8a, 0x01, 0xa7, 0xd2, 0x42, 0x21, 0x48, 0x00, 0xc9, 0xf8, 0xb6,
0x5f, 0xff, 0xd9, 0x27, 0x28, 0x1d, 0xcb, 0x30, 0x14, 0x0f, 0xf3, 0xad, 0xe1, 0xdb, 0xc6, 0xbf,
0x0b, 0x4b, 0x7f, 0xd4, 0x1a, 0x8f, 0xda, 0x63, 0x56, 0x1f, 0xbb, 0xc2, 0x18, 0x79, 0x03, 0x0c,
0x4d, 0x27, 0x72, 0x27, 0xbe, 0xee, 0xdf, 0xba, 0x26, 0xac, 0x53, 0x80, 0x6a, 0x0f, 0x9a, 0xff,
0x98, 0x2b, 0xfb, 0x01, 0xca, 0xe0, 0x38, 0xac, 0xc1, 0x3c, 0x93, 0x5c, 0xf8, 0x6c, 0x54, 0x8d,
0x7a, 0x9f, 0x66, 0xca, 0xd2, 0x93, 0x21, 0x8a, 0x04, 0x71, 0x0c, 0x1c, 0xa6, 0xb1, 0x98, 0xe3,
0xc5, 0xdd, 0xa2, 0xf1, 0x4e, 0x19, 0x92, 0x68, 0x76, 0x12, 0x28, 0x84, 0x39, 0xce, 0x56, 0x13,
0x56, 0xdd, 0x01, 0x17, 0x95, 0xe4, 0xc7, 0x1b, 0x9c, 0xf1, 0x9c, 0x73, 0xe0, 0xd0, 0x01, 0x0f,
0x25, 0xd1, 0x54, 0xb2, 0x8f, 0xcc, 0x73, 0x62, 0xba, 0x2c, 0xa5, 0x4f, 0xa8, 0xfe, 0x9a, 0xc0,
0x15, 0x48, 0x82, 0xf8, 0xf2, 0xc6, 0x90, 0x26, 0x9b, 0x80, 0xde, 0xcc, 0x99, 0x63, 0xab, 0x60,
0x2a, 0xa8, 0xe3, 0x8a, 0xfe, 0x87, 0xa6, 0x3c, 0xde, 0xf8, 0xa3, 0xe0, 0x53, 0x71, 0x30, 0x3d,
0x43, 0xf1, 0x34, 0x43, 0xc6, 0x1e, 0xdb, 0x36, 0xba, 0x9b, 0x5f, 0x7d, 0xbf, 0xf7, 0x46, 0x2c,
0x0a, 0xbb, 0x04, 0x58, 0x51, 0x6f, 0x34, 0xea, 0x69, 0x23, 0x77, 0x7a, 0xf3, 0x47, 0x1d, 0x35,
0x48, 0xc5, 0x3b, 0x8a, 0x02, 0x77, 0x80, 0xe3, 0x39, 0x2b, 0x77, 0xe0, 0x15, 0xc7, 0x21, 0xbd,
0x52, 0x24, 0x39, 0x67, 0x53, 0x9b, 0xc0, 0xfd, 0x79, 0xe6, 0x9c, 0x8b, 0x96, 0x80, 0xa8, 0x43,
0x07, 0xdc, 0x9e, 0xd4, 0xd7, 0x04, 0x51, 0x3e, 0xde, 0xc4, 0xa9, 0xe9, 0x41, 0x78, 0x36, 0x19,
0xb2, 0x0a, 0x56, 0x36, 0xe5, 0xa6, 0x7c, 0xe8, 0x24, 0x96, 0x02, 0x63, 0x8d, 0x8e, 0x80, 0x43,
0x91, 0x5a, 0xd3, 0xc1, 0xb2, 0x78, 0xf2, 0x61, 0x89, 0x40, 0xe9, 0x95, 0x22, 0x4a, 0xb9, 0xab,
0x1a, 0x59, 0x9f, 0x67, 0x01, 0xae, 0xec, 0x6e, 0xc8, 0x48, 0x51, 0xe4, 0x44, 0xc8, 0x9e, 0x5a,
0x0f, 0xeb, 0x94, 0x0a, 0x14, 0xdd, 0xb5, 0x21, 0x36, 0xc7, 0x2b, 0x06, 0x9c, 0x2d, 0xf9, 0xf6,
0xdf, 0x1c, 0x16, 0x4b, 0xea, 0x13, 0x39, 0x8a, 0x35, 0xf2, 0x46, 0x86, 0x8c, 0x89, 0xba, 0x14,
0xaf, 0xa3, 0x19, 0x60, 0xfd, 0xf3, 0x5c, 0x82, 0x3e, 0xf6, 0xd4, 0x96, 0x19, 0x0d, 0x09, 0x95,
0xaa, 0x9a, 0xba, 0xe2, 0xdd, 0x82, 0x80, 0x03, 0x0e, 0x4c, 0x1f, 0x6b, 0xe0, 0xa4, 0x62, 0xe0,
0xd4, 0xcb, 0x9f, 0x9a, 0xa5, 0xf4, 0xcf, 0xd7, 0x66, 0x15, 0x16, 0xdc, 0x29, 0x76, 0x9a, 0x5c,
0x03, 0x0e, 0x99, 0x9f, 0x21, 0x4b, 0xf7, 0x27, 0x94, 0xd9, 0x0b, 0x1a, 0xed, 0xba, 0x07, 0xa6,
0x37, 0x6e, 0x2b, 0xba, 0xca, 0x5e, 0x60, 0x3a, 0x03, 0x0e, 0x41, 0xba, 0xff, 0x22, 0x08, 0x39,
0x67, 0x4b, 0x15, 0x19, 0xd5, 0x39, 0x6c, 0x7a, 0x29, 0xdd, 0x1b, 0x65, 0x6d, 0x10, 0xce, 0x79,
0xe4, 0x32, 0xc7, 0x49, 0x30, 0x78, 0x46, 0x10, 0xd3, 0x1f, 0x48, 0x42, 0xde, 0xfd, 0xbe, 0xd6,
0x5f, 0xee, 0x4f, 0x00, 0x07, 0x8d, 0x48, 0x55, 0xeb, 0xd1, 0xdb, 0x8e, 0xc5, 0x93, 0x14, 0xc3,
0xea, 0x61, 0x15, 0x34, 0xf0, 0xcb, 0x99, 0x44, 0x9a, 0x4a, 0xd4, 0xf1, 0x06, 0x26, 0xe1, 0xdc,
0xb6, 0xcf, 0x5a, 0xbf, 0x85, 0xe0, 0x1e, 0xd8, 0xeb, 0x34, 0x13, 0x2d, 0x13, 0x38, 0xa4, 0xeb,
0x45, 0x41, 0x92, 0xcf, 0xde, 0x06, 0x46, 0xe2, 0x8e, 0x22, 0xe1, 0xef, 0x2a, 0x70, 0xe3, 0x1e,
0xc2, 0x20, 0x75, 0x39, 0x27, 0xf5, 0xb8, 0x9b, 0x0b, 0x3c, 0x8e, 0x35, 0x8e, 0x0f, 0x3a, 0x07,
0x6e, 0xdc, 0x03, 0xb3, 0x90, 0xb6, 0xb5, 0x34, 0x4c, 0x4b, 0x9f, 0xbc, 0x10, 0x33, 0xe1, 0xdd,
0x4a, 0xe1, 0x5f, 0x01, 0x51, 0x29, 0xfd, 0x14, 0x08, 0x6b, 0xd2, 0x5a, 0xad, 0x31, 0x09, 0x52,
0xf6, 0x56, 0x6b, 0xd5, 0xfc, 0x27, 0x80, 0xc3, 0x55, 0x1a, 0x0c, 0xc5, 0x08, 0xbf, 0x6e, 0x8b,
0xf6, 0xc5, 0xc2, 0xa2, 0x48, 0x86, 0x06, 0x4e, 0x36, 0x43, 0xeb, 0x75, 0x14, 0x99, 0xc8, 0xc4,
0x86, 0x2f, 0x19, 0xea, 0x07, 0x0b, 0x5a, 0x10, 0x58, 0x8c, 0xe4, 0x5a, 0xa5, 0x51, 0x69, 0x2a,
0x1b, 0x38, 0x64, 0xba, 0x20, 0x88, 0xd9, 0xb9, 0xc2, 0x0b, 0x53, 0x60, 0xd1, 0x1b, 0xae, 0x02,
0x37, 0xe8, 0xaa, 0x64, 0x4e, 0x5d, 0x5b, 0x8e, 0x08, 0xd0, 0x2e, 0x7e, 0x2c, 0x48, 0xe2, 0x55,
0xc7, 0x07, 0x9d, 0x01, 0x47, 0xa8, 0x37, 0xe4, 0x48, 0xe6, 0xdb, 0x03, 0x4a, 0xfc, 0x77, 0x02,
0xe9, 0x70, 0x59, 0x2a, 0x14, 0xce, 0x58, 0x07, 0x88, 0x2a, 0xe2, 0x0e, 0x7c, 0xd3, 0x06, 0x38,
0x3d, 0x5a, 0xa2, 0xd5, 0x19, 0x93, 0x2c, 0xa7, 0x6f, 0xb5, 0x3a, 0xfe, 0x27, 0x80, 0xd3, 0xa0,
0x5a, 0x0f, 0x60, 0xfe, 0xe3, 0x48, 0xcb, 0xfe, 0x4b, 0x0e, 0xfc, 0x07, 0x3e, 0x48, 0x87, 0xe7,
0x39, 0x1e, 0x68, 0x3c, 0x86, 0x21, 0xcf, 0x2d, 0x1b, 0xd1, 0xb2, 0x2e, 0x82, 0x6a, 0xd0, 0x6a,
0xca, 0xae, 0x0e, 0x4d, 0x65, 0x03, 0xd7, 0xe2, 0x99, 0xd2, 0x49, 0xe5, 0xe5, 0xcd, 0xe2, 0x58,
0xa0, 0xab, 0xc0, 0xf5, 0x39, 0x23, 0x49, 0x69, 0xdf, 0xa8, 0xcb, 0x59, 0x49, 0xdd, 0xaf, 0x09,
0x82, 0xfc, 0x08, 0x75, 0xd8, 0xa3, 0xcc, 0x29, 0xc7, 0x11, 0x17, 0x81, 0x15, 0x71, 0x77, 0xf1,
0xbc, 0x52, 0x34, 0xff, 0x26, 0xf0, 0x0c, 0x1f, 0x97, 0x8e, 0x57, 0x6a, 0x91, 0x79, 0xae, 0x8a,
0xca, 0x7c, 0x73, 0x51, 0x22, 0x15, 0x79, 0x6b, 0x42, 0xb2, 0x24, 0x15, 0x3e, 0xb6, 0x62, 0xb9,
0x3f, 0x23, 0x2a, 0x31, 0x02, 0xd5, 0xa8, 0xd5, 0x04, 0x4a, 0x68, 0xab, 0x57, 0x1f, 0x1e, 0x7c,
0xe4, 0x12, 0x4d, 0xd2, 0x8c, 0xce, 0xc8, 0xc4, 0x29, 0x0f, 0xfc, 0xd3, 0x2a, 0x09, 0x54, 0xb5,
0xd2, 0x2b, 0x51, 0x83, 0xba, 0x5a, 0xd0, 0xf1, 0x8a, 0xca, 0x01, 0x0e, 0x81, 0xb5, 0x89, 0x22,
0xf0, 0xe1, 0x8a, 0x01, 0x70, 0x0d, 0x38, 0x02, 0x00, 0x67, 0x96, 0x9e, 0x6d, 0x28, 0xf7, 0xf6,
0xbb, 0x80, 0x3b, 0x97, 0x5e, 0xcf, 0x21, 0xba, 0x4e, 0x80, 0xd3, 0x62, 0x6d, 0x4d, 0x32, 0x74,
0x25, 0x94, 0x9a, 0x6d, 0x0b, 0x0f, 0x25, 0x66, 0xe4, 0x00, 0x00, 0x0e, 0x4c, 0x49, 0x44, 0x41,
0x54, 0x41, 0xef, 0x59, 0x92, 0x25, 0xeb, 0x93, 0x27, 0x3e, 0x10, 0x84, 0x74, 0x97, 0x12, 0xa9,
0x30, 0xc8, 0x0c, 0x87, 0x00, 0xfe, 0x0d, 0x80, 0x1d, 0x5d, 0x2f, 0x96, 0xaa, 0x8a, 0xff, 0x93,
0xc6, 0x09, 0x51, 0x4d, 0x5d, 0xe4, 0x50, 0xe3, 0xbe, 0x23, 0x56, 0x87, 0x47, 0xc7, 0x53, 0x71,
0x97, 0x8e, 0xed, 0x1e, 0xdd, 0x12, 0x55, 0xf2, 0x06, 0x2a, 0xe5, 0x69, 0x9c, 0xaf, 0xd7, 0x39,
0x01, 0x58, 0x95, 0xb4, 0x8d, 0x55, 0x29, 0x94, 0x06, 0x6e, 0xc8, 0x6d, 0x59, 0x2e, 0x5d, 0xf1,
0xe5, 0xb2, 0xa8, 0xbc, 0x0c, 0x44, 0x65, 0x79, 0x85, 0x0a, 0x28, 0xb2, 0x4a, 0x10, 0xcc, 0xe9,
0x8e, 0x2b, 0x69, 0x9d, 0x71, 0x1c, 0x36, 0x51, 0x2e, 0x02, 0x4e, 0xb4, 0xec, 0x30, 0x11, 0x0a,
0xc1, 0x6f, 0x32, 0x30, 0x73, 0xd6, 0x5b, 0xb5, 0xcf, 0x1a, 0x90, 0x2c, 0x09, 0x59, 0xcb, 0x91,
0xf2, 0x08, 0xfa, 0x71, 0xb0, 0x92, 0x59, 0x99, 0x49, 0x02, 0x3b, 0x9e, 0x2d, 0x0a, 0xe9, 0x7b,
0x4a, 0xa5, 0x7b, 0xff, 0x1c, 0x70, 0xa5, 0x86, 0xad, 0x42, 0xbd, 0x7b, 0x0e, 0x9d, 0xf1, 0xd9,
0xc7, 0x23, 0xfe, 0xd5, 0xf4, 0x4f, 0x5f, 0xcc, 0x52, 0x2c, 0xc4, 0x40, 0x3f, 0xae, 0xe4, 0x2d,
0x2b, 0xe0, 0xb4, 0xc0, 0x97, 0x7b, 0x21, 0x3d, 0x19, 0xf6, 0xca, 0x64, 0x77, 0x11, 0x38, 0x62,
0x6c, 0x8a, 0x20, 0x3d, 0x9a, 0x57, 0xee, 0xae, 0xb0, 0x55, 0xb2, 0x28, 0xa5, 0xd5, 0x73, 0x78,
0xcc, 0x49, 0x76, 0x40, 0x53, 0xef, 0x47, 0x41, 0x7a, 0x29, 0x14, 0xef, 0x0b, 0x52, 0xf6, 0x06,
0x29, 0x3f, 0x81, 0xb2, 0x0c, 0x2c, 0x39, 0x0d, 0x43, 0xda, 0x5e, 0x06, 0xa7, 0xec, 0x72, 0x24,
0x82, 0xac, 0x5c, 0x35, 0x58, 0x82, 0x5e, 0xf8, 0xdd, 0xab, 0x64, 0x46, 0x9f, 0xe3, 0xf9, 0xe2,
0x1f, 0xe9, 0xb3, 0x4a, 0x0a, 0xf0, 0x2b, 0x0b, 0x38, 0x54, 0x85, 0x63, 0xd5, 0x3d, 0xff, 0x5f,
0x43, 0x5f, 0xaf, 0x4a, 0xe9, 0x13, 0x5a, 0x1e, 0x70, 0x08, 0xd2, 0xe9, 0x72, 0x66, 0xea, 0x8f,
0x25, 0x99, 0x70, 0x67, 0xc0, 0xd9, 0x68, 0x29, 0x62, 0x56, 0xba, 0x20, 0xdc, 0x75, 0x54, 0x1b,
0x6e, 0x7d, 0xda, 0x0e, 0x51, 0x16, 0x9f, 0x39, 0x76, 0xe4, 0x9c, 0xa5, 0x75, 0x7a, 0xdc, 0x10,
0x24, 0x21, 0xf9, 0xfb, 0x1d, 0x56, 0xf4, 0x3f, 0xb7, 0x81, 0x1b, 0x9d, 0xf2, 0x49, 0xe9, 0xf3,
0x7c, 0x0e, 0x9a, 0x25, 0x73, 0x64, 0xb9, 0xba, 0xc3, 0x06, 0x38, 0x9f, 0x89, 0xa9, 0xa2, 0x90,
0x77, 0xa3, 0xc4, 0x9b, 0xab, 0x34, 0xe0, 0x60, 0x24, 0x0c, 0x3e, 0xf5, 0x0f, 0xad, 0x94, 0x6e,
0xd8, 0xe5, 0x72, 0x1c, 0x82, 0x54, 0x6f, 0xd5, 0x44, 0x79, 0x2e, 0xb2, 0xe5, 0x0d, 0x17, 0x39,
0x0e, 0x3d, 0x0a, 0x78, 0xe0, 0xf0, 0x3b, 0xe5, 0x9d, 0xd6, 0xe1, 0xb2, 0x28, 0x40, 0xab, 0xd2,
0xb1, 0x71, 0xe2, 0x10, 0xb8, 0xb7, 0xb6, 0xa6, 0x99, 0xcd, 0xa9, 0xd3, 0x71, 0xeb, 0x5a, 0x7d,
0x6c, 0x5c, 0x8a, 0x2c, 0x65, 0x9f, 0x29, 0xb9, 0x21, 0x41, 0x68, 0x3f, 0xfd, 0x43, 0x12, 0xd2,
0x1d, 0x14, 0xd2, 0x5b, 0x93, 0x0d, 0x70, 0xc0, 0x1a, 0x7d, 0x00, 0x44, 0xf0, 0x83, 0x57, 0x9b,
0x6e, 0x2b, 0x0b, 0x38, 0x30, 0x60, 0xc0, 0xe9, 0x6a, 0xa2, 0x78, 0x9b, 0xfe, 0x9f, 0xa4, 0x72,
0x80, 0x2b, 0x9a, 0xd0, 0x52, 0x51, 0x4f, 0x17, 0x81, 0x6b, 0xf4, 0xd8, 0x2c, 0x0a, 0xe5, 0xd7,
0xc6, 0xcd, 0x4a, 0x11, 0xc5, 0xbc, 0x3d, 0x8e, 0x8f, 0x39, 0x01, 0xce, 0xff, 0x6c, 0x8e, 0x54,
0x70, 0x75, 0x90, 0x4d, 0xfd, 0x03, 0xd6, 0xe3, 0x38, 0x30, 0xa2, 0x7e, 0x2f, 0x91, 0x95, 0x00,
0xd7, 0xc0, 0x6c, 0x49, 0x90, 0xa6, 0xd8, 0xef, 0xf5, 0xb5, 0xad, 0xab, 0xb4, 0x01, 0xce, 0xff,
0x3b, 0xf1, 0x85, 0x58, 0xf8, 0xaa, 0xa0, 0xbe, 0xd2, 0x38, 0x0e, 0xa9, 0x1c, 0x56, 0x2b, 0xbe,
0x5c, 0xb9, 0xa2, 0xd2, 0xa6, 0x6a, 0xdb, 0x35, 0xe0, 0x6a, 0xad, 0x00, 0xa6, 0x9a, 0xa9, 0x43,
0x39, 0x67, 0x21, 0x6d, 0xaf, 0x65, 0x8b, 0xf2, 0xa3, 0xa9, 0xf0, 0xfa, 0xf6, 0x7e, 0x83, 0x13,
0xe0, 0x06, 0x3c, 0x32, 0xcb, 0xb9, 0x6b, 0x9a, 0xd8, 0x54, 0x73, 0x60, 0x3e, 0xf3, 0xb3, 0x24,
0x31, 0xbd, 0xa4, 0x28, 0x97, 0xc0, 0xd4, 0x35, 0x6e, 0x98, 0x0b, 0x9e, 0x5f, 0xb3, 0xdd, 0xaf,
0xea, 0x59, 0xcb, 0x3a, 0x4c, 0x61, 0x07, 0x1c, 0xde, 0xe2, 0xbe, 0x59, 0x94, 0x1f, 0x7e, 0x59,
0xc3, 0xb2, 0x32, 0x2a, 0x0b, 0xb8, 0xe2, 0xce, 0xf4, 0x95, 0x44, 0xae, 0x00, 0xa7, 0x6c, 0xc9,
0x2c, 0xfe, 0xdd, 0x21, 0x70, 0xfe, 0xbd, 0xac, 0xb7, 0xf3, 0x6b, 0x3f, 0xb9, 0x2b, 0x4b, 0xe6,
0x9b, 0x36, 0x75, 0x20, 0x75, 0x7a, 0xb5, 0xb5, 0x5e, 0xec, 0xad, 0x96, 0x67, 0xc8, 0x62, 0xfe,
0x8f, 0x9d, 0x2c, 0x13, 0x6d, 0x3b, 0x34, 0xc7, 0xc0, 0x79, 0x4e, 0xcf, 0x90, 0x85, 0xf4, 0x29,
0xca, 0x00, 0x4a, 0xf3, 0x9c, 0x76, 0xd8, 0x53, 0xe1, 0x8f, 0xdc, 0xb5, 0xaf, 0x24, 0x23, 0x00,
0x8e, 0x58, 0x95, 0x59, 0x28, 0x66, 0xfc, 0x62, 0x3d, 0xb4, 0x3e, 0xeb, 0xf7, 0x4f, 0xb5, 0x1e,
0xbb, 0x0d, 0x70, 0xe0, 0xa2, 0x2b, 0xd2, 0x44, 0x31, 0xfb, 0x76, 0xa0, 0xa5, 0x4f, 0x45, 0xa5,
0x01, 0x57, 0xc9, 0x64, 0xe7, 0xc7, 0xe1, 0xe7, 0x05, 0xb1, 0x8c, 0xbd, 0x6e, 0x81, 0x3f, 0x17,
0xd8, 0x95, 0xa0, 0x4f, 0xbc, 0x27, 0x64, 0xee, 0x9a, 0xd0, 0x06, 0xe2, 0x04, 0x35, 0x8f, 0xcf,
0xd8, 0x1f, 0x33, 0x25, 0xa9, 0xe0, 0xa6, 0x4d, 0xb8, 0xb6, 0xc7, 0x19, 0x31, 0xeb, 0xce, 0x8f,
0x63, 0x7b, 0xf9, 0xd7, 0xd0, 0x28, 0xcd, 0x10, 0x02, 0xc7, 0xdd, 0xc9, 0x95, 0xe5, 0xec, 0x9b,
0x81, 0x4e, 0xee, 0x34, 0xe1, 0xbe, 0x28, 0xa4, 0xd8, 0xf5, 0xd8, 0xe9, 0x7e, 0x54, 0x90, 0xf2,
0xef, 0xb4, 0xb3, 0x3f, 0xbd, 0xd1, 0xc5, 0x1c, 0xe0, 0x96, 0x8f, 0x2a, 0xfd, 0x56, 0x8b, 0x55,
0x26, 0x49, 0x2c, 0x48, 0x5e, 0xde, 0xb6, 0x28, 0x8f, 0xe0, 0xd9, 0x6c, 0xe4, 0x37, 0xa6, 0x42,
0x31, 0xb3, 0x24, 0xca, 0x09, 0xab, 0x29, 0x61, 0x76, 0xe0, 0x3b, 0xab, 0x12, 0x99, 0x06, 0xc0,
0xb2, 0x92, 0x84, 0xb3, 0x83, 0xfe, 0x51, 0xc0, 0xa1, 0xaa, 0xf3, 0x72, 0x61, 0x19, 0xc0, 0x75,
0x75, 0x90, 0xd6, 0x59, 0x0f, 0x5c, 0xf4, 0xec, 0x07, 0x9b, 0xa6, 0xf7, 0xea, 0xd0, 0xaa, 0x59,
0xbb, 0xae, 0xc3, 0xe6, 0x25, 0x67, 0x9b, 0x05, 0x21, 0x6d, 0x8e, 0x4d, 0xed, 0xeb, 0x9c, 0x87,
0xc0, 0xf5, 0x12, 0x1e, 0x1c, 0x5f, 0x3e, 0x7d, 0xc8, 0xa0, 0x01, 0x1f, 0x4e, 0x98, 0xb7, 0xff,
0x3e, 0xcc, 0xa5, 0xde, 0x9f, 0xef, 0xd0, 0xa6, 0x24, 0x60, 0xe5, 0xb3, 0xa3, 0xb4, 0xce, 0x7f,
0xa7, 0x88, 0x92, 0xe9, 0xa8, 0x03, 0x07, 0x42, 0xfd, 0x7d, 0xba, 0x68, 0x89, 0x57, 0x96, 0x50,
0xe0, 0x8d, 0x2c, 0x59, 0xfe, 0x23, 0x6d, 0xc7, 0x27, 0x83, 0x7a, 0xb5, 0x6d, 0xd3, 0xa9, 0xcf,
0x94, 0xb5, 0x77, 0x4d, 0x82, 0x2c, 0xa6, 0xf9, 0x97, 0xae, 0x2c, 0x81, 0x1c, 0x27, 0x5a, 0x03,
0x87, 0xb4, 0x3d, 0x9b, 0x25, 0x48, 0xa6, 0x5d, 0xda, 0x7f, 0x12, 0x70, 0x08, 0x76, 0x5e, 0x2e,
0x6b, 0x77, 0x69, 0xe0, 0x4f, 0x85, 0xb2, 0x2d, 0x70, 0xb3, 0x9e, 0xca, 0x72, 0x81, 0x98, 0x9b,
0x91, 0x72, 0xf7, 0xf6, 0xed, 0xe4, 0xfb, 0x4f, 0x4d, 0xd0, 0x31, 0x4e, 0x59, 0x6a, 0x7b, 0x89,
0x91, 0xc9, 0xb2, 0x0c, 0x5c, 0x65, 0x31, 0xc7, 0xf4, 0xf4, 0xf1, 0xa3, 0x27, 0xe9, 0x59, 0x2f,
0x60, 0xff, 0x9d, 0xa7, 0x23, 0x1d, 0x3b, 0x71, 0x40, 0x81, 0x4d, 0xb8, 0x5f, 0x20, 0x42, 0xe0,
0xac, 0x13, 0x33, 0xdf, 0xe6, 0xca, 0xd2, 0xc3, 0x39, 0x8e, 0x3e, 0x31, 0xea, 0x1e, 0xf0, 0xc4,
0xcf, 0x58, 0xbd, 0x85, 0xf7, 0xfa, 0x51, 0xc8, 0x07, 0x92, 0x3f, 0xf3, 0xf1, 0x83, 0xe4, 0x3b,
0xf7, 0x52, 0xd2, 0x73, 0xe0, 0xc6, 0xa6, 0xb4, 0x4d, 0xb8, 0xa6, 0xd4, 0xee, 0x98, 0xa2, 0xc8,
0x49, 0xc9, 0x87, 0x60, 0x7c, 0xb5, 0xef, 0x59, 0x59, 0x12, 0x32, 0x06, 0xfd, 0x93, 0x80, 0xc3,
0x34, 0xe7, 0x0b, 0xc4, 0xbc, 0xa5, 0xce, 0x39, 0xee, 0xb0, 0x7d, 0x25, 0x73, 0xbb, 0x35, 0x69,
0xf9, 0x22, 0xec, 0x6f, 0xaa, 0x94, 0x78, 0x29, 0x45, 0x09, 0x69, 0xb3, 0x5a, 0xd9, 0x7a, 0x50,
0x8d, 0xe6, 0xa5, 0x8b, 0x2f, 0x2c, 0xf5, 0x26, 0x42, 0x41, 0x81, 0x0c, 0x77, 0x19, 0xe5, 0xde,
0xfe, 0xc2, 0x79, 0x8b, 0xf7, 0x09, 0xf7, 0x65, 0x11, 0x8a, 0x4a, 0x6b, 0xe5, 0x07, 0xb7, 0xd3,
0xdc, 0xee, 0xe5, 0xe8, 0xfc, 0x16, 0x67, 0x0a, 0x0a, 0x5f, 0x3c, 0xb0, 0x7a, 0x8b, 0x50, 0x07,
0x9e, 0xcd, 0x10, 0x9f, 0x3f, 0x87, 0xfb, 0x9f, 0x95, 0x06, 0x0e, 0x92, 0x94, 0x97, 0xba, 0x2a,
0xd0, 0xea, 0x8a, 0xfe, 0x37, 0x0a, 0x64, 0xb9, 0x54, 0xbb, 0x0c, 0xc5, 0x3b, 0xaf, 0x35, 0x35,
0x57, 0x7a, 0x21, 0x7e, 0xf9, 0x4f, 0x02, 0x0e, 0x21, 0x0e, 0x9a, 0x72, 0x9f, 0x8c, 0x75, 0x6a,
0x36, 0x36, 0x5b, 0x9e, 0x99, 0xf7, 0x64, 0xad, 0xad, 0xdf, 0xd5, 0x6a, 0xe2, 0x2f, 0x37, 0x1f,
0x3c, 0x4d, 0x37, 0xe5, 0xe6, 0x15, 0xe4, 0xe7, 0x9a, 0x1e, 0xdd, 0x58, 0xdc, 0x01, 0xb1, 0xef,
0x6c, 0x8b, 0xb4, 0xfd, 0xe4, 0x97, 0xdb, 0x8f, 0xd3, 0xb2, 0x72, 0xf3, 0xc5, 0x02, 0xc8, 0x77,
0xbf, 0xef, 0x18, 0xe7, 0xe3, 0x2c, 0x49, 0x4f, 0x20, 0x44, 0xaf, 0xc8, 0xbc, 0x9c, 0xb3, 0x03,
0x6c, 0x37, 0x91, 0x7c, 0x9f, 0xf1, 0x3c, 0x63, 0x96, 0xe3, 0x2e, 0x68, 0x13, 0x32, 0xf2, 0xb2,
0xec, 0x2a, 0x9a, 0x3d, 0x3b, 0xad, 0xbf, 0xf8, 0x38, 0x3d, 0x3b, 0xaf, 0x20, 0x2f, 0x2f, 0x37,
0xed, 0x49, 0xf2, 0xc9, 0x89, 0x2d, 0xa0, 0xe1, 0x52, 0xb2, 0x8d, 0x0a, 0x81, 0x0d, 0x6a, 0xd2,
0x3e, 0xb1, 0x49, 0xc3, 0xa3, 0xe8, 0xb7, 0x69, 0xf9, 0xd9, 0xe3, 0xfe, 0x51, 0xc0, 0x21, 0x13,
0xf6, 0x9f, 0xd9, 0xe0, 0xbc, 0x61, 0xa2, 0xb6, 0xeb, 0x8f, 0x91, 0x9b, 0xec, 0xdb, 0x33, 0x61,
0xef, 0xf4, 0x98, 0xba, 0x62, 0xd7, 0xc1, 0x33, 0x91, 0x91, 0x91, 0x67, 0xf6, 0xcf, 0xeb, 0x53,
0xd3, 0x89, 0xe1, 0xeb, 0xdf, 0x77, 0xf1, 0xb7, 0x87, 0xcf, 0x9c, 0x05, 0x74, 0x72, 0xff, 0x8a,
0x71, 0x75, 0x60, 0x2a, 0xc5, 0xb1, 0x6f, 0x03, 0x80, 0xab, 0x35, 0xf1, 0xec, 0xc9, 0x29, 0xfe,
0xb6, 0x29, 0xd6, 0x01, 0x3f, 0x44, 0xee, 0x71, 0xe2, 0xd7, 0xbf, 0xb3, 0xe7, 0xec, 0x4f, 0xd6,
0xc6, 0x0c, 0xec, 0x65, 0x84, 0xd4, 0xe8, 0xf0, 0xc5, 0xf7, 0xc7, 0x23, 0xcf, 0x46, 0x46, 0x9e,
0xfc, 0x6e, 0xe9, 0xa0, 0x26, 0x6a, 0xdb, 0xb6, 0xbc, 0x48, 0x8f, 0xad, 0x91, 0x3b, 0xda, 0x96,
0xca, 0xf8, 0x2a, 0xcd, 0x2d, 0xd0, 0xae, 0x5b, 0xcf, 0x1e, 0x55, 0x52, 0xea, 0xa7, 0x79, 0xbd,
0x01, 0x00, 0x67, 0xe9, 0x86, 0xf0, 0x66, 0x10, 0x01, 0x0b, 0x23, 0x60, 0x90, 0x59, 0x01, 0xae,
0x64, 0xa6, 0xcb, 0x75, 0x36, 0xaa, 0xb8, 0x0d, 0xb0, 0xd3, 0xdb, 0xa3, 0xae, 0x14, 0x24, 0xda,
0xcd, 0x7e, 0x39, 0xdf, 0xe6, 0x14, 0x93, 0x68, 0xe0, 0x22, 0x60, 0x09, 0x3a, 0xe6, 0x62, 0xe1,
0xdc, 0x5f, 0xfa, 0xdd, 0x2d, 0xbb, 0x52, 0x81, 0xcc, 0xe8, 0x1f, 0x4a, 0x32, 0x8c, 0xde, 0xdd,
0xf6, 0xd0, 0x09, 0xa1, 0xe8, 0xaf, 0x0c, 0x4b, 0xf2, 0xd7, 0x27, 0xd7, 0x57, 0xfa, 0xe4, 0x55,
0x39, 0x70, 0x08, 0x81, 0xe3, 0xb0, 0x0c, 0x1a, 0xc1, 0xa7, 0x45, 0xd3, 0x3c, 0x4d, 0xbb, 0x81,
0x73, 0x4a, 0xa7, 0xc1, 0xba, 0xbe, 0x75, 0x6b, 0x63, 0x67, 0x05, 0x38, 0xbc, 0xca, 0x91, 0x43,
0x61, 0xc9, 0xad, 0x0a, 0x45, 0xdf, 0xda, 0xcc, 0x73, 0xbc, 0x8e, 0xbd, 0x30, 0xbc, 0xea, 0x87,
0xf4, 0x86, 0xd2, 0x29, 0x1d, 0x4b, 0x52, 0xe4, 0x95, 0xcd, 0xf5, 0x35, 0x1a, 0x14, 0xaf, 0xbc,
0x58, 0xe3, 0x6b, 0x12, 0xae, 0x74, 0xb6, 0x51, 0xa1, 0xbe, 0xe3, 0x63, 0x58, 0x9e, 0x63, 0x99,
0xe8, 0x11, 0x6e, 0xdc, 0x1c, 0x12, 0xae, 0x3e, 0xc1, 0x33, 0x7a, 0x23, 0x4b, 0x45, 0x2f, 0xe8,
0xe9, 0xa5, 0x25, 0xca, 0x2d, 0xf6, 0xfb, 0xab, 0x09, 0xd6, 0xa8, 0x63, 0xa8, 0x57, 0xc0, 0xa2,
0x23, 0x49, 0x3c, 0x47, 0x33, 0xcc, 0xe9, 0xa1, 0xaa, 0x2a, 0x5f, 0x4c, 0x6f, 0x24, 0xa1, 0xe8,
0x46, 0xd2, 0xc8, 0xf3, 0x1c, 0xc7, 0xe8, 0x62, 0xf7, 0x2d, 0xec, 0xe2, 0x57, 0xd5, 0xeb, 0x5b,
0x85, 0x23, 0xde, 0xdd, 0xc6, 0xef, 0xbb, 0x64, 0x80, 0xbb, 0x1a, 0x75, 0x94, 0x6e, 0x63, 0x47,
0x37, 0x6e, 0x0e, 0x49, 0x4b, 0x4c, 0x3a, 0x05, 0xfb, 0x29, 0x50, 0x0c, 0xc9, 0x26, 0x5c, 0xdf,
0x3e, 0xb3, 0x8b, 0x1f, 0x7c, 0xf7, 0x6f, 0xf6, 0x0b, 0x8a, 0xb6, 0x3d, 0xc1, 0xa7, 0x21, 0xa1,
0x5e, 0x5d, 0xc6, 0x6c, 0x8f, 0x22, 0x49, 0x9a, 0xe1, 0x69, 0xc0, 0x72, 0xd1, 0xe3, 0xeb, 0x57,
0xb9, 0x10, 0x78, 0x43, 0x09, 0x6b, 0x38, 0xfa, 0x44, 0x3c, 0x43, 0xea, 0x29, 0x1a, 0xd6, 0xfa,
0x5f, 0x3f, 0xb6, 0x6d, 0x70, 0x63, 0x02, 0xa9, 0x81, 0xbc, 0x46, 0x21, 0xe4, 0x6b, 0x13, 0xa1,
0x3c, 0x35, 0x8b, 0xd0, 0xa0, 0x08, 0x5a, 0x3f, 0x68, 0xc9, 0xb1, 0x4b, 0x7a, 0x92, 0x27, 0x39,
0x58, 0xec, 0x47, 0x9e, 0x58, 0xe0, 0x87, 0x6a, 0xdf, 0x14, 0xef, 0xf2, 0x0d, 0x23, 0x0c, 0x6d,
0x38, 0x66, 0xdd, 0x15, 0x30, 0x4b, 0xc6, 0xff, 0x50, 0xb0, 0xfd, 0x78, 0xec, 0xa1, 0x75, 0x03,
0x61, 0x83, 0x28, 0x0c, 0xfb, 0xfb, 0x26, 0x8c, 0xd0, 0x7a, 0xa8, 0x09, 0x2d, 0x81, 0x56, 0x0b,
0x5a, 0x72, 0xe8, 0x1c, 0xa3, 0x4b, 0xe2, 0x6e, 0x51, 0x49, 0xa4, 0x81, 0xbc, 0x72, 0x60, 0xcc,
0xbb, 0xa8, 0xaa, 0x5a, 0x55, 0xcf, 0xd0, 0x9b, 0x49, 0x6a, 0x14, 0xac, 0xf5, 0x6a, 0xed, 0x27,
0x6f, 0x0f, 0xd7, 0xe9, 0x12, 0x92, 0x78, 0x3a, 0x31, 0x81, 0x61, 0xa9, 0x88, 0x85, 0x43, 0x9b,
0xd7, 0x24, 0x90, 0xbf, 0x55, 0x48, 0xa1, 0xcd, 0xfb, 0x2d, 0x3a, 0x60, 0x80, 0xcd, 0xbc, 0x81,
0xe0, 0xa6, 0x19, 0xdd, 0x85, 0xed, 0xb3, 0xdb, 0xd7, 0x85, 0xf1, 0xf0, 0xaa, 0xd6, 0xba, 0x6f,
0x28, 0xc1, 0x87, 0x8c, 0x01, 0x1d, 0xa3, 0x69, 0x3f, 0x79, 0x5f, 0x44, 0x1c, 0x47, 0xea, 0x74,
0x24, 0x45, 0x31, 0x09, 0xb1, 0xc7, 0x16, 0x0e, 0xf5, 0x43, 0xab, 0xfd, 0x4d, 0xd2, 0x12, 0x2c,
0x1e, 0xcc, 0xaf, 0xdb, 0xc2, 0x7d, 0xd7, 0x19, 0x06, 0xac, 0x1a, 0xde, 0xa0, 0xa3, 0xe2, 0x2f,
0x84, 0x2c, 0x7b, 0x4f, 0xab, 0xf4, 0x65, 0x70, 0xdb, 0x26, 0x8e, 0x09, 0x6e, 0x46, 0x54, 0x03,
0xb3, 0x80, 0x40, 0x5a, 0x0f, 0x5c, 0x72, 0x88, 0x26, 0x19, 0x46, 0xc7, 0xd0, 0x2c, 0xc3, 0xc4,
0xc3, 0x0d, 0x1b, 0x5e, 0x7f, 0xd3, 0x18, 0xd0, 0x80, 0x31, 0xdb, 0x8e, 0xc5, 0xd3, 0x1c, 0xb8,
0x7b, 0x12, 0xdc, 0xb5, 0x75, 0x6e, 0xd9, 0x88, 0x77, 0xeb, 0x5a, 0x3a, 0x00, 0x68, 0x2a, 0x5e,
0xbb, 0xfe, 0x7f, 0x8e, 0x3c, 0x5b, 0xf7, 0x5f, 0x77, 0x82, 0xd6, 0xd3, 0x34, 0xc7, 0x30, 0x24,
0xa9, 0xbf, 0x7e, 0x6a, 0xcb, 0x4c, 0x3f, 0xd4, 0xd2, 0x40, 0xed, 0x2f, 0x89, 0x85, 0xa1, 0xc5,
0x3f, 0xfd, 0x06, 0x6f, 0x39, 0x16, 0x0b, 0x39, 0x9d, 0xd1, 0xeb, 0x39, 0x5a, 0x77, 0xe1, 0xeb,
0x49, 0xad, 0xbd, 0xec, 0x9f, 0x60, 0xec, 0x26, 0x27, 0x04, 0x6c, 0x3a, 0x0d, 0xee, 0x3b, 0x3c,
0x38, 0x3c, 0x86, 0xe6, 0x79, 0xfe, 0x96, 0x51, 0xaf, 0xff, 0x8d, 0x8b, 0xd8, 0x36, 0xa6, 0x8b,
0x17, 0xa2, 0xb4, 0x06, 0xc5, 0x60, 0xc8, 0xbe, 0xf2, 0x1e, 0xd1, 0xad, 0x54, 0x5f, 0x62, 0xb8,
0x87, 0x57, 0xcb, 0x31, 0xab, 0xa3, 0x12, 0x6e, 0xb1, 0xb4, 0x21, 0x91, 0xa4, 0x8c, 0xba, 0xd8,
0xf0, 0x9d, 0xc3, 0x9b, 0xbe, 0x09, 0x21, 0xd3, 0x7f, 0x14, 0x61, 0x80, 0x50, 0xdf, 0xc9, 0x5f,
0x87, 0xc7, 0x18, 0x29, 0x03, 0x4d, 0x71, 0x3c, 0x49, 0x93, 0x11, 0x5b, 0x82, 0xde, 0xf3, 0x52,
0x1e, 0x37, 0x8d, 0x12, 0xa8, 0xcb, 0xad, 0x38, 0xcb, 0xbf, 0x15, 0xcc, 0x73, 0xa0, 0x68, 0xcd,
0xe6, 0x41, 0x0b, 0x23, 0x18, 0x23, 0xc3, 0x1a, 0x18, 0x8a, 0xa2, 0x38, 0x2a, 0x7c, 0xe7, 0xe4,
0xf6, 0xda, 0x6a, 0x6e, 0xbd, 0x56, 0x21, 0x42, 0x55, 0x18, 0x50, 0x77, 0x04, 0xa2, 0xf5, 0xed,
0x09, 0x1f, 0xe2, 0x4e, 0x02, 0xb6, 0x23, 0x75, 0x2c, 0xcf, 0x9c, 0x3b, 0xb0, 0x68, 0xa0, 0x52,
0xee, 0x00, 0x3b, 0x06, 0x55, 0x56, 0x30, 0x93, 0x20, 0x30, 0x15, 0xaa, 0x0e, 0x58, 0xb4, 0xf7,
0x5c, 0x1c, 0xb0, 0x21, 0x29, 0x23, 0xa7, 0x67, 0xf8, 0xd8, 0x43, 0xcb, 0xde, 0x6f, 0x0c, 0x18,
0x1b, 0x53, 0xb9, 0x19, 0xae, 0x22, 0xa4, 0x46, 0xe1, 0x43, 0x90, 0xe0, 0x84, 0x22, 0xbe, 0x03,
0x67, 0x87, 0x5e, 0xe1, 0x19, 0x4a, 0x47, 0xd1, 0x9c, 0x91, 0x24, 0xa3, 0x0e, 0xcd, 0xec, 0x56,
0x13, 0x57, 0xda, 0xc6, 0x56, 0xd6, 0xcd, 0x80, 0xd8, 0xad, 0xf9, 0x2e, 0xec, 0x5d, 0xa9, 0x53,
0x9a, 0xad, 0x53, 0x7a, 0x3d, 0x73, 0x68, 0xd9, 0xc0, 0x77, 0x55, 0x35, 0x70, 0x0c, 0xc7, 0x2b,
0xbe, 0x25, 0xeb, 0xff, 0x34, 0x41, 0xfd, 0x85, 0x03, 0x6c, 0x30, 0xa5, 0x0b, 0x8d, 0x67, 0xfb,
0xe0, 0x7d, 0xd1, 0x09, 0x54, 0xe2, 0x2d, 0x60, 0xa1, 0xd3, 0xdc, 0x6f, 0xd7, 0x43, 0x16, 0x76,
0x69, 0x08, 0x4f, 0xaa, 0xa4, 0x9b, 0x79, 0x77, 0x19, 0x1f, 0x12, 0xcd, 0x29, 0x76, 0x24, 0x43,
0xf3, 0x49, 0x17, 0x8e, 0x04, 0x0f, 0xf5, 0x84, 0x21, 0x14, 0xa5, 0x69, 0x05, 0x86, 0xba, 0x65,
0x65, 0x05, 0x08, 0x9a, 0x0b, 0x78, 0x71, 0xdd, 0x3f, 0xa1, 0x56, 0xf9, 0x7e, 0x10, 0x1c, 0x12,
0xa3, 0x67, 0xc1, 0xd4, 0x02, 0x39, 0xc6, 0xfc, 0x16, 0xbb, 0x65, 0x46, 0xe7, 0x86, 0x2e, 0x35,
0x28, 0x71, 0x78, 0x71, 0xab, 0x17, 0x5e, 0x5d, 0xc6, 0x6c, 0x8b, 0x20, 0x29, 0x8e, 0xa1, 0x49,
0xbd, 0x9e, 0xa7, 0x63, 0xc2, 0x83, 0x87, 0xfb, 0x96, 0x3e, 0xc1, 0xcd, 0x71, 0x7f, 0x8a, 0xb0,
0xba, 0xb0, 0x5b, 0xb9, 0x9e, 0x22, 0x69, 0x86, 0x83, 0xfd, 0x4c, 0x62, 0xc3, 0xb6, 0x0c, 0xf4,
0x23, 0x50, 0x4b, 0xbf, 0xae, 0x8a, 0x5c, 0x08, 0xf0, 0x91, 0x4a, 0xa5, 0x74, 0x65, 0x23, 0x10,
0x0f, 0x1c, 0xf3, 0x1e, 0xbc, 0x28, 0xec, 0x12, 0x79, 0x0b, 0xe8, 0x4f, 0x2e, 0x31, 0xc1, 0x90,
0x78, 0x61, 0xf7, 0xe4, 0x9e, 0x2e, 0x77, 0x57, 0x77, 0x53, 0xf9, 0xa4, 0x06, 0x22, 0xcb, 0xb7,
0xe3, 0xb4, 0xcd, 0x31, 0xb0, 0x59, 0x39, 0x9d, 0x98, 0x48, 0xb1, 0x6c, 0xcc, 0x81, 0xd5, 0x30,
0x8e, 0x89, 0x62, 0x2a, 0x8c, 0x20, 0xb4, 0x2e, 0xa3, 0x47, 0x60, 0xb0, 0x93, 0x1e, 0xa6, 0x24,
0xb7, 0xd5, 0xf8, 0xe0, 0x45, 0x07, 0xce, 0x71, 0x34, 0x6d, 0xa4, 0x18, 0x5d, 0x02, 0x43, 0xc7,
0x1c, 0x9a, 0xd6, 0xd3, 0x17, 0xc7, 0xdc, 0x91, 0xe4, 0x4a, 0x24, 0xa5, 0x7b, 0xa1, 0x06, 0x6f,
0x3f, 0x6d, 0xe7, 0x09, 0x8a, 0xa5, 0x92, 0x68, 0x5e, 0x9f, 0x64, 0xa0, 0x93, 0x7e, 0x5d, 0x10,
0xd4, 0xbc, 0xa6, 0x5a, 0x5d, 0x81, 0x22, 0x07, 0xa2, 0x86, 0x4a, 0x05, 0x1f, 0x60, 0x85, 0x6a,
0xb0, 0xe6, 0xfd, 0x16, 0x86, 0x90, 0x3c, 0xa7, 0xe3, 0x60, 0xf2, 0xd6, 0x48, 0x46, 0xef, 0x9c,
0xdb, 0xbe, 0x36, 0x2c, 0x2c, 0xc5, 0x31, 0xb5, 0xdb, 0x92, 0xac, 0x4c, 0x22, 0x70, 0xc0, 0x56,
0x9a, 0x8e, 0xd3, 0xf6, 0x45, 0xc4, 0xd3, 0x3c, 0x9b, 0xa0, 0x07, 0x86, 0x04, 0x1f, 0x1b, 0xb6,
0x20, 0x48, 0x79, 0x78, 0xb1, 0xcb, 0x57, 0x81, 0x6e, 0x20, 0x58, 0x04, 0xb8, 0x5f, 0x97, 0x85,
0x21, 0xd7, 0x75, 0x46, 0xf8, 0x70, 0x3f, 0x9a, 0xa5, 0xe3, 0xa3, 0xf7, 0x05, 0xb7, 0xf7, 0xb4,
0x28, 0x4d, 0xc2, 0xba, 0x85, 0xa6, 0x9b, 0xfe, 0x2c, 0xa9, 0x55, 0x96, 0xbc, 0x5c, 0xeb, 0xc1,
0xcb, 0x42, 0x49, 0x0a, 0xd8, 0x28, 0x0c, 0x65, 0xa4, 0x75, 0xf1, 0x51, 0x5b, 0x66, 0xbe, 0x5b,
0xd3, 0xe5, 0xf8, 0x2f, 0x14, 0xad, 0xe0, 0xc7, 0xbb, 0x63, 0xb6, 0x85, 0x25, 0x24, 0xf1, 0x7a,
0xa3, 0x41, 0x07, 0xdb, 0x5d, 0x9e, 0x5b, 0xf6, 0x51, 0xeb, 0xda, 0x38, 0x66, 0x31, 0x89, 0xaa,
0xb9, 0x1f, 0xf6, 0x5d, 0x49, 0xf4, 0xaa, 0x81, 0xb9, 0xe5, 0x2f, 0xe1, 0xd5, 0x7a, 0xe0, 0xc6,
0x13, 0x3a, 0xe8, 0x1a, 0xf0, 0x7a, 0x9a, 0x65, 0x94, 0x38, 0xa6, 0xcb, 0x17, 0xab, 0x86, 0xab,
0x31, 0xbf, 0x81, 0x5b, 0xc2, 0x62, 0x21, 0xf0, 0x7a, 0xca, 0xc8, 0x18, 0xe9, 0x0b, 0x1b, 0x27,
0xbf, 0x5b, 0xb7, 0xe8, 0xa1, 0x13, 0x8a, 0x25, 0xab, 0x76, 0x43, 0xf7, 0x57, 0x11, 0xea, 0x3b,
0x22, 0xf8, 0x44, 0x0c, 0x49, 0xd2, 0x24, 0xec, 0xfb, 0x44, 0x25, 0x9c, 0xde, 0x32, 0xba, 0x73,
0x4d, 0xb8, 0xbd, 0x44, 0x01, 0xd7, 0xda, 0x51, 0x80, 0x2d, 0xa0, 0x14, 0x51, 0xaa, 0x3c, 0x75,
0xd8, 0xab, 0xf9, 0x98, 0x95, 0x11, 0x71, 0x3a, 0x1e, 0x58, 0xfe, 0x3a, 0x2a, 0x89, 0x89, 0x0d,
0xdf, 0x39, 0xa2, 0x79, 0x75, 0x9c, 0x40, 0xdd, 0x58, 0xfd, 0x2d, 0x04, 0xcc, 0x07, 0xdf, 0x8f,
0x37, 0x9e, 0x88, 0xd1, 0x33, 0x09, 0x14, 0x74, 0xc0, 0x0c, 0xfc, 0xe9, 0xcd, 0x41, 0x01, 0x5e,
0x50, 0x9c, 0x22, 0x1e, 0x8e, 0x9e, 0x1f, 0x40, 0x28, 0xad, 0x91, 0x88, 0x9a, 0xcd, 0x83, 0x16,
0x9c, 0x66, 0x48, 0x86, 0xe7, 0x68, 0x8a, 0xd3, 0xd3, 0x14, 0x7c, 0x0a, 0xa4, 0x1a, 0x16, 0x71,
0xba, 0xdd, 0xec, 0xbf, 0x87, 0x54, 0x60, 0xb6, 0x95, 0x38, 0xe6, 0x75, 0x8e, 0x4c, 0x62, 0x0c,
0x06, 0x86, 0x67, 0xe8, 0xa8, 0x03, 0x0b, 0xfb, 0xc3, 0x2d, 0x5d, 0x18, 0x6e, 0x53, 0x44, 0x07,
0x1f, 0x05, 0xa1, 0x02, 0xf6, 0x08, 0x5e, 0xfd, 0xdd, 0x85, 0x7b, 0xa3, 0xe2, 0x74, 0x1c, 0xcd,
0x1a, 0x68, 0x3d, 0xc9, 0xc5, 0x85, 0x2e, 0xeb, 0xd9, 0x14, 0x57, 0xab, 0x71, 0x77, 0x66, 0xfb,
0x6f, 0x23, 0x0f, 0x35, 0x06, 0xab, 0xb1, 0x7c, 0x07, 0xcf, 0x3d, 0x12, 0x93, 0xc8, 0x50, 0x8c,
0x1e, 0x30, 0x11, 0xa9, 0x8f, 0x3a, 0x34, 0xa3, 0xf3, 0xdb, 0xc0, 0xc2, 0x54, 0x59, 0xbb, 0xd0,
0x04, 0x4c, 0x26, 0x20, 0x88, 0x57, 0xcb, 0x99, 0x5b, 0xa2, 0x12, 0x38, 0x86, 0x04, 0x76, 0x0d,
0x14, 0xb1, 0xa1, 0xcb, 0x06, 0xb7, 0x56, 0x3a, 0xe1, 0x6b, 0xb0, 0x4a, 0xdd, 0xe9, 0xef, 0xa6,
0x32, 0x08, 0x76, 0xe5, 0xb2, 0x74, 0x56, 0xf0, 0xea, 0x1c, 0x7c, 0x20, 0x3a, 0xde, 0x60, 0x64,
0x68, 0x2a, 0x01, 0x58, 0x1b, 0x31, 0x7b, 0x17, 0x74, 0x69, 0x68, 0x8b, 0x02, 0xe0, 0xa8, 0xba,
0x5d, 0xc6, 0x84, 0xc0, 0x27, 0x8b, 0xdf, 0x02, 0x1a, 0xd1, 0xc0, 0xd0, 0xd1, 0x47, 0x82, 0x87,
0x7b, 0x29, 0x3a, 0x0f, 0x47, 0x5f, 0xab, 0x0f, 0xa2, 0x9b, 0x5e, 0x8f, 0x30, 0x8d, 0xa2, 0xc8,
0x60, 0x04, 0x18, 0xf5, 0xed, 0xbf, 0x72, 0x5f, 0x0c, 0x09, 0x00, 0x89, 0x67, 0x79, 0x8e, 0xe7,
0xae, 0xc3, 0x38, 0xa6, 0xf5, 0xd9, 0x84, 0x57, 0xe7, 0xd1, 0x5b, 0x4e, 0xf3, 0x3c, 0xa5, 0x03,
0x98, 0x25, 0xe9, 0x13, 0x62, 0xc2, 0x83, 0x47, 0xf8, 0x2a, 0x7d, 0x65, 0x09, 0x0c, 0x57, 0xc3,
0x60, 0xb5, 0xb6, 0xf2, 0xb2, 0x7b, 0x6e, 0x72, 0x81, 0x2c, 0x4f, 0x6c, 0x23, 0x6a, 0x07, 0x4c,
0xdb, 0x1c, 0xcd, 0x2a, 0x8f, 0x9d, 0xe6, 0x28, 0x92, 0x8c, 0x0d, 0xdb, 0xdc, 0xdf, 0x0f, 0x2b,
0x7a, 0x96, 0x1c, 0x86, 0x10, 0x75, 0xfb, 0x2f, 0x0c, 0x8b, 0x86, 0xe5, 0x23, 0x06, 0x9e, 0xe4,
0x49, 0x3a, 0x7a, 0xef, 0xb4, 0xde, 0xb5, 0xdd, 0x5a, 0xed, 0x0d, 0x20, 0x54, 0xad, 0xf6, 0xed,
0xf8, 0xf1, 0xc6, 0x18, 0xd8, 0xef, 0x9a, 0xe4, 0xe1, 0x53, 0x3c, 0x62, 0x0e, 0x7c, 0xf5, 0x51,
0x47, 0x0f, 0x15, 0xa2, 0x26, 0xf0, 0xea, 0xde, 0x03, 0xe7, 0xee, 0x8b, 0xd2, 0x93, 0x06, 0x9e,
0x4b, 0x22, 0x75, 0x1c, 0x7c, 0x70, 0x6d, 0x6f, 0x5f, 0x8f, 0xaa, 0x1e, 0xb2, 0x9b, 0x20, 0x29,
0x0f, 0x6b, 0x44, 0xd1, 0xce, 0x1f, 0xef, 0x3e, 0x41, 0xc2, 0xfd, 0x87, 0x24, 0xc4, 0x48, 0x1f,
0x17, 0x1e, 0xb2, 0x79, 0xdd, 0xd7, 0x5b, 0x0e, 0x45, 0x30, 0x89, 0x89, 0x89, 0x0c, 0xc3, 0xd1,
0xb7, 0xa8, 0xdf, 0xa2, 0x77, 0x2f, 0xe8, 0xec, 0xad, 0xf5, 0xc0, 0xdd, 0x72, 0xf1, 0x8d, 0x20,
0xa5, 0x0b, 0x3d, 0x70, 0xc6, 0xbc, 0x3a, 0xcf, 0x38, 0x10, 0x11, 0x6f, 0xe4, 0x15, 0xa3, 0x11,
0x68, 0x3b, 0x92, 0x36, 0x50, 0x89, 0x0c, 0x4f, 0x33, 0x1c, 0xc7, 0xea, 0x78, 0x3e, 0x3e, 0xfa,
0x40, 0x70, 0x67, 0x2f, 0xa0, 0xcc, 0xd4, 0x5a, 0xb7, 0x9c, 0x7c, 0x23, 0x48, 0x79, 0x3c, 0x0e,
0x41, 0x00, 0xf7, 0x0d, 0x0d, 0x08, 0x0a, 0x3e, 0xc2, 0x1a, 0x7f, 0x23, 0x69, 0x96, 0x67, 0x8d,
0x46, 0x9a, 0xa6, 0x19, 0xa3, 0x81, 0xd4, 0xb1, 0x14, 0xcd, 0xdc, 0xba, 0x10, 0x3c, 0x3a, 0xa0,
0xae, 0xe5, 0x29, 0x73, 0x6e, 0x7a, 0x33, 0x08, 0xb3, 0xf4, 0xf6, 0x43, 0x3d, 0x70, 0x14, 0xad,
0x19, 0x30, 0x78, 0xf3, 0x29, 0x52, 0xc7, 0x33, 0xf0, 0x31, 0xc3, 0x8c, 0x8e, 0xe6, 0x74, 0x2c,
0x63, 0x60, 0x81, 0xfd, 0xbf, 0x71, 0x5a, 0x40, 0x5d, 0xf8, 0x68, 0x0f, 0x70, 0x9a, 0xdb, 0x30,
0x79, 0x33, 0x08, 0xb5, 0x64, 0xc1, 0x61, 0x73, 0x73, 0x25, 0x06, 0x82, 0x37, 0xfc, 0x28, 0xf8,
0x48, 0x44, 0x2c, 0xc9, 0xf3, 0x1c, 0xf3, 0x1b, 0x4f, 0xeb, 0xe2, 0xa2, 0xc3, 0x76, 0x7e, 0xd4,
0x1c, 0xb1, 0x34, 0xff, 0x76, 0x63, 0xf6, 0x26, 0x13, 0x56, 0x7f, 0xe8, 0xdc, 0x6d, 0x21, 0xc7,
0x4e, 0x44, 0x5c, 0x88, 0x3a, 0x7d, 0x2c, 0x74, 0x7b, 0xf0, 0x47, 0xef, 0xb9, 0x01, 0xfb, 0x27,
0x10, 0xcc, 0xcc, 0x68, 0x7c, 0x9b, 0x77, 0xeb, 0xd9, 0x7f, 0xf0, 0xc0, 0x0f, 0xba, 0xb5, 0x6f,
0xe8, 0x05, 0xb7, 0x04, 0xbb, 0xb7, 0x24, 0xbe, 0xf9, 0x44, 0x14, 0xff, 0xd0, 0x58, 0x7a, 0x76,
0x23, 0x15, 0x2d, 0x28, 0x72, 0x53, 0x55, 0x12, 0x54, 0x7b, 0x6a, 0xb8, 0xaf, 0x4e, 0x0d, 0xb1,
0x73, 0xe9, 0x99, 0x55, 0x6e, 0x7a, 0x3d, 0xfa, 0xff, 0x89, 0x66, 0x6b, 0x8a, 0xce, 0x58, 0xc1,
0x98, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, };

View file

@ -0,0 +1,114 @@
# Steps to run M5GFX on a PC. ( VisualStudioCode + PlatformIO + SDL2 environment. )
## Step 1. install Visual Studio Code and make PlatformIO ready for use.
https://docs.m5stack.com/ja/quick_start/m5unified/intro_vscode
---
## Step 2. PlatformIO to allow `platform = native` to be built.
https://docs.platformio.org/en/latest/platforms/native.html#installation
#### for Windows
follow the [MSYS2](https://www.msys2.org/) installation guide .
Run the following command on msys2 to install gcc and gdb .
``` msys2
pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gdb
```
Add the following paths to the `PATH` system environment variable:
```
C:\msys64\mingw64\bin
C:\msys64\ucrt64\bin
C:\msys64\usr\bin
```
#### for Linux
open the system terminal and run the following commands:
```
sudo apt update
sudo apt install build-essential
```
#### for macOS
open the system terminal and install Xcode Command Line Tools
```
xcode-select --install
```
---
## Step 3. Enable `SDL2` on PlatformIO.
#### for Windows
Go to the [SDL repository on github and obtain the release package (SDL2-devel-x.x.x-mingw.zip).](https://github.com/libsdl-org/SDL/releases)
Unzip the zip file and copy the following four files to `C:\msys64\ucrt64`
- share
- bin
- include
- lib
#### for Linux
open the system terminal and run the following commands:
```
sudo apt-get install libsdl2 libsdl2-dev
```
#### for macOS
Install `sdl2` using [Homebrew](https://brew.sh/).
```
brew install sdl2
```
---
## Step 4. Execute !
Open the `PlatformIO_SDL` folder containing this document in PlatformIO.
Click on the ![PlatformIO](img_pio.png) icon on the left side of the screen.
Click `PROJECT TASKS` -> `native` -> `General` -> `Upload`
※ If you are using arm processor, use `native_arm` instead of `native` (e.g. M1mac)
![execute](img_00.png)
※ The window may start up with the window hidden behind. Check the task tray.
---
## Step 5. Use debugger.
#### for macOS
If you want to use the debugger on a mac, lldb is available.
![setup lldb](img_01.png)
`EXPLORER` -> `.vscode` -> `launch.json` -> `Add Configuration...` -> `C/C++: (lldb) Launch`
![setup lldb](img_02.png)
Rewrite the `"program"` : `"${workspaceRoot}/.pio/build/native/program"`
(The `native` part should match the environment name in `PlatformIO`)
![setup lldb](img_03.png)
Pressing the `F5` key allows debugging execution.
---

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 B

View file

@ -0,0 +1,66 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[platformio]
default_envs = native
[env]
lib_extra_dirs=../../../
[env:native]
platform = native
build_type = debug
build_flags = -O0 -xc++ -std=c++14 -lSDL2
-I"/usr/local/include/SDL2" ; for intel mac homebrew SDL2
-L"/usr/local/lib" ; for intel mac homebrew SDL2
-DM5GFX_SHOW_FRAME ; Display frame image.
-DM5GFX_BACK_COLOR=0x222222u ; Color outside the frame image
[env:native_arm]
platform = native
build_type = debug
build_flags = -O0 -xc++ -std=c++14 -lSDL2
-arch arm64 ; for arm mac
-I"${sysenv.HOMEBREW_PREFIX}/include/SDL2" ; for arm mac homebrew SDL2
-L"${sysenv.HOMEBREW_PREFIX}/lib" ; for arm mac homebrew SDL2
-DM5GFX_SHOW_FRAME ; Display frame image.
-DM5GFX_BACK_COLOR=0x222222u ; Color outside the frame image
[env:native_StickCPlus]
extends = native
platform = native
build_flags = ${env:native.build_flags}
-DM5GFX_SCALE=2
-DM5GFX_ROTATION=0
-DM5GFX_BOARD=board_M5StickCPlus
[env:native_Paper]
extends = native
platform = native
build_flags = ${env:native.build_flags}
-DM5GFX_ROTATION=0
-DM5GFX_BOARD=board_M5Paper
[esp32_base]
build_type = debug
platform = espressif32
board = esp32dev
upload_speed = 1500000
monitor_speed = 115200
monitor_filters = esp32_exception_decoder
[env:esp32_arduino]
extends = esp32_base
framework = arduino
[env:esp32_idf]
extends = esp32_base
framework = espidf

View file

@ -0,0 +1,25 @@
#include <M5GFX.h>
#if defined ( SDL_h_ )
void setup(void);
void loop(void);
__attribute__((weak))
int user_func(bool* running)
{
setup();
do
{
loop();
} while (*running);
return 0;
}
int main(int, char**)
{
// The second argument is effective for step execution with breakpoints.
// You can specify the time in milliseconds to perform slow execution that ensures screen updates.
return lgfx::Panel_sdl::main(user_func, 128);
}
#endif

View file

@ -0,0 +1,29 @@
#include <M5GFX.h>
static M5GFX gfx;
void setup(void)
{
gfx.init();
}
void loop(void)
{
gfx.fillCircle(rand()%gfx.width(), rand()%gfx.height(), 16, rand());
}
#if defined ( ESP_PLATFORM ) && !defined ( ARDUINO )
extern "C" {
int app_main(int, char**)
{
setup();
for (;;) {
loop();
}
return 0;
}
}
#endif