#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SD.h>
// Piny dla wyświetlacza
#define TFT_CS 5
#define TFT_DC 4
#define TFT_RST 22
#define TFT_MOSI 23
#define TFT_CLK 18
#define TFT_MISO 19
// Pin dla karty SD
#define SD_CS 15
// Inicjalizacja wyświetlacza
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// Piny dla potencjometrów
#define POT_GAZ 35
#define POT_SPRZEGLO 34
// Piny dla diod
#define LED_CZERWONY 25
#define LED_ZIELONY 26
// Piny dla przycisków
#define PRZYCISK_GORA 32
#define PRZYCISK_DOL 33
#define PRZYCISK_LEWO 12
#define PRZYCISK_PRAWO 14
#define PRZYCISK_OK 21
#define PRZYCISK_SET 27
#define PRZYCISK_START 13
// Zmienne dla obsługi przycisków
bool poprzedniStanGora = HIGH;
bool poprzedniStanDol = HIGH;
bool poprzedniStanLewo = HIGH;
bool poprzedniStanPrawo = HIGH;
bool poprzedniStanOK = HIGH;
bool poprzedniStanSet = HIGH;
bool poprzedniStanStart = HIGH;
unsigned long czasOstatniegoNacisniecia = 0;
const unsigned long OPOZNIENIE_PRZYCISKOW = 200;
const unsigned long OPOZNIENIE_PRZED_PRZEWIJANIEM = 400;
const unsigned long SZYBKOSC_PRZEWIJANIA_ZNAKOW = 120;
// Zmienne globalne
int wartoscGazu = 0;
int wartoscSprzegla = 0;
// Zmienne dla zarządzania zawodnikami
#define MAX_ZAWODNIKOW 10
#define MAX_DLUGOSC_NICKU 10
String aktualnyZawodnik = "GOSC";
String listaZawodnikow[MAX_ZAWODNIKOW];
int liczbaZawodnikow = 0;
String nazwaPlikuZawodnikow = "/zawodnicy.txt";
const char DOSTEPNE_ZNAKI[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const int LICZBA_ZNAKOW = sizeof(DOSTEPNE_ZNAKI) - 1;
int indeksZnaku = 0;
// Zmienne do obsługi menu
int pozycjaMenu = 0;
int pozycjaKursora = 0;
char wybranyZnak = ' ';
String nowyNick = "";
int poprzedniaPozycjaMenu = -1;
bool wymusPelneRysowanie = true;
int pozycjaPrzewijaniaZawodnikow = 0;
const int WIERSZY_LISTY_ZAWODNIKOW = 7;
int indeksZawodnikaDoUsuniecia = -1;
int pozycjaMenuPotwierdzenia = 0; // 0=TAK, 1=NIE
// Poprzednie wartości do porównania - zapobiega migotaniu
int poprzedniGaz = -1;
int poprzednieSprzeglo = -1;
// Zmienne do mrugania nickiem
unsigned long czasOstatniegoMigniecia = 0;
bool stanMigniecia = false;
// Tryby pracy
#define TRYB_POWITALNY 0
#define TRYB_TEST 1
#define TRYB_REKORDY 2
#define TRYB_MENU_ZAWODNIKA 3
#define TRYB_WYBOR_ZAWODNIKA 4
#define TRYB_DODAJ_ZAWODNIKA 5
#define TRYB_DIAGNOSTYKA 6
#define TRYB_REKORDY_POTWIERDZENIE_USUNIECIA 7
#define TRYB_USUN_ZAWODNIKA 8
#define TRYB_USUN_ZAWODNIKA_POTWIERDZENIE 9
int tryb = TRYB_POWITALNY;
int stanTestu = 0;
unsigned long czasStartu = 0, czasReakcji = 0, czasFazy = 0;
int procentGazuWyniku = 0;
bool sdDostepna = false;
int numerTestu = 0;
String nazwaPlikuWynikow = "/wyniki.csv";
unsigned long najlepszyWynik = 9999;
String najlepszyZawodnik = "---";
struct Wynik { String nick; unsigned long czas; };
int pozycjaPrzewijaniaRekordow = 0;
const int WIERSZY_NA_EKRANIE = 10;
int maksymalnaLiczbaRekordow = 0;
// >>> ZMIANA: Zmienna dla trybu widoku diagnostyki
int diagnostykaViewMode = 0; // 0: Gaz i Sprzęgło, 1: Tylko Sprzęgło, 2: Tylko Gaz
const unsigned char zuzel[] PROGMEM = {
// TU SOBIE DODAM BITMAPE 'zz, 320x240px};
// --- DEKLARACJE FUNKCJI ---
// TU SOBIE DODAM BITMAPE 'zz, 320x240px
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
0xfc, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x7f, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7e,
0x3f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0x9f, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff,
0xe7, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x1f, 0xf3, 0xfc, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x83,
0xf9, 0xfc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xe0, 0xfe, 0xfe, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xdf, 0xf8,
0x7f, 0xfe, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xee, 0xfe, 0x03, 0xfe, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf0, 0x1f,
0x80, 0x7e, 0x31, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf0, 0x0f, 0xe0, 0x1e, 0x31, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf0, 0x20,
0xfc, 0x06, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfb, 0xff, 0xff, 0xf3, 0xe6, 0x00, 0x3e, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x1f, 0xff, 0xe1, 0xe4, 0x00,
0x0f, 0x01, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xc0, 0x00, 0x0f, 0xff, 0xe0, 0xcc, 0x00, 0x03, 0xc0, 0xee, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x9f, 0xc7, 0x87, 0xc4, 0x18, 0x08,
0x01, 0xc0, 0x7e, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfc, 0x3f, 0x8f, 0xe3, 0x33, 0xcf, 0x18, 0x3e, 0x00, 0xe0, 0x3e, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xcf, 0xe1, 0x38, 0x4f, 0x80, 0xff,
0x00, 0x68, 0x1e, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe3, 0xff, 0xcf, 0xe8, 0x9c, 0x0f, 0x80, 0xff, 0x00, 0x3c, 0x0e, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xcf, 0xe4, 0x0f, 0x07, 0xb1, 0xfe,
0x00, 0x18, 0x06, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x1f, 0xff, 0xcf, 0xe6, 0x21, 0x03, 0x99, 0xfc, 0x60, 0x04, 0x06, 0x3f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xc7, 0xfe, 0x31, 0xb3, 0x99, 0xf8,
0xf0, 0x00, 0x02, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x7f, 0xff, 0xe0, 0x00, 0x30, 0x39, 0x98, 0xf1, 0xf8, 0x03, 0x02, 0x3f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xe0, 0x40, 0x10, 0x39, 0xcc, 0xe3,
0xf8, 0x03, 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3,
0xff, 0xff, 0xf1, 0xfc, 0x09, 0x3c, 0xe0, 0x67, 0xf0, 0x01, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0x09, 0x3c, 0xe0, 0x0f,
0xe3, 0x00, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87,
0xff, 0xff, 0xff, 0xff, 0x8c, 0x9e, 0x70, 0x1f, 0xc7, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xcc, 0x9e, 0x3f, 0x03,
0x8f, 0x00, 0x40, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f,
0xff, 0xff, 0xff, 0xff, 0xe4, 0xcf, 0x1f, 0xe0, 0x1f, 0x20, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x47, 0x0e, 0xbe,
0x1e, 0x78, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff,
0xff, 0xff, 0xff, 0xff, 0xe2, 0x47, 0x81, 0xef, 0x3c, 0xf8, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x23, 0xc0, 0x1f,
0x99, 0xf0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x7f,
0xff, 0xff, 0xff, 0xdf, 0xf3, 0x21, 0xf8, 0x0f, 0x9b, 0xe0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0x87, 0xf3, 0x30, 0x7c, 0x83,
0x87, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff,
0xff, 0xff, 0xf3, 0x9f, 0xf1, 0x10, 0x38, 0xc3, 0xc7, 0x87, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xfe, 0x7f, 0xff, 0xff, 0xe7, 0x3f, 0xf9, 0x98, 0x19, 0xe1,
0x4f, 0x0e, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0x0f,
0xff, 0xff, 0xc6, 0x7f, 0xf9, 0x98, 0x83, 0xf1, 0x40, 0x1e, 0x61, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x80, 0xc7, 0xff, 0xfe, 0x0c, 0xff, 0xf8, 0x8c, 0xe3, 0xf1,
0xc0, 0x0c, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x60, 0x13,
0xff, 0xf8, 0x03, 0xff, 0xf8, 0xcc, 0x7c, 0xf0, 0xa0, 0x60, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x7e, 0x09, 0xff, 0xc0, 0x87, 0xff, 0xf8, 0xce, 0x7c, 0x20,
0xf9, 0xc1, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0x03, 0xc4,
0xff, 0x0e, 0x0f, 0xff, 0xf8, 0xce, 0x38, 0x24, 0x7f, 0x01, 0xe3, 0xfe, 0x03, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0x7c, 0x12, 0x78, 0x3c, 0x1f, 0xff, 0xfc, 0xc7, 0x1c, 0x26,
0x06, 0x1c, 0x07, 0xfc, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0x3f, 0x88,
0x60, 0xf8, 0x7f, 0xff, 0xfc, 0xc7, 0x9e, 0x63, 0x00, 0x3e, 0x0f, 0xf8, 0xe0, 0x0f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xe0, 0x03, 0xe1, 0xff, 0xef, 0xfc, 0x67, 0x87, 0xf9,
0xe0, 0xff, 0x1f, 0xf3, 0x8f, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0xf8,
0x7f, 0x80, 0x00, 0x07, 0xfc, 0x67, 0x01, 0xfc, 0x41, 0xff, 0xff, 0xe2, 0x3f, 0xf1, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0x1f, 0xf8, 0xfe, 0x03, 0xff, 0xff, 0xfc, 0x67, 0x20, 0xfc,
0x07, 0xff, 0xff, 0xe2, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0x9f, 0xf8,
0xf8, 0x79, 0xff, 0xff, 0xfc, 0x66, 0x78, 0x00, 0x03, 0xff, 0xff, 0xc4, 0xff, 0xfc, 0x7f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x8f, 0xf8, 0xe0, 0xfd, 0xff, 0xff, 0xfc, 0x62, 0x7f, 0xe1,
0xe1, 0xff, 0xff, 0xc5, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x8f, 0xfc,
0x06, 0x7c, 0x7f, 0xff, 0xf0, 0x70, 0xf7, 0x01, 0xf8, 0x7f, 0xff, 0x85, 0xff, 0xf7, 0x3f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xcf, 0xfc, 0x1f, 0x1f, 0x03, 0xff, 0x86, 0x70, 0xf4, 0x18,
0xfc, 0x7f, 0xe0, 0xa5, 0xff, 0xb7, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xe7, 0xfc,
0x3f, 0x87, 0x11, 0xfe, 0x1f, 0xf0, 0xe8, 0x7c, 0x06, 0x3f, 0x80, 0x24, 0x0f, 0xb2, 0x3f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xe3, 0xfc, 0x0f, 0xe3, 0x20, 0xfc, 0x7f, 0xe8, 0xc0, 0x3e,
0x07, 0x3e, 0x0e, 0x04, 0xe7, 0xb2, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xe3, 0xfe,
0x71, 0xf8, 0x28, 0x79, 0xff, 0x08, 0x81, 0xc0, 0x07, 0x38, 0x3f, 0x84, 0x17, 0xb6, 0x7f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xf1, 0x02, 0x7c, 0x7c, 0x10, 0x23, 0xfc, 0x18, 0x07, 0xf0,
0x06, 0x20, 0xc1, 0xc0, 0x13, 0xb4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xf0, 0x00,
0x3f, 0x9f, 0x07, 0x8f, 0xe1, 0xfc, 0x1c, 0x1f, 0x82, 0x07, 0x00, 0x60, 0xd3, 0xb4, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xe0, 0xfe, 0x1c, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x60, 0x01,
0xe0, 0x1e, 0x1e, 0x20, 0x13, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xc3, 0xff,
0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe0, 0x1f, 0xf0, 0xff, 0x10, 0x03, 0x63, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x8f, 0xff, 0xc6, 0x7f, 0x00, 0x00, 0x3f, 0x07, 0x0f, 0xfe,
0x00, 0x03, 0xff, 0x93, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff,
0xe6, 0x00, 0x07, 0xb8, 0x00, 0x3c, 0x3f, 0xff, 0xc0, 0x0f, 0xff, 0x93, 0xfc, 0x00, 0x03, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x1f, 0xff, 0xf0, 0x01, 0x9f, 0xff, 0xbd, 0xe0, 0xff, 0xff,
0xff, 0xff, 0xff, 0x98, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff,
0xf0, 0x6f, 0x10, 0x03, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x7f, 0xc0, 0x3e, 0x0f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x18, 0x3f, 0xfe, 0xf8, 0x6f, 0x20, 0x00, 0x00, 0xcf, 0xff, 0xff,
0xff, 0xff, 0xfc, 0x76, 0x60, 0x00, 0x07, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3c, 0x3f, 0xff,
0x78, 0x66, 0x27, 0xf0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf0, 0x00, 0x1f, 0xf1, 0x8f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf8, 0x7c, 0x37, 0xfe, 0x7c, 0x66, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe0, 0x00, 0x78, 0x3f, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf8, 0x3b, 0xef,
0x7c, 0x66, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x07, 0xf0, 0x7f, 0xfe, 0x7f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xe3, 0xfc, 0x39, 0xef, 0x7c, 0x66, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfe, 0x18, 0x6f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xfc, 0x11, 0xe7,
0x3c, 0x20, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x61, 0x9f, 0xc0, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xcf, 0xfc, 0x00, 0xe7, 0xbc, 0x00, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x0e, 0x3f, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfc, 0x00, 0xf7,
0xbc, 0x0e, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x38, 0xff, 0x91, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x1f, 0xf9, 0x80, 0x26, 0x3c, 0x3e, 0x31, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x01, 0x83, 0xff, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xf1, 0xc0, 0x00,
0x1c, 0x1f, 0x18, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0c, 0x0f, 0xfe, 0x27, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0x7f, 0xf3, 0xc0, 0x00, 0x00, 0xcf, 0x87, 0x0f, 0xff, 0xff, 0xff, 0xff,
0xf8, 0x20, 0x7f, 0xfe, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xe3, 0xe0, 0x06,
0x61, 0xc7, 0xc0, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0xc3, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfc, 0xff, 0xc7, 0xff, 0x0f, 0xff, 0xe7, 0xe0, 0x3e, 0x00, 0x07, 0xff, 0xff,
0x83, 0x0f, 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xc7, 0xff, 0x07,
0xff, 0xf3, 0xfe, 0x00, 0xfe, 0x00, 0xff, 0xff, 0x06, 0x7f, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf9, 0xff, 0xcf, 0xff, 0x87, 0xff, 0xf3, 0xff, 0x00, 0x01, 0xfc, 0x7f, 0xfc,
0x36, 0xff, 0xff, 0xe2, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xcf, 0xff, 0x83,
0xff, 0xfb, 0xff, 0xfe, 0x00, 0x0e, 0x3f, 0xc8, 0xe6, 0xff, 0xff, 0xc4, 0x7f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf3, 0xff, 0xcf, 0xff, 0x83, 0xff, 0xf9, 0xff, 0xff, 0xff, 0x07, 0x1f, 0x81,
0xe6, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xdf, 0xff, 0xc9,
0xff, 0xcc, 0xff, 0xff, 0x7e, 0x01, 0x1f, 0x43, 0xe6, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf3, 0xff, 0x9f, 0xff, 0xcc, 0xff, 0xec, 0x7f, 0xf8, 0x06, 0x01, 0x9f, 0x03,
0xe6, 0x7f, 0xff, 0x31, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x9f, 0xff, 0xc4,
0x7f, 0xe6, 0x7f, 0xf2, 0xe0, 0x00, 0x9f, 0x03, 0xf6, 0x7f, 0xfc, 0x63, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xe7, 0xff, 0xbf, 0xff, 0xe6, 0x7f, 0xf6, 0x3c, 0xf6, 0x60, 0x08, 0x8f, 0x03,
0xf6, 0x7f, 0xf0, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0x3f, 0xff, 0xe6,
0x3f, 0xf3, 0x11, 0x10, 0x00, 0xf8, 0xcf, 0x00, 0x16, 0x00, 0x03, 0xcf, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xef, 0xff, 0x3f, 0xff, 0xe7, 0x3f, 0xfb, 0x14, 0x03, 0x87, 0xfc, 0x4c, 0x27,
0xd2, 0x00, 0x07, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0x7f, 0xff, 0xe3,
0x1f, 0xf1, 0x01, 0x03, 0x87, 0xfc, 0x4d, 0xff, 0xf2, 0x7f, 0xf4, 0x1f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xcf, 0xff, 0x7f, 0xff, 0xf3, 0xcf, 0xf8, 0x00, 0x00, 0x07, 0xfc, 0x4d, 0xff,
0xf2, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xcf, 0xfe, 0x7f, 0xff, 0xf3,
0xcf, 0xe4, 0x00, 0x03, 0x33, 0xfc, 0x6d, 0xff, 0xf3, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x00, 0x7f, 0xcf, 0xfe, 0x7f, 0xff, 0xf3, 0xe4, 0xe0, 0x40, 0x7b, 0xf7, 0xf0, 0x25, 0xff,
0xf9, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7c, 0x00, 0xcf, 0xfe, 0x7f, 0xff, 0xf1,
0xc0, 0xf0, 0x01, 0xf3, 0xf3, 0xe0, 0x24, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe0, 0x3f, 0x80, 0x0f, 0xfc, 0xff, 0xff, 0xf1, 0xc0, 0xe0, 0x07, 0xc3, 0xf3, 0xc0, 0x24, 0xff,
0xe9, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0f, 0xfc, 0x0f, 0xfc, 0xff, 0xff, 0xf9,
0xd2, 0x00, 0x1f, 0xc3, 0xf3, 0x00, 0x34, 0xff, 0xe9, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x8f, 0x80, 0xff, 0xef, 0xfd, 0xff, 0xff, 0xf8, 0xd0, 0x80, 0x3f, 0x93, 0xe6, 0x08, 0x36, 0xff,
0xe9, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xf0, 0x00, 0xef, 0xf9, 0xff, 0xff, 0xf8,
0x80, 0x03, 0xfe, 0x09, 0xc4, 0x38, 0x36, 0xff, 0xc9, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x1f, 0xff, 0xc0, 0x0f, 0xf9, 0xff, 0xff, 0xf8, 0x10, 0x1f, 0xf0, 0x19, 0xc0, 0x78, 0x36, 0x7e,
0x09, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0x0f, 0xf3, 0xff, 0xff, 0xf8,
0xc0, 0x7f, 0x03, 0xb9, 0x00, 0xf0, 0x17, 0x7c, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
0x3f, 0xff, 0xff, 0xcf, 0xf3, 0xff, 0xff, 0xf8, 0x81, 0xf8, 0x1f, 0x98, 0x43, 0xf0, 0x1b, 0xb0,
0x08, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xcf, 0xf3, 0xff, 0xff, 0xf8,
0x0f, 0xc7, 0xff, 0xe1, 0x87, 0xf0, 0x1b, 0x83, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
0x7f, 0xff, 0xff, 0xcf, 0xe3, 0xff, 0xff, 0xf8, 0x18, 0x0f, 0xff, 0xff, 0x0f, 0xf3, 0x1b, 0xc7,
0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xcf, 0xe3, 0xff, 0xff, 0xf8,
0x00, 0x7f, 0xff, 0xfc, 0x3f, 0xe7, 0x1b, 0xcf, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc,
0x3f, 0xff, 0xff, 0xcf, 0xe3, 0xff, 0xff, 0xf9, 0x83, 0xff, 0xff, 0xf8, 0x7f, 0xcf, 0x0b, 0x8f,
0xf0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0x9f, 0xc3, 0xff, 0xff, 0xf0,
0x3f, 0xff, 0xff, 0xf0, 0xff, 0x9c, 0x0b, 0x9f, 0xc0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe0,
0xc0, 0x7f, 0xff, 0x9f, 0xc1, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xc1, 0xfe, 0x71, 0x88, 0x20,
0x00, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xc7, 0xff, 0xe0, 0x00, 0x3f, 0xff, 0xc3, 0xf0, 0x07, 0xff, 0x9f, 0xc1, 0xff, 0xff, 0xe3,
0xff, 0xff, 0xff, 0x83, 0xfc, 0xf1, 0x88, 0x20, 0x00, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xf8, 0x00, 0x7e, 0x0f,
0xfe, 0x00, 0x7f, 0x9f, 0x99, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x07, 0xf1, 0xc3, 0x80, 0x00,
0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0x30, 0x03, 0x9f, 0x98, 0xff, 0xff, 0xcf,
0xff, 0xff, 0xfe, 0x1f, 0xe3, 0x87, 0x04, 0x10, 0x38, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x03, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7f,
0xff, 0x7e, 0x00, 0x3f, 0x9c, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfc, 0x3f, 0xcf, 0x0f, 0x1c, 0x20,
0x30, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0,
0x3f, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xfe, 0x3f, 0x9c, 0xff, 0xff, 0x9f,
0xff, 0xff, 0xe0, 0x7f, 0x1c, 0x3e, 0x1c, 0x21, 0xde, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x7f, 0xff, 0x3f, 0x1e, 0xff, 0xff, 0x1f, 0xff, 0xfe, 0x00, 0xfe, 0x38, 0x7c, 0x1c, 0x47,
0xde, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0f,
0xff, 0xfc, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0x00, 0xff, 0xfe, 0x7f, 0x1e, 0x7f, 0xff, 0x3f,
0xff, 0xf0, 0x03, 0xf8, 0x71, 0xf8, 0x1c, 0x47, 0x6d, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xfc, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x0d, 0xff, 0xfe, 0x7e, 0x3f, 0x7f, 0xfe, 0x3f, 0xff, 0x80, 0x07, 0xf1, 0xe3, 0xf0, 0x0c, 0xee,
0x44, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff,
0xff, 0xfe, 0x78, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x39, 0xff, 0xfc, 0x1e, 0x3f, 0x7f, 0xfc, 0x7f,
0xfe, 0x0f, 0x0f, 0xe3, 0xc7, 0xe0, 0x0e, 0xd8, 0x33, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xfe, 0x60, 0x1f, 0xff, 0xfe, 0x1c, 0xfb,
0xe1, 0xff, 0xfc, 0x26, 0x7f, 0x7f, 0xfc, 0x7f, 0xc0, 0xfe, 0x1f, 0x87, 0x8f, 0xc0, 0x0e, 0x51,
0x1a, 0xd8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff,
0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xf0, 0x02, 0x7f, 0x7f, 0xf8, 0x3c,
0x0f, 0xf8, 0x7f, 0x0e, 0x1f, 0x80, 0x8e, 0x77, 0x99, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfe,
0x1f, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xf8, 0x00, 0x7f, 0xf0, 0xfe, 0x3c, 0x3f, 0x00, 0x0e, 0x68,
0x0d, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xfe,
0x01, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0x80, 0x06, 0x7f, 0xff, 0xf0, 0x03,
0xff, 0xe1, 0xfc, 0x78, 0xfe, 0x00, 0x4e, 0x68, 0x0c, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfc, 0x7f, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xe1,
0xff, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xf3, 0x01, 0xe0, 0x0f, 0xf1, 0xc3, 0xfc, 0x00, 0x07, 0x50,
0x06, 0xf6, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xe1,
0xf0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xfe, 0x10, 0x20, 0x7f, 0xff, 0xe3, 0x80,
0x00, 0x0f, 0xf1, 0xc3, 0xfc, 0x00, 0x07, 0x50, 0x06, 0xf6, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0x87, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x1f,
0xff, 0xfe, 0x00, 0x24, 0x3f, 0xff, 0xe3, 0xe0, 0x00, 0x1f, 0xe3, 0x8f, 0xf8, 0x04, 0x47, 0x00,
0x03, 0x16, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0x1f,
0x03, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xfc, 0x40, 0x00, 0x3f, 0xff, 0xe3, 0xf8,
0x07, 0xff, 0x87, 0x1f, 0xf0, 0x60, 0x07, 0x00, 0x03, 0x7f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfe, 0x7c, 0x1f, 0x01, 0xe7, 0xff, 0xff, 0xfe, 0x83, 0xff,
0xff, 0xfc, 0x83, 0x00, 0x1f, 0xff, 0xc7, 0xfd, 0xff, 0xff, 0x1e, 0x3f, 0xe0, 0xc0, 0x06, 0x22,
0x01, 0x7b, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf9, 0xf0,
0x78, 0x00, 0x07, 0xff, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xf8, 0x84, 0x04, 0x1f, 0xff, 0xc7, 0xff,
0xff, 0xfe, 0x38, 0x7f, 0xc0, 0x40, 0x26, 0x24, 0x41, 0xbb, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xf3, 0xe1, 0xe0, 0xff, 0xc3, 0xff, 0xff, 0xf0, 0x38, 0xff,
0xff, 0xf9, 0x8f, 0x07, 0x8f, 0xff, 0x87, 0xff, 0xff, 0xfc, 0x70, 0xff, 0x88, 0x23, 0xe7, 0x20,
0x01, 0xbb, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xc7, 0x83,
0x87, 0xff, 0xf3, 0xff, 0xff, 0xe0, 0x9c, 0x7f, 0xff, 0xf8, 0x01, 0x23, 0xcf, 0x9f, 0x8f, 0xff,
0xff, 0xf8, 0xe1, 0xff, 0x81, 0x60, 0x07, 0x20, 0x40, 0x9d, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x8e, 0x0c, 0x1f, 0xff, 0xf9, 0xff, 0xff, 0x07, 0xc7, 0x1f,
0xff, 0xf8, 0x00, 0x63, 0xe7, 0x8f, 0x8f, 0xff, 0xff, 0xf3, 0xc7, 0xff, 0x01, 0xfd, 0xe7, 0x08,
0x10, 0xdd, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x18, 0x18,
0x7f, 0xff, 0xf9, 0xff, 0xfc, 0x0f, 0xe3, 0x8f, 0xff, 0xf0, 0x3a, 0xe1, 0xe3, 0xcf, 0x1f, 0xff,
0xff, 0xe7, 0x8f, 0xfe, 0x00, 0x7e, 0xe7, 0x08, 0x14, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf3, 0xfe, 0x38, 0xc1, 0xff, 0xff, 0xf9, 0xff, 0xf0, 0x3f, 0xf9, 0xc3,
0xff, 0xe1, 0xf8, 0xe0, 0xe3, 0xc7, 0x1f, 0xff, 0xff, 0xce, 0x1f, 0xfc, 0x70, 0x00, 0x07, 0x3c,
0x34, 0x4f, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xfc, 0xe1, 0x87,
0xff, 0xff, 0xf9, 0xff, 0xc0, 0xff, 0xfe, 0x71, 0xff, 0xc3, 0xf1, 0xf0, 0xe7, 0xe6, 0x3f, 0xff,
0xff, 0x1c, 0x3f, 0xf8, 0xe1, 0xfb, 0x07, 0x1e, 0x36, 0x6e, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xe7, 0xf9, 0xc7, 0x0f, 0xff, 0xff, 0xf9, 0xfe, 0x03, 0xff, 0xff, 0x38,
0xff, 0xc7, 0xf3, 0xf0, 0x67, 0xe4, 0x3f, 0xff, 0xfe, 0x38, 0xff, 0xf0, 0xe3, 0xfe, 0x37, 0x1e,
0x26, 0x6e, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xfb, 0x8e, 0x3f,
0xff, 0xff, 0xf9, 0xf0, 0x0f, 0xff, 0xff, 0x9c, 0x7f, 0x8f, 0xe7, 0xfb, 0x13, 0xe0, 0x7f, 0xff,
0xf8, 0xe3, 0xff, 0xc3, 0xc7, 0xff, 0x33, 0x0e, 0x66, 0x2e, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x8f, 0xf7, 0x1c, 0x7f, 0xff, 0xff, 0xfb, 0xc0, 0x1f, 0xff, 0xff, 0xc6,
0x3f, 0x1f, 0xc7, 0xfb, 0x07, 0xe0, 0xff, 0xff, 0xf1, 0xe7, 0xff, 0x87, 0xc7, 0xff, 0x33, 0x27,
0x27, 0x27, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xe6, 0x18, 0xff,
0xff, 0xff, 0xf3, 0x01, 0x0f, 0xff, 0xff, 0xe3, 0x0f, 0x3f, 0x8f, 0xfb, 0x07, 0xe0, 0xff, 0xff,
0xf1, 0xe7, 0xff, 0x87, 0xc7, 0xff, 0x03, 0x37, 0x0e, 0x37, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x1f, 0xee, 0x31, 0xff, 0xff, 0xff, 0xf0, 0x70, 0x87, 0xff, 0xff, 0xf9,
0xc6, 0x7f, 0x87, 0xfb, 0x87, 0xe1, 0xff, 0xff, 0xe3, 0xcf, 0xff, 0x8f, 0x87, 0xff, 0x03, 0x3b,
0x0e, 0x37, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xdc, 0x63, 0xff,
0xff, 0xff, 0xe0, 0xfc, 0x23, 0xff, 0xff, 0xfc, 0x60, 0xff, 0x27, 0xfb, 0xc7, 0xe3, 0xff, 0xff,
0xc7, 0x1f, 0xff, 0x1f, 0x87, 0xff, 0x93, 0x1d, 0x0c, 0x37, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0x3f, 0x98, 0xc7, 0xff, 0xff, 0xff, 0x07, 0xfe, 0x18, 0xff, 0xff, 0xfe,
0x31, 0xfe, 0x37, 0xff, 0xc7, 0xe3, 0xff, 0xff, 0x9e, 0x3f, 0xfe, 0x3f, 0x07, 0xff, 0x93, 0x9c,
0x0c, 0xbf, 0x23, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0x39, 0x8f, 0xff,
0xff, 0xfe, 0x1f, 0xff, 0x8c, 0x7f, 0xff, 0xff, 0x93, 0xfe, 0x77, 0xff, 0xef, 0xc7, 0xff, 0xff,
0x3c, 0x7f, 0xfe, 0x7f, 0x27, 0xff, 0x9b, 0x9e, 0x0d, 0xbb, 0xa3, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfc, 0xff, 0x23, 0x1f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xc3, 0x3f, 0xff, 0xff,
0xc7, 0xfc, 0xf7, 0xff, 0xef, 0xc7, 0xff, 0xfe, 0x78, 0xff, 0xfc, 0x7e, 0x67, 0xff, 0x9b, 0x8f,
0x01, 0x9b, 0xb3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xfe, 0x62, 0x1f, 0xff,
0xff, 0xf8, 0x7f, 0xff, 0xe1, 0x8f, 0xff, 0xff, 0xc7, 0xf8, 0xf3, 0xff, 0xef, 0x87, 0xff, 0xfc,
0xf1, 0xff, 0xf8, 0xfe, 0x77, 0xff, 0x9b, 0x87, 0x23, 0x9b, 0xb3, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf9, 0xfc, 0x46, 0x0f, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xfc, 0x31, 0xff, 0xff,
0x8f, 0xf2, 0xfb, 0xff, 0xfe, 0x0f, 0xff, 0xf9, 0xe7, 0xff, 0xf1, 0xfc, 0x77, 0xff, 0x9b, 0x83,
0x03, 0xd9, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf8, 0xcc, 0x87, 0xff,
0xc1, 0xc2, 0x7f, 0xff, 0xfc, 0x31, 0xff, 0xff, 0x9f, 0xf2, 0x7b, 0xff, 0xfe, 0x0f, 0xff, 0xf3,
0xcf, 0xff, 0xf3, 0xfc, 0xf7, 0xff, 0xd9, 0x83, 0x03, 0xdd, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf3, 0xf9, 0x88, 0xc3, 0xff, 0xd9, 0x8e, 0x7f, 0xff, 0xff, 0x18, 0xff, 0xff,
0x3f, 0xe7, 0x7b, 0xff, 0xfc, 0x1f, 0xff, 0xe7, 0x8c, 0x07, 0xe7, 0xf8, 0xf7, 0xff, 0xc9, 0x89,
0x23, 0xdd, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf1, 0x98, 0xf0, 0xff,
0x98, 0x1e, 0x7f, 0xff, 0xff, 0x86, 0x3f, 0xfe, 0x3f, 0xcf, 0x7b, 0xff, 0xf8, 0x1f, 0xff, 0xcf,
0x3c, 0x73, 0xcf, 0xf9, 0xf7, 0xff, 0xc1, 0x8c, 0x31, 0xdd, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xe7, 0xf3, 0x99, 0xfc, 0x00, 0x18, 0x7e, 0x7f, 0xff, 0xff, 0xf3, 0x1f, 0xfc,
0x7f, 0xcf, 0x79, 0xff, 0xf8, 0x3f, 0xff, 0x1e, 0x78, 0xf3, 0x9f, 0xf1, 0xf7, 0xff, 0xc1, 0xce,
0x21, 0xfd, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xe7, 0x33, 0xff, 0x00,
0x39, 0xf8, 0x7f, 0xff, 0xff, 0xf8, 0x87, 0xfc, 0xff, 0x9f, 0x39, 0xff, 0xe0, 0xff, 0xfe, 0x7c,
0xf9, 0xe7, 0x1f, 0xf3, 0xf7, 0xff, 0xe1, 0xce, 0x2c, 0xee, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xc7, 0xe7, 0x33, 0xff, 0xe0, 0x3b, 0xe0, 0x3f, 0xff, 0xff, 0xfc, 0x63, 0xf8,
0xff, 0x9f, 0x39, 0xff, 0xc3, 0xff, 0xfc, 0xf8, 0xe0, 0xce, 0x3f, 0xe7, 0xff, 0xff, 0xc1, 0xce,
0x0c, 0xee, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xc6, 0x77, 0xff, 0xfe,
0x7b, 0x83, 0x1f, 0xff, 0xff, 0xff, 0x11, 0xf9, 0xff, 0x3f, 0xbd, 0xff, 0x87, 0xff, 0xf1, 0xf0,
0x00, 0x0c, 0x7f, 0xe7, 0xff, 0xff, 0x81, 0xce, 0x1e, 0x6e, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xcf, 0xce, 0x67, 0xff, 0xfc, 0xf8, 0x0f, 0x07, 0xff, 0xff, 0xff, 0x8c, 0x73,
0xff, 0x3f, 0x9d, 0xfe, 0x1f, 0xff, 0xe3, 0xe0, 0x1f, 0x0c, 0x7f, 0xc7, 0xff, 0xff, 0x0d, 0xce,
0x8e, 0x2e, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x8c, 0xe7, 0xff, 0xf0,
0xf8, 0x7e, 0x03, 0xff, 0xff, 0xff, 0xc6, 0x23, 0xfe, 0x7f, 0x9d, 0xfc, 0x3f, 0xff, 0xcf, 0x81,
0x3f, 0x00, 0x7f, 0xcf, 0xff, 0xff, 0x1d, 0xce, 0x87, 0x06, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x9f, 0x8c, 0xcf, 0xff, 0xe1, 0xf9, 0xf8, 0x10, 0xff, 0xff, 0xff, 0xf3, 0x87,
0xfe, 0x7f, 0x9c, 0xf8, 0xff, 0xff, 0x1f, 0x05, 0xbf, 0x80, 0x7f, 0x8f, 0xff, 0xfe, 0x3c, 0xcd,
0x93, 0x06, 0xe4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x99, 0xcf, 0xff, 0xe0,
0x13, 0xe0, 0x18, 0x7f, 0xff, 0xff, 0xf8, 0xc7, 0xfe, 0xff, 0x9c, 0xe1, 0xff, 0xfe, 0x3e, 0x0a,
0xdf, 0xc0, 0x7f, 0x9f, 0xff, 0xfc, 0x7c, 0xed, 0x19, 0x86, 0x64, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xbf, 0x99, 0x9f, 0xff, 0xc0, 0x03, 0x03, 0x9c, 0x3f, 0xff, 0xff, 0xfc, 0x0f,
0xfc, 0xff, 0x9c, 0xc3, 0xff, 0xf8, 0xf8, 0x0a, 0xdf, 0xe0, 0x7f, 0x3f, 0xff, 0xf8, 0xfc, 0xed,
0x19, 0x96, 0x74, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x99, 0x9f, 0xff, 0xc2,
0x10, 0x0f, 0x1f, 0x0f, 0xff, 0xff, 0xff, 0x9f, 0xf9, 0xff, 0x9c, 0x0f, 0xff, 0xc3, 0xc3, 0x14,
0x0f, 0xf6, 0x3e, 0x7f, 0xff, 0xf1, 0xfc, 0xe2, 0x9e, 0x47, 0x76, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0x13, 0x9f, 0xfc, 0x03, 0x10, 0x3f, 0x1f, 0x87, 0xff, 0xff, 0xff, 0x3f,
0xf9, 0xff, 0x9c, 0x0f, 0xff, 0xc3, 0xc3, 0x14, 0x0f, 0xf6, 0x3e, 0x7f, 0xff, 0xf1, 0xfc, 0xe2,
0x9e, 0x47, 0x76, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x33, 0x3f, 0xf0, 0x10,
0xb0, 0x3f, 0x1f, 0xc3, 0xff, 0xff, 0xfe, 0x7f, 0xf3, 0xff, 0x9e, 0x1f, 0xff, 0x87, 0x85, 0x58,
0x67, 0xf3, 0x3e, 0x7f, 0xff, 0xe3, 0xfc, 0xe2, 0x8f, 0x23, 0x76, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x01, 0xf2, 0x03, 0x3f, 0x1f, 0xe0, 0xff, 0xff, 0xfe, 0x7f,
0xf7, 0xff, 0x9c, 0x3f, 0xff, 0x1e, 0x15, 0x09, 0xe7, 0xfb, 0x1c, 0xff, 0xff, 0xe7, 0xfc, 0xe6,
0x8f, 0x83, 0x32, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0x00, 0x00, 0x07, 0xe1,
0xc7, 0x3f, 0x1f, 0xf8, 0x7f, 0xff, 0xfe, 0x7f, 0xe7, 0xff, 0x98, 0x7f, 0xfc, 0x3c, 0x18, 0xa9,
0xf3, 0xf9, 0x9d, 0xff, 0xff, 0xc7, 0xfe, 0xe5, 0x8f, 0x83, 0xb2, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfe, 0x7c, 0x0f, 0xff, 0xff, 0x81, 0x82, 0x3f, 0x1f, 0xfc, 0x1f, 0xff, 0xfc, 0xff,
0xcf, 0xff, 0x80, 0x3f, 0xf8, 0x78, 0xda, 0x81, 0xf3, 0xfd, 0xcd, 0xff, 0xff, 0xcf, 0xfe, 0xe1,
0x8f, 0x83, 0xba, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x78, 0xff, 0xff, 0xf8, 0x00,
0x00, 0x7f, 0x1f, 0xfe, 0x0f, 0xff, 0xf9, 0xff, 0xdf, 0xff, 0x81, 0x1f, 0xf1, 0xf1, 0x6c, 0x53,
0xf9, 0xfd, 0xc9, 0xff, 0xff, 0x8f, 0xfe, 0x61, 0xcc, 0x33, 0xba, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfe, 0x71, 0xfc, 0x00, 0x00, 0x44, 0x1c, 0x1f, 0x9f, 0xff, 0x87, 0xff, 0xf9, 0xff,
0x9f, 0xff, 0x81, 0xa7, 0x80, 0x07, 0xad, 0x51, 0xf9, 0xfc, 0xc3, 0xff, 0xff, 0x1f, 0xfe, 0x70,
0x00, 0x3b, 0xba, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x63, 0xc0, 0x00, 0x0f, 0xc3,
0x0e, 0x07, 0x9f, 0xff, 0xc1, 0xff, 0xf3, 0xff, 0x3f, 0xff, 0x82, 0xc0, 0x00, 0x02, 0xa5, 0x69,
0xfc, 0xfc, 0x63, 0xff, 0xfe, 0x1f, 0xfe, 0x30, 0x3f, 0x0b, 0xba, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfe, 0x67, 0x06, 0x7f, 0xff, 0xe0, 0x03, 0xc1, 0x9f, 0xff, 0xf0, 0xff, 0xf3, 0xfe,
0x7f, 0xff, 0x01, 0x00, 0x7c, 0x1a, 0x16, 0xa8, 0xfc, 0xf9, 0x23, 0xff, 0xfe, 0x3f, 0xfe, 0x30,
0x60, 0x03, 0xbb, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x46, 0x26, 0x7f, 0x00, 0xf0,
0x00, 0x70, 0x3f, 0xff, 0xf8, 0x7f, 0xe7, 0xfc, 0xff, 0xfe, 0x1a, 0x07, 0xf8, 0xd9, 0x56, 0xb4,
0xf0, 0xe3, 0x83, 0xff, 0xfc, 0x7f, 0xfe, 0x10, 0x00, 0xc1, 0xbb, 0x3f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfe, 0x0c, 0x26, 0x78, 0x00, 0x00, 0x7c, 0x1e, 0x0f, 0xff, 0xfc, 0x1f, 0xc7, 0xfc,
0xff, 0xfc, 0x20, 0x03, 0xe7, 0xdd, 0x4b, 0x34, 0x06, 0x47, 0xc3, 0xff, 0xf8, 0x7f, 0xfe, 0x10,
0x27, 0xd1, 0x99, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1c, 0x26, 0x71, 0xff, 0xfc,
0x00, 0x01, 0xf0, 0xff, 0xff, 0x07, 0x9f, 0xf3, 0xff, 0xf8, 0x80, 0xe8, 0x03, 0xe6, 0xa5, 0x5a,
0xd3, 0x1f, 0xe3, 0xff, 0xf1, 0xff, 0xff, 0x04, 0x87, 0xb1, 0x9d, 0x3f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfe, 0x18, 0x26, 0x71, 0xff, 0xff, 0xf8, 0x00, 0x1c, 0x3f, 0xff, 0xc1, 0x1f, 0xe3,
0xff, 0xf1, 0x41, 0x99, 0xf3, 0xe6, 0x15, 0xab, 0x68, 0x0f, 0xf3, 0xff, 0xe3, 0xff, 0xff, 0xc4,
0xc7, 0xb1, 0xdd, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x39, 0x26, 0x63, 0xff, 0xff,
0xff, 0xc0, 0x00, 0x0f, 0xff, 0xe0, 0x3f, 0xc7, 0xff, 0xe1, 0x01, 0x89, 0xf9, 0xf3, 0x52, 0xad,
0x60, 0xc7, 0xe7, 0xff, 0xcf, 0xff, 0xff, 0xc6, 0xc7, 0x71, 0xdd, 0x3f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfe, 0x1b, 0x24, 0x07, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x03, 0xff, 0xf8, 0x7f, 0x8f,
0xff, 0xe2, 0x05, 0x18, 0xf8, 0xf3, 0x7a, 0xc5, 0xe6, 0x63, 0xc7, 0xff, 0x9f, 0xff, 0xff, 0xc6,
0x67, 0x71, 0xdd, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x03, 0x24, 0x07, 0xff, 0xff,
0xff, 0xff, 0xf0, 0x00, 0xff, 0xf8, 0xff, 0x1f, 0xff, 0xc0, 0x0c, 0x12, 0xfc, 0xf3, 0x2b, 0x55,
0x92, 0x31, 0x8f, 0xff, 0x1f, 0xff, 0xff, 0xc6, 0x63, 0x61, 0xdd, 0xbf, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf8, 0x03, 0x34, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xf1, 0xfe, 0x3f,
0xff, 0x80, 0x1f, 0x0f, 0x7e, 0x79, 0xa9, 0x6a, 0x38, 0x08, 0x03, 0xfe, 0x3f, 0xff, 0xff, 0xc6,
0x22, 0xe1, 0xdd, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf3, 0x30, 0xc7, 0xff, 0xff,
0xff, 0xff, 0xe1, 0xe0, 0x1f, 0xe3, 0xfe, 0x7f, 0xff, 0x04, 0x3f, 0xff, 0x7e, 0x79, 0x95, 0xa8,
0x10, 0x00, 0x78, 0xfc, 0x7f, 0xff, 0xff, 0xc6, 0x30, 0xe1, 0xdd, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf8, 0x03, 0xb0, 0xcf, 0xcc, 0xe7, 0x3f, 0xff, 0x87, 0xfe, 0x07, 0xc7, 0xfc, 0xff,
0xfe, 0x08, 0x78, 0x3f, 0xbe, 0x7d, 0xd4, 0xa0, 0x43, 0xe0, 0x0c, 0x78, 0xff, 0xff, 0xff, 0xc3,
0x10, 0xe0, 0xdd, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x03, 0x90, 0xcf, 0xcc, 0xd7,
0x7f, 0xff, 0x0f, 0xff, 0x83, 0x8f, 0xf9, 0xff, 0xfc, 0x08, 0x38, 0x1f, 0xbf, 0x3c, 0xc0, 0xc3,
0x47, 0x01, 0x84, 0x11, 0xff, 0xff, 0xff, 0xc3, 0x10, 0xd0, 0xdc, 0x8f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfd, 0xe7, 0x90, 0xcf, 0xc0, 0xd7, 0x7f, 0xfc, 0x7f, 0xff, 0x18, 0x3f, 0xf0, 0xff,
0xf8, 0x00, 0x93, 0xbc, 0x1f, 0xfe, 0xea, 0x3e, 0x4c, 0xf1, 0xe1, 0xc3, 0xff, 0xff, 0xff, 0xe3,
0x00, 0x50, 0xdc, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xef, 0xd8, 0x8f, 0xd2, 0xc3,
0x7f, 0xfc, 0x7f, 0xff, 0x18, 0x3f, 0xf0, 0xff, 0xf8, 0x00, 0x93, 0xbc, 0x1f, 0xfe, 0xea, 0x3e,
0x4c, 0xf1, 0xe1, 0xc3, 0xff, 0xff, 0xff, 0xe3, 0x21, 0x10, 0xdc, 0x8f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf9, 0xef, 0xc8, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfc, 0x38, 0x07, 0xfc, 0xff,
0xf0, 0x22, 0x91, 0x39, 0x8f, 0xfe, 0x00, 0x37, 0x09, 0xf9, 0xe0, 0x87, 0xff, 0xff, 0xff, 0xe1,
0x23, 0x10, 0xdc, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xc8, 0x0f, 0xff, 0xff,
0xff, 0xf9, 0xff, 0xfc, 0x78, 0x00, 0x00, 0xff, 0xe0, 0x11, 0xb8, 0x78, 0x4f, 0xf0, 0x01, 0x9b,
0x81, 0xf9, 0xc4, 0x07, 0xff, 0xff, 0xff, 0xe1, 0x31, 0x94, 0xee, 0x8f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf3, 0xcf, 0xec, 0x00, 0x2f, 0xff, 0xff, 0xf1, 0xff, 0xfc, 0x78, 0x7c, 0x00, 0x0f,
0xe0, 0x00, 0x7f, 0xfe, 0x4f, 0xc3, 0x80, 0xcd, 0x81, 0xf9, 0xc6, 0x0f, 0xff, 0xff, 0xff, 0xe1,
0xb1, 0xc4, 0xee, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xe6, 0x08, 0x00, 0x0f,
0xff, 0xf3, 0xff, 0xf8, 0xf8, 0x7f, 0xff, 0xb8, 0x00, 0x0c, 0xff, 0xf6, 0x47, 0x07, 0xc0, 0x66,
0x01, 0xf9, 0xcf, 0x0f, 0xff, 0xff, 0xff, 0xe1, 0xb1, 0x84, 0xee, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf7, 0xdf, 0xe7, 0x1f, 0xfc, 0x00, 0xff, 0xe7, 0xff, 0xf8, 0xf8, 0x7f, 0xff, 0x9f,
0x80, 0x04, 0xff, 0xf7, 0x80, 0x5f, 0xe0, 0x30, 0x31, 0xf8, 0xce, 0x3f, 0xff, 0xff, 0xff, 0xe1,
0xa5, 0xa4, 0xee, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x9f, 0xf3, 0x0f, 0xff, 0xc0,
0x0f, 0xe7, 0xff, 0xf9, 0xc0, 0x7f, 0xff, 0xcf, 0xc0, 0x00, 0x67, 0xf3, 0x01, 0x1f, 0xf0, 0x18,
0x79, 0x80, 0x4e, 0x3f, 0xff, 0xff, 0xff, 0xe1, 0x8c, 0xa4, 0xee, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe7, 0x8f, 0xfb, 0x00, 0x3f, 0xfe, 0x00, 0x0f, 0xff, 0xf1, 0xc8, 0x7f, 0xff, 0xc7,
0xc0, 0x00, 0x1b, 0xf0, 0x04, 0x1f, 0xe0, 0x13, 0xf8, 0x00, 0x0e, 0x7f, 0xff, 0xff, 0xff, 0xf0,
0x8c, 0xa0, 0xee, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x8f, 0xf9, 0x80, 0x01, 0xff,
0xf0, 0x07, 0xff, 0xf1, 0x9c, 0x3f, 0xff, 0xe3, 0xc7, 0xfc, 0x3d, 0xf0, 0x07, 0x0e, 0x01, 0x0f,
0xf8, 0x38, 0x0e, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xcc, 0x20, 0xec, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xcf, 0x8f, 0xfc, 0xc7, 0x00, 0x3f, 0xff, 0x80, 0x1f, 0xf3, 0x9c, 0x1f, 0xff, 0xf1,
0xe7, 0xfe, 0x35, 0xc0, 0xa7, 0x88, 0x0f, 0x0f, 0xf8, 0xf9, 0xee, 0x7f, 0xff, 0xff, 0xff, 0xf0,
0xcc, 0x24, 0xcc, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x07, 0xfe, 0x47, 0x80, 0x03,
0xff, 0x9c, 0x00, 0xe3, 0x9c, 0x1f, 0xff, 0xf1, 0xe7, 0xfe, 0x34, 0x03, 0x07, 0x80, 0x7f, 0x1f,
0xf9, 0xf9, 0xf6, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x5e, 0x24, 0xcc, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xdf, 0x07, 0xff, 0x21, 0xc1, 0x00, 0x3f, 0x9f, 0xe0, 0x03, 0x9c, 0x8f, 0xff, 0xf8,
0xf3, 0xfe, 0x14, 0x0f, 0x00, 0x03, 0xff, 0x1f, 0xf1, 0xf9, 0x78, 0x7f, 0xff, 0xff, 0xff, 0xf0,
0x5e, 0x0c, 0xcc, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x07, 0xff, 0x10, 0xe0, 0xf8,
0x01, 0x9f, 0xfe, 0x03, 0x98, 0xc7, 0xff, 0xf8, 0x73, 0xfe, 0x01, 0xbf, 0x08, 0x0f, 0xff, 0x1f,
0xe3, 0xfb, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x6e, 0x0c, 0xcc, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x3f, 0x73, 0xff, 0x98, 0x70, 0x7f, 0xc0, 0x1f, 0xff, 0xc3, 0x9c, 0x63, 0xff, 0xfc,
0x18, 0x7f, 0x23, 0x9c, 0x3f, 0x23, 0xfe, 0x3f, 0xc7, 0xf3, 0xd8, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x6e, 0x4c, 0xec, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xe3, 0xff, 0xc4, 0x38, 0x0f,
0xfe, 0x01, 0xff, 0xe3, 0x8e, 0x20, 0xff, 0xfe, 0x00, 0x03, 0x33, 0xb0, 0xfc, 0x70, 0xfe, 0x20,
0x0f, 0xf7, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2e, 0x44, 0xec, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfc, 0x7c, 0x01, 0xff, 0xe3, 0x1e, 0x00, 0xff, 0xc0, 0x0f, 0xe3, 0x80, 0x06, 0x7f, 0xff,
0xc0, 0x00, 0x19, 0xe3, 0xf0, 0xfc, 0x00, 0x00, 0x3f, 0xe7, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x2e, 0x64, 0xec, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0x01, 0xff, 0xf1, 0x8f, 0xc0,
0x00, 0x00, 0x00, 0xf3, 0xf0, 0x0e, 0x7f, 0xff, 0x70, 0xc0, 0x00, 0x03, 0x81, 0x80, 0x00, 0x01,
0xff, 0x8f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x36, 0x20, 0xcd, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xe1, 0x80, 0x00, 0xff, 0xfc, 0x63, 0xf0, 0x00, 0x07, 0x80, 0x13, 0xf0, 0x0e, 0x3f, 0xff,
0x80, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x36, 0x08, 0xcd, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x86, 0x00, 0x00, 0x7f, 0xfe, 0x30, 0xff,
0x00, 0xff, 0x80, 0x00, 0x00, 0x0e, 0x1f, 0xff, 0xc0, 0x7f, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff,
0xfe, 0x3f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x08, 0xdd, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0x08, 0x00, 0x02, 0x3f, 0xff, 0x0e, 0x1f, 0xff, 0xfe, 0x1c, 0x00, 0x00, 0x00, 0x0f, 0xff,
0xf0, 0x3f, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc,
0x10, 0x8d, 0xdb, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x71, 0x00, 0x07, 0x3f, 0xff, 0x83, 0x03,
0xff, 0xf0, 0x38, 0x04, 0x00, 0x02, 0x47, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0d, 0xdb, 0xbf, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x80, 0x00, 0x0f, 0x9f, 0xff, 0xe0, 0xf0, 0x1c, 0x01, 0xe0, 0x10, 0x00, 0x00, 0x61, 0xff,
0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0f, 0x8f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfe,
0x18, 0x0d, 0xdb, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x1f, 0xcf, 0xff, 0xf8, 0x7e,
0x00, 0x1f, 0x83, 0x80, 0x08, 0x00, 0x30, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
0x00, 0x3f, 0xc7, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x18, 0x0d, 0xdb, 0x3f, 0xff, 0xff, 0xff,
0xff, 0xe6, 0x00, 0x03, 0xff, 0xc7, 0xff, 0xfe, 0x1f, 0xff, 0xfe, 0x1f, 0x54, 0x00, 0x08, 0x08,
0x7f, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xe1, 0xfc, 0x7f, 0xff, 0xff,
0xff, 0xfe, 0x08, 0x49, 0xdb, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x40, 0x1f, 0xff, 0xe1, 0xff,
0xff, 0xfc, 0x03, 0x7f, 0x60, 0xf8, 0x02, 0xa4, 0x1e, 0x00, 0x1f, 0xff, 0xc0, 0x07, 0xff, 0xbc,
0x00, 0x00, 0x7f, 0xff, 0xe1, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x08, 0x01, 0x9a, 0x3f, 0xff,
0xff, 0xff, 0xff, 0xe2, 0x00, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xf8, 0x00, 0x07, 0xfe, 0xf3, 0x70,
0x3e, 0x00, 0x07, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf0, 0xf8, 0xff, 0xff,
0xff, 0xff, 0xff, 0x05, 0x01, 0x9a, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xf8,
0xff, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xf8, 0x7f, 0xb0, 0x03, 0xff, 0xc0, 0x00, 0x00, 0x00,
0x1f, 0xff, 0xff, 0xff, 0xf8, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x01, 0x92, 0x3f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3,
0xff, 0xfe, 0x00, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff,
0xff, 0xff, 0xff, 0x02, 0x03, 0x32, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0x03, 0x36, 0x7f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x1f, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x03, 0x36, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x87, 0x64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff,
0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x46, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x84, 0x26, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x03,
0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0c, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc3, 0x7c, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x39, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe1, 0x93, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xef, 0x31, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0xfe, 0x73, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf8, 0x43, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
// --- DEKLARACJE FUNKCJI ---
// --- DEKLARACJE FUNKCJI ---
void rysujEkranPowitalny();
void wyswietlEkranRekordow();
void odczytajPosortujIWyswietlRekordy();
void usunWszystkieRekordy();
void wyswietlPotwierdzenieUsuniecia();
void wyswietlEkranDiagnostyki();
void aktualizujEkranDiagnostyki(int, int);
void aktualizujPodswietlenieMenu(int, int);
void wyswietlMenuZawodnika();
void wyswietlListeZawodnikow();
void wyswietlListeDoUsuniecia();
void usunZawodnika(int);
void wyswietlPotwierdzenieUsunieciaZawodnika();
void odczytajNajlepszyWynik();
void obslugaMenuNawigacja(int kierunek);
void obslugaMenuNawigacjaPozioma(int kierunek);
void obslugaMenuOK();
void obslugaPrzewijaniaRekordow(int kierunek);
void setup() {
Serial.begin(115200);
tft.begin(); tft.setRotation(1);
pinMode(LED_CZERWONY, OUTPUT); pinMode(LED_ZIELONY, OUTPUT);
pinMode(PRZYCISK_GORA, INPUT_PULLUP);
pinMode(PRZYCISK_DOL, INPUT_PULLUP);
pinMode(PRZYCISK_LEWO, INPUT_PULLUP);
pinMode(PRZYCISK_PRAWO, INPUT_PULLUP);
pinMode(PRZYCISK_OK, INPUT_PULLUP);
pinMode(PRZYCISK_SET, INPUT_PULLUP);
pinMode(PRZYCISK_START, INPUT_PULLUP);
digitalWrite(LED_CZERWONY, LOW); digitalWrite(LED_ZIELONY, LOW);
sdDostepna = inicjujKarteSD();
if (sdDostepna) { wczytajZawodnikow(); odczytajNajlepszyWynik(); }
wyswietlLogoStartowe();
randomSeed(analogRead(39));
rysujEkranPowitalny();
}
void loop() {
unsigned long teraz = millis();
bool stanGora = digitalRead(PRZYCISK_GORA);
bool stanDol = digitalRead(PRZYCISK_DOL);
bool stanLewo = digitalRead(PRZYCISK_LEWO);
bool stanPrawo = digitalRead(PRZYCISK_PRAWO);
bool stanOK = digitalRead(PRZYCISK_OK);
bool stanSet = digitalRead(PRZYCISK_SET);
bool stanStart = digitalRead(PRZYCISK_START);
if (teraz - czasOstatniegoNacisniecia > OPOZNIENIE_PRZYCISKOW) {
// --- Obsługa przycisku START ---
if (stanStart == LOW && poprzedniStanStart == HIGH) {
czasOstatniegoNacisniecia = teraz;
if (tryb == TRYB_POWITALNY) {
tryb = TRYB_TEST; stanTestu = 0; tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(3); tft.setTextColor(ILI9341_YELLOW); tft.setCursor(65, 80); tft.print("PODJEDZ POD");
tft.setCursor(120, 120); tft.print("TASME"); czasStartu = teraz; czasFazy = random(2000, 3000);
} else if (tryb == TRYB_TEST && (stanTestu == 4 || stanTestu == 5)) {
tryb = TRYB_POWITALNY; rysujEkranPowitalny();
} else if (tryb != TRYB_TEST) {
tryb = TRYB_POWITALNY; rysujEkranPowitalny();
}
}
// --- Obsługa przycisku SET ---
if (stanSet == LOW && poprzedniStanSet == HIGH) {
czasOstatniegoNacisniecia = teraz;
if (tryb == TRYB_POWITALNY) {
wymusPelneRysowanie = true;
tryb = TRYB_MENU_ZAWODNIKA; pozycjaMenu = 0; wyswietlMenuZawodnika();
} else if (tryb == TRYB_REKORDY) {
tryb = TRYB_REKORDY_POTWIERDZENIE_USUNIECIA; wyswietlPotwierdzenieUsuniecia();
} else if (tryb == TRYB_DIAGNOSTYKA) { // >>> ZMIANA: Przełączanie widoku w diagnostyce
diagnostykaViewMode = (diagnostykaViewMode + 1) % 3;
wymusPelneRysowanie = true;
wyswietlEkranDiagnostyki();
}
}
// --- Obsługa przycisku OK ---
if (stanOK == LOW && poprzedniStanOK == HIGH) {
czasOstatniegoNacisniecia = teraz;
obslugaMenuOK();
}
// --- Obsługa przycisku GÓRA ---
if (stanGora == LOW && poprzedniStanGora == HIGH) {
czasOstatniegoNacisniecia = teraz;
if (tryb == TRYB_REKORDY) { obslugaPrzewijaniaRekordow(-1); }
else { obslugaMenuNawigacja(-1); }
}
// --- Obsługa przycisku DÓŁ ---
if (stanDol == LOW && poprzedniStanDol == HIGH) {
czasOstatniegoNacisniecia = teraz;
if (tryb == TRYB_POWITALNY) { // >>> ZMIANA: Skrót do diagnostyki
tryb = TRYB_DIAGNOSTYKA;
diagnostykaViewMode = 0; // Zawsze zaczynaj od widoku domyślnego
wymusPelneRysowanie = true;
wyswietlEkranDiagnostyki();
} else if(tryb == TRYB_REKORDY) { obslugaPrzewijaniaRekordow(1); }
else { obslugaMenuNawigacja(1); }
}
// --- Obsługa przycisku LEWO ---
if (stanLewo == LOW && poprzedniStanLewo == HIGH) {
czasOstatniegoNacisniecia = teraz;
if (tryb == TRYB_POWITALNY) { // >>> ZMIANA: Skrót do tabeli wyników
tryb = TRYB_REKORDY;
pozycjaPrzewijaniaRekordow = 0;
wymusPelneRysowanie = true;
wyswietlEkranRekordow();
} else {
obslugaMenuNawigacjaPozioma(-1);
}
}
// --- Obsługa przycisku PRAWO ---
if (stanPrawo == LOW && poprzedniStanPrawo == HIGH) {
czasOstatniegoNacisniecia = teraz;
obslugaMenuNawigacjaPozioma(1);
}
}
if (tryb == TRYB_DODAJ_ZAWODNIKA) {
if ((stanLewo == LOW || stanPrawo == LOW) && (teraz - czasOstatniegoNacisniecia > OPOZNIENIE_PRZED_PRZEWIJANIEM)) {
if (teraz - czasOstatniegoNacisniecia > SZYBKOSC_PRZEWIJANIA_ZNAKOW) {
if (stanLewo == LOW) obslugaMenuNawigacjaPozioma(-1); else if (stanPrawo == LOW) obslugaMenuNawigacjaPozioma(1);
czasOstatniegoNacisniecia = teraz;
}
}
}
poprzedniStanGora = stanGora;
poprzedniStanDol = stanDol;
poprzedniStanLewo = stanLewo;
poprzedniStanPrawo = stanPrawo;
poprzedniStanOK = stanOK;
poprzedniStanSet = stanSet;
poprzedniStanStart = stanStart;
if (tryb == TRYB_TEST) { obslugaTestu(); }
else if (tryb == TRYB_DIAGNOSTYKA) {
wartoscGazu = analogRead(POT_GAZ); wartoscSprzegla = analogRead(POT_SPRZEGLO);
int procentGazu = map(wartoscGazu, 0, 4095, 100, 0); int procentSprzegla = map(wartoscSprzegla, 0, 4095, 0, 100);
aktualizujEkranDiagnostyki(procentGazu, procentSprzegla);
} else if (tryb == TRYB_POWITALNY) {
obslugaMruganiaNicku();
}
delay(10);
}
void wyswietlLogoStartowe() {
tft.fillScreen(ILI9341_BLUE);
tft.drawBitmap(0,0, zuzel, 320, 240, ILI9341_BLACK);
tft.setTextSize(3);tft.setTextColor(ILI9341_ORANGE);tft.setCursor(46, 12);tft.print("GooMoo#312");
tft.setTextSize(3);tft.setTextColor(ILI9341_GREEN);tft.setCursor(48, 10);tft.print("GooMoo#312");
tft.setTextSize(3);tft.setTextColor(ILI9341_YELLOW);tft.setCursor(53, 212);tft.print("TRENAZER v1.0");
tft.setTextSize(3);tft.setTextColor(ILI9341_RED);tft.setCursor(55, 210);tft.print("TRENAZER v1.0");
delay(3000);
}
void wczytajZawodnikow() {
if (!sdDostepna) return; if (!SD.exists(nazwaPlikuZawodnikow)) { File f = SD.open(nazwaPlikuZawodnikow, FILE_WRITE); if (f) f.close(); return; }
File f = SD.open(nazwaPlikuZawodnikow, FILE_READ);
if (f) { liczbaZawodnikow = 0; while (f.available() && liczbaZawodnikow < MAX_ZAWODNIKOW) { String l = f.readStringUntil('\n'); l.trim(); if (l.length() > 0) listaZawodnikow[liczbaZawodnikow++] = l; } f.close(); }
}
void zapiszNowegoZawodnika(String nick) {
if (!sdDostepna || liczbaZawodnikow >= MAX_ZAWODNIKOW) return;
for (int i=0; i<liczbaZawodnikow; i++) if (listaZawodnikow[i] == nick) return;
listaZawodnikow[liczbaZawodnikow++] = nick;
File f = SD.open(nazwaPlikuZawodnikow, FILE_WRITE);
if (f) { for (int i=0; i<liczbaZawodnikow; i++) f.println(listaZawodnikow[i]); f.close(); }
}
void aktualizujPodswietlenieMenu(int nP, int sP) {
int sY = 70, sp = 30; String opcje[] = {"Wybierz", "Dodaj", "Usun", "Gosc", "Powrot"};
tft.setTextSize(2);
if (sP != -1) { tft.setTextColor(ILI9341_WHITE); tft.setCursor(60, sY + sP * sp); tft.print(opcje[sP]); }
tft.setTextColor(ILI9341_CYAN); tft.setCursor(60, sY + nP * sp); tft.print(opcje[nP]);
}
void aktualizujPodswietlenieListy(int nP, int sP) {
int sY = 65, sp = 20, sPe = sP - pozycjaPrzewijaniaZawodnikow, nPe = nP - pozycjaPrzewijaniaZawodnikow;
tft.setTextSize(2);
if (sP != -1 && sPe >= 0 && sPe < WIERSZY_LISTY_ZAWODNIKOW) {
tft.setTextColor(ILI9341_WHITE); tft.setCursor(60, sY + sPe * sp);
if(tryb == TRYB_WYBOR_ZAWODNIKA) tft.print((sP == 0) ? "GOSC" : listaZawodnikow[sP - 1]);
else tft.print(listaZawodnikow[sP]);
}
if (nPe >= 0 && nPe < WIERSZY_LISTY_ZAWODNIKOW) {
tft.setTextColor(ILI9341_CYAN); tft.setCursor(60, sY + nPe * sp);
if(tryb == TRYB_WYBOR_ZAWODNIKA) tft.print((nP == 0) ? "GOSC" : listaZawodnikow[nP - 1]);
else tft.print(listaZawodnikow[nP]);
}
}
void wyswietlMenuZawodnika() {
tft.fillScreen(ILI9341_DARKGREEN);
tft.drawBitmap(0,0, zuzel, 320, 240, ILI9341_BLACK);
tft.setTextSize(3); tft.setTextColor(ILI9341_YELLOW); tft.setCursor(30, 20); tft.print("MENU ZAWODNIKA");
tft.setTextSize(1); tft.setTextColor(ILI9341_ORANGE); tft.setCursor(20, 230); tft.print("GORA/DOL: wybor | OK: zatwierdz | START: powrot");
String opcje[] = {"Wybierz", "Dodaj", "Usun", "Gosc", "Powrot"};
int sY = 70, sp = 30;
tft.setTextSize(2);
for(int i=0; i<5; i++){
tft.setTextColor(i == pozycjaMenu ? ILI9341_CYAN : ILI9341_WHITE);
tft.setCursor(60, sY + i * sp); tft.print(opcje[i]);
}
poprzedniaPozycjaMenu = pozycjaMenu;
}
void wyswietlListeZawodnikow() {
if (wymusPelneRysowanie) {
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(2); tft.setTextColor(ILI9341_YELLOW); tft.setCursor(40, 30); tft.print("WYBIERZ ZAWODNIKA");
tft.setTextSize(1); tft.setTextColor(ILI9341_CYAN); tft.setCursor(20, 220); tft.print("GORA/DOL: wybor | OK: zatwierdz | START: powrot");
wymusPelneRysowanie = false;
}
tft.fillRect(0, 60, tft.width(), 150, ILI9341_BLACK);
int sY=65, sp=20; tft.setTextSize(2);
for(int i=0; i<WIERSZY_LISTY_ZAWODNIKOW; i++){
int aI = i+pozycjaPrzewijaniaZawodnikow; if (aI > liczbaZawodnikow) break;
tft.setTextColor(aI == pozycjaMenu ? ILI9341_CYAN : ILI9341_WHITE);
tft.setCursor(60, sY + i*sp); tft.print(aI==0 ? "GOSC" : listaZawodnikow[aI-1]);
}
if (pozycjaPrzewijaniaZawodnikow > 0) tft.fillTriangle(160, 55, 150, 65, 170, 65, ILI9341_WHITE);
if (pozycjaPrzewijaniaZawodnikow + WIERSZY_LISTY_ZAWODNIKOW <= liczbaZawodnikow) tft.fillTriangle(160, 210, 150, 200, 170, 200, ILI9341_WHITE);
poprzedniaPozycjaMenu = pozycjaMenu;
}
void wyswietlListeDoUsuniecia() {
if (wymusPelneRysowanie) {
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(2); tft.setTextColor(ILI9341_YELLOW); tft.setCursor(60, 30); tft.print("USUN ZAWODNIKA");
tft.setTextSize(1); tft.setTextColor(ILI9341_CYAN); tft.setCursor(20, 220); tft.print("GORA/DOL: wybor | OK: usun | START: powrot");
wymusPelneRysowanie = false;
}
tft.fillRect(0, 60, tft.width(), 150, ILI9341_BLACK);
int sY=65, sp=20; tft.setTextSize(2);
if (liczbaZawodnikow == 0) { tft.setTextColor(ILI9341_WHITE); tft.setCursor(40, 100); tft.print("Brak zawodnikow!"); return; }
for(int i=0; i<WIERSZY_LISTY_ZAWODNIKOW; i++){
int aI = i+pozycjaPrzewijaniaZawodnikow; if (aI >= liczbaZawodnikow) break;
tft.setTextColor(aI == pozycjaMenu ? ILI9341_CYAN : ILI9341_WHITE);
tft.setCursor(60, sY + i*sp); tft.print(listaZawodnikow[aI]);
}
if (pozycjaPrzewijaniaZawodnikow > 0) tft.fillTriangle(160, 55, 150, 65, 170, 65, ILI9341_WHITE);
if (pozycjaPrzewijaniaZawodnikow + WIERSZY_LISTY_ZAWODNIKOW < liczbaZawodnikow) tft.fillTriangle(160, 210, 150, 200, 170, 200, ILI9341_WHITE);
poprzedniaPozycjaMenu = pozycjaMenu;
}
void wyswietlDodawanieZawodnika(String aN, int pK, char wZ) {
if (wymusPelneRysowanie) {
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(2); tft.setTextColor(ILI9341_YELLOW); tft.setCursor(40, 30); tft.print("DODAJ ZAWODNIKA");
tft.setTextSize(1); tft.setTextColor(ILI9341_CYAN); tft.setCursor(20, 220); tft.print("OK: zatwierdz | START: powrot do menu");
wymusPelneRysowanie = false;
}
tft.fillRect(30, 80, 280, 20, ILI9341_BLACK);
tft.setTextSize(2); tft.setTextColor(ILI9341_WHITE); tft.setCursor(40, 80);
for (int i=0; i<MAX_DLUGOSC_NICKU; i++) {
if (i < aN.length()) { tft.setTextColor(i == pK ? ILI9341_CYAN : ILI9341_WHITE); tft.print(aN[i]); }
else if (i == pK) { tft.setTextColor(ILI9341_CYAN); tft.print(wZ); }
else { tft.setTextColor(ILI9341_WHITE); tft.print("_"); }
}
tft.fillRect(10, 140, 300, 50, ILI9341_BLACK);
if (pK >= MAX_DLUGOSC_NICKU) {
tft.setTextSize(2); tft.setCursor(80, 140);
tft.setTextColor(wZ == 'Z' ? ILI9341_CYAN : ILI9341_WHITE); tft.print("ZAPISZ");
tft.setCursor(80, 170); tft.setTextColor(wZ == 'P' ? ILI9341_CYAN : ILI9341_WHITE); tft.print("POWROT");
} else {
tft.setTextSize(1); tft.setTextColor(ILI9341_CYAN); tft.setCursor(20, 140); tft.print("LEWO/PRAWO: zmiana znaku | OK: nastepny znak");
tft.setCursor(80, 160); tft.setTextColor(ILI9341_WHITE);
for (int i=-2; i<=2; i++) {
int idx = (indeksZnaku+i+LICZBA_ZNAKOW)%LICZBA_ZNAKOW;
if (i==0) { tft.setTextColor(ILI9341_CYAN); tft.print("["); tft.print(DOSTEPNE_ZNAKI[idx]); tft.print("]"); tft.setTextColor(ILI9341_WHITE); }
else { tft.print(" "); tft.print(DOSTEPNE_ZNAKI[idx]); tft.print(" "); }
}
}
}
void wyswietlEkranRekordow() {
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(2); tft.setTextColor(ILI9341_YELLOW); tft.setCursor(90, 10); tft.print("REKORDY");
tft.setTextSize(1); tft.setTextColor(ILI9341_WHITE); tft.setCursor(10, 220); tft.print("GORA/DOL: przewijanie");
tft.setCursor(10, 230); tft.print("SET: usun | START: powrot");
odczytajPosortujIWyswietlRekordy();
}
void odczytajPosortujIWyswietlRekordy() {
if (!sdDostepna) { tft.setTextSize(2); tft.setTextColor(ILI9341_RED); tft.setCursor(40, 100); tft.print("Brak karty SD!"); return; }
File plik = SD.open(nazwaPlikuWynikow, FILE_READ);
if (!plik) { tft.setTextSize(2); tft.setTextColor(ILI9341_RED); tft.setCursor(40, 100); tft.print("Blad pliku!"); return; }
const int MAX_WYNIKOW = 100; Wynik wyniki[MAX_WYNIKOW]; int lW = 0;
plik.readStringUntil('\n');
while (plik.available() && lW < MAX_WYNIKOW) {
String linia = plik.readStringUntil('\n'); if (linia.length() > 0) {
int p1=linia.indexOf(','), p2=linia.indexOf(',',p1+1), p3=linia.indexOf(',',p2+1), p4=linia.indexOf(',',p3+1), p5=linia.indexOf(',',p4+1);
if (p5 > 0) { String s=linia.substring(p4+1, p5); if(s.startsWith("OK")) { wyniki[lW].czas=linia.substring(p2+1, p3).toInt(); wyniki[lW].nick=linia.substring(p5+1); lW++; } } }
}
plik.close(); maksymalnaLiczbaRekordow = lW;
for (int i=0; i<lW-1; i++) for (int j=0; j<lW-i-1; j++) if (wyniki[j].czas > wyniki[j+1].czas) { Wynik t=wyniki[j]; wyniki[j]=wyniki[j+1]; wyniki[j+1]=t; }
tft.fillRect(0, 40, tft.width(), 170, ILI9341_BLACK);
tft.setTextSize(1); tft.setTextColor(ILI9341_CYAN); tft.setCursor(10,40); tft.print("MIEJSCE");
tft.setCursor(80,40); tft.print("NICK"); tft.setCursor(240,40); tft.print("WYNIK [ms]");
if (lW == 0) { tft.setTextSize(2); tft.setTextColor(ILI9341_CYAN); tft.setCursor(70, 100); tft.print("Brak rekordow"); return; }
tft.setTextSize(2); int y = 60;
for (int i=0; i<WIERSZY_NA_EKRANIE; i++) {
int idx = i + pozycjaPrzewijaniaRekordow; if (idx >= lW) break;
tft.setTextColor(ILI9341_WHITE); tft.setCursor(20, y); tft.print(idx+1); tft.print(".");
tft.setCursor(80, y); tft.print(wyniki[idx].nick); tft.setCursor(240, y); tft.print(wyniki[idx].czas); y+=16;
}
if (pozycjaPrzewijaniaRekordow > 0) tft.fillTriangle(160, 30, 150, 40, 170, 40, ILI9341_WHITE);
if (pozycjaPrzewijaniaRekordow+WIERSZY_NA_EKRANIE < maksymalnaLiczbaRekordow) tft.fillTriangle(160, 215, 150, 205, 170, 205, ILI9341_WHITE);
}
void usunWszystkieRekordy() {
if (!sdDostepna) return; SD.remove(nazwaPlikuWynikow);
File f = SD.open(nazwaPlikuWynikow, FILE_WRITE); if (f) { f.println("Nr,Data,Czas_ms,Gaz_%,Status,Zawodnik"); f.close(); }
numerTestu = 0; pozycjaPrzewijaniaRekordow=0; maksymalnaLiczbaRekordow=0; najlepszyWynik=9999;
tft.fillRect(50,100,220,40,ILI9341_BLACK); tft.setTextSize(2); tft.setTextColor(ILI9341_RED);
tft.setCursor(60, 110); tft.print("Rekordy usuniete!"); delay(1500);
}
void odczytajNajlepszyWynik() {
najlepszyWynik = 9999; najlepszyZawodnik = "---";
if (!sdDostepna) return; File plik = SD.open(nazwaPlikuWynikow, FILE_READ); if (!plik) return;
plik.readStringUntil('\n');
while (plik.available()) {
String linia = plik.readStringUntil('\n');
int p1=linia.indexOf(','),p2=linia.indexOf(',',p1+1),p3=linia.indexOf(',',p2+1),p4=linia.indexOf(',',p3+1),p5=linia.indexOf(',',p4+1);
if (p5 > 0) { String status = linia.substring(p4+1, p5); if (status.startsWith("OK")) {
unsigned long czas = linia.substring(p2+1, p3).toInt(); if (czas>0 && czas<najlepszyWynik) { najlepszyWynik=czas; najlepszyZawodnik=linia.substring(p5+1); }
}}
}
plik.close();
}
bool inicjujKarteSD() {
tft.fillScreen(ILI9341_BLACK); tft.setTextSize(2); tft.setTextColor(ILI9341_WHITE); tft.setCursor(20, 100); tft.print("Inicjalizacja karty SD...");
if (!SD.begin(SD_CS)) { tft.fillScreen(ILI9341_BLACK); tft.setTextColor(ILI9341_RED); tft.setCursor(40, 100); tft.print("Blad karty SD!"); tft.setCursor(40, 130); tft.print("Kontynuuje bez zapisu."); delay(2000); return false; }
if (!SD.exists(nazwaPlikuWynikow)) { File f=SD.open(nazwaPlikuWynikow, FILE_WRITE); if (f) { f.println("Nr,Data,Czas_ms,Gaz_%,Status,Zawodnik"); f.close(); } }
File f=SD.open(nazwaPlikuWynikow, FILE_READ); if (f) { while (f.available()) if (f.read()=='\n') numerTestu++; f.close(); if (numerTestu>0) numerTestu--; }
tft.fillScreen(ILI9341_BLACK); tft.setTextColor(ILI9341_GREEN); tft.setCursor(40, 100); tft.print("Karta SD gotowa!"); delay(1000);
return true;
}
void zapiszWynik(unsigned long czas, int poziomGazu, String status) {
if (!sdDostepna) return; numerTestu++;
File f = SD.open(nazwaPlikuWynikow, FILE_APPEND);
if (f) {
String dane = String(numerTestu)+","+String(millis())+","+String(czas)+","+String(poziomGazu)+","+status+","+aktualnyZawodnik;
f.println(dane); f.close(); if (status.startsWith("OK") && czas > 0 && czas < najlepszyWynik) { najlepszyWynik = czas; najlepszyZawodnik = aktualnyZawodnik; }
}
}
void obslugaMenuNawigacjaPozioma(int kierunek) {
if (tryb == TRYB_DODAJ_ZAWODNIKA) {
if (pozycjaKursora < MAX_DLUGOSC_NICKU) {
indeksZnaku=(indeksZnaku+kierunek+LICZBA_ZNAKOW)%LICZBA_ZNAKOW; wybranyZnak=DOSTEPNE_ZNAKI[indeksZnaku];
} else { wybranyZnak = (wybranyZnak == 'Z') ? 'P' : 'Z'; }
wyswietlDodawanieZawodnika(nowyNick, pozycjaKursora, wybranyZnak);
} else if (tryb == TRYB_REKORDY_POTWIERDZENIE_USUNIECIA) {
if (kierunek < 0) { /* LEWO - NIE */ tryb = TRYB_REKORDY; wyswietlEkranRekordow(); }
if (kierunek > 0) { /* PRAWO - TAK */ usunWszystkieRekordy(); tryb = TRYB_REKORDY; wyswietlEkranRekordow(); }
} else if (tryb == TRYB_USUN_ZAWODNIKA_POTWIERDZENIE) {
pozycjaMenuPotwierdzenia = (kierunek > 0) ? 1 : 0; // Prawo -> NIE, Lewo -> TAK
wyswietlPotwierdzenieUsunieciaZawodnika();
}
}
void obslugaMenuNawigacja(int kierunek) {
if (tryb == TRYB_MENU_ZAWODNIKA) {
poprzedniaPozycjaMenu = pozycjaMenu;
pozycjaMenu = (pozycjaMenu + kierunek + 5) % 5;
aktualizujPodswietlenieMenu(pozycjaMenu, poprzedniaPozycjaMenu);
} else if (tryb == TRYB_WYBOR_ZAWODNIKA) {
poprzedniaPozycjaMenu = pozycjaMenu;
int maxIdx = liczbaZawodnikow;
pozycjaMenu = (pozycjaMenu + kierunek + maxIdx + 1) % (maxIdx + 1);
bool p=false; if(pozycjaMenu<pozycjaPrzewijaniaZawodnikow){p=true; pozycjaPrzewijaniaZawodnikow=pozycjaMenu;} else if(pozycjaMenu>=pozycjaPrzewijaniaZawodnikow+WIERSZY_LISTY_ZAWODNIKOW){p=true; pozycjaPrzewijaniaZawodnikow=pozycjaMenu-WIERSZY_LISTY_ZAWODNIKOW+1;}
if (p) { wymusPelneRysowanie = true; wyswietlListeZawodnikow(); } else { aktualizujPodswietlenieListy(pozycjaMenu, poprzedniaPozycjaMenu); }
} else if (tryb == TRYB_USUN_ZAWODNIKA) {
if (liczbaZawodnikow == 0) return;
poprzedniaPozycjaMenu = pozycjaMenu;
pozycjaMenu = (pozycjaMenu + kierunek + liczbaZawodnikow) % liczbaZawodnikow;
bool p=false; if(pozycjaMenu<pozycjaPrzewijaniaZawodnikow){p=true; pozycjaPrzewijaniaZawodnikow=pozycjaMenu;} else if(pozycjaMenu>=pozycjaPrzewijaniaZawodnikow+WIERSZY_LISTY_ZAWODNIKOW){p=true; pozycjaPrzewijaniaZawodnikow=pozycjaMenu-WIERSZY_LISTY_ZAWODNIKOW+1;}
if (p) { wymusPelneRysowanie = true; wyswietlListeDoUsuniecia(); } else { aktualizujPodswietlenieListy(pozycjaMenu, poprzedniaPozycjaMenu); }
}
}
void obslugaMenuOK() {
wymusPelneRysowanie = true;
if (tryb == TRYB_MENU_ZAWODNIKA) {
switch (pozycjaMenu) {
case 0: tryb = TRYB_WYBOR_ZAWODNIKA; pozycjaMenu = 0; pozycjaPrzewijaniaZawodnikow = 0; wyswietlListeZawodnikow(); break;
case 1: tryb = TRYB_DODAJ_ZAWODNIKA; pozycjaKursora=0; indeksZnaku=0; wybranyZnak=' '; nowyNick=""; wyswietlDodawanieZawodnika(nowyNick, pozycjaKursora, wybranyZnak); break;
case 2: tryb = TRYB_USUN_ZAWODNIKA; pozycjaMenu = 0; pozycjaPrzewijaniaZawodnikow = 0; wyswietlListeDoUsuniecia(); break;
case 3: aktualnyZawodnik = "GOSC"; tryb = TRYB_POWITALNY; rysujEkranPowitalny(); break;
case 4: tryb = TRYB_POWITALNY; rysujEkranPowitalny(); break;
}
} else if (tryb == TRYB_WYBOR_ZAWODNIKA) {
aktualnyZawodnik = (pozycjaMenu == 0) ? "GOSC" : listaZawodnikow[pozycjaMenu-1];
tryb = TRYB_POWITALNY; rysujEkranPowitalny();
} else if (tryb == TRYB_USUN_ZAWODNIKA) {
if (liczbaZawodnikow > 0) {
indeksZawodnikaDoUsuniecia = pozycjaMenu; tryb = TRYB_USUN_ZAWODNIKA_POTWIERDZENIE;
pozycjaMenuPotwierdzenia = 1; // Domyślnie na "NIE"
wyswietlPotwierdzenieUsunieciaZawodnika();
}
} else if (tryb == TRYB_USUN_ZAWODNIKA_POTWIERDZENIE) {
if (pozycjaMenuPotwierdzenia == 0) { // TAK
usunZawodnika(indeksZawodnikaDoUsuniecia);
pozycjaMenu=0;
}
tryb = TRYB_USUN_ZAWODNIKA; wyswietlListeDoUsuniecia();
} else if (tryb == TRYB_DODAJ_ZAWODNIKA) {
if (pozycjaKursora < MAX_DLUGOSC_NICKU) {
if (nowyNick.length()<=pozycjaKursora) nowyNick+=wybranyZnak; else nowyNick.setCharAt(pozycjaKursora, wybranyZnak);
pozycjaKursora++;
if (pozycjaKursora>=MAX_DLUGOSC_NICKU) wybranyZnak='Z'; else { indeksZnaku=0; wybranyZnak=DOSTEPNE_ZNAKI[indeksZnaku]; }
} else {
if (wybranyZnak == 'Z') {
nowyNick.trim(); if(nowyNick.length()>0) { zapiszNowegoZawodnika(nowyNick); aktualnyZawodnik=nowyNick; }
tryb=TRYB_POWITALNY; rysujEkranPowitalny();
} else { tryb=TRYB_MENU_ZAWODNIKA; pozycjaMenu=0; wyswietlMenuZawodnika(); }
}
wyswietlDodawanieZawodnika(nowyNick, pozycjaKursora, wybranyZnak);
}
}
void obslugaMruganiaNicku() {
unsigned long teraz = millis();
uint16_t kolorNicku;
unsigned long interwal;
if (stanMigniecia) { interwal = 300; kolorNicku = ILI9341_CYAN; }
else { interwal = 150; kolorNicku = ILI9341_BLUE; }
if (teraz - czasOstatniegoMigniecia > interwal) {
stanMigniecia = !stanMigniecia;
czasOstatniegoMigniecia = teraz;
int16_t x1, y1; uint16_t w, h;
tft.setTextSize(3);
tft.getTextBounds(aktualnyZawodnik, 0, 0, &x1, &y1, &w, &h);
int16_t x = (tft.width() - w) / 2;
int16_t y = 150;
tft.fillRect(x - 5, y, w + 10, h, ILI9341_BLACK);
tft.setTextColor(kolorNicku);
tft.setCursor(x, y);
tft.print(aktualnyZawodnik);
}
}
void rysujEkranPowitalny() {
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(3); tft.setTextColor(ILI9341_YELLOW); tft.setCursor(40, 25); tft.print("TEST REAKCJI");
tft.setTextSize(2); tft.setTextColor(ILI9341_DARKGREEN); tft.setCursor(90, 60); tft.print("GooMoo#312");
tft.setTextSize(2); tft.setTextColor(ILI9341_DARKGREEN); tft.setCursor(0, 70); tft.print("--------------------------");
if (najlepszyWynik < 9999) {
tft.setTextSize(2); tft.setTextColor(ILI9341_GREEN); tft.setCursor(70, 90); tft.print("Rekord: "); tft.print(najlepszyWynik); tft.print(" ms");
tft.setTextSize(1); tft.setTextColor(ILI9341_GREEN); tft.setCursor(70, 110); tft.print("("); tft.print(najlepszyZawodnik); tft.print(")");
tft.drawFastHLine(0, 120, 320, ILI9341_GREENYELLOW);
tft.drawFastHLine(0, 121, 320, ILI9341_GREENYELLOW);
}
tft.setTextSize(1); tft.setCursor(30, 12); tft.setTextColor(ILI9341_PINK); tft.print("by JagOOda");
tft.setTextSize(1); tft.setCursor(250, 10); tft.setTextColor(sdDostepna ? ILI9341_GREEN : ILI9341_RED); tft.print(sdDostepna ? "SD OK" : "Brak SD");
tft.setTextSize(2); tft.setTextColor(ILI9341_WHITE); tft.setCursor(80, 200); tft.print("Nacisnij START");
// >>> ZMIANA: Zaktualizowany tekst pomocy na ekranie głównym
tft.setTextSize(1); tft.setTextColor(ILI9341_CYAN); tft.setCursor(10, 225); tft.print("SET: Menu Zawodnika | LEWO: Rekordy");
tft.setCursor(10, 235); tft.print("DOL: Diagnostyka");
tft.setTextSize(1); tft.setTextColor(ILI9341_RED); tft.setCursor(260, 50); tft.print("V 1.2");
czasOstatniegoMigniecia = millis();
stanMigniecia = true;
obslugaMruganiaNicku();
}
void aktualizujWyswietlacz(int pG, int pS) {
int sG=map(pG,0,100,0,278); if(pG!=poprzedniGaz){ int pSz=map(poprzedniGaz,0,100,0,278); if(sG>pSz) tft.fillRect(21+pSz,71,sG-pSz,28,ILI9341_RED); else tft.fillRect(21+sG,71,278-sG,28,ILI9341_BLACK); tft.fillRect(150,80,50,10,ILI9341_BLACK); tft.setCursor(150,80); tft.setTextSize(1); tft.setTextColor(ILI9341_WHITE); tft.print(pG); tft.print("%"); poprzedniGaz=pG;}
int sS=map(pS,0,100,0,278); if(pS!=poprzednieSprzeglo){ int pSz=map(poprzednieSprzeglo,0,100,0,278); if(sS>pSz) tft.fillRect(21+pSz,141,sS-pSz,28,ILI9341_GREEN); else tft.fillRect(21+sS,141,278-sS,28,ILI9341_BLACK); tft.fillRect(150,150,50,10,ILI9341_BLACK); tft.setCursor(150,150); tft.setTextSize(1); tft.setTextColor(ILI9341_WHITE); tft.print(pS); tft.print("%"); poprzednieSprzeglo=pS;}
}
void wyswietlPotwierdzenieUsuniecia() {
tft.fillRect(40,80,240,80,ILI9341_DARKGREY); tft.drawRect(40,80,240,80,ILI9341_WHITE);
tft.setTextSize(2); tft.setTextColor(ILI9341_YELLOW); tft.setCursor(65, 100); tft.print("USUNAC WYNIKI?");
tft.setTextSize(1); tft.setTextColor(ILI9341_WHITE); tft.setCursor(50, 140); tft.print("LEWO: NIE | PRAWO: TAK | START: ANULUJ");
}
// >>> ZMIANA: Zmodyfikowana funkcja rysowania ekranu diagnostyki
void wyswietlEkranDiagnostyki() {
if (wymusPelneRysowanie) {
tft.fillScreen(ILI9341_RED);
tft.drawBitmap(0, 0, zuzel, 320, 240, ILI9341_BLACK);
tft.setTextSize(2); tft.setTextColor(ILI9341_YELLOW); tft.setCursor(80, 20); tft.print("DIAGNOSTYKA");
wymusPelneRysowanie = false;
}
// Wyczyszczenie obszaru roboczego przed przerysowaniem
tft.fillRect(10, 60, 300, 150, ILI9341_BLACK);
tft.setTextSize(2); tft.setTextColor(ILI9341_WHITE);
if (diagnostykaViewMode == 0) { // Widok: Gaz i Sprzęgło
tft.setCursor(20, 70); tft.println("GAZ:"); tft.drawRect(20, 100, 280, 30, ILI9341_WHITE);
tft.setCursor(20, 150); tft.print("SPRZEGLO:"); tft.drawRect(20, 180, 280, 30, ILI9341_WHITE);
} else if (diagnostykaViewMode == 1) { // Widok: Tylko Sprzęgło
tft.setCursor(20, 110); tft.print("SPRZEGLO:"); tft.drawRect(20, 140, 280, 30, ILI9341_WHITE);
} else if (diagnostykaViewMode == 2) { // Widok: Tylko Gaz
tft.setCursor(20, 110); tft.println("GAZ:"); tft.drawRect(20, 140, 280, 30, ILI9341_WHITE);
}
tft.setTextSize(1); tft.setTextColor(ILI9341_CYAN); tft.setCursor(40, 220); tft.print("SET: Zmiana widoku | START: Powrot");
poprzedniGaz = -1; poprzednieSprzeglo = -1; // Wymuś przerysowanie pasków
}
// >>> ZMIANA: Zmodyfikowana funkcja aktualizacji ekranu diagnostyki
void aktualizujEkranDiagnostyki(int pG, int pS) {
// Aktualizuj pasek gazu
if (diagnostykaViewMode == 0 || diagnostykaViewMode == 2) {
int yPos = (diagnostykaViewMode == 0) ? 100 : 140;
int sG=map(pG,0,100,0,278);
if (pG!=poprzedniGaz) {
int pSz=map(poprzedniGaz,0,100,0,278);
if (sG>pSz) tft.fillRect(21+pSz,yPos+1,sG-pSz,28,ILI9341_RED);
else tft.fillRect(21+sG,yPos+1,278-sG,28,ILI9341_BLACK);
tft.fillRect(140,yPos+10,60,16,ILI9341_BLACK);
tft.setCursor(140,yPos+10); tft.setTextSize(2); tft.setTextColor(ILI9341_WHITE); tft.print(pG); tft.print("%");
poprzedniGaz=pG;
}
}
// Aktualizuj pasek sprzęgła
if (diagnostykaViewMode == 0 || diagnostykaViewMode == 1) {
int yPos = (diagnostykaViewMode == 0) ? 180 : 140;
int sS=map(pS,0,100,0,278);
if (pS!=poprzednieSprzeglo) {
int pSz=map(poprzednieSprzeglo,0,100,0,278);
if (sS>pSz) tft.fillRect(21+pSz,yPos+1,sS-pSz,28,ILI9341_GREEN);
else tft.fillRect(21+sS,yPos+1,278-sS,28,ILI9341_BLACK);
tft.fillRect(140,yPos+10,60,16,ILI9341_BLACK);
tft.setCursor(140,yPos+10); tft.setTextSize(2); tft.setTextColor(ILI9341_WHITE); tft.print(pS); tft.print("%");
poprzednieSprzeglo=pS;
}
}
}
void obslugaPrzewijaniaRekordow(int kierunek) {
bool p = false;
if(kierunek > 0 && pozycjaPrzewijaniaRekordow < maksymalnaLiczbaRekordow-WIERSZY_NA_EKRANIE){
pozycjaPrzewijaniaRekordow++;
p = true;
}
if(kierunek < 0 && pozycjaPrzewijaniaRekordow > 0){
pozycjaPrzewijaniaRekordow--;
p = true;
}
if(p){
odczytajPosortujIWyswietlRekordy();
}
}
void obslugaTestu() {
wartoscGazu=analogRead(POT_GAZ); wartoscSprzegla=analogRead(POT_SPRZEGLO);
int pG=map(wartoscGazu,0,4095,100,0), pS=map(wartoscSprzegla,0,4095,0,100);
unsigned long teraz=millis(); switch(stanTestu){
case 0: if (teraz-czasStartu>=czasFazy){ stanTestu=1; tft.fillScreen(ILI9341_BLACK); tft.setTextSize(2);tft.setTextColor(ILI9341_RED);tft.setCursor(80,20);tft.print("PRZYGOTUJ SIE"); tft.setCursor(50,50);tft.print("WCISNIJ SPRZEGLO"); tft.setTextSize(2);tft.setTextColor(ILI9341_WHITE);tft.setCursor(20,90);tft.println("GAZ:");tft.drawRect(20,110,280,30,ILI9341_WHITE); tft.setCursor(20,160);tft.print("SPRZEGLO:");tft.drawRect(20,180,280,30,ILI9341_WHITE); poprzedniGaz=-1;poprzednieSprzeglo=-1; digitalWrite(LED_CZERWONY,HIGH);czasStartu=teraz;czasFazy=random(2000,5000); } break;
case 1: { int sG=map(pG,0,100,0,278); if (pG!=poprzedniGaz){ int pSz=map(poprzedniGaz,0,100,0,278); if(sG>pSz) tft.fillRect(21+pSz,111,sG-pSz,28,ILI9341_RED);else tft.fillRect(21+sG,111,278-sG,28,ILI9341_BLACK); tft.fillRect(140,120,60,16,ILI9341_BLACK);tft.setCursor(140,120);tft.setTextSize(2);tft.setTextColor(ILI9341_WHITE);tft.print(pG);tft.print("%");poprzedniGaz=pG;} int sS=map(pS,0,100,0,278); if(pS!=poprzednieSprzeglo){ int pSz=map(poprzednieSprzeglo,0,100,0,278); if(sS>pSz) tft.fillRect(21+pSz,181,sS-pSz,28,ILI9341_GREEN);else tft.fillRect(21+sS,181,278-sS,28,ILI9341_BLACK); tft.fillRect(140,190,60,16,ILI9341_BLACK);tft.setCursor(140,190);tft.setTextSize(2);tft.setTextColor(ILI9341_WHITE);tft.print(pS);tft.print("%");poprzednieSprzeglo=pS;} }
if (teraz-czasStartu>=czasFazy) {
if (pS<90){
stanTestu=5; digitalWrite(LED_CZERWONY,LOW); tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(3);tft.setTextColor(ILI9341_RED);tft.setCursor(90,80);tft.print("TASMA!!!");
tft.setTextSize(2);tft.setCursor(110, 130);tft.print("CO JEST?");
tft.setCursor(20, 160); tft.print("NIE WCISNALES SPRZEGLA!");
zapiszWynik(0,pG,"TASMA_SPRZEGLO");
} else {
stanTestu=2;tft.fillScreen(ILI9341_BLACK);tft.setTextSize(2);tft.setTextColor(ILI9341_WHITE);tft.setCursor(20,10);tft.println("Test reakcji - CZEKAJ"); tft.setTextSize(1);tft.setCursor(20,50);tft.println("Gaz:");tft.setCursor(20,120);tft.print("Sprzeglo:"); tft.drawRect(20,70,280,30,ILI9341_WHITE);tft.drawRect(20,140,280,30,ILI9341_WHITE); digitalWrite(LED_CZERWONY,LOW);digitalWrite(LED_ZIELONY,HIGH); czasStartu=teraz;czasFazy=random(2000,6000);poprzedniGaz=-1;poprzednieSprzeglo=-1;
}
} break;
case 2: aktualizujWyswietlacz(pG,pS); if (pS<80){stanTestu=5;digitalWrite(LED_ZIELONY,LOW); tft.fillScreen(ILI9341_BLACK);tft.setTextSize(3);tft.setTextColor(ILI9341_RED);tft.setCursor(90,80);tft.print("TASMA!!!"); tft.setTextSize(2);tft.setCursor(35,140);tft.print("ZA WCZESNIE-SKUP SIE");zapiszWynik(0,pG,"TASMA_ZA_WCZESNIE");}else if(teraz-czasStartu>=czasFazy){stanTestu=3;digitalWrite(LED_ZIELONY,LOW); tft.fillRect(20,10,280,30,ILI9341_BLACK); tft.setTextSize(2);tft.setTextColor(ILI9341_RED);tft.setCursor(20,10);tft.println("PUSC SPRZEGLO TERAZ!"); czasStartu=teraz;} break;
case 3: aktualizujWyswietlacz(pG,pS); if(pS<10){czasReakcji=teraz-czasStartu;procentGazuWyniku=pG;stanTestu=4; tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(3);tft.setTextColor(ILI9341_GREEN);tft.setCursor(120,20);tft.print("WYNIK");
tft.setTextSize(2);tft.setTextColor(ILI9341_MAGENTA);tft.setCursor(60,55);tft.print("Zawodnik: ");tft.print(aktualnyZawodnik);
tft.setTextSize(3);tft.setTextColor(ILI9341_WHITE);tft.setCursor(95,85);tft.print(czasReakcji);tft.print(" ms");
tft.drawLine(0, 110, 320, 110, ILI9341_RED);tft.drawLine(0, 111, 320, 111, ILI9341_RED);
tft.setTextSize(2);tft.setTextColor(ILI9341_CYAN);tft.setCursor(40,120);tft.print("Najlepszy: ");tft.print(najlepszyWynik);tft.print(" ms");
tft.setTextSize(1);tft.setCursor(60, 140); tft.print("("); tft.print(najlepszyZawodnik); tft.print(")");
tft.drawFastHLine(0, 155, 320, ILI9341_DARKGREEN);tft.drawFastHLine(0, 154, 320, ILI9341_DARKGREEN);tft.drawFastHLine(0, 156, 320, ILI9341_DARKGREEN);
if(procentGazuWyniku>75){tft.setTextSize(2);tft.setTextColor(ILI9341_YELLOW);tft.setCursor(50,175);tft.print("Poziom gazu: ");tft.print(procentGazuWyniku);tft.print("%");}
if(sdDostepna){tft.setTextSize(1);tft.setTextColor(ILI9341_CYAN);tft.setCursor(250,15);tft.print("SD: #");tft.print(numerTestu+1);}
if(procentGazuWyniku<75){tft.setTextSize(2);tft.setTextColor(ILI9341_RED);tft.setCursor(30,165);tft.print("Troche malo - ");tft.print(procentGazuWyniku);tft.print(" % gazu");tft.setTextColor(ILI9341_ORANGE);tft.setCursor(50,200);tft.print("NAKREC TEGO GAZU!");zapiszWynik(czasReakcji,procentGazuWyniku,"OK_MALO_GAZU");}
else{zapiszWynik(czasReakcji,procentGazuWyniku,"OK");}}
else if(teraz-czasStartu>2000){stanTestu=5;tft.fillScreen(ILI9341_BLACK);tft.setTextSize(3);tft.setTextColor(ILI9341_RED);tft.setCursor(40,100);tft.print("BRAK REAKCJI!");zapiszWynik(2000,pG,"BRAK_REAKCJI");} break;
}
if (stanTestu==4||stanTestu==5){tft.setTextSize(1);tft.setTextColor(ILI9341_WHITE);tft.setCursor(60,230);tft.print("Nacisnij START aby powrocic");}
}
void usunZawodnika(int indeks) {
if (indeks < 0 || indeks >= liczbaZawodnikow) return;
String usunietyZawodnik = listaZawodnikow[indeks];
for (int i = indeks; i < liczbaZawodnikow - 1; i++) {
listaZawodnikow[i] = listaZawodnikow[i + 1];
}
liczbaZawodnikow--;
File plik = SD.open(nazwaPlikuZawodnikow, FILE_WRITE);
if (plik) { for (int i = 0; i < liczbaZawodnikow; i++) { plik.println(listaZawodnikow[i]); } plik.close(); }
if (aktualnyZawodnik == usunietyZawodnik) { aktualnyZawodnik = "GOSC"; }
}
void wyswietlPotwierdzenieUsunieciaZawodnika() {
tft.fillRect(40, 80, 240, 90, ILI9341_DARKGREY);
tft.drawRect(40, 80, 240, 90, ILI9341_WHITE);
tft.setTextSize(2); tft.setTextColor(ILI9341_YELLOW); tft.setCursor(50, 95); tft.print("Usunac gracza?");
tft.setTextColor(ILI9341_WHITE); tft.setCursor(50, 115); tft.print(listaZawodnikow[indeksZawodnikaDoUsuniecia]);
tft.setTextSize(2);
tft.setTextColor(pozycjaMenuPotwierdzenia == 0 ? ILI9341_CYAN : ILI9341_WHITE); tft.setCursor(70, 145); tft.print("TAK");
tft.setTextColor(pozycjaMenuPotwierdzenia == 1 ? ILI9341_CYAN : ILI9341_WHITE); tft.setCursor(190, 145); tft.print("NIE");
}