/*********************************************************************** * ftermlinux-test.cpp - FTermLinux unit tests * * * * This file is part of the Final Cut widget toolkit * * * * Copyright 2019 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * * as published by the Free Software Foundation; either version 3 of * * the License, or (at your option) any later version. * * * * The Final Cut is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program. If not, see * * . * ***********************************************************************/ #include #include #include #include #include #include #include #include #include #if defined(__linux__) #include #endif #include #include #define CPPUNIT_ASSERT_CSTRING(expected, actual) \ check_c_string (expected, actual, CPPUNIT_SOURCELINE()) //---------------------------------------------------------------------- void check_c_string ( const char* s1 , const char* s2 , CppUnit::SourceLine sourceLine ) { if ( s1 == 0 && s2 == 0 ) // Strings are equal return; if ( s1 && s2 && std::strcmp (s1, s2) == 0 ) // Strings are equal return; ::CppUnit::Asserter::fail ("Strings are not equal", sourceLine); } namespace test { //---------------------------------------------------------------------- // class FSystemTest //---------------------------------------------------------------------- #pragma pack(push) #pragma pack(1) class FSystemTest : public finalcut::FSystem { public: // Typedefs and Enumerations typedef struct { uChar shift : 1; uChar alt_gr : 1; uChar ctrl : 1; uChar alt : 1; uChar : 4; // padding bits } shiftstate; typedef struct { uChar red; uChar green; uChar blue; } rgb; typedef struct { rgb color[16]; } ColorMap; enum ac_mode { index_mode, data_mode }; // Constructor FSystemTest(); // Destructor virtual ~FSystemTest(); // Methods virtual uChar inPortByte (uShort) override; virtual void outPortByte (uChar, uShort) override; virtual int isTTY (int) override; virtual int ioctl (int, uLong, ...) override; virtual int open (const char*, int, ...) override; virtual int close (int) override; virtual FILE* fopen (const char*, const char*) override; virtual int fclose (FILE*) override; virtual int putchar (int) override; virtual int tputs (const char*, int, int (*)(int)) override; virtual uid_t getuid() override; rgb& getRGB (std::size_t); console_font_op& getConsoleFont(); shiftstate& getShiftState(); std::string& getCharacters(); private: // Methods static void initVScreenInfo(); static void initFScreenInfo(); // Data Members std::string characters; static shiftstate shift_state; static rgb terminal_color[16]; static rgb defaultColor[16]; static struct console_font_op terminal_font; static unimapdesc terminal_unicode_map; static struct fb_var_screeninfo fb_terminal_info; static struct fb_fix_screeninfo fb_terminal_fix_info; static bool vga_port_access; ac_mode attribute_controller_mode = index_mode; uChar ac_address_register[21] = \ { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0c, 0x00, 0x0f, 0x08, 0x00 }; uChar ac_index = 0; bool palette_addr_source_field = true; uChar port_3cc = 0x67; // Miscellaneous output uChar port_3da = 0; // Input status 1 static uChar vga8x16[]; static struct unipair unicode_cp437_pairs[]; }; #pragma pack(pop) // private Data Member of FSystemTest //---------------------------------------------------------------------- uChar FSystemTest::vga8x16[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, // 1 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, // 2 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, // 3 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // 4 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 5 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 6 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 7 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, // 9 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, // 10 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, // 11 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 12 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, // 13 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, // 14 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 15 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, // 16 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, // 17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, // 18 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, // 19 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, // 20 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, // 21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, // 22 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, // 23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, // 25 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 26 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 27 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 28 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, // 30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // 31 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, // 35 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, // 36 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, // 37 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 38 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, // 40 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, // 41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 43 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, // 44 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, // 47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xd6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, // 48 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, // 49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, // 50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, // 52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, // 55 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, // 57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, // 58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, // 59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, // 60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, // 62 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, // 64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, // 65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00, // 66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, // 67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, // 68 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, // 69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, // 70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, // 71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, // 72 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, // 74 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, // 75 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, // 76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, // 77 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, // 78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 79 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, // 80 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00, // 81 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, // 82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 85 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, // 86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0xee, 0x6c, 0x00, 0x00, 0x00, 0x00, // 87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x7c, 0x38, 0x38, 0x7c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, // 88 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, // 90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, // 91 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, // 92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, // 93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 94 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, // 95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 96 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, // 98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, // 102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, // 103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, // 104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, // 106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, // 107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00, // 109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, // 110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, // 112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, // 113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, // 114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, // 116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, // 118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00, // 119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, // 120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, // 121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, // 122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, // 123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, // 125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, // 127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00, // 128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00, // 135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, // 142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, // 143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, // 144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x76, 0x36, 0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, // 145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, // 146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, // 152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x3c, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, // 156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00, // 158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, // 159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, // 161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, // 163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, // 164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, // 165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, // 168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, // 169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, // 170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xdc, 0x86, 0x0c, 0x18, 0x3e, 0x00, 0x00, // 171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xce, 0x9e, 0x3e, 0x06, 0x06, 0x00, 0x00, // 172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, // 173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, // 176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, // 177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, // 178 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 184 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 189 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, // 215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 218 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, // 222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, // 224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00, // 225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, // 226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, // 227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, // 228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, // 229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, // 230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, // 232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, // 233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, // 234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, // 235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, // 237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, // 238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, // 239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, // 240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, // 241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, // 242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, // 243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, // 244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, // 245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, // 246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, // 251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, // 254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; struct unipair FSystemTest::unicode_cp437_pairs[] = { // .----------- unicode // | .---- fontpos // | | {0x0020, 0x20}, {0x0021, 0x21}, {0x0022, 0x22}, {0x0023, 0x23}, {0x0024, 0x24}, {0x0025, 0x25}, {0x0026, 0x26}, {0x0027, 0x27}, {0x0028, 0x28}, {0x0029, 0x29}, {0x002a, 0x2a}, {0x002b, 0x2b}, {0x002c, 0x2c}, {0x002d, 0x2d}, {0x002e, 0x2e}, {0x002f, 0x2f}, {0x0030, 0x30}, {0x0031, 0x31}, {0x0032, 0x32}, {0x0033, 0x33}, {0x0034, 0x34}, {0x0035, 0x35}, {0x0036, 0x36}, {0x0037, 0x37}, {0x0038, 0x38}, {0x0039, 0x39}, {0x003a, 0x3a}, {0x003b, 0x3b}, {0x003c, 0x3c}, {0x003d, 0x3d}, {0x003e, 0x3e}, {0x003f, 0x3f}, {0x0040, 0x40}, {0x0041, 0x41}, {0x0042, 0x42}, {0x0043, 0x43}, {0x0044, 0x44}, {0x0045, 0x45}, {0x0046, 0x46}, {0x0047, 0x47}, {0x0048, 0x48}, {0x0049, 0x49}, {0x004a, 0x4a}, {0x004b, 0x4b}, {0x004c, 0x4c}, {0x004d, 0x4d}, {0x004e, 0x4e}, {0x004f, 0x4f}, {0x0050, 0x50}, {0x0051, 0x51}, {0x0052, 0x52}, {0x0053, 0x53}, {0x0054, 0x54}, {0x0055, 0x55}, {0x0056, 0x56}, {0x0057, 0x57}, {0x0058, 0x58}, {0x0059, 0x59}, {0x005a, 0x5a}, {0x005b, 0x5b}, {0x005c, 0x5c}, {0x005d, 0x5d}, {0x005e, 0x5e}, {0x005f, 0x5f}, {0x0060, 0x60}, {0x0061, 0x61}, {0x0062, 0x62}, {0x0063, 0x63}, {0x0064, 0x64}, {0x0065, 0x65}, {0x0066, 0x66}, {0x0067, 0x67}, {0x0068, 0x68}, {0x0069, 0x69}, {0x006a, 0x6a}, {0x006b, 0x6b}, {0x006c, 0x6c}, {0x006d, 0x6d}, {0x006e, 0x6e}, {0x006f, 0x6f}, {0x0070, 0x70}, {0x0071, 0x71}, {0x0072, 0x72}, {0x0073, 0x73}, {0x0074, 0x74}, {0x0075, 0x75}, {0x0076, 0x76}, {0x0077, 0x77}, {0x0078, 0x78}, {0x0079, 0x79}, {0x007a, 0x7a}, {0x007b, 0x7b}, {0x007c, 0x7c}, {0x007d, 0x7d}, {0x007e, 0x7e}, {0x00a0, 0xff}, {0x00a1, 0xad}, {0x00a2, 0x9b}, {0x00a3, 0x9c}, {0x00a5, 0x9d}, {0x00a7, 0x15}, {0x00aa, 0xa6}, {0x00ab, 0xae}, {0x00ac, 0xaa}, {0x00b0, 0xf8}, {0x00b1, 0xf1}, {0x00b2, 0xfd}, {0x00b5, 0xe6}, {0x00b6, 0x14}, {0x00b7, 0xfa}, {0x00ba, 0xa7}, {0x00bb, 0xaf}, {0x00bc, 0xac}, {0x00bd, 0xab}, {0x00bf, 0xa8}, {0x00c4, 0x8e}, {0x00c5, 0x8f}, {0x00c6, 0x92}, {0x00c7, 0x80}, {0x00c9, 0x90}, {0x00d1, 0xa5}, {0x00d6, 0x99}, {0x00dc, 0x9a}, {0x00df, 0xe1}, {0x00e0, 0x85}, {0x00e1, 0xa0}, {0x00e2, 0x83}, {0x00e4, 0x84}, {0x00e5, 0x86}, {0x00e6, 0x91}, {0x00e7, 0x87}, {0x00e8, 0x8a}, {0x00e9, 0x82}, {0x00ea, 0x88}, {0x00eb, 0x89}, {0x00ec, 0x8d}, {0x00ed, 0xa1}, {0x00ee, 0x8c}, {0x00ef, 0x8b}, {0x00f1, 0xa4}, {0x00f2, 0x95}, {0x00f3, 0xa2}, {0x00f4, 0x93}, {0x00f6, 0x94}, {0x00f7, 0xf6}, {0x00f9, 0x97}, {0x00fa, 0xa3}, {0x00fb, 0x96}, {0x00fc, 0x81}, {0x00ff, 0x98}, {0x0192, 0x9f}, {0x0393, 0xe2}, {0x0398, 0xe9}, {0x03a3, 0xe4}, {0x03a6, 0xe8}, {0x03a9, 0xea}, {0x03b1, 0xe0}, {0x03b2, 0xe1}, {0x03b4, 0xeb}, {0x03b5, 0xee}, {0x03bc, 0xe6}, {0x03c0, 0xe3}, {0x03c3, 0xe5}, {0x03c4, 0xe7}, {0x03c6, 0xed}, {0x2008, 0x00}, {0x2022, 0x07}, {0x203c, 0x13}, {0x207f, 0xfc}, {0x20a7, 0x9e}, {0x2126, 0xea}, {0x212b, 0x8f}, {0x2190, 0x1b}, {0x2191, 0x18}, {0x2192, 0x1a}, {0x2193, 0x19}, {0x2194, 0x1d}, {0x2195, 0x12}, {0x21a8, 0x17}, {0x2205, 0xed}, {0x2208, 0xee}, {0x220e, 0xfe}, {0x2219, 0xf9}, {0x221a, 0xfb}, {0x221e, 0xec}, {0x221f, 0x1c}, {0x2229, 0xef}, {0x2248, 0xf7}, {0x2261, 0xf0}, {0x2264, 0xf3}, {0x2265, 0xf2}, {0x22c5, 0xf9}, {0x2300, 0xed}, {0x2302, 0x7f}, {0x2310, 0xa9}, {0x2319, 0x1c}, {0x2320, 0xf4}, {0x2321, 0xf5}, {0x2500, 0xc4}, {0x2502, 0xb3}, {0x250c, 0xda}, {0x2510, 0xbf}, {0x2514, 0xc0}, {0x2518, 0xd9}, {0x251c, 0xc3}, {0x2524, 0xb4}, {0x252c, 0xc2}, {0x2534, 0xc1}, {0x253c, 0xc5}, {0x2550, 0xcd}, {0x2551, 0xba}, {0x2552, 0xd5}, {0x2553, 0xd6}, {0x2554, 0xc9}, {0x2555, 0xb8}, {0x2556, 0xb7}, {0x2557, 0xbb}, {0x2558, 0xd4}, {0x2559, 0xd3}, {0x255a, 0xc8}, {0x255b, 0xbe}, {0x255c, 0xbd}, {0x255d, 0xbc}, {0x255e, 0xc6}, {0x255f, 0xc7}, {0x2560, 0xcc}, {0x2561, 0xb5}, {0x2562, 0xb6}, {0x2563, 0xb9}, {0x2564, 0xd1}, {0x2565, 0xd2}, {0x2566, 0xcb}, {0x2567, 0xcf}, {0x2568, 0xd0}, {0x2569, 0xca}, {0x256a, 0xd8}, {0x256b, 0xd7}, {0x256c, 0xce}, {0x2580, 0xdf}, {0x2584, 0xdc}, {0x2588, 0xdb}, {0x258c, 0xdd}, {0x2590, 0xde}, {0x2591, 0xb0}, {0x2592, 0xb1}, {0x2593, 0xb2}, {0x25a0, 0xfe}, {0x25ac, 0x16}, {0x25b2, 0x1e}, {0x25b6, 0x10}, {0x25ba, 0x10}, {0x25bc, 0x1f}, {0x25c0, 0x11}, {0x25c4, 0x11}, {0x25cb, 0x09}, {0x25d8, 0x08}, {0x25d9, 0x0a}, {0x263a, 0x01}, {0x263b, 0x02}, {0x263c, 0x0f}, {0x2640, 0x0c}, {0x2642, 0x0b}, {0x2660, 0x06}, {0x2663, 0x05}, {0x2665, 0x03}, {0x2666, 0x04}, {0x266a, 0x0d}, {0x266b, 0x0e}, {0x266c, 0x0e} }; FSystemTest::rgb FSystemTest::terminal_color[16] { }; FSystemTest::rgb FSystemTest::defaultColor[16] { {0x00, 0x00, 0x00}, {0xaa, 0x00, 0x00}, {0x00, 0xaa, 0x00}, {0xaa, 0x55, 0x00}, {0x00, 0x00, 0xaa}, {0xaa, 0x00, 0xaa}, {0x00, 0xaa, 0xaa}, {0xaa, 0xaa, 0xaa}, {0x55, 0x55, 0x55}, {0xff, 0x55, 0x55}, {0x55, 0xff, 0x55}, {0xff, 0xff, 0x55}, {0x55, 0x55, 0xff}, {0xff, 0x55, 0xff}, {0x55, 0xff, 0xff}, {0xff, 0xff, 0xff} }; // static class attributes //---------------------------------------------------------------------- FSystemTest::shiftstate FSystemTest::shift_state; struct console_font_op FSystemTest::terminal_font; unimapdesc FSystemTest::terminal_unicode_map; struct fb_var_screeninfo FSystemTest::fb_terminal_info; struct fb_fix_screeninfo FSystemTest::fb_terminal_fix_info; bool FSystemTest::vga_port_access = false; // constructors and destructor //---------------------------------------------------------------------- FSystemTest::FSystemTest() // constructor { // fill bit field with 0 memset (&shift_state, 0x00, sizeof(shift_state)); memset (&terminal_font, 0x00, sizeof(terminal_font)); memset (&terminal_unicode_map, 0x00, sizeof(terminal_unicode_map)); constexpr std::size_t font_data_size = 4 * 32 * 512; terminal_font.data = new uChar[font_data_size]{ }; // init framebuffer initVScreenInfo(); initFScreenInfo(); } //---------------------------------------------------------------------- FSystemTest::~FSystemTest() // destructor { if ( terminal_font.data ) delete[] terminal_font.data; if ( terminal_unicode_map.entries ) delete[] terminal_unicode_map.entries; } // public methods of FSystemTest //---------------------------------------------------------------------- uChar FSystemTest::inPortByte (uShort port) { std::cerr << "Call: im (port=" << port << ")\n"; switch ( port ) { case 0x3c1: if ( attribute_controller_mode == data_mode ) return ac_address_register[ac_index]; break; case 0x3cc: return port_3cc; case 0x3da: attribute_controller_mode = index_mode; return port_3da; } return 0; } //---------------------------------------------------------------------- void FSystemTest::outPortByte (uChar value, uShort port) { std::cerr << "Call: outb (value=" << value << ", port=" << port << ")\n"; switch ( port ) { case 0x3c0: if ( attribute_controller_mode == index_mode ) { ac_index = value & 0x1f; palette_addr_source_field = bool(value & 0x20); attribute_controller_mode = data_mode; } else { ac_address_register[ac_index] = value; attribute_controller_mode = index_mode; } break; default: return; } } //---------------------------------------------------------------------- int FSystemTest::isTTY (int fd) { std::cerr << "Call: isatty (fd=" << fd << ")\n"; return 1; } //---------------------------------------------------------------------- int FSystemTest::ioctl (int fd, uLong request, ...) { va_list args; void* argp; std::string req_string; int ret_val = -1; va_start (args, request); argp = va_arg (args, void*); switch ( request ) { case TIOCLINUX: { req_string = "TIOCLINUX"; char* subcode = static_cast(argp); uChar* state = reinterpret_cast(&shift_state); if ( *subcode == 6 ) *subcode = static_cast(*state); ret_val = 0; break; } case KDFONTOP: { req_string = "KDFONTOP"; constexpr std::size_t font_data_size = 4 * 32 * 512; struct console_font_op* fn = static_cast(argp); // Set Default if ( terminal_font.data && terminal_font.data[219 * 32] == 0 ) { terminal_font.width = 8; terminal_font.height = 16; terminal_font.charcount = 256; if ( fn->data ) std::memcpy (terminal_font.data, &vga8x16, sizeof(vga8x16)); } if ( fn->op == KD_FONT_OP_GET ) { fn->flags = terminal_font.flags; fn->width = terminal_font.width; fn->height = terminal_font.height; fn->charcount = terminal_font.charcount; if ( fn->data ) std::memcpy (fn->data, terminal_font.data, font_data_size); terminal_font.op = KD_FONT_OP_GET; } if ( fn->op == KD_FONT_OP_SET ) { terminal_font.flags = fn->flags; terminal_font.width = fn->width; terminal_font.height = fn->height; terminal_font.charcount = fn->charcount; if ( fn->data ) std::memcpy (terminal_font.data, fn->data, font_data_size); terminal_font.op = KD_FONT_OP_SET; } ret_val = 0; break; } case KDGKBTYPE: { req_string = "KDGKBTYPE"; char* keyboard_type = static_cast(argp); *keyboard_type = KB_101; ret_val = 0; break; } case GIO_CMAP: { req_string = "GIO_CMAP"; ColorMap* cmap = static_cast(argp); // Set Default if ( terminal_color[15].red == 0 && terminal_color[15].green == 0 && terminal_color[15].blue == 0 ) { for (std::size_t index = 0; index < 16; index++) { terminal_color[index].red = defaultColor[index].red; terminal_color[index].green = defaultColor[index].green; terminal_color[index].blue = defaultColor[index].blue; } } for (std::size_t index = 0; index < 16; index++) { cmap->color[index].red = terminal_color[index].red; cmap->color[index].green = terminal_color[index].green; cmap->color[index].blue = terminal_color[index].blue; } ret_val = 0; break; } case PIO_CMAP: { req_string = "PIO_CMAP"; ColorMap* cmap = static_cast(argp); for (std::size_t index = 0; index < 16; index++) { terminal_color[index].red = cmap->color[index].red; terminal_color[index].green = cmap->color[index].green; terminal_color[index].blue = cmap->color[index].blue; } ret_val = 0; break; } case GIO_UNIMAP: { req_string = "GIO_UNIMAP"; unimapdesc* umap = static_cast(argp); std::size_t pairs = sizeof(unicode_cp437_pairs) / sizeof(unipair); std::size_t pairs_size = pairs * sizeof(unipair); // Sets the default unicode map of the terminal on the first call if ( terminal_unicode_map.entries == 0 ) { terminal_unicode_map.entry_ct = pairs; terminal_unicode_map.entries = new unipair[pairs](); std::memcpy (terminal_unicode_map.entries, &unicode_cp437_pairs, pairs_size); } umap->entry_ct = terminal_unicode_map.entry_ct; if ( umap->entries && terminal_unicode_map.entries ) { std::memcpy (umap->entries, terminal_unicode_map.entries, pairs_size); errno = 0; ret_val = 0; } else { errno = ENOMEM; ret_val = -1; } break; } case PIO_UNIMAP: { req_string = "PIO_UNIMAP"; unimapdesc* umap = static_cast(argp); std::memcpy (&terminal_unicode_map, umap, sizeof(*umap)); ret_val = 0; break; } case PIO_UNIMAPCLR: req_string = "PIO_UNIMAPCLR"; ret_val = 0; break; case FBIOGET_VSCREENINFO: { req_string = "FBIOGET_VSCREENINFO"; struct fb_var_screeninfo* fb_var \ = static_cast(argp); std::memcpy (fb_var, &fb_terminal_info, sizeof(fb_terminal_info)); ret_val = 0; break; } case FBIOGET_FSCREENINFO: { req_string = "FBIOGET_FSCREENINFO"; struct fb_fix_screeninfo* fb_fix = static_cast(argp); std::memcpy (fb_fix, &fb_terminal_fix_info, sizeof(fb_terminal_fix_info)); ret_val = 0; break; } case KDENABIO: { req_string = "KDENABIO"; vga_port_access = true; ret_val = 0; break; } case KDDISABIO: { req_string = "KDDISABIO"; vga_port_access = false; ret_val = 0; break; } case TIOCGWINSZ: { req_string = "TIOCGWINSZ"; struct winsize* win_size = static_cast(argp); win_size->ws_col = 96; win_size->ws_row = 36; ret_val = 0; break; } } va_end (args); std::cerr << "Call: ioctl (fd=" << fd << ", request=" << req_string << "(0x" << std::hex << request << ")" << ", argp=" << argp << std::dec << ")\n"; return ret_val; } //---------------------------------------------------------------------- int FSystemTest::open (const char* pathname, int flags, ...) { va_list args; va_start (args, flags); mode_t mode = static_cast(va_arg (args, int)); va_end (args); std::cerr << "Call: open (pathname=\"" << pathname << "\", flags=" << flags << ", mode=" << mode << ")\n"; if ( std::strncmp(pathname, "/dev/fb0", 9) == 0 || std::strncmp(pathname, "/dev/fb/0", 9) == 0 ) return 99; // File descriptor return 0; } //---------------------------------------------------------------------- int FSystemTest::close (int fildes) { std::cerr << "Call: close (fildes=" << fildes << ")\n"; return 0; } //---------------------------------------------------------------------- FILE* FSystemTest::fopen (const char* path, const char* mode) { std::cerr << "Call: fopen (path=" << path << ", mode=" << mode << ")\n"; return 0; } //---------------------------------------------------------------------- int FSystemTest::fclose (FILE* fp) { std::cerr << "Call: fclose (fp=" << fp << ")\n"; return 0; } //---------------------------------------------------------------------- int FSystemTest::putchar (int c) { std::cerr << "Call: putchar (" << c << ")\n"; characters.push_back(c); return 1; } //---------------------------------------------------------------------- int FSystemTest::tputs (const char* str, int affcnt, int (*putc)(int)) { return ::tputs (str, affcnt, putc); } //---------------------------------------------------------------------- uid_t FSystemTest::getuid() { return 0; } //---------------------------------------------------------------------- FSystemTest::rgb& FSystemTest::getRGB (std::size_t i) { if ( i < 16 ) return terminal_color[i]; else return terminal_color[0]; } //---------------------------------------------------------------------- console_font_op& FSystemTest::getConsoleFont() { return terminal_font; } //---------------------------------------------------------------------- FSystemTest::shiftstate& FSystemTest::getShiftState() { return shift_state; } //---------------------------------------------------------------------- std::string& FSystemTest::getCharacters() { return characters; } // private methods of FSystemTest //---------------------------------------------------------------------- void FSystemTest::initVScreenInfo() { fb_terminal_info.xres = 800; fb_terminal_info.yres = 600; fb_terminal_info.xres_virtual = 1176; fb_terminal_info.yres_virtual = 885; fb_terminal_info.xoffset = 0; fb_terminal_info.yoffset = 0; fb_terminal_info.bits_per_pixel = 32; fb_terminal_info.grayscale = 0; fb_terminal_info.red.offset = 16; fb_terminal_info.red.length = 8; fb_terminal_info.red.msb_right = 0; fb_terminal_info.green.offset = 8; fb_terminal_info.green.length = 8, fb_terminal_info.green.msb_right = 0; fb_terminal_info.blue.offset = 0; fb_terminal_info.blue.length = 8; fb_terminal_info.blue.msb_right = 0; fb_terminal_info.transp.offset = 0; fb_terminal_info.blue.length = 0; fb_terminal_info.blue.msb_right = 0; fb_terminal_info.nonstd = 0; fb_terminal_info.activate = 0; fb_terminal_info.height = 0xffffffff; fb_terminal_info.width = 0xffffffff; fb_terminal_info.accel_flags = 0; fb_terminal_info.pixclock = 0; fb_terminal_info.left_margin = 0; fb_terminal_info.right_margin = 0; fb_terminal_info.upper_margin = 0; fb_terminal_info.lower_margin = 0; fb_terminal_info.hsync_len = 0; fb_terminal_info.vsync_len = 0; fb_terminal_info.sync = 0; fb_terminal_info.vmode = 0; fb_terminal_info.rotate = 0; #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0) fb_terminal_info.colorspace = 0; #endif fb_terminal_info.reserved[0] = 0; fb_terminal_info.reserved[1] = 0; fb_terminal_info.reserved[2] = 0; fb_terminal_info.reserved[3] = 0; } //---------------------------------------------------------------------- void FSystemTest::initFScreenInfo() { char id[16] { "VESA VGA" }; std::strncpy (fb_terminal_fix_info.id, id, sizeof(id)); fb_terminal_fix_info.smem_start = 0xf9000000; fb_terminal_fix_info.smem_len = 0x00500000; fb_terminal_fix_info.type = 0; fb_terminal_fix_info.type_aux = 0; fb_terminal_fix_info.visual = 2; fb_terminal_fix_info.xpanstep = 0; fb_terminal_fix_info.ypanstep = 0; fb_terminal_fix_info.ywrapstep = 0; fb_terminal_fix_info.line_length = 5120; fb_terminal_fix_info.mmio_start = 0; fb_terminal_fix_info.mmio_len = 0; fb_terminal_fix_info.accel = 0; #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0) fb_terminal_fix_info.capabilities = 0; #endif fb_terminal_fix_info.reserved[0] = 0; fb_terminal_fix_info.reserved[1] = 0; } } // namespace test //---------------------------------------------------------------------- // class FTermLinuxTest //---------------------------------------------------------------------- #pragma pack(push) #pragma pack(1) class FTermLinuxTest : public CPPUNIT_NS::TestFixture, test::ConEmu { public: FTermLinuxTest(); protected: void classNameTest(); void linuxConsoleTest(); void linuxCursorStyleTest(); void linuxColorPaletteTest(); void linuxFontTest(); void modifierKeyTest(); private: // Adds code needed to register the test suite CPPUNIT_TEST_SUITE (FTermLinuxTest); // Add a methods to the test suite CPPUNIT_TEST (classNameTest); CPPUNIT_TEST (linuxConsoleTest); CPPUNIT_TEST (linuxCursorStyleTest); CPPUNIT_TEST (linuxColorPaletteTest); CPPUNIT_TEST (linuxFontTest); CPPUNIT_TEST (modifierKeyTest); // End of test suite definition CPPUNIT_TEST_SUITE_END(); }; #pragma pack(pop) //---------------------------------------------------------------------- FTermLinuxTest::FTermLinuxTest() { } //---------------------------------------------------------------------- void FTermLinuxTest::classNameTest() { const finalcut::FTermLinux p; const char* const classname = p.getClassName(); CPPUNIT_ASSERT ( std::strcmp(classname, "FTermLinux") == 0 ); } //---------------------------------------------------------------------- void FTermLinuxTest::linuxConsoleTest() { finalcut::FTermData* data; finalcut::FSystem* fsys; fsys = new test::FSystemTest(); finalcut::FTerm::setFSystem(fsys); finalcut::FTermDetection* term_detection; std::cout << "\n"; data = finalcut::FTerm::getFTermData(); auto& encoding_list = data->getEncodingList(); encoding_list["UTF-8"] = finalcut::fc::UTF8; encoding_list["UTF8"] = finalcut::fc::UTF8; encoding_list["VT100"] = finalcut::fc::VT100; encoding_list["PC"] = finalcut::fc::PC; encoding_list["ASCII"] = finalcut::fc::ASCII; data->setTermEncoding(finalcut::fc::PC); data->setBaudrate(38400); data->setTermType("linux"); data->setTermFileName("/dev/tty2"); #if DEBUG data->setFramebufferBpp(32); #endif data->supportShadowCharacter (false); data->supportHalfBlockCharacter (false); data->supportCursorOptimisation (true); data->setCursorHidden (true); data->useAlternateScreen (false); data->setASCIIConsole (true); data->setVT100Console (false); data->setUTF8Console (false); data->setUTF8 (false); data->setNewFont (false); data->setVGAFont (false); data->setMonochron (false); data->setTermResized (false); term_detection = finalcut::FTerm::getFTermDetection(); finalcut::FTermLinux linux; term_detection->setLinuxTerm(true); pid_t pid = forkConEmu(); if ( isConEmuChildProcess(pid) ) { setenv ("TERM", "linux", 1); setenv ("COLUMNS", "90", 1); setenv ("LINES", "30", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); unsetenv("COLORFGBG"); unsetenv("VTE_VERSION"); unsetenv("XTERM_VERSION"); unsetenv("ROXTERM_ID"); unsetenv("KONSOLE_DBUS_SESSION"); unsetenv("KONSOLE_DCOP"); unsetenv("TMUX"); term_detection->detect(); linux.init(); CPPUNIT_ASSERT ( isatty(3) == 0 ); CPPUNIT_ASSERT ( term_detection->isLinuxTerm() ); CPPUNIT_ASSERT ( data->getTermGeometry().getWidth() == 96 ); CPPUNIT_ASSERT ( data->getTermGeometry().getHeight() == 36 ); CPPUNIT_ASSERT ( data->hasShadowCharacter() ); CPPUNIT_ASSERT ( data->hasHalfBlockCharacter() ); CPPUNIT_ASSERT ( linux.getFramebufferBpp() == 32 ); test::FSystemTest* fsystest = static_cast(fsys); std::string& characters = fsystest->getCharacters(); linux.setUTF8 (false); CPPUNIT_ASSERT ( characters == ESC "%@" ); characters.clear(); linux.setUTF8 (true); CPPUNIT_ASSERT ( characters == ESC "%G" ); characters.clear(); linux.setBeep (20, 100); // Hz < 21 CPPUNIT_ASSERT ( characters.empty() ); linux.setBeep (32767, 100); // Hz > 32766 CPPUNIT_ASSERT ( characters.empty() ); linux.setBeep (200, -1); // ms < 0 CPPUNIT_ASSERT ( characters.empty() ); linux.setBeep (200, 2000); // ms > 1999 CPPUNIT_ASSERT ( characters.empty() ); linux.setBeep (200, 100); // 200 Hz - 100 ms CPPUNIT_ASSERT ( characters == CSI "10;200]" CSI "11;100]" ); characters.clear(); linux.resetBeep(); CPPUNIT_ASSERT ( characters == CSI "10;750]" CSI "11;125]" ); characters.clear(); linux.initCharMap (finalcut::fc::character); auto& character_map = data->getCharSubstitutionMap(); CPPUNIT_ASSERT ( character_map.size() == 3 ); CPPUNIT_ASSERT ( character_map[finalcut::fc::BlackCircle] == L'*' ); CPPUNIT_ASSERT ( character_map[finalcut::fc::Times] == L'x' ); CPPUNIT_ASSERT ( character_map[L'ˣ'] == L'ⁿ' ); closeConEmuStdStreams(); exit(EXIT_SUCCESS); } else // Parent { // Start the terminal emulation startConEmuTerminal (ConEmu::linux_con); if ( waitpid(pid, 0, WUNTRACED) != pid ) std::cerr << "waitpid error" << std::endl; } linux.finish(); } //---------------------------------------------------------------------- void FTermLinuxTest::linuxCursorStyleTest() { finalcut::FTermData* data; finalcut::FSystem* fsys; fsys = new test::FSystemTest(); finalcut::FTerm::setFSystem(fsys); finalcut::FTermDetection* term_detection; std::cout << "\n"; data = finalcut::FTerm::getFTermData(); auto& encoding_list = data->getEncodingList(); encoding_list["UTF-8"] = finalcut::fc::UTF8; encoding_list["UTF8"] = finalcut::fc::UTF8; encoding_list["VT100"] = finalcut::fc::VT100; encoding_list["PC"] = finalcut::fc::PC; encoding_list["ASCII"] = finalcut::fc::ASCII; data->setTermEncoding(finalcut::fc::PC); data->setBaudrate(38400); data->setTermType("linux"); data->setTermFileName("/dev/tty2"); #if DEBUG data->setFramebufferBpp(32); #endif data->supportShadowCharacter (false); data->supportHalfBlockCharacter (false); data->supportCursorOptimisation (true); data->setCursorHidden (true); data->useAlternateScreen (false); data->setASCIIConsole (true); data->setVT100Console (false); data->setUTF8Console (false); data->setUTF8 (false); data->setNewFont (false); data->setVGAFont (false); data->setMonochron (false); data->setTermResized (false); term_detection = finalcut::FTerm::getFTermDetection(); finalcut::FTermLinux linux; term_detection->setLinuxTerm(true); pid_t pid = forkConEmu(); if ( isConEmuChildProcess(pid) ) { setenv ("TERM", "linux", 1); setenv ("COLUMNS", "90", 1); setenv ("LINES", "30", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); unsetenv("COLORFGBG"); unsetenv("VTE_VERSION"); unsetenv("XTERM_VERSION"); unsetenv("ROXTERM_ID"); unsetenv("KONSOLE_DBUS_SESSION"); unsetenv("KONSOLE_DCOP"); unsetenv("TMUX"); term_detection->detect(); linux.init(); char* cursorstyle; cursorstyle = linux.setCursorStyle (finalcut::fc::default_cursor, false); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?0c" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::default_cursor ); cursorstyle = linux.setCursorStyle (finalcut::fc::invisible_cursor, false); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?1c" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::invisible_cursor ); cursorstyle = linux.setCursorStyle (finalcut::fc::underscore_cursor, false); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?2c" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::underscore_cursor ); cursorstyle = linux.setCursorStyle (finalcut::fc::lower_third_cursor, false); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?3c" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::lower_third_cursor ); cursorstyle = linux.setCursorStyle (finalcut::fc::lower_half_cursor, false); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?4c" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::lower_half_cursor ); cursorstyle = linux.setCursorStyle (finalcut::fc::two_thirds_cursor, false); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?5c" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::two_thirds_cursor ); cursorstyle = linux.setCursorStyle (finalcut::fc::full_block_cursor, false); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?6c" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::full_block_cursor ); cursorstyle = linux.setCursorStyle (finalcut::fc::default_cursor, true); CPPUNIT_ASSERT_CSTRING ( cursorstyle, "" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::default_cursor ); cursorstyle = linux.restoreCursorStyle(); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?0c" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::default_cursor ); cursorstyle = linux.setCursorStyle (finalcut::fc::invisible_cursor, true); CPPUNIT_ASSERT_CSTRING ( cursorstyle, "" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::invisible_cursor ); cursorstyle = linux.restoreCursorStyle(); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?1c" ); cursorstyle = linux.setCursorStyle (finalcut::fc::underscore_cursor, true); CPPUNIT_ASSERT_CSTRING ( cursorstyle, "" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::underscore_cursor ); cursorstyle = linux.restoreCursorStyle(); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?2c" ); cursorstyle = linux.setCursorStyle (finalcut::fc::lower_third_cursor, true); CPPUNIT_ASSERT_CSTRING ( cursorstyle, "" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::lower_third_cursor ); cursorstyle = linux.restoreCursorStyle(); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?3c" ); cursorstyle = linux.setCursorStyle (finalcut::fc::lower_half_cursor, true); CPPUNIT_ASSERT_CSTRING ( cursorstyle, "" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::lower_half_cursor ); cursorstyle = linux.restoreCursorStyle(); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?4c" ); cursorstyle = linux.setCursorStyle (finalcut::fc::two_thirds_cursor, true); CPPUNIT_ASSERT_CSTRING ( cursorstyle, "" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::two_thirds_cursor ); cursorstyle = linux.restoreCursorStyle(); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?5c" ); cursorstyle = linux.setCursorStyle (finalcut::fc::full_block_cursor, true); CPPUNIT_ASSERT_CSTRING ( cursorstyle, "" ); CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::full_block_cursor ); cursorstyle = linux.restoreCursorStyle(); CPPUNIT_ASSERT_CSTRING ( cursorstyle, CSI "?6c" ); closeConEmuStdStreams(); exit(EXIT_SUCCESS); } else // Parent { // Start the terminal emulation startConEmuTerminal (ConEmu::linux_con); if ( waitpid(pid, 0, WUNTRACED) != pid ) std::cerr << "waitpid error" << std::endl; } linux.finish(); } //---------------------------------------------------------------------- void FTermLinuxTest::linuxColorPaletteTest() { finalcut::FTermData* data; finalcut::FSystem* fsys; fsys = new test::FSystemTest(); finalcut::FTerm::setFSystem(fsys); finalcut::FTermDetection* term_detection; std::cout << "\n"; data = finalcut::FTerm::getFTermData(); auto& encoding_list = data->getEncodingList(); encoding_list["UTF-8"] = finalcut::fc::UTF8; encoding_list["UTF8"] = finalcut::fc::UTF8; encoding_list["VT100"] = finalcut::fc::VT100; encoding_list["PC"] = finalcut::fc::PC; encoding_list["ASCII"] = finalcut::fc::ASCII; data->setTermEncoding(finalcut::fc::PC); data->setBaudrate(38400); data->setTermType("linux"); data->setTermFileName("/dev/tty2"); #if DEBUG data->setFramebufferBpp(32); #endif data->supportShadowCharacter (false); data->supportHalfBlockCharacter (false); data->supportCursorOptimisation (true); data->setCursorHidden (true); data->useAlternateScreen (false); data->setASCIIConsole (true); data->setVT100Console (false); data->setUTF8Console (false); data->setUTF8 (false); data->setNewFont (false); data->setVGAFont (false); data->setMonochron (false); data->setTermResized (false); term_detection = finalcut::FTerm::getFTermDetection(); finalcut::FTermLinux linux; term_detection->setLinuxTerm(true); pid_t pid = forkConEmu(); if ( isConEmuChildProcess(pid) ) { setenv ("TERM", "linux", 1); setenv ("COLUMNS", "90", 1); setenv ("LINES", "30", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); unsetenv("COLORFGBG"); unsetenv("VTE_VERSION"); unsetenv("XTERM_VERSION"); unsetenv("ROXTERM_ID"); unsetenv("KONSOLE_DBUS_SESSION"); unsetenv("KONSOLE_DCOP"); unsetenv("TMUX"); term_detection->detect(); linux.init(); test::FSystemTest* fsystest = static_cast(fsys); CPPUNIT_ASSERT ( linux.resetColorMap() == true ); CPPUNIT_ASSERT ( linux.saveColorMap() == true ); FColor index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::Black); test::FSystemTest::rgb& RGB0 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB0.red == 0x00 ); CPPUNIT_ASSERT ( RGB0.green == 0x00 ); CPPUNIT_ASSERT ( RGB0.blue == 0x00 ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x01, 0x02, 0x03) ); CPPUNIT_ASSERT ( RGB0.red == 0x01 ); CPPUNIT_ASSERT ( RGB0.green == 0x02 ); CPPUNIT_ASSERT ( RGB0.blue == 0x03 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::Blue); test::FSystemTest::rgb& RGB1 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB1.red == 0x00 ); CPPUNIT_ASSERT ( RGB1.green == 0x00 ); CPPUNIT_ASSERT ( RGB1.blue == 0xaa ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x04, 0x05, 0x06) ); CPPUNIT_ASSERT ( RGB1.red == 0x04 ); CPPUNIT_ASSERT ( RGB1.green == 0x05 ); CPPUNIT_ASSERT ( RGB1.blue == 0x06 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::Green); test::FSystemTest::rgb& RGB2 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB2.red == 0x00 ); CPPUNIT_ASSERT ( RGB2.green == 0xaa ); CPPUNIT_ASSERT ( RGB2.blue == 0x00 ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x07, 0x08, 0x09) ); CPPUNIT_ASSERT ( RGB2.red == 0x07 ); CPPUNIT_ASSERT ( RGB2.green == 0x08 ); CPPUNIT_ASSERT ( RGB2.blue == 0x09 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::Cyan); test::FSystemTest::rgb& RGB3 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB3.red == 0x00 ); CPPUNIT_ASSERT ( RGB3.green == 0xaa ); CPPUNIT_ASSERT ( RGB3.blue == 0xaa ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x0a, 0x0b, 0x0c) ); CPPUNIT_ASSERT ( RGB3.red == 0x0a ); CPPUNIT_ASSERT ( RGB3.green == 0x0b ); CPPUNIT_ASSERT ( RGB3.blue == 0x0c ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::Red); test::FSystemTest::rgb& RGB4 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB4.red == 0xaa ); CPPUNIT_ASSERT ( RGB4.green == 0x00 ); CPPUNIT_ASSERT ( RGB4.blue == 0x00 ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x0d, 0x0e, 0x0f) ); CPPUNIT_ASSERT ( RGB4.red == 0x0d ); CPPUNIT_ASSERT ( RGB4.green == 0x0e ); CPPUNIT_ASSERT ( RGB4.blue == 0x0f ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::Magenta); test::FSystemTest::rgb& RGB5 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB5.red == 0xaa ); CPPUNIT_ASSERT ( RGB5.green == 0x00 ); CPPUNIT_ASSERT ( RGB5.blue == 0xaa ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x10, 0x11, 0x12) ); CPPUNIT_ASSERT ( RGB5.red == 0x10 ); CPPUNIT_ASSERT ( RGB5.green == 0x11 ); CPPUNIT_ASSERT ( RGB5.blue == 0x12 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::Brown); test::FSystemTest::rgb& RGB6 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB6.red == 0xaa ); CPPUNIT_ASSERT ( RGB6.green == 0x55 ); CPPUNIT_ASSERT ( RGB6.blue == 0x00 ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x13, 0x14, 0x15) ); CPPUNIT_ASSERT ( RGB6.red == 0x13 ); CPPUNIT_ASSERT ( RGB6.green == 0x14 ); CPPUNIT_ASSERT ( RGB6.blue == 0x15 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::LightGray); test::FSystemTest::rgb& RGB7 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB7.red == 0xaa ); CPPUNIT_ASSERT ( RGB7.green == 0xaa ); CPPUNIT_ASSERT ( RGB7.blue == 0xaa ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x16, 0x17, 0x18) ); CPPUNIT_ASSERT ( RGB7.red == 0x16 ); CPPUNIT_ASSERT ( RGB7.green == 0x17 ); CPPUNIT_ASSERT ( RGB7.blue == 0x18 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::DarkGray); test::FSystemTest::rgb& RGB8 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB8.red == 0x55 ); CPPUNIT_ASSERT ( RGB8.green == 0x55 ); CPPUNIT_ASSERT ( RGB8.blue == 0x55 ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x19, 0x20, 0x21) ); CPPUNIT_ASSERT ( RGB8.red == 0x19 ); CPPUNIT_ASSERT ( RGB8.green == 0x20 ); CPPUNIT_ASSERT ( RGB8.blue == 0x21 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::LightBlue); test::FSystemTest::rgb& RGB9 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB9.red == 0x55 ); CPPUNIT_ASSERT ( RGB9.green == 0x55 ); CPPUNIT_ASSERT ( RGB9.blue == 0xff ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x22, 0x23, 0x24) ); CPPUNIT_ASSERT ( RGB9.red == 0x22 ); CPPUNIT_ASSERT ( RGB9.green == 0x23 ); CPPUNIT_ASSERT ( RGB9.blue == 0x24 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::LightGreen); test::FSystemTest::rgb& RGB10 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB10.red == 0x55 ); CPPUNIT_ASSERT ( RGB10.green == 0xff ); CPPUNIT_ASSERT ( RGB10.blue == 0x55 ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x25, 0x26, 0x27) ); CPPUNIT_ASSERT ( RGB10.red == 0x25 ); CPPUNIT_ASSERT ( RGB10.green == 0x26 ); CPPUNIT_ASSERT ( RGB10.blue == 0x27 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::LightCyan); test::FSystemTest::rgb& RGB11 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB11.red == 0x55 ); CPPUNIT_ASSERT ( RGB11.green == 0xff ); CPPUNIT_ASSERT ( RGB11.blue == 0xff ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x28, 0x29, 0x30) ); CPPUNIT_ASSERT ( RGB11.red == 0x28 ); CPPUNIT_ASSERT ( RGB11.green == 0x29 ); CPPUNIT_ASSERT ( RGB11.blue == 0x30 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::LightRed); test::FSystemTest::rgb& RGB12 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB12.red == 0xff ); CPPUNIT_ASSERT ( RGB12.green == 0x55 ); CPPUNIT_ASSERT ( RGB12.blue == 0x55 ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x31, 0x32, 0x33) ); CPPUNIT_ASSERT ( RGB12.red == 0x31 ); CPPUNIT_ASSERT ( RGB12.green == 0x32 ); CPPUNIT_ASSERT ( RGB12.blue == 0x33 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::LightMagenta); test::FSystemTest::rgb& RGB13 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB13.red == 0xff ); CPPUNIT_ASSERT ( RGB13.green == 0x55 ); CPPUNIT_ASSERT ( RGB13.blue == 0xff ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x34, 0x35, 0x36) ); CPPUNIT_ASSERT ( RGB13.red == 0x34 ); CPPUNIT_ASSERT ( RGB13.green == 0x35 ); CPPUNIT_ASSERT ( RGB13.blue == 0x36 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::Yellow); test::FSystemTest::rgb& RGB14 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB14.red == 0xff ); CPPUNIT_ASSERT ( RGB14.green == 0xff ); CPPUNIT_ASSERT ( RGB14.blue == 0x55 ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x37, 0x38, 0x39) ); CPPUNIT_ASSERT ( RGB14.red == 0x37 ); CPPUNIT_ASSERT ( RGB14.green == 0x38 ); CPPUNIT_ASSERT ( RGB14.blue == 0x39 ); index = finalcut::FOptiAttr::vga2ansi(finalcut::fc::White); test::FSystemTest::rgb& RGB15 = fsystest->getRGB(index); CPPUNIT_ASSERT ( RGB15.red == 0xff ); CPPUNIT_ASSERT ( RGB15.green == 0xff ); CPPUNIT_ASSERT ( RGB15.blue == 0xff ); CPPUNIT_ASSERT ( linux.setPalette (index, 0x40, 0x41, 0x42) ); CPPUNIT_ASSERT ( RGB15.red == 0x40 ); CPPUNIT_ASSERT ( RGB15.green == 0x41 ); CPPUNIT_ASSERT ( RGB15.blue == 0x42 ); // Out of range -> no change CPPUNIT_ASSERT ( linux.setPalette (index, -1, 0, 0) ); CPPUNIT_ASSERT ( RGB15.red == 0x40 ); CPPUNIT_ASSERT ( RGB15.green == 0x41 ); CPPUNIT_ASSERT ( RGB15.blue == 0x42 ); // Out of range -> no change CPPUNIT_ASSERT ( linux.setPalette (index, 0, -1, 0) ); CPPUNIT_ASSERT ( RGB15.red == 0x40 ); CPPUNIT_ASSERT ( RGB15.green == 0x41 ); CPPUNIT_ASSERT ( RGB15.blue == 0x42 ); // Out of range -> no change CPPUNIT_ASSERT ( linux.setPalette (index, 0, 0, -1) ); CPPUNIT_ASSERT ( RGB15.red == 0x40 ); CPPUNIT_ASSERT ( RGB15.green == 0x41 ); CPPUNIT_ASSERT ( RGB15.blue == 0x42 ); // Out of range -> no change CPPUNIT_ASSERT ( linux.setPalette (index, 256, 0, 0) ); CPPUNIT_ASSERT ( RGB15.red == 0x40 ); CPPUNIT_ASSERT ( RGB15.green == 0x41 ); CPPUNIT_ASSERT ( RGB15.blue == 0x42 ); // Out of range -> no change CPPUNIT_ASSERT ( linux.setPalette (index, 0, 256, 0) ); CPPUNIT_ASSERT ( RGB15.red == 0x40 ); CPPUNIT_ASSERT ( RGB15.green == 0x41 ); CPPUNIT_ASSERT ( RGB15.blue == 0x42 ); // Out of range -> no change CPPUNIT_ASSERT ( linux.setPalette (index, 0, 0, 256) ); CPPUNIT_ASSERT ( RGB15.red == 0x40 ); CPPUNIT_ASSERT ( RGB15.green == 0x41 ); CPPUNIT_ASSERT ( RGB15.blue == 0x42 ); CPPUNIT_ASSERT ( linux.resetColorMap() == true ); closeConEmuStdStreams(); exit(EXIT_SUCCESS); } else // Parent { // Start the terminal emulation startConEmuTerminal (ConEmu::linux_con); if ( waitpid(pid, 0, WUNTRACED) != pid ) std::cerr << "waitpid error" << std::endl; } linux.finish(); } //---------------------------------------------------------------------- void FTermLinuxTest::linuxFontTest() { finalcut::FTermData* data; finalcut::FSystem* fsys; fsys = new test::FSystemTest(); finalcut::FTerm::setFSystem(fsys); finalcut::FTermDetection* term_detection; std::cout << "\n"; data = finalcut::FTerm::getFTermData(); auto& encoding_list = data->getEncodingList(); encoding_list["UTF-8"] = finalcut::fc::UTF8; encoding_list["UTF8"] = finalcut::fc::UTF8; encoding_list["VT100"] = finalcut::fc::VT100; encoding_list["PC"] = finalcut::fc::PC; encoding_list["ASCII"] = finalcut::fc::ASCII; data->setTermEncoding(finalcut::fc::PC); data->setBaudrate(38400); data->setTermType("linux"); data->setTermFileName("/dev/tty2"); #if DEBUG data->setFramebufferBpp(32); #endif data->supportShadowCharacter (false); data->supportHalfBlockCharacter (false); data->supportCursorOptimisation (true); data->setCursorHidden (true); data->useAlternateScreen (false); data->setASCIIConsole (true); data->setVT100Console (false); data->setUTF8Console (false); data->setUTF8 (false); data->setNewFont (false); data->setVGAFont (false); data->setMonochron (false); data->setTermResized (false); term_detection = finalcut::FTerm::getFTermDetection(); finalcut::FTermLinux linux; pid_t pid = forkConEmu(); if ( isConEmuChildProcess(pid) ) { setenv ("TERM", "linux", 1); setenv ("COLUMNS", "90", 1); setenv ("LINES", "30", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); unsetenv("COLORFGBG"); unsetenv("VTE_VERSION"); unsetenv("XTERM_VERSION"); unsetenv("ROXTERM_ID"); unsetenv("KONSOLE_DBUS_SESSION"); unsetenv("KONSOLE_DCOP"); unsetenv("TMUX"); term_detection->detect(); linux.init(); test::FSystemTest* fsystest = static_cast(fsys); console_font_op& font = fsystest->getConsoleFont(); CPPUNIT_ASSERT ( font.op == KD_FONT_OP_GET ); CPPUNIT_ASSERT ( ! linux.isVGAFontUsed() ); CPPUNIT_ASSERT ( ! linux.isNewFontUsed() ); linux.loadVGAFont(); CPPUNIT_ASSERT ( data->hasShadowCharacter() ); CPPUNIT_ASSERT ( data->hasHalfBlockCharacter() ); CPPUNIT_ASSERT ( font.op == KD_FONT_OP_SET ); CPPUNIT_ASSERT ( linux.isVGAFontUsed() ); CPPUNIT_ASSERT ( ! linux.isNewFontUsed() ); // Full block character test for (std::size_t i = 0; i < 16 ; i++) CPPUNIT_ASSERT ( font.data[219 * 32 + i] == 0xff ); linux.loadNewFont(); CPPUNIT_ASSERT ( ! linux.isVGAFontUsed() ); CPPUNIT_ASSERT ( linux.isNewFontUsed() ); // Full block character test for (std::size_t i = 0; i < 16 ; i++) CPPUNIT_ASSERT ( font.data[219 * 32 + i] == 0xff ); // New font bullet CPPUNIT_ASSERT ( font.data[249 * 32 + 0] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 1] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 2] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 3] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 4] == 0x38 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 5] == 0x7c ); CPPUNIT_ASSERT ( font.data[249 * 32 + 6] == 0xfe ); CPPUNIT_ASSERT ( font.data[249 * 32 + 7] == 0xfe ); CPPUNIT_ASSERT ( font.data[249 * 32 + 8] == 0xfe ); CPPUNIT_ASSERT ( font.data[249 * 32 + 9] == 0x7c ); CPPUNIT_ASSERT ( font.data[249 * 32 + 10] == 0x38 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 11] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 12] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 13] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 14] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 15] == 0x00 ); linux.loadOldFont(finalcut::fc::character); CPPUNIT_ASSERT ( ! linux.isVGAFontUsed() ); CPPUNIT_ASSERT ( ! linux.isNewFontUsed() ); // cp437 bullet operator CPPUNIT_ASSERT ( font.data[249 * 32 + 0] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 1] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 2] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 3] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 4] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 5] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 6] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 7] == 0x18 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 8] == 0x18 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 9] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 10] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 11] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 12] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 13] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 14] == 0x00 ); CPPUNIT_ASSERT ( font.data[249 * 32 + 15] == 0x00 ); closeConEmuStdStreams(); exit(EXIT_SUCCESS); } else // Parent { // Start the terminal emulation startConEmuTerminal (ConEmu::linux_con); if ( waitpid(pid, 0, WUNTRACED) != pid ) std::cerr << "waitpid error" << std::endl; } linux.finish(); } //---------------------------------------------------------------------- void FTermLinuxTest::modifierKeyTest() { FKey keycode; FKey mod_keycode; const finalcut::FTermLinux linux; finalcut::FSystem* fsys; fsys = new test::FSystemTest(); test::FSystemTest* fsystest = static_cast(fsys); test::FSystemTest::shiftstate& mod_key = fsystest->getShiftState(); // Up key keycode = finalcut::fc::Fkey_up; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_up ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_sr ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_up ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_up ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_sup ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_sup ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_up ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_sup ); // Down key mod_key.shift = 0; mod_key.ctrl = 0; mod_key.alt = 0; keycode = finalcut::fc::Fkey_down; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_down ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_sf ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_down ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_down ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_sdown ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_sdown ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_down ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_sdown ); // Left key mod_key.shift = 0; mod_key.ctrl = 0; mod_key.alt = 0; keycode = finalcut::fc::Fkey_left; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_left ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_sleft ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_left ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_left ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_sleft ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_sleft ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_left ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_sleft ); // Right key mod_key.shift = 0; mod_key.ctrl = 0; mod_key.alt = 0; keycode = finalcut::fc::Fkey_right; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_right ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_sright ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_right ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_right ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_sright ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_sright ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_right ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_sright ); // Insert key mod_key.shift = 0; mod_key.ctrl = 0; mod_key.alt = 0; keycode = finalcut::fc::Fkey_ic; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_ic ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_sic ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_ic ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_ic ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_sic ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_sic ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_ic ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_sic ); // Delete key mod_key.shift = 0; mod_key.ctrl = 0; mod_key.alt = 0; keycode = finalcut::fc::Fkey_dc; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_dc ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_sdc ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_dc ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_dc ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_sdc ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_sdc ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_dc ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_sdc ); // Home key mod_key.shift = 0; mod_key.ctrl = 0; mod_key.alt = 0; keycode = finalcut::fc::Fkey_home; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_home ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_shome ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_home ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_home ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_shome ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_shome ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_home ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_shome ); // End key mod_key.shift = 0; mod_key.ctrl = 0; mod_key.alt = 0; keycode = finalcut::fc::Fkey_end; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_end ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_send ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_end ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_end ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_send ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_send ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_end ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_send ); // Page Up key mod_key.shift = 0; mod_key.ctrl = 0; mod_key.alt = 0; keycode = finalcut::fc::Fkey_ppage; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_ppage ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_sprevious ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_ppage ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_ppage ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_sppage ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_sppage ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_ppage ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_sppage ); // Page Down key mod_key.shift = 0; mod_key.ctrl = 0; mod_key.alt = 0; keycode = finalcut::fc::Fkey_npage; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_npage ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_snext ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_npage ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_npage ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fckey_snpage ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fmkey_snpage ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_npage ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fcmkey_snpage ); // Space key mod_key.shift = 0; mod_key.ctrl = 0; mod_key.alt = 0; keycode = finalcut::fc::Fkey_space; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_space ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_space ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_space ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_space ); mod_key.shift = 1; mod_key.ctrl = 1; mod_key.alt = 0; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_space ); mod_key.ctrl = 0; mod_key.alt = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_space ); mod_key.shift = 0; mod_key.ctrl = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_space ); mod_key.shift = 1; mod_keycode = linux.modifierKeyCorrection(keycode); CPPUNIT_ASSERT ( mod_keycode == finalcut::fc::Fkey_space ); } // Put the test suite in the registry CPPUNIT_TEST_SUITE_REGISTRATION (FTermLinuxTest); // The general unit test main part #include