From 8bda492113df0896be14d1451407373cb929cf1d Mon Sep 17 00:00:00 2001 From: Stephen Hurd <deuce@synchro.net> Date: Thu, 10 Feb 2022 18:01:42 -0500 Subject: [PATCH] With the CMakeLists.txt files in the main repo, we don't need to maintain anything here except the config file. We just jelly it into anyone who uses the library, British style. --- CMakeLists.txt | 53 +- ciolib/CMakeLists.txt | 129 - ciolib/CVS/Entries | 3 - ciolib/CVS/Repository | 1 - ciolib/CVS/Root | 1 - ciolib/CVS/Template | 0 ciolib/OverhaulNotes.txt | 113 - ciolib/SDLMain.h | 11 - ciolib/SDLMain.m | 387 - ciolib/SDL_win32_main.c | 146 - ciolib/allfonts.c | 23825 ------------------------------------- ciolib/ansi_cio.c | 1036 -- ciolib/ansi_cio.h | 77 - ciolib/bitmap_con.c | 1785 --- ciolib/bitmap_con.h | 62 - ciolib/ciolib.c | 1942 --- ciolib/ciolib.h | 707 -- ciolib/ciolib.rc | 5 - ciolib/conv2vid.pl | 130 - ciolib/cterm.c | 5609 --------- ciolib/cterm.h | 292 - ciolib/cterm.txt | 1283 -- ciolib/curs_cio.c | 1354 --- ciolib/curs_cio.h | 80 - ciolib/curs_fix.h | 292 - ciolib/hqx.c | 414 - ciolib/hqx.h | 11 - ciolib/keys.h | 2 - ciolib/makefont.pl | 48 - ciolib/mouse.c | 612 - ciolib/mouse.h | 2 - ciolib/pasteboard.h | 9 - ciolib/pasteboard.m | 34 - ciolib/petscii.c | 218 - ciolib/scale.c | 893 -- ciolib/scale.h | 21 - ciolib/sdl_con.c | 1300 -- ciolib/sdl_con.h | 52 - ciolib/sdlfuncs.c | 316 - ciolib/sdlfuncs.h | 76 - ciolib/syncicon64.c | 695 -- ciolib/syncicon64.h | 8 - ciolib/syncicon64.ico | Bin 16958 -> 0 bytes ciolib/utf8_codepages.c | 1929 --- ciolib/utf8_codepages.h | 61 - ciolib/vidmodes.c | 390 - ciolib/vidmodes.h | 142 - ciolib/win32cio.c | 934 -- ciolib/win32cio.h | 68 - ciolib/x_cio.c | 558 - ciolib/x_cio.h | 84 - ciolib/x_events.c | 1364 --- ciolib/x_events.h | 128 - ciolib/xbr.c | 299 - ciolib/xbr.h | 4 - comio/CMakeLists.txt | 25 - comio/comio.c | 72 - comio/comio.h | 142 - comio/comio_nix.c | 413 - comio/comio_win32.c | 228 - encode/CMakeLists.txt | 27 - encode/README.md | 6 - encode/base64.c | 174 - encode/base64.h | 62 - encode/hex.c | 59 - encode/hex.h | 38 - encode/lzh.c | 781 -- encode/lzh.h | 55 - encode/utf8.c | 524 - encode/utf8.h | 90 - encode/uucode.c | 248 - encode/uucode.h | 49 - encode/yenc.c | 203 - encode/yenc.h | 49 - hash/CMakeLists.txt | 22 - hash/README.md | 5 - hash/crc16.c | 81 - hash/crc16.h | 42 - hash/crc32.c | 89 - hash/crc32.h | 44 - hash/md5.c | 304 - hash/md5.h | 75 - hash/sha1.c | 311 - hash/sha1.h | 57 - uifc/CMakeLists.txt | 21 - uifc/filepick.c | 721 -- uifc/filepick.h | 30 - uifc/uifc.h | 535 - uifc/uifc32.c | 3077 ----- uifc/uifctest.c | 187 - uifc/uifcx.c | 524 - xpdev/CMakeLists.txt | 189 - xpdev/Makefile | 53 - xpdev/SDLMain.h | 11 - xpdev/SDLMain.m | 387 - xpdev/SDL_win32_main.c | 144 - xpdev/conwrap.c | 161 - xpdev/conwrap.h | 55 - xpdev/cp437defs.h | 178 - xpdev/dat_file.c | 290 - xpdev/dat_file.h | 82 - xpdev/datewrap.c | 213 - xpdev/datewrap.h | 99 - xpdev/dirwrap.c | 1231 -- xpdev/dirwrap.h | 246 - xpdev/eventwrap.h | 43 - xpdev/filewrap.c | 427 - xpdev/filewrap.h | 181 - xpdev/gen_defs.h | 574 - xpdev/genpack.pl | 254 - xpdev/genwrap.c | 886 -- xpdev/genwrap.h | 399 - xpdev/haproxy.h | 40 - xpdev/ini_file.c | 2476 ---- xpdev/ini_file.h | 293 - xpdev/ini_file.txt | 213 - xpdev/link_list.c | 963 -- xpdev/link_list.h | 205 - xpdev/msg_queue.c | 234 - xpdev/msg_queue.h | 76 - xpdev/multisock.c | 642 - xpdev/multisock.h | 55 - xpdev/netwrap.c | 145 - xpdev/netwrap.h | 43 - xpdev/petdefs.h | 103 - xpdev/sdlfuncs.c | 111 - xpdev/sdlfuncs.h | 40 - xpdev/semfile.c | 146 - xpdev/semfile.h | 47 - xpdev/semwrap.c | 125 - xpdev/semwrap.h | 92 - xpdev/sockwrap.c | 844 -- xpdev/sockwrap.h | 308 - xpdev/str_list.c | 876 -- xpdev/str_list.h | 177 - xpdev/strwrap.c | 77 - xpdev/strwrap.h | 34 - xpdev/threadwrap.c | 304 - xpdev/threadwrap.h | 278 - xpdev/tutorial.doc | Bin 183296 -> 0 bytes xpdev/tutorial.ppt | Bin 84992 -> 0 bytes xpdev/unicode.c | 744 -- xpdev/unicode.h | 55 - xpdev/unicode_defs.h | 750 -- xpdev/wrapdll.h | 35 - xpdev/wraptest.c | 418 - xpdev/xp_dl.c | 76 - xpdev/xp_dl.h | 39 - xpdev/xp_syslog.h | 61 - xpdev/xpbeep.c | 1235 -- xpdev/xpbeep.h | 51 - xpdev/xpdatetime.c | 457 - xpdev/xpdatetime.h | 146 - xpdev/xpendian.h | 85 - xpdev/xpevent.c | 221 - xpdev/xpevent.h | 83 - xpdev/xpmap.c | 158 - xpdev/xpmap.h | 61 - xpdev/xpprintf.c | 1483 --- xpdev/xpprintf.h | 74 - xpdev/xpsem.c | 295 - xpdev/xpsem.h | 121 - xpdev/xptime.c | 98 - 163 files changed, 47 insertions(+), 81114 deletions(-) delete mode 100644 ciolib/CMakeLists.txt delete mode 100644 ciolib/CVS/Entries delete mode 100644 ciolib/CVS/Repository delete mode 100644 ciolib/CVS/Root delete mode 100644 ciolib/CVS/Template delete mode 100644 ciolib/OverhaulNotes.txt delete mode 100644 ciolib/SDLMain.h delete mode 100644 ciolib/SDLMain.m delete mode 100644 ciolib/SDL_win32_main.c delete mode 100644 ciolib/allfonts.c delete mode 100644 ciolib/ansi_cio.c delete mode 100644 ciolib/ansi_cio.h delete mode 100644 ciolib/bitmap_con.c delete mode 100644 ciolib/bitmap_con.h delete mode 100644 ciolib/ciolib.c delete mode 100644 ciolib/ciolib.h delete mode 100644 ciolib/ciolib.rc delete mode 100755 ciolib/conv2vid.pl delete mode 100644 ciolib/cterm.c delete mode 100644 ciolib/cterm.h delete mode 100644 ciolib/cterm.txt delete mode 100644 ciolib/curs_cio.c delete mode 100644 ciolib/curs_cio.h delete mode 100644 ciolib/curs_fix.h delete mode 100644 ciolib/hqx.c delete mode 100644 ciolib/hqx.h delete mode 100644 ciolib/keys.h delete mode 100755 ciolib/makefont.pl delete mode 100644 ciolib/mouse.c delete mode 100644 ciolib/mouse.h delete mode 100644 ciolib/pasteboard.h delete mode 100644 ciolib/pasteboard.m delete mode 100644 ciolib/petscii.c delete mode 100644 ciolib/scale.c delete mode 100644 ciolib/scale.h delete mode 100644 ciolib/sdl_con.c delete mode 100644 ciolib/sdl_con.h delete mode 100644 ciolib/sdlfuncs.c delete mode 100644 ciolib/sdlfuncs.h delete mode 100644 ciolib/syncicon64.c delete mode 100644 ciolib/syncicon64.h delete mode 100644 ciolib/syncicon64.ico delete mode 100644 ciolib/utf8_codepages.c delete mode 100644 ciolib/utf8_codepages.h delete mode 100644 ciolib/vidmodes.c delete mode 100644 ciolib/vidmodes.h delete mode 100644 ciolib/win32cio.c delete mode 100644 ciolib/win32cio.h delete mode 100644 ciolib/x_cio.c delete mode 100644 ciolib/x_cio.h delete mode 100644 ciolib/x_events.c delete mode 100644 ciolib/x_events.h delete mode 100644 ciolib/xbr.c delete mode 100644 ciolib/xbr.h delete mode 100644 comio/CMakeLists.txt delete mode 100644 comio/comio.c delete mode 100644 comio/comio.h delete mode 100644 comio/comio_nix.c delete mode 100644 comio/comio_win32.c delete mode 100644 encode/CMakeLists.txt delete mode 100644 encode/README.md delete mode 100644 encode/base64.c delete mode 100644 encode/base64.h delete mode 100644 encode/hex.c delete mode 100644 encode/hex.h delete mode 100644 encode/lzh.c delete mode 100644 encode/lzh.h delete mode 100644 encode/utf8.c delete mode 100644 encode/utf8.h delete mode 100644 encode/uucode.c delete mode 100644 encode/uucode.h delete mode 100644 encode/yenc.c delete mode 100644 encode/yenc.h delete mode 100644 hash/CMakeLists.txt delete mode 100644 hash/README.md delete mode 100644 hash/crc16.c delete mode 100644 hash/crc16.h delete mode 100644 hash/crc32.c delete mode 100644 hash/crc32.h delete mode 100644 hash/md5.c delete mode 100644 hash/md5.h delete mode 100644 hash/sha1.c delete mode 100644 hash/sha1.h delete mode 100644 uifc/CMakeLists.txt delete mode 100644 uifc/filepick.c delete mode 100644 uifc/filepick.h delete mode 100644 uifc/uifc.h delete mode 100644 uifc/uifc32.c delete mode 100644 uifc/uifctest.c delete mode 100644 uifc/uifcx.c delete mode 100644 xpdev/CMakeLists.txt delete mode 100644 xpdev/Makefile delete mode 100644 xpdev/SDLMain.h delete mode 100644 xpdev/SDLMain.m delete mode 100644 xpdev/SDL_win32_main.c delete mode 100644 xpdev/conwrap.c delete mode 100644 xpdev/conwrap.h delete mode 100644 xpdev/cp437defs.h delete mode 100644 xpdev/dat_file.c delete mode 100644 xpdev/dat_file.h delete mode 100644 xpdev/datewrap.c delete mode 100644 xpdev/datewrap.h delete mode 100644 xpdev/dirwrap.c delete mode 100644 xpdev/dirwrap.h delete mode 100644 xpdev/eventwrap.h delete mode 100644 xpdev/filewrap.c delete mode 100644 xpdev/filewrap.h delete mode 100644 xpdev/gen_defs.h delete mode 100755 xpdev/genpack.pl delete mode 100644 xpdev/genwrap.c delete mode 100644 xpdev/genwrap.h delete mode 100644 xpdev/haproxy.h delete mode 100644 xpdev/ini_file.c delete mode 100644 xpdev/ini_file.h delete mode 100644 xpdev/ini_file.txt delete mode 100644 xpdev/link_list.c delete mode 100644 xpdev/link_list.h delete mode 100644 xpdev/msg_queue.c delete mode 100644 xpdev/msg_queue.h delete mode 100644 xpdev/multisock.c delete mode 100644 xpdev/multisock.h delete mode 100644 xpdev/netwrap.c delete mode 100644 xpdev/netwrap.h delete mode 100644 xpdev/petdefs.h delete mode 100644 xpdev/sdlfuncs.c delete mode 100644 xpdev/sdlfuncs.h delete mode 100644 xpdev/semfile.c delete mode 100644 xpdev/semfile.h delete mode 100644 xpdev/semwrap.c delete mode 100644 xpdev/semwrap.h delete mode 100644 xpdev/sockwrap.c delete mode 100644 xpdev/sockwrap.h delete mode 100644 xpdev/str_list.c delete mode 100644 xpdev/str_list.h delete mode 100644 xpdev/strwrap.c delete mode 100644 xpdev/strwrap.h delete mode 100644 xpdev/threadwrap.c delete mode 100644 xpdev/threadwrap.h delete mode 100644 xpdev/tutorial.doc delete mode 100644 xpdev/tutorial.ppt delete mode 100644 xpdev/unicode.c delete mode 100644 xpdev/unicode.h delete mode 100644 xpdev/unicode_defs.h delete mode 100644 xpdev/wrapdll.h delete mode 100644 xpdev/wraptest.c delete mode 100644 xpdev/xp_dl.c delete mode 100644 xpdev/xp_dl.h delete mode 100644 xpdev/xp_syslog.h delete mode 100644 xpdev/xpbeep.c delete mode 100644 xpdev/xpbeep.h delete mode 100644 xpdev/xpdatetime.c delete mode 100644 xpdev/xpdatetime.h delete mode 100644 xpdev/xpendian.h delete mode 100644 xpdev/xpevent.c delete mode 100644 xpdev/xpevent.h delete mode 100644 xpdev/xpmap.c delete mode 100644 xpdev/xpmap.h delete mode 100644 xpdev/xpprintf.c delete mode 100644 xpdev/xpprintf.h delete mode 100644 xpdev/xpsem.c delete mode 100644 xpdev/xpsem.h delete mode 100644 xpdev/xptime.c diff --git a/CMakeLists.txt b/CMakeLists.txt index b8ff999..b301feb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,52 @@ cmake_minimum_required(VERSION 3.11) project (XPDevPlus CXX) -add_subdirectory(ciolib) -add_subdirectory(comio) -add_subdirectory(encode) -add_subdirectory(hash) -add_subdirectory(uifc) -add_subdirectory(xpdev) +include("FetchContent") + +include(ExternalProject) + +add_compile_options(-include xpdevplus.h) + +FetchContent_Declare( + CONIO + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/conio + SOURCE_SUBDIR src/conio +) +FetchContent_MakeAvailable(CONIO) + +FetchContent_Declare( + COMIO + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/comio + SOURCE_SUBDIR src/comio +) +FetchContent_MakeAvailable(COMIO) + +FetchContent_Declare( + Encode + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/encode + SOURCE_SUBDIR src/encode +) +FetchContent_MakeAvailable(Encode) + +FetchContent_Declare( + Hash + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/hash + SOURCE_SUBDIR src/hash +) +FetchContent_MakeAvailable(Hash) + +FetchContent_Declare( + UIFC + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/uifc + SOURCE_SUBDIR src/uifc +) +FetchContent_MakeAvailable(UIFC) + +FetchContent_Declare( + XPDev + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/xpdev + SOURCE_SUBDIR src/xpdev +) +FetchContent_MakeAvailable(XPDev) enable_language(C) set(SOURCE diff --git a/ciolib/CMakeLists.txt b/ciolib/CMakeLists.txt deleted file mode 100644 index bfd25ed..0000000 --- a/ciolib/CMakeLists.txt +++ /dev/null @@ -1,129 +0,0 @@ -project (ConIOLib C) - -cmake_minimum_required(VERSION 3.11) - -INCLUDE (CheckFunctionExists) -find_package(X11) -# So on BSD, this causes the find to fail. However, it's required for Linux -# This is because on BSD, ncursesw.h does not exist, but libraries use -# ncurses.h -set(CURSES_NEED_WIDE TRUE) -find_package(Threads REQUIRED) -if(NOT WIN32) - find_package(Curses) - find_package(PkgConfig) - pkg_check_modules(SDL2 sdl2) -endif() - -set(SOURCE - allfonts.c - ansi_cio.c - ciolib.c - ciolib.rc - cterm.c - mouse.c - syncicon64.c - utf8_codepages.c - vidmodes.c - xbr.c -) - -set(HEADER - ciolib.h - cterm.h - keys.h - mouse.h - utf8_codepages.h - vidmodes.h -) - -if(WIN32) - list(APPEND SOURCE win32cio.c ciolib.rc) -endif() - -if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows") - if(CURSES_FOUND) - list(APPEND SOURCE curs_cio.c) - set(USE_CURSES_ANYWAY TRUE) - else() - if(${CMAKE_SYSTEM_NAME} MATCHES "(Free|Open|Net)BSD") - list(APPEND SOURCE curs_cio.c) - set(USE_CURSES_ANYWAY TRUE) - else() - message(FATAL_ERROR "ncursesw not found") - endif() - endif() -endif() - -if(X11_FOUND) - list(APPEND SOURCE x_events.c x_cio.c) - set(NEED_BITMAP TRUE) - set(NEED_DLOPEN TRUE) - set(NEED_SCALE TRUE) -endif() - -if(SDL2_INCLUDE_DIRS) - list(APPEND SOURCE sdl_con.c) - list(APPEND SOURCE sdlfuncs.c) - set(NEED_SCALE TRUE) - if(WIN32) - list(APPEND SOURCE SDL_win32_main.c) - endif() - if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - list(APPEND SOURCE SDLMain.m) - endif() - set(NEED_BITMAP TRUE) - set(NEED_DLOPEN TRUE) -endif() - -if(NEED_BITMAP) - list(APPEND SOURCE bitmap_con.c) -endif() - -if(NEED_SCALE) - list(APPEND SOURCE scale.c) -endif() - -add_library(ciolib OBJECT ${SOURCE}) -target_include_directories(ciolib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -if(CURSES_FOUND) - if(${CMAKE_SYSTEM_NAME} MATCHES "(Free|Open|Net)BSD") - list(APPEND SOURCE curs_cio.c) - set(USE_CURSES_ANYWAY TRUE) - endif() -endif() - -if(X11_FOUND) - target_include_directories(ciolib PRIVATE ${X11_INCLUDE_DIR}) -else() - target_compile_definitions(ciolib PRIVATE NO_X) -endif() - -if(SDL2_INCLUDE_DIRS) - target_include_directories(ciolib PUBLIC ${SDL2_INCLUDE_DIRS}) - set(WITH_SDL TRUE PARENT_SCOPE) -endif() - -if(NOT WIN32) - target_link_libraries(ciolib pthread) -endif() - -if(USE_CURSES_ANYWAY) - if(CURSES_FOUND) - if (CURSES_HAVE_NCURSES_NCURSES_H) - target_compile_definitions(ciolib PRIVATE DEBIAN_HATES_YOU) - elseif(CURSES_HAVE_NCURSES_H) - target_compile_definitions(ciolib PRIVATE N_CURSES_LIB) - endif() - target_link_libraries(ciolib ${NCURSES_LIBRARIES}) - else() - target_link_libraries(ciolib ${CURSES_NCURSES_LIBRARY}) - target_link_libraries(ciolib ${CURSES_TINFO_LIBRARY_NAME}) - endif() -endif() - -CHECK_FUNCTION_EXISTS(vasprintf HAVE_VASPRINTF) -if(HAVE_VASPRINTF) - target_compile_definitions(ciolib PRIVATE HAVE_VASPRINTF) -endif() -target_link_libraries(ciolib hash encode xpdev) diff --git a/ciolib/CVS/Entries b/ciolib/CVS/Entries deleted file mode 100644 index 1cdbe41..0000000 --- a/ciolib/CVS/Entries +++ /dev/null @@ -1,3 +0,0 @@ -/conio.dsp/1.15/Thu Jun 1 21:57:02 2006// -/conio_sdl.dsp/1.1/Thu Oct 11 06:30:16 2007// -D diff --git a/ciolib/CVS/Repository b/ciolib/CVS/Repository deleted file mode 100644 index 88f933e..0000000 --- a/ciolib/CVS/Repository +++ /dev/null @@ -1 +0,0 @@ -src/conio diff --git a/ciolib/CVS/Root b/ciolib/CVS/Root deleted file mode 100644 index 008bd82..0000000 --- a/ciolib/CVS/Root +++ /dev/null @@ -1 +0,0 @@ -:pserver:deuce@cvs.synchro.net:/cvsroot/sbbs diff --git a/ciolib/CVS/Template b/ciolib/CVS/Template deleted file mode 100644 index e69de29..0000000 diff --git a/ciolib/OverhaulNotes.txt b/ciolib/OverhaulNotes.txt deleted file mode 100644 index 2822c71..0000000 --- a/ciolib/OverhaulNotes.txt +++ /dev/null @@ -1,113 +0,0 @@ -1) NO GLOBALS (ESCDELAY etc will be in the struct with accessors) -2) An init function that returns a struct with a bunch of function pointers in - it. -3) UIFC will need to have the ability for the ciolib struct to be passed to - it. -4) Will support multiple independent windows. -5) There will be a compatability library for JUST conio stuff. -6) Any advanced features not in the conio API will not be present. -7) Unicode (UTF-8) support... likely X11 first, followed by Curses, SDL and - Win32. -8) ANSI mode may never get proper unicode support... or at least not until - everything else works. -9) Unicode support will support GR access of the C1 set. Most importantly, - this means CSI (\x9b). This is actually somewhat silly since it will take - two bytes regardless, but if UCS-2 or something gets added in the future, - it may make a difference, and there's no reason to show control codes. -10) Greatly expanded attribute sets, and in UTF-8 mode there will be no - hackiness. The great bright/bold debate will rage on though... possibly a - new set/reset mode will be added to control it. -11) Double-height/Double-width/Double-size modes. As is tradition, all the - cells covered by the glyph must be the same character and attributes. This - opens a whole can of worms regarding how further updates work etc. I'll - strive to keep it sane and compatible, which may be impossible. -12) A Unicode cell will potentially have multiple codepoints "in" it. -13) We need a way to specify the initial mode. - -Some sort of state checkpoint thing... you "save" the checkpoint, and send that -ID back and you get the same state returned. - -Stack and state save thing - -For CONIOng: -Layers: -0 - Solid fixed background (doesn't scoll) -1 - Text area background (scrolls, text area) -2 - Text area background bitmap (scrolls, text area) -3 - Text area background pixel (scrolls, text area) -4 - Bitmap background (doesn't scroll) -5 - Pixel background (doesn't scroll) -6 - Text area foreground (scrolls, text area) -7 - Text area foreground bitmap (scrolls, text area) -8 - Text area foreground pixel (scrolls, text area) -9 - Bitmap foreground (doesn't scroll) -10 - Pixel foreground layer (doesn't scroll) - -Layer Attributes: -Layer 0: "colour" -Layer 1: <none> -Layer 2: <none> -Layer 3: "hidden" -Layer 4: <none> -Layer 5: "hidden" -Layer 6: <none> -Layer 7: <none> -Layer 8: "hidden" -Layer 9: <none> -Layer 10: "hidden" - -A text area can be defined as having a given width and height with the -top-left corner positioned at any pixel location. Text areas use a fixed -width font, and have multiple planes... text background, background bitmap, -background pixels, text foreground, foreground bitmap, foreground pixels -It will have the following attributes: -Fonts -Codepage -Tab stops -Cursor position -Auto-wrap -Blink enabled -Cursor vidible -Palette definition -Foreground visible -Foreground bitmaps visible -Foreground pixels visible -Background visible -Background bitmaps visible -Background pixels visible -Z-index -"Current" cell attributes (see below) - -Each character cell will have the following attributes: -Codepoints (array) -Foreground colour -Background colour -Font -Flags -- Fast Blink -- Slow Blink -- Bold -- Italic -- Negative -- Concealed -- Underline -- Overstrike -- Double underline -- Double overstrike -- Double-wide -- Double-high -- Superscript -- Subscript - -Bitmap layers contain zero or more bitmaps (likely WebP, maybe others) -which have a stacking order in the layer. Attributes: -position -hidden -paused (not animated) -Z-index - -Pixel layers are simply an array of pixels that may be directly -manipulated. No attributes are planned. - -For the bitmap and pixel layers associated with a text area, they will -scroll with the text in that area. diff --git a/ciolib/SDLMain.h b/ciolib/SDLMain.h deleted file mode 100644 index 4683df5..0000000 --- a/ciolib/SDLMain.h +++ /dev/null @@ -1,11 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser <dwaliss1@purdue.edu> - Non-NIB-Code & other changes: Max Horn <max@quendi.de> - - Feel free to customize this file to suit your needs -*/ - -#import <Cocoa/Cocoa.h> - -@interface SDLMain : NSObject -@end diff --git a/ciolib/SDLMain.m b/ciolib/SDLMain.m deleted file mode 100644 index f9c6394..0000000 --- a/ciolib/SDLMain.m +++ /dev/null @@ -1,387 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser <dwaliss1@purdue.edu> - Non-NIB-Code & other changes: Max Horn <max@quendi.de> - - Feel free to customize this file to suit your needs -*/ - -#include "SDL.h" -#include "SDLMain.h" -#include <sys/param.h> /* for MAXPATHLEN */ -#include <unistd.h> - -/* For some reaon, Apple removed setAppleMenu from the headers in 10.4, - but the method still is there and works. To avoid warnings, we declare - it ourselves here. */ -@interface NSApplication(SDL_Missing_Methods) -- (void)setAppleMenu:(NSMenu *)menu; -@end - -/* Use this flag to determine whether we use SDLMain.nib or not */ -#define SDL_USE_NIB_FILE 0 - -/* Use this flag to determine whether we use CPS (docking) or not */ -#define SDL_USE_CPS 1 -#ifdef SDL_USE_CPS -/* Portions of CPS.h */ -typedef struct CPSProcessSerNum -{ - UInt32 lo; - UInt32 hi; -} CPSProcessSerNum; - -extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); -extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); -extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); - -#endif /* SDL_USE_CPS */ - -static int gArgc; -static char **gArgv; -static BOOL gFinderLaunch; -static BOOL gCalledAppMainline = FALSE; - -static NSString *getApplicationName(void) -{ - const NSDictionary *dict; - NSString *appName = 0; - - /* Determine the application name */ - dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); - if (dict) - appName = [dict objectForKey: @"CFBundleName"]; - - if (![appName length]) - appName = [[NSProcessInfo processInfo] processName]; - - return appName; -} - -#if SDL_USE_NIB_FILE -/* A helper category for NSString */ -@interface NSString (ReplaceSubString) -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; -@end -#endif - -@interface NSApplication (SDLApplication) -@end - -@implementation NSApplication (SDLApplication) -/* Invoked from the Quit menu item */ -- (void)terminate:(id)sender -{ - /* Post a SDL_QUIT event */ - SDL_Event event; - event.type = SDL_QUIT; - SDL_PushEvent(&event); -} -@end - -/* The main class of the application, the application's delegate */ -@implementation SDLMain - -/* Set the working directory to the .app's parent directory */ -- (void) setupWorkingDirectory:(BOOL)shouldChdir -{ - if (shouldChdir) - { - char parentdir[MAXPATHLEN]; - CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url); - if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, MAXPATHLEN)) { - chdir(parentdir); /* chdir to the binary app's parent */ - } - CFRelease(url); - CFRelease(url2); - } -} - -#if SDL_USE_NIB_FILE - -/* Fix menu to contain the real app name instead of "SDL App" */ -- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName -{ - NSRange aRange; - NSEnumerator *enumerator; - NSMenuItem *menuItem; - - aRange = [[aMenu title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; - - enumerator = [[aMenu itemArray] objectEnumerator]; - while ((menuItem = [enumerator nextObject])) - { - aRange = [[menuItem title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; - if ([menuItem hasSubmenu]) - [self fixMenu:[menuItem submenu] withAppName:appName]; - } -} - -#else - -static void setApplicationMenu(void) -{ - /* warning: this code is very odd */ - NSMenu *appleMenu; - NSMenuItem *menuItem; - NSString *title; - NSString *appName; - - appName = getApplicationName(); - appleMenu = [[NSMenu alloc] initWithTitle:@""]; - - /* Add menu items */ - title = [@"About " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Hide " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@""]; - - menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@""]; - [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; - - [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Quit " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@""]; - - - /* Put menu into the menubar */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; - [menuItem setSubmenu:appleMenu]; - [[NSApp mainMenu] addItem:menuItem]; - - /* Tell the application object that this is now the application menu */ - [NSApp setAppleMenu:appleMenu]; - - /* Finally give up our references to the objects */ - [appleMenu release]; - [menuItem release]; -} - -/* Create a window menu */ -static void setupWindowMenu(void) -{ - NSMenu *windowMenu; - NSMenuItem *windowMenuItem; - NSMenuItem *menuItem; - - windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; - - /* "Minimize" item */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@""]; - [windowMenu addItem:menuItem]; - [menuItem release]; - - /* Put menu into the menubar */ - windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; - [windowMenuItem setSubmenu:windowMenu]; - [[NSApp mainMenu] addItem:windowMenuItem]; - - /* Tell the application object that this is now the window menu */ - [NSApp setWindowsMenu:windowMenu]; - - /* Finally give up our references to the objects */ - [windowMenu release]; - [windowMenuItem release]; -} - -/* Replacement for NSApplicationMain */ -static void CustomApplicationMain (int argc, char **argv) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - SDLMain *sdlMain; - - /* If there's no Window Server (ie: remote headless), go in dry. */ - if (_CGSDefaultConnection() == NULL) { - XPDEV_main(argc, argv, environ); - return; - } - - /* Ensure the application object is initialised */ - [NSApplication sharedApplication]; - -#ifdef SDL_USE_CPS - { - CPSProcessSerNum PSN; - /* Tell the dock about us */ - if (!CPSGetCurrentProcess(&PSN)) - if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103)) - if (!CPSSetFrontProcess(&PSN)) - [NSApplication sharedApplication]; - } -#endif /* SDL_USE_CPS */ - - /* Set up the menubar */ - [NSApp setMainMenu:[[NSMenu alloc] init]]; - setApplicationMenu(); - setupWindowMenu(); - - /* Create SDLMain and make it the app delegate */ - sdlMain = [[SDLMain alloc] init]; - [NSApp setDelegate:sdlMain]; - - /* Start the main event loop */ - [NSApp run]; - - [sdlMain release]; - [pool release]; -} - -#endif - - -/* - * Catch document open requests...this lets us notice files when the app - * was launched by double-clicking a document, or when a document was - * dragged/dropped on the app's icon. You need to have a - * CFBundleDocumentsType section in your Info.plist to get this message, - * apparently. - * - * Files are added to gArgv, so to the app, they'll look like command line - * arguments. Previously, apps launched from the finder had nothing but - * an argv[0]. - * - * This message may be received multiple times to open several docs on launch. - * - * This message is ignored once the app's mainline has been called. - */ -- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename -{ - const char *temparg; - size_t arglen; - char *arg; - char **newargv; - - if (!gFinderLaunch) /* MacOS is passing command line args. */ - return FALSE; - - if (gCalledAppMainline) /* app has started, ignore this document. */ - return FALSE; - - temparg = [filename UTF8String]; - arglen = SDL_strlen(temparg) + 1; - arg = (char *) SDL_malloc(arglen); - if (arg == NULL) - return FALSE; - - newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2)); - if (newargv == NULL) - { - SDL_free(arg); - return FALSE; - } - gArgv = newargv; - - SDL_strlcpy(arg, temparg, arglen); - gArgv[gArgc++] = arg; - gArgv[gArgc] = NULL; - return TRUE; -} - -extern char **environ; -/* Called when the internal event loop has just started running */ -- (void) applicationDidFinishLaunching: (NSNotification *) note -{ - int status; - - /* Set the working directory to the .app's parent directory */ - [self setupWorkingDirectory:gFinderLaunch]; - -#if SDL_USE_NIB_FILE - /* Set the main menu to contain the real app name instead of "SDL App" */ - [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()]; -#endif - - /* Hand off to main application code */ - gCalledAppMainline = TRUE; - status = SDL_main_env (gArgc, gArgv, environ); - - /* We're done, thank you for playing */ - exit(status); -} -@end - - -@implementation NSString (ReplaceSubString) - -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString -{ - unsigned int bufferSize; - unsigned int selfLen = [self length]; - unsigned int aStringLen = [aString length]; - unichar *buffer; - NSRange localRange; - NSString *result; - - bufferSize = selfLen + aStringLen - aRange.length; - buffer = (unichar *)NSAllocateMemoryPages(bufferSize*sizeof(unichar)); - - /* Get first part into buffer */ - localRange.location = 0; - localRange.length = aRange.location; - [self getCharacters:buffer range:localRange]; - - /* Get middle part into buffer */ - localRange.location = 0; - localRange.length = aStringLen; - [aString getCharacters:(buffer+aRange.location) range:localRange]; - - /* Get last part into buffer */ - localRange.location = aRange.location + aRange.length; - localRange.length = selfLen - localRange.location; - [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; - - /* Build output string */ - result = [NSString stringWithCharacters:buffer length:bufferSize]; - - NSDeallocateMemoryPages(buffer, bufferSize); - - return result; -} - -@end - - - -#ifdef main -# undef main -#endif - - -/* Main entry point to executable - should *not* be SDL_main! */ -int main (int argc, char **argv) -{ - /* Copy the arguments into a global variable */ - /* This is passed if we are launched by double-clicking */ - if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { - gArgv = (char **) SDL_malloc(sizeof (char *) * 2); - gArgv[0] = argv[0]; - gArgv[1] = NULL; - gArgc = 1; - gFinderLaunch = YES; - } else { - int i; - gArgc = argc; - gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1)); - for (i = 0; i <= argc; i++) - gArgv[i] = argv[i]; - gFinderLaunch = NO; - } - -#if SDL_USE_NIB_FILE - NSApplicationMain (argc, argv); -#else - CustomApplicationMain (argc, argv); -#endif - return 0; -} - diff --git a/ciolib/SDL_win32_main.c b/ciolib/SDL_win32_main.c deleted file mode 100644 index 96f87f2..0000000 --- a/ciolib/SDL_win32_main.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - SDL_main.c, placed in the public domain by Sam Lantinga 4/13/98 - - The WinMain function -- calls your program's main() function -*/ - -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include <stdlib.h> - -#include <windows.h> -#include <malloc.h> /* For _alloca() */ - -#define DIR_SEPERATOR TEXT("/") -#include <direct.h> - -#include "ciolib.h" /* ciolib_appname */ - -/* Parse a command line buffer into arguments */ -static int ParseCommandLine(char *cmdline, char **argv) -{ - char *bufp; - int argc; - - argc = 0; - for ( bufp = cmdline; *bufp; ) { - /* Skip leading whitespace */ - while ( isspace(*bufp) ) { - ++bufp; - } - /* Skip over argument */ - if ( *bufp == '"' ) { - ++bufp; - if ( *bufp ) { - if ( argv ) { - argv[argc] = bufp; - } - ++argc; - } - /* Skip over word */ - while ( *bufp && (*bufp != '"') ) { - ++bufp; - } - } else { - if ( *bufp ) { - if ( argv ) { - argv[argc] = bufp; - } - ++argc; - } - /* Skip over word */ - while ( *bufp && ! isspace(*bufp) ) { - ++bufp; - } - } - if ( *bufp ) { - if ( argv ) { - *bufp = '\0'; - } - ++bufp; - } - } - if ( argv ) { - argv[argc] = NULL; - } - return(argc); -} - -extern int CIOLIB_main(int argc, char **argv); - -/* This is where execution begins [console apps] */ -static int console_main(int argc, char *argv[], char **env) -{ - int n; - char *bufp, *appname; - - /* Get the class name from argv[0] */ - appname = argv[0]; - if ( (bufp=strrchr(argv[0], '\\')) != NULL ) { - appname = bufp+1; - } else - if ( (bufp=strrchr(argv[0], '/')) != NULL ) { - appname = bufp+1; - } - - if ( (bufp=strrchr(appname, '.')) == NULL ) - n = strlen(appname); - else - n = (bufp-appname); - - bufp = (char *)alloca(n+1); - if ( bufp == NULL ) { - return 1; - } - strncpy(bufp, appname, n); - bufp[n] = '\0'; - ciolib_appname = bufp; - - /* Run the application main() code */ - n=CIOLIB_main(argc, argv); - - /* Exit cleanly, calling atexit() functions */ - exit(n); - - /* Hush little compiler, don't you cry... */ - return(n); -} - -/* This is where execution begins [windowed apps] */ -int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) -{ - HINSTANCE handle; - char **argv; - int argc; - char *cmdline; - char *bufp; - - /* Start up DDHELP.EXE before opening any files, so DDHELP doesn't - keep them open. This is a hack.. hopefully it will be fixed - someday. DDHELP.EXE starts up the first time DDRAW.DLL is loaded. - */ - handle = LoadLibrary(TEXT("DDRAW.DLL")); - if ( handle != NULL ) { - FreeLibrary(handle); - } - - /* Grab the command line (use alloca() on Windows) */ - bufp = GetCommandLine(); - cmdline = (char *)alloca(strlen(bufp)+1); - if ( cmdline == NULL ) { - return 1; - } - strcpy(cmdline, bufp); - - /* Parse it into argv and argc */ - argc = ParseCommandLine(cmdline, NULL); - argv = (char **)alloca((argc+1)*(sizeof *argv)); - if ( argv == NULL ) { - return 1; - } - ParseCommandLine(cmdline, argv); - - /* Run the main program (after a little SDL initialization) */ - return(console_main(argc, argv, _environ)); -} diff --git a/ciolib/allfonts.c b/ciolib/allfonts.c deleted file mode 100644 index f2d6a54..0000000 --- a/ciolib/allfonts.c +++ /dev/null @@ -1,23825 +0,0 @@ -#include <stdio.h> /* NULL */ - -#include "ciolib.h" - -#ifdef NO_FONTS -CIOLIBEXPORT struct conio_font_data_struct conio_fontdata[257] = { - {NULL, NULL, NULL, "Codepage 437 English", CIOLIB_CP437}, - {NULL, NULL, NULL, "Codepage 1251 Cyrillic, (swiss)", CIOLIB_CP1251}, - {NULL, NULL, NULL, "Russian koi8-r", CIOLIB_KOI8_R}, - {NULL, NULL, NULL, "ISO-8859-2 Central European", CIOLIB_ISO_8859_2}, - {NULL, NULL, NULL, "ISO-8859-4 Baltic wide (VGA 9bit mapped)", CIOLIB_ISO_8859_4}, - {NULL, NULL, NULL, "Codepage 866 (c) Russian", CIOLIB_CP866M}, - {NULL, NULL, NULL, "ISO-8859-9 Turkish", CIOLIB_ISO_8859_9}, - {NULL, NULL, NULL, "haik8 codepage (use only with armscii8 screenmap)", CIOLIB_HAIK8}, - {NULL, NULL, NULL, "ISO-8859-8 Hebrew", CIOLIB_ISO_8859_8}, - {NULL, NULL, NULL, "Ukrainian font koi8-u", CIOLIB_KOI8_U}, - {NULL, NULL, NULL, "ISO-8859-15 West European, (thin)", CIOLIB_ISO_8859_15}, - {NULL, NULL, NULL, "ISO-8859-4 Baltic (VGA 9bit mapped)", CIOLIB_ISO_8859_4}, - {NULL, NULL, NULL, "Russian koi8-r (b)", CIOLIB_KOI8_R}, - {NULL, NULL, NULL, "ISO-8859-4 Baltic wide", CIOLIB_ISO_8859_4}, - {NULL, NULL, NULL, "ISO-8859-5 Cyrillic", CIOLIB_ISO_8859_5}, - {NULL, NULL, NULL, "ARMSCII-8 Character set", CIOLIB_ARMSCII8}, - {NULL, NULL, NULL, "ISO-8859-15 West European", CIOLIB_ISO_8859_15}, - {NULL, NULL, NULL, "Codepage 850 Multilingual Latin I, (thin)", CIOLIB_CP850}, - {NULL, NULL, NULL, "Codepage 850 Multilingual Latin I", CIOLIB_CP850}, - {NULL, NULL, NULL, "Codepage 865 Norwegian, (thin)", CIOLIB_CP865}, - {NULL, NULL, NULL, "Codepage 1251 Cyrillic", CIOLIB_CP1251}, - {NULL, NULL, NULL, "ISO-8859-7 Greek", CIOLIB_ISO_8859_7}, - {NULL, NULL, NULL, "Russian koi8-r (c)", CIOLIB_KOI8_R}, - {NULL, NULL, NULL, "ISO-8859-4 Baltic", CIOLIB_ISO_8859_4}, - {NULL, NULL, NULL, "ISO-8859-1 West European", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "Codepage 866 Russian", CIOLIB_CP866M2}, - {NULL, NULL, NULL, "Codepage 437 English, (thin)", CIOLIB_CP437}, - {NULL, NULL, NULL, "Codepage 866 (b) Russian", CIOLIB_CP866M2}, - {NULL, NULL, NULL, "Codepage 865 Norwegian", CIOLIB_CP865}, - {NULL, NULL, NULL, "Ukrainian font cp866u", CIOLIB_CP866U}, - {NULL, NULL, NULL, "ISO-8859-1 West European, (thin)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "Codepage 1131 Belarusian, (swiss)", CIOLIB_CP1131}, - {NULL, NULL, NULL, "Commodore 64 (UPPER)", CIOLIB_PETSCIIU}, - {NULL, NULL, NULL, "Commodore 64 (Lower)", CIOLIB_PETSCIIL}, - {NULL, NULL, NULL, "Commodore 128 (UPPER)", CIOLIB_PETSCIIU}, - {NULL, NULL, NULL, "Commodore 128 (Lower)", CIOLIB_PETSCIIL}, - {NULL, NULL, NULL, "Atari", CIOLIB_ATASCII}, - {NULL, NULL, NULL, "P0T NOoDLE (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "mO'sOul (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL , "MicroKnight Plus (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "Topaz Plus (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "MicroKnight (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "Topaz (Amiga)", CIOLIB_ISO_8859_1} -}; -#else -CIOLIBEXPORT struct conio_font_data_struct conio_fontdata[257] = { - {"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x0c\x06\x7c\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x66\x60\x60\x66\x3c\x0c\x06\x3c\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x18\x30\x60\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\x76\x36\x7e\xd8\xd8\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x18\x3c\x66\x60\x60\x60\x66\x3c\x18\x18\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x18\x00\x00\x00\x00" - "\x00\xf8\xcc\xcc\xf8\xc4\xcc\xde\xcc\xcc\xcc\xc6\x00\x00\x00\x00" - "\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\x18\x18\xd8\x70\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\xc0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x60\xdc\x86\x0c\x18\x3e\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x66\xce\x9e\x3e\x06\x06\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\xd8\xd8\xd8\xdc\x76\x00\x00\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x00\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\x60\x30\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xd8\xd8\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x18\x3c\x66\x66\x66\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\x6c\x6c\x6c\x6c\xee\x00\x00\x00\x00" - "\x00\x00\x1e\x30\x18\x0c\x3e\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xdb\xdb\xdb\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x03\x06\x7e\xdb\xdb\xf3\x7e\x60\xc0\x00\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7c\x60\x60\x60\x30\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\xff\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\xd8\x6c\x6c\x6c\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x7e\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\x7e\x00\x00\x00" - "\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00" - "\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00" - "\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\xf8\xfe\xf8\xe0\xc0\x80\x00\x00\x00" - "\x00\x00\x02\x06\x0e\x3e\xfe\x3e\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00" - "\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc2\x66\x3c\x0c\x06\x7c\x00" - "\x00\x00\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xcc\xcc\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x66\x60\x66\x3c\x0c\x06\x3c\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\xcc\xcc\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x66\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\xc6\xc6\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x18\x30\x60\x00\xfe\x66\x60\x7c\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xcc\x76\x36\x7e\xd8\xd8\x6e\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xce\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xc6\xc6\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\xc6\xc6\x38\x6c\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\xc6\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x18\x18\x3c\x66\x60\x60\x66\x3c\x18\x18\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xe6\xfc\x00\x00\x00" - "\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x00\x00\x00" - "\x00\xf8\xcc\xcc\xf8\xc4\xcc\xde\xcc\xcc\xc6\x00\x00\x00" - "\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\x18\xd8\x70\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\x00\x00\x00" - "\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x00\x00\x00\x00" - "\x00\xc0\xc0\xc6\xcc\xd8\x30\x60\xdc\x86\x0c\x18\x3e\x00" - "\x00\xc0\xc0\xc6\xcc\xd8\x30\x66\xce\x9e\x3e\x06\x06\x00" - "\x00\x00\x18\x18\x00\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\xd8\xd8\xdc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xfc\xc6\xc6\xfc\xc0\xc0\x40\x00" - "\x00\x00\xfe\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x6c\x6c\x6c\x6c\x6c\x6c\x00\x00\x00" - "\x00\x00\xfe\xc6\x60\x30\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xd8\xd8\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x7c\x60\x60\xc0\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x7e\x18\x3c\x66\x66\x66\x3c\x18\x7e\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\x6c\x6c\x6c\xee\x00\x00\x00" - "\x00\x00\x1e\x30\x18\x0c\x3e\x66\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xdb\xdb\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x03\x06\x7e\xdb\xdb\xf3\x7e\x60\xc0\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7c\x60\x60\x30\x1c\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\xff\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\xd8\x6c\x6c\x6c\x6c\x6c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xfe\x7c\x38\x7c" - "\x10\x10\x38\x7c\xfe\x7c\x38\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78" - "\x3c\x66\x66\x66\x3c\x18\x7e\x18" - "\x3f\x33\x3f\x30\x30\x70\xf0\xe0" - "\x7f\x63\x7f\x63\x63\x67\xe6\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x18\x3c\x7e\x18\x18\x7e\x3c\x18" - "\x66\x66\x66\x66\x66\x00\x66\x00" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x63\x38\x6c\x6c\x38\xcc\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x18\x3c\x7e\x18\x7e\x3c\x18\xff" - "\x18\x3c\x7e\x18\x18\x18\x18\x00" - "\x18\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x0c\xfe\x0c\x18\x00\x00" - "\x00\x30\x60\xfe\x60\x30\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\xc6\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\xcc\xcc\x78" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\xc6\xfe\x00" - "\x78\xcc\xc0\xcc\x78\x18\x0c\x78" - "\x00\xcc\x00\xcc\xcc\xcc\x7e\x00" - "\x1c\x00\x78\xcc\xfc\xc0\x78\x00" - "\x7e\xc3\x3c\x06\x3e\x66\x3f\x00" - "\xcc\x00\x78\x0c\x7c\xcc\x7e\x00" - "\xe0\x00\x78\x0c\x7c\xcc\x7e\x00" - "\x30\x30\x78\x0c\x7c\xcc\x7e\x00" - "\x00\x00\x78\xc0\xc0\x78\x0c\x38" - "\x7e\xc3\x3c\x66\x7e\x60\x3c\x00" - "\xcc\x00\x78\xcc\xfc\xc0\x78\x00" - "\xe0\x00\x78\xcc\xfc\xc0\x78\x00" - "\xcc\x00\x70\x30\x30\x30\x78\x00" - "\x7c\xc6\x38\x18\x18\x18\x3c\x00" - "\xe0\x00\x70\x30\x30\x30\x78\x00" - "\xc6\x38\x6c\xc6\xfe\xc6\xc6\x00" - "\x30\x30\x00\x78\xcc\xfc\xcc\x00" - "\x1c\x00\xfc\x60\x78\x60\xfc\x00" - "\x00\x00\x7f\x0c\x7f\xcc\x7f\x00" - "\x3e\x6c\xcc\xfe\xcc\xcc\xce\x00" - "\x78\xcc\x00\x78\xcc\xcc\x78\x00" - "\x00\xcc\x00\x78\xcc\xcc\x78\x00" - "\x00\xe0\x00\x78\xcc\xcc\x78\x00" - "\x78\xcc\x00\xcc\xcc\xcc\x7e\x00" - "\x00\xe0\x00\xcc\xcc\xcc\x7e\x00" - "\x00\xcc\x00\xcc\xcc\x7c\x0c\xf8" - "\xc3\x18\x3c\x66\x66\x3c\x18\x00" - "\xcc\x00\xcc\xcc\xcc\xcc\x78\x00" - "\x18\x18\x7e\xc0\xc0\x7e\x18\x18" - "\x38\x6c\x64\xf0\x60\xe6\xfc\x00" - "\xcc\xcc\x78\xfc\x30\xfc\x30\x30" - "\xf8\xcc\xcc\xfa\xc6\xcf\xc6\xc7" - "\x0e\x1b\x18\x3c\x18\x18\xd8\x70" - "\x1c\x00\x78\x0c\x7c\xcc\x7e\x00" - "\x38\x00\x70\x30\x30\x30\x78\x00" - "\x00\x1c\x00\x78\xcc\xcc\x78\x00" - "\x00\x1c\x00\xcc\xcc\xcc\x7e\x00" - "\x00\xf8\x00\xf8\xcc\xcc\xcc\x00" - "\xfc\x00\xcc\xec\xfc\xdc\xcc\x00" - "\x3c\x6c\x6c\x3e\x00\x7e\x00\x00" - "\x38\x6c\x6c\x38\x00\x7c\x00\x00" - "\x30\x00\x30\x60\xc0\xcc\x78\x00" - "\x00\x00\x00\xfc\xc0\xc0\x00\x00" - "\x00\x00\x00\xfc\x0c\x0c\x00\x00" - "\xc3\xc6\xcc\xde\x33\x66\xcc\x0f" - "\xc3\xc6\xcc\xdb\x37\x6f\xcf\x03" - "\x18\x18\x00\x18\x18\x18\x18\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdb\x77\xdb\xee\xdb\x77\xdb\xee" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x18\x18\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\x36\x36\xf6\x36\x36\x36" - "\x00\x00\x00\x00\xfe\x36\x36\x36" - "\x00\x00\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x36\x36\x36\x36\xfe\x00\x00\x00" - "\x18\x18\xf8\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x18\x18\x1f\x18\x1f\x18\x18\x18" - "\x36\x36\x36\x36\x37\x36\x36\x36" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x18\x18\xff\x00\xff\x00\x00\x00" - "\x36\x36\x36\x36\xff\x00\x00\x00" - "\x00\x00\xff\x00\xff\x18\x18\x18" - "\x00\x00\x00\x00\xff\x36\x36\x36" - "\x36\x36\x36\x36\x3f\x00\x00\x00" - "\x18\x18\x1f\x18\x1f\x00\x00\x00" - "\x00\x00\x1f\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x3f\x36\x36\x36" - "\x36\x36\x36\x36\xff\x36\x36\x36" - "\x18\x18\xff\x18\xff\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x00\x00\x76\xdc\xc8\xdc\x76\x00" - "\x00\x78\xcc\xf8\xcc\xf8\xc0\xc0" - "\x00\xfc\xcc\xc0\xc0\xc0\xc0\x00" - "\x00\xfe\x6c\x6c\x6c\x6c\x6c\x00" - "\xfc\xcc\x60\x30\x60\xcc\xfc\x00" - "\x00\x00\x7e\xd8\xd8\xd8\x70\x00" - "\x00\x66\x66\x66\x66\x7c\x60\xc0" - "\x00\x76\xdc\x18\x18\x18\x18\x00" - "\xfc\x30\x78\xcc\xcc\x78\x30\xfc" - "\x38\x6c\xc6\xfe\xc6\x6c\x38\x00" - "\x38\x6c\xc6\xc6\x6c\x6c\xee\x00" - "\x1c\x30\x18\x7c\xcc\xcc\x78\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x00\x00" - "\x06\x0c\x7e\xdb\xdb\x7e\x60\xc0" - "\x38\x60\xc0\xf8\xc0\x60\x38\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\x00" - "\x00\xfc\x00\xfc\x00\xfc\x00\x00" - "\x30\x30\xfc\x30\x30\x00\xfc\x00" - "\x60\x30\x18\x30\x60\x00\xfc\x00" - "\x18\x30\x60\x30\x18\x00\xfc\x00" - "\x0e\x1b\x1b\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xd8\xd8\x70" - "\x30\x30\x00\xfc\x00\x30\x30\x00" - "\x00\x76\xdc\x00\x76\xdc\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x0f\x0c\x0c\x0c\xec\x6c\x3c\x1c" - "\x78\x6c\x6c\x6c\x6c\x00\x00\x00" - "\x70\x18\x30\x60\x78\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 437 English", CIOLIB_CP437} - ,{"\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x81\xe7\xa5\x99\x81\x99\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x7e\xff\x99\xdb\xe7\xff\xe7\x7e\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x38\x38\x10\xd6\xfe\xd6\x10\x38\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\xfe\xfe\x54\x10\x38\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x30\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x18\x00\x00\x00\x00" - "\x00\x20\x30\x38\x3c\x36\x36\x30\x70\xf0\xf0\x60\x00\x00\x00\x00" - "\x00\x00\x3e\x22\x3e\x22\x22\x22\x22\x26\x6e\xe4\x40\x00\x00\x00" - "\x00\x00\x00\x10\x92\x54\x28\xc6\x28\x54\x92\x10\x00\x00\x00\x00" - "\x00\x00\x40\x60\x70\x78\x7c\x7e\x7c\x78\x70\x60\x40\x00\x00\x00" - "\x00\x00\x02\x06\x0e\x1e\x3e\x7e\x3e\x1e\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7e\xf4\xf4\xf4\x74\x14\x14\x14\x14\x14\x00\x00\x00\x00" - "\x00\x1e\x30\x78\xdc\xce\xe7\x73\x3b\x1e\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\xff\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x0c\x06\xff\x06\x0c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xff\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x33\x66\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x66\xff\x66\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x3c\x3c\x7e\x7e\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x7e\x7e\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x77\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x00\x10\x7c\xd6\xd0\xd0\x70\x38\x1c\x16\x16\xd6\x7c\x10\x00\x00" - "\x00\x00\xc6\xc6\x0c\x0c\x18\x30\x30\x60\x60\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x70\xd6\xdc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x1c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\xff\x3c\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xd6\xd6\xd6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x0c\x18\x30\x60\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x0c\xcc\xcc\xcc\xcc\xfe\x0c\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\x06\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\x0c\x18\x70\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x1c\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc0\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x0c\x18\x30\x30\x00\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x7c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xcc\xf8\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xce\xc6\xc6\xc6\x66\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xf6\xde\x7c\x0c\x06\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xd8\xcc\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\x60\x38\x0c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x38\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xfe\x06\x0c\x0c\x18\x18\x30\x60\x60\xc0\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x00\x70\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x06\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x66\x60\x60\xf0\x60\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\x7c" - "\x00\x00\x00\xc0\xc0\xc0\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xfe\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc0\x70\x1c\x06\x06\x7c\x00\x00\x00" - "\x00\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x30\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xd6\xd6\xfe\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x0c\x18\x30\x60\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x30\x60\x30\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0c\x06\x0c\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\xfc\x60\x60\x60\x7e\x63\x63\x63\x63\x67\x6c\x00\x00\x00" - "\x18\x30\x00\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x18\x30\x00\x00" - "\x00\x00\x00\x18\x30\x00\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x66\xcc\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xdb\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x7e\x18\x18\x18\x00\x00\x00" - "\x00\x00\x1e\x32\x30\x7e\x30\x7e\x30\x30\x32\x1e\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x0c\x0c\x18\x30\x30\x60\x60\xdb\xdb\x00\x00\x00" - "\x00\x00\x38\x78\xd8\xd8\xde\xdb\xdb\xdb\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x00\x00\x00\x0c\x18\x30\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\xd8\xd8\xd8\xd8\xd8\xfe\xdb\xdb\xdb\xdb\xde\x00\x00\x00" - "\x18\x30\x00\xc6\xcc\xd8\xf0\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x38\x38\x00" - "\x00\x00\x60\x60\xf8\x60\x7c\x66\x66\x66\x66\x66\x66\x0c\x18\x00" - "\x00\x00\x0c\x18\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x1c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x33\x66\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x77\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xf1\x5b\x55\x51\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x58\xd8\xde\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x00\x00\x00\x60\x30\x18\x18\x30\x60\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd8\xd8\xd8\xfe\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x00\x18\x30\x00\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x60\x60\xf8\x60\x7c\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x38\x38\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x44\x38\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x44\x38\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x1e\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x66\x66\x3c\x66\x66\x66\x66\x3c\x66\x66\x00\x00\x00" - "\x06\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x1e\x30\x78\xdc\xce\xe7\x73\x3b\x1e\x0c\x78\x00\x00\x00\x00" - "\x6c\x6c\x00\xfe\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x3e\x63\x5d\x51\x51\x5d\x63\x3e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xfc\xc0\xc0\xc0\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\xd8\x6c\x36\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x63\x5d\x55\x59\x55\x63\x3e\x00\x00\x00\x00\x00\x00" - "\x66\x66\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\xff\x00\x00\x00\x00" - "\x18\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x0c\x0c\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00" - "\x00\x00\x7e\xf4\xf4\xf4\x74\x14\x14\x14\x14\x14\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\xc8\xc8\xea\xed\xdd\xda\xc8\xcf\xc8\xc8\xc8\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf8\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x36\x6c\xd8\x00\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\x7c" - "\x00\x00\x7c\xc6\xc0\xc0\x60\x38\x0c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc0\x70\x1c\x06\x06\x7c\x00\x00\x00" - "\x00\x00\x66\x66\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x7c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x7e\xc3\x66\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\x54\x7c\x38\x38\x38\x7c\x54\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xce\xde\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x44\x38\xc6\xce\xde\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x6c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x66\x3c\x00\x00\x00" - "\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x10\x10\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x03\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x06\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x06\x00" - "\x00\x00\xf0\xb0\x30\x30\x3c\x36\x36\x36\x36\x36\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xf6\xde\xde\xde\xde\xde\xf6\x00\x00\x00" - "\x00\x00\x30\x30\x30\x30\x3c\x36\x36\x36\x36\x36\x3c\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3e\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\x66\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3c\x66\x66\x66\x66\x66\xff\xc3\x66\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\x7c\x38\x38\x38\x7c\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x06\x3c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x44\x38\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x10\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x10" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x03\x06\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x06\x00" - "\x00\x00\x00\x00\x00\x00\xf0\xb0\x30\x3c\x36\x36\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfa\xce\xce\xfa\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x60\x60\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x06\x3e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xd6\xd6\xf6\xd6\xd6\xcc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - , NULL, NULL, "Codepage 1251 Cyrillic, (swiss)", CIOLIB_CP1251} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xa2\xaa\xba\x82\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x6c\x6c\x00\xfe\xc6\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xaa\xba\x82\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x1f\x18\x18\x18\x18" - "\x00\x00\x00\xf8\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\x00\x00\x00\x00" - "\x18\x18\x18\x1f\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x18\x18\x18\x18" - "\x00\x00\x00\xff\x18\x18\x18\x18" - "\x18\x18\x18\xff\x00\x00\x00\x00" - "\x18\x18\x18\xff\x18\x18\x18\x18" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x0e\x1b\x1b\x18\x18\x18\x18\x18" - "\x00\x00\x7c\x7c\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x03\x02\x06\x04\xcc\x68\x38\x10" - "\x00\x76\xdc\x00\x76\xdc\x00\x00" - "\x00\x0c\x18\x30\x60\x30\x18\x0c" - "\x00\x30\x18\x0c\x06\x0c\x18\x30" - "\x00\x00\x00\x00\x00\x42\x7e\x00" - "\x18\x18\x18\x18\x18\xd8\xd8\x70" - "\x00\x38\x6c\x6c\x38\x00\x00\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x18\x18\x00\x7e\x00\x18\x18" - "\x00\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x1f\x18\x1f\x18\x18\x18\x18" - "\x24\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\x00\x3f\x36\x36\x36\x36" - "\x00\x3f\x30\x37\x36\x36\x36\x36" - "\x00\xf8\x18\xf8\x18\x18\x18\x18" - "\x00\x00\x00\xfe\x36\x36\x36\x36" - "\x00\xfe\x06\xf6\x36\x36\x36\x36" - "\x18\x1f\x18\x1f\x00\x00\x00\x00" - "\x36\x36\x36\x3f\x00\x00\x00\x00" - "\x36\x37\x30\x3f\x00\x00\x00\x00" - "\x18\xf8\x18\xf8\x00\x00\x00\x00" - "\x36\x36\x36\xfe\x00\x00\x00\x00" - "\x36\xf6\x06\xfe\x00\x00\x00\x00" - "\x18\x1f\x18\x1f\x18\x18\x18\x18" - "\x36\x36\x36\x37\x36\x36\x36\x36" - "\x36\x37\x30\x37\x36\x36\x36\x36" - "\x18\xf8\x18\xf8\x18\x18\x18\x18" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\x36\x36\x36\xf6\x36\x36\x36\x36" - "\x36\xf6\x06\xf6\x36\x36\x36\x36" - "\x00\xff\x00\xff\x18\x18\x18\x18" - "\x00\x00\x00\xff\x36\x36\x36\x36" - "\x00\xff\x00\xf7\x36\x36\x36\x36" - "\x18\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\xff\x00\x00\x00\x00" - "\x36\xf7\x00\xff\x00\x00\x00\x00" - "\x18\xff\x18\xff\x18\x18\x18\x18" - "\x36\x36\x36\xff\x36\x36\x36\x36" - "\x36\xf7\x00\xf7\x36\x36\x36\x36" - "\x3c\x42\x99\xa1\xa1\x99\x42\x3c" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - , "Russian koi8-r", CIOLIB_KOI8_R} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x78\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x18\x30\x1e\x00" - "\x00\xc6\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xf0\x64\x6c\x78\x70\xe0\xe0\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00\x00" - "\x00\x1b\xee\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x0c\x18\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x18\x0c\x78\x00" - "\x36\x1c\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x18\x18\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x18\x30\x1e\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x60\x3c\x00" - "\x00\x00\x38\x1a\x1e\x1c\x18\x38\x78\x58\x18\x3c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x1b\xee\x60\x60\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x78\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x18\x0c\x78\x00" - "\x6c\x38\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x36\x6c\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x0c\x18\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x0c\x18\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\xc6\x7c\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xf6\x6c\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x0c\x06\x7c\x00" - "\x6c\x38\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x60\x78\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x18\x30\x1e\x00" - "\x00\xc6\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x6c\x38\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x1c\x36\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x6c\x38\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\xf6\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x0c\x18\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x6c\x38\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x36\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x6c\xc6\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x38\x6c\x38\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x36\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x18\x0c\x78\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xc6\x7c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe6\x6c\x60\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x0c\x78\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x30\x60\x3c\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x6c\x38\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x0c\x0c\x7e\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x36\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x36\x6c\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x18\x0c\x78\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xd6\xd6\xd6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xce\x18\x0e\x00" - "\x00\xc6\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xf0\x64\x6c\x78\x70\xe0\xe2\x66\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x00\x1b\xee\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x0c\x18\x00\x7c\xc6\xc6\x70\x1c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0e\xc6\x7c\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc6\x70\x1c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x18\x70\x00" - "\x36\x1c\x00\x7e\x7e\x5a\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x0c\x18\x00\xfe\xc6\x8c\x18\x30\x62\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\xfe\xc6\x8c\x18\x30\x62\xc6\xfe\x00\x00\x00" - "\x18\x18\x00\xfe\xc6\x8c\x18\x30\x62\xc6\xfe\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x30\x1c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x30\x1c\x00" - "\x00\x00\x38\x1a\x1e\x1c\x18\x38\x78\x58\x3c\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x1b\xee\x60\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x70\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x18\x70\x00" - "\x6c\x38\x00\x10\x30\x30\xfc\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x36\x6c\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x18\x18\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x0c\x18\x00\xfc\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x0c\x18\x00\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x38\x6c\x00\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\xc6\x7c\x00\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xf6\x6c\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x0c\x18\x00\x3c\x66\xc2\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x18\x70\x00" - "\x6c\x38\x00\x3c\x66\xc2\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x30\x1c\x00" - "\x00\xc6\x00\xfe\x66\x62\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x6c\x38\x00\xfe\x66\x62\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x1c\x36\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x6c\x38\x00\xf8\x6c\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\xf6\x66\x66\x6c\xf8\x00\x00\x00" - "\x0c\x18\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\x00\x00\x00" - "\x6c\x38\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\x00\x00\x00" - "\x0c\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x36\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x6c\xc6\x00\x00\x00\x00" - "\x6c\x38\x00\xfc\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x38\x6c\x38\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x0c\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x36\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x0c\x18\x00\x66\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x0c\x38\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xcc\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xc6\x7c\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe6\x6c\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x18\x70\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x30\x1c\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x6c\x38\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x0c\x0c\x7e\x0c\x3c\x6c\xcc\xcc\x76\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x36\x6c\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x38\x6c\x38\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x6c\xd8\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x0c\x38\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x18\x18\x00\x18\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xc6\xd6\xc6\xc6\x7c\x00" - "\x18\x38\x18\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x1c\x30\x66\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x1c\x30\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x06\x0c\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x0c\x38\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x0c\x18\x30\x60\x30\x18\x0c\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x18\x3c\x66\x66\x7e\x66\x66\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x3c\x66\x66\x66\x6e\x3c\x0e\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x3c\x66\x30\x18\x0c\x66\x3c\x00" - "\x7e\x5a\x18\x18\x18\x18\x3c\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x6c\x38\x38\x6c\xc6\xc6\x00" - "\x66\x66\x66\x3c\x18\x18\x3c\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x1c\x36\x30\x78\x30\x30\x78\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x18\x00\x38\x18\x18\x18\x3c\x00" - "\x06\x00\x06\x06\x06\x66\x66\x3c" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x7c\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x3e\x60\x3c\x06\x7c\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\x66\x66\x66\x3e\x06\x7c" - "\x00\x00\x7e\x4c\x18\x32\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x00" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x66\x7e\x66\x6e\x18\x0e" - "\xc6\x7c\x00\x00\x00\x00\x00\x00" - "\xf0\x68\x78\xf0\xe2\x66\xfe\x00" - "\x00\x42\x3c\x66\x66\x3c\x42\x00" - "\xfb\x6e\x60\x60\x62\x66\xfe\x00" - "\x0c\x18\x7c\xc2\x38\x86\x7c\x00" - "\x3c\x66\x38\x6c\x6c\x38\xcc\x78" - "\x66\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x7c\xc2\x38\x86\x7c\x00" - "\x3c\x66\x30\x18\x0c\x66\x3c\x38" - "\x36\x1c\x7e\x5a\x18\x18\x3c\x00" - "\x0c\x18\xfe\x86\x18\x62\xfe\x00" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x6c\x38\xfe\x86\x18\x62\xfe\x00" - "\x18\x00\xfe\x86\x18\x62\xfe\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x1c" - "\x00\x00\x00\x00\x00\x00\x30\x1c" - "\x38\x1a\x1e\x3c\x78\x18\x3c\x00" - "\x0c\x18\x00\x00\x00\x00\x00\x00" - "\xfb\x6e\x60\x60\x60\x60\xf0\x00" - "\x0c\x18\x3c\x40\x38\x04\x78\x00" - "\x6c\x38\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x0c\x38" - "\x6c\x38\x3c\x40\x38\x04\x78\x00" - "\x00\x00\x3e\x60\x3c\x06\x7c\x38" - "\x6c\x38\x30\x7c\x30\x34\x18\x00" - "\x0c\x18\x00\x7c\x18\x30\x7c\x00" - "\x36\x6c\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\x18\x30\x7c\x00" - "\x00\x18\x00\x7c\x18\x30\x7c\x00" - "\x0c\x18\xfc\xc6\xfc\xcc\xc6\x00" - "\x0c\x18\x3c\x66\x7e\x66\x66\x00" - "\x1c\x36\x3c\x66\x7e\x66\x66\x00" - "\x66\x3c\x3c\x66\x7e\x66\x66\x00" - "\x66\x18\x3c\x66\x7e\x66\x66\x00" - "\xe6\x6c\x60\x60\x62\x66\xfe\x00" - "\x0c\x18\x7c\xc6\xc0\xc6\x7c\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x38" - "\x6c\x38\x7c\xc6\xc0\xc6\x7c\x00" - "\x0c\x18\xfe\x60\x78\x60\xfe\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x1c" - "\xc6\x00\xfe\x60\x78\x60\xfe\x00" - "\x6c\x38\xfe\x60\x78\x60\xfe\x00" - "\x0c\x18\x3c\x18\x18\x18\x3c\x00" - "\x1c\x36\x3c\x18\x18\x18\x3c\x00" - "\x6c\x38\xfc\x66\x66\x66\xfc\x00" - "\xf8\x6c\x66\xf6\x66\x6c\xf8\x00" - "\x0c\x18\xe6\xf6\xde\xce\xc6\x00" - "\x6c\x38\xe6\xf6\xde\xce\xc6\x00" - "\x0c\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x38\x6c\x7c\xc6\xc6\xc6\x7c\x00" - "\x36\x6c\x7c\xc6\xc6\xc6\x7c\x00" - "\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00" - "\x00\xc6\x6c\x38\x6c\xc6\x00\x00" - "\x6c\x38\xfc\xc6\xfc\xcc\xc6\x00" - "\x38\x6c\xf6\xc6\xc6\xc6\x7c\x00" - "\x0c\x18\xc6\xc6\xc6\xc6\x7c\x00" - "\x36\x6c\xc6\xc6\xc6\xc6\x7c\x00" - "\xc6\x00\xc6\xc6\xc6\xc6\x7c\x00" - "\x0c\x7e\x66\x66\x3c\x18\x3c\x00" - "\x7e\x5a\x18\x18\x18\x18\x3c\x0e" - "\x78\xcc\xcc\xd8\xcc\xc6\xcc\x00" - "\x0c\x18\xdc\x76\x66\x60\xf0\x00" - "\x0c\x18\x78\x0c\x7c\xcc\x76\x00" - "\x38\x6c\x78\x0c\x7c\xcc\x76\x00" - "\xc6\x7c\x78\x0c\x7c\xcc\x76\x00" - "\xcc\x00\x78\x0c\x7c\xcc\x76\x00" - "\x73\x36\x30\x30\x30\x30\x78\x00" - "\x0c\x18\x00\x3c\x60\x60\x3c\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x38" - "\x36\x1c\x00\x3c\x60\x60\x3c\x00" - "\x0c\x18\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x1c" - "\x66\x00\x3c\x66\x7e\x60\x3c\x00" - "\x36\x1c\x3c\x66\x7e\x60\x3c\x00" - "\x0c\x18\x38\x18\x18\x18\x3c\x00" - "\x1c\x36\x38\x18\x18\x18\x3c\x00" - "\x6c\x38\x0c\x0c\x7c\xcc\x76\x00" - "\x0c\x3e\x0c\x7c\xcc\xcc\x76\x00" - "\x0c\x18\x7c\x66\x66\x66\x66\x00" - "\x6c\x38\x7c\x66\x66\x66\x66\x00" - "\x0c\x18\x00\x3c\x66\x66\x3c\x00" - "\x1c\x36\x00\x3c\x66\x66\x3c\x00" - "\x36\x6c\x00\x3c\x66\x66\x3c\x00" - "\x66\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x18\x00\x7e\x00\x18\x00\x00" - "\x6c\x38\xdc\x76\x66\x60\xf0\x00" - "\x30\xcc\x30\xcc\xcc\xcc\x76\x00" - "\x18\x30\x00\xcc\xcc\xcc\x76\x00" - "\x6c\xd8\x00\xcc\xcc\xcc\x76\x00" - "\xcc\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x0c\x18\x66\x66\x66\x3e\x06\x7c" - "\x10\x30\x7c\x30\x30\x34\x18\x0e" - "\x18\x00\x00\x00\x00\x00\x00\x00" - , "ISO-8859-2 Central European", CIOLIB_ISO_8859_2} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x18\x00\x18\x18\x00\x00" - "\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00" - "\x00\x18\x7e\xdb\xdb\xe8\x78\x3c\x1e\x17\x1b\xdb\xdb\x7e\x18\x18" - "\x00\x00\xe6\xa6\xec\x0c\x18\x18\x30\x30\x60\x6e\xca\xce\x00\x00" - "\x00\x00\x38\x6c\x6c\x6c\x38\x38\x6d\xcd\xc6\xc6\xcb\x73\x00\x00" - "\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00" - "\x00\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x66\x66\x3c\xff\xff\x3c\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x7e\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x00\x00\x7c\xc6\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\xc6\x7c\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x30\x60\xc3\xff\x00\x00" - "\x00\x00\xfe\xc6\x0c\x18\x3c\x06\x03\x03\x03\xc3\x66\x3c\x00\x00" - "\x00\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcd\xff\x0d\x0c\x1e\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xe6\xc3\x03\x03\xc3\x66\x3c\x00\x00" - "\x00\x00\x3c\x66\xc6\xc0\xfc\xe6\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x66\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\x67\x3f\x03\x63\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x7e\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x00\x00\x7e\xc3\xc3\xdf\xdb\xdb\xde\xc0\xc0\x7c\x00\x00" - "\x00\x00\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x63\x63\x63\x63\x63\xfe\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfc\x66\x63\x63\x63\x63\x63\x63\x63\x63\x66\xfc\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x60\x60\xf8\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0f\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xc3\xe7\xff\xff\xdb\xdb\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x63\x7e\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xcb\xcf\x7e\x3c\x06\x07" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\x66\xf7\x00\x00" - "\x00\x00\x7e\xc3\xc7\xc0\x60\x3c\x06\x03\xe3\xe3\xc3\x7e\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xe7\x7e\x3c\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00" - "\x00\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00" - "\x00\x00\x18\x3c\x66\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xde\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0e\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xe3\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xc3\xc3\xc3\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xde\x63\x63\x63\x63\x63\x63\x7e\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0f" - "\x00\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xee\x7c\x38\x38\x7c\xee\xc6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc3\xc3\x66\x66\x3c\x18\x18\x30\x30\xe0" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x70\x18\x18\x18\x18\x1e\x1e\x18\x18\x18\x18\x70\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x20\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x76\xdc\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x6c\x6c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x00\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3f\x6c\xcc\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x66\x3c\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00" - "\x0e\x18\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x18\x0f" - "\x66\x24\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x18\x18\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x0e\x18\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x7e\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfc\x66\x63\x63\x63\xf3\xf3\x63\x63\x63\x66\xfc\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x0c\x78" - "\x7e\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x06\x3c" - "\x3c\x66\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x76\xdc\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x66\x66\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x01\x3d\x66\xc7\xcb\xcb\xdb\xdb\xdb\xd3\xd3\x66\xbc\x80\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x19\x0e" - "\x18\x30\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xc6\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xfe\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xdc\xc6\xc3\xc3\xc3\xc3\xc6\xcc\xc0\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xff\x00" - "\x00\x00\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xce\x18\x0f" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\x66\xf7\x18\xf0" - "\x00\x00\x00\x00\x82\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x82\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x0e\x3c" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x3c\x7e\xc3\xc7\xc0\x60\x3c\x06\x03\xe3\xe3\xc3\x7e\x00\x00" - "\x7e\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x66\x3c\x0c\x78" - "\x00\x00\xff\xdb\x99\x18\x1b\x1e\x3c\x78\xd8\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x7c\x00\x00\x00\x00\x00" - "\x6c\x38\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x18\x0f" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x1e" - "\x00\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x18\xf0" - "\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x0c\x78" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x78\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x3c\x60\x30\x00\x7b\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x30\x36\x1c\x00\x00" - "\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00" - "\x00\x00\x00\x6c\x38\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\x06\x1c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6e\x1b\x1b\x7f\xd8\xd8\xd8\x6f\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x30\x1c" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x30\x1e" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x10\x38\x10\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0e\x06\x7f\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x0c\x78" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x18\xf0" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7c\xce\xde\xd6\xd6\xf6\xe6\x7c\xc0\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x60\x3c" - "\x00\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x10\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, NULL, "ISO-8859-4 Baltic wide (VGA 9bit mapped)", CIOLIB_ISO_8859_4} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xa5\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xdb\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x06\x0e\x1a\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x10\xfe\x66\x62\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xe8\xd0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x36\x24\x00\x78\x30\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x18\x10\x00\x78\x30\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x60\xf0\x60\x6c\x76\x66\x66\x66\x66\xe6\x06\x0c\x30\x00" - "\x00\x00\x0c\x08\x00\x3c\x18\x18\x18\x18\x18\x18\x18\xb0\x60\x00" - "\x00\x00\x24\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x02\xfe\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x18\x10\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x10\x10\x38\x00" - "\x00\x00\x00\x00\x07\x88\xcb\xab\xa8\xab\x9b\x88\x00\x00\x00\x00" - "\x00\x00\x60\xf0\x60\x60\x7c\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe7\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\xb0\x60\x00\x00" - "\x00\x60\xf8\x60\x60\x7c\x76\x66\x66\x66\x66\xe7\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x00\x00\x00" - "\x6c\x38\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x6c\x6c\x6c\x6e\x69\x69\x69\x69\xce\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xfe\xc9\xc9\xc9\xc9\xce\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x36\x24\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xfe\xc9\xc9\xce\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x4c\x4c\x4e\x49\x49\xce\x00\x00\x00\x00" - "\x00\x00\x18\x10\x00\xfe\xc2\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x62\xc0\xf8\xc0\x62\x3c\x00\x00\x00\x00" - "\x02\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x18\x10\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x10\x10\x38\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, NULL, "Codepage 866 (c) Russian", CIOLIB_CP866M} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xdb\xdb\xc3\xc3\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc3\xe7\xff\xff\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\x66\x3c\x18\x18\x3c\x66\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xff\xc3\x86\x0c\x18\x30\x60\xc1\xc3\xff\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xdb\xdb\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xdb\xdb\xff\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\xc3\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x18\x18\x7e\xc3\xc0\xc0\xc0\xc3\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x82\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x82\x00\x00\x00" - "\x00\x00\xc3\x66\x3c\x18\xff\x18\xff\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xa2\xa2\xba\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\x70\x18\x78\xc8\x78\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xaa\xb2\xaa\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xf8\x18\x30\x18\xd8\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7e\x63\x60\xc0\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x06\x3c\x00\x00" - "\x00\x60\xe0\x60\x60\x60\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x88\xd8\x70\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x66\xce\x96\x3e\x06\x06\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x60\xce\x9b\x06\x0c\x1f\x00\x00" - "\x00\xf0\x30\x72\x36\xec\x18\x30\x66\xce\x96\x3e\x06\x06\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x60\x30\x18\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x18\x30\x00\x00" - "\x30\x18\x0c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x18\x30\x60\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x00\xc6\x00\xfe\x66\x60\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x30\x18\x0c\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x18\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x42\x3c\x00\x3c\x66\xc2\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x6c\x38\x10\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x02\x06\x7c\xce\xce\xde\xd6\xd6\xf6\xe6\xe6\x7c\xc0\x80\x00\x00" - "\x60\x30\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x18\x30\x00\x00" - "\x00\x00\x38\x6c\xc6\xce\xdc\xd8\xcc\xc6\xd6\xdc\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x3b\x1b\x7e\xd8\xdc\x77\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x30\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x44\x38\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x02\x06\x7c\xce\xde\xd6\xf6\xe6\x7c\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x18\x30\x00\x00" - "\x00\x00\x66\x66\x00\xee\x66\x66\x66\x66\x66\x3e\x06\x0c\x38\x00" - , NULL, NULL, "ISO-8859-9 Turkish", CIOLIB_ISO_8859_9} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x18\x18\x7e\xdb\xd8\xd8\x7e\x1b\x1b\xdb\xdb\x7e\x18\x18\x00\x00" - "\x00\x00\xe6\xac\xec\x18\x18\x30\x30\x6e\x6a\xce\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x6c\x38\x76\xdc\xdc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00\x00" - "\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x30\x00\x00\x00\x00" - "\x00\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00\x00" - "\x00\x38\x6c\xce\xde\xde\xd6\xf6\xf6\xe6\x6c\x38\x00\x00\x00\x00" - "\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\xfc\x8c\x18\x30\x38\x0c\x06\x06\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\xfe\xc0\xc0\xf8\xcc\x06\x06\x06\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x38\x6c\xc0\xc0\xf8\xec\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\x6c\x38\x6c\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\xc6\x6e\x3e\x06\x06\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x60\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x3c\x66\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x7c\xee\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\xfe\x66\x62\x60\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\xfe\x66\x62\x60\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc0\xc0\xce\xc6\xc6\xce\x7a\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xe6\x66\x6c\x6c\x78\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x82\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xde\xfe\x7c\x0e\x06\x00\x00" - "\x00\xfc\x66\x66\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc0\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" - "\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xfe\xc6\x8c\x0c\x18\x10\x30\x60\x62\xc6\xfe\x00\x00\x00\x00" - "\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x00\x00\x00\x00" - "\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xdc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x1c\x0c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\xcc\x78" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c\x1e" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\x7c\x38\x7c\xee\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x7c\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\x0c\x38\x60\xc6\xfe\x00\x00\x00\x00" - "\x0e\x18\x18\x18\x18\x30\xe0\x30\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x70\x18\x18\x18\x18\x0c\x07\x0c\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x30\x4c\x52\xba\x94\x64\x18\x00\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x60\x60\x60\x6c\x6c\x6c\x3f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00\x30\x78\x30\x00\x00\x00" - "\x00\x60\x30\x38\x1c\x1c\x1c\x1c\x1c\x1c\x38\x30\x60\x00\x00\x00" - "\x00\x0c\x18\x38\x70\x70\x70\x70\x70\x70\x38\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6c\x36\x1b\x1b\x36\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x36\x6c\xd8\xd8\x6c\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00\x00" - "\x00\x60\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x3c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x7c\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xc2\xe6\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x92\x92\x00\x00\x00\x00" - "\x00\x03\x76\xdc\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x46\x96\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xde\xcf\x7b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\x6a\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\xc0\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00" - "\x00\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x66\x66\x66\x3e\x06\x0c\xd8\xfe\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f\x00" - "\x00\xc0\xc0\xc0\xfe\xc0\xc0\xc0\xc0\xf8\x0c\x0c\x78\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xc0\xc0\xc0\xc0\xf8\x0c\x38\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00" - "\x00\x7c\xc6\xc6\xc6\xcf\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xcf\xd6\xd6\xd6\xcc\xc0\xc0\xc0\x00" - "\x00\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x0c\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00" - "\x00\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x00\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xce\xc0\xc0\xc0\x00" - "\x00\xc0\x7e\xfb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\x78\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c\x00" - "\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xf0\x3c\x0e\x0c\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x66\x66\x06\x06\x06\x6c\xd8\x6e\x00\x00\x00\x00" - "\x00\x30\x7e\x0c\x18\x30\x70\xd8\xd8\xcc\xce\x76\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00" - "\x00\x0e\xdb\x70\x30\x78\xcc\xcc\xcc\xcc\xdc\x6c\x00\x00\x00\x00" - "\x00\x1c\x36\x60\x60\xf8\x6c\x66\x66\x66\x6e\x3a\x00\x00\x00\x00" - "\x00\xcf\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x78\xcc\x0c\x1c\x38\x6c\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\xdc\x70\x00" - "\x00\xe0\x60\x60\x66\x66\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x66\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00" - "\x00\xf8\x0c\x7c\xcc\xcc\xc0\xc0\xc0\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\xcc\xcc\xcc\x0c\x18\x30\x60\xc0\x7e\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\x0c\x0c\x0c\xd8\x70\x30\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xc0\x7e\x00" - "\x00\x7e\xdb\xdb\xdb\xdb\xdb\xdb\x1b\x1b\x03\x03\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\x7f\x03\x03\x03\x00" - "\x00\x60\xf0\xd8\xcc\xc6\x66\x36\x16\x1c\xd8\xfe\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\x70\xd8\xcc\xcc\x6c\x38\x30\x60\xc0\x7e\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcf\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00\x00\x00" - "\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0f\x00\x00\x00\x00" - "\x00\x0c\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f\x00" - "\x00\x78\xcc\xcc\xc0\x60\x30\x18\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xd6\xd6\xd6\xd6\xd6\x76\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00" - "\x00\x78\xcc\xcc\xcc\x78\xcc\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\xc0\xc0\xf0\xd8\xd8\xd8\xd8\xd8\xce\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00\x00" - "\x00\x10\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\xdc\xd6\xd6\xd6\xd6\xd6\x76\x10\x10\x10\x00" - "\x00\x3c\x66\x66\x66\x66\x7c\x60\x60\xfe\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x66\x66\x66\x66\x7c\x60\xfe\x60\x60\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x00\x00\x00\x00" - "\x00\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x10\x10\x10\x00" - "\x00\x38\x38\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\xfe" - "\x66\x66\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00" - "\x18\x7e\xdb\xd8\xd8\x7e\x1b\x1b\xdb\xdb\x7e\x18\x18\x00" - "\x00\xe6\xac\xec\x18\x18\x30\x30\x6e\x6a\xce\x00\x00\x00" - "\x38\x6c\x6c\x6c\x38\x76\xdc\xdc\xcc\xcc\x76\x00\x00\x00" - "\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x30\x00\x00\x00" - "\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00" - "\x38\x6c\xce\xde\xde\xd6\xf6\xf6\xe6\x6c\x38\x00\x00\x00" - "\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x38\x6c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\xfc\x8c\x18\x30\x38\x0c\x06\x06\xc6\x6c\x38\x00\x00\x00" - "\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\xfe\xc0\xc0\xf8\xcc\x06\x06\x06\xc6\x6c\x38\x00\x00\x00" - "\x38\x6c\xc0\xc0\xf8\xec\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00" - "\x38\x6c\xc6\xc6\x6c\x38\x6c\xc6\xc6\x6c\x38\x00\x00\x00" - "\x38\x6c\xc6\xc6\xc6\x6e\x3e\x06\x06\x6c\x38\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x60\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x3c\x66\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x10\x38\x7c\xee\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\xf8\x6c\x66\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\xfe\x66\x62\x60\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00" - "\xfe\x66\x62\x60\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc0\xc0\xce\xc6\xc6\xce\x7a\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\xe6\x66\x6c\x6c\x78\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\xf0\x60\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x82\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\xfc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xde\xfe\x7c\x0e\x06\x00" - "\xfc\x66\x66\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x7c\xc6\xc6\xc0\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00" - "\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00" - "\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00" - "\xfe\xc6\x8c\x0c\x18\x10\x30\x60\x62\xc6\xfe\x00\x00\x00" - "\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x00\x00\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xdc\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x1c\x0c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\xcc" - "\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc" - "\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\x60" - "\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c" - "\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00" - "\x10\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xee\x7c\x38\x7c\xee\xc6\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x7c" - "\x00\x00\x00\x00\xfe\xc6\x0c\x38\x60\xc6\xfe\x00\x00\x00" - "\x18\x18\x18\x18\x30\xe0\x30\x18\x18\x18\x18\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00" - "\x18\x18\x18\x18\x0c\x07\x0c\x18\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x30\x4c\x52\xba\x94\x64\x18\x00\x00\x00\x00" - "\xe0\x60\x60\x60\x60\x60\x60\x6c\x6c\x6c\x3f\x00\x00\x00" - "\x00\x00\x00\x00\x30\x78\x30\x00\x00\x30\x78\x30\x00\x00" - "\x60\x30\x38\x1c\x1c\x1c\x1c\x1c\x1c\x38\x30\x60\x00\x00" - "\x0c\x18\x38\x70\x70\x70\x70\x70\x70\x38\x18\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x6c\x36\x1b\x1b\x36\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\xd8\x6c\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00" - "\x60\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x3c\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc2\xe6\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x92\x92\x92\x00\x00\x00" - "\x03\x76\xdc\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x46\x96\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xde\xcf\x7b\x00\x00\x00" - "\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\x6a\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\xc0" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c" - "\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x3c\x66\x66\x66\x66\x66\x3e\x06\x0c\xd8\xfe\xc3\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f" - "\xc0\xc0\xc0\xfe\xc0\xc0\xc0\xc0\xf8\x0c\x0c\x78\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xc0\xc0\xc0\xc0\xf8\x0c\x38\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe" - "\x7c\xc6\xc6\xc6\xcf\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xfc\xc6\xcf\xd6\xd6\xd6\xcc\xc0\xc0\xc0" - "\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x0c\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00\x00" - "\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e" - "\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xce\xc0\xc0\xc0" - "\xc0\x7e\xfb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\x78\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c" - "\x18\x30\x18\x0c\x18\x30\x60\xc0\xf0\x3c\x0e\x0c\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x3c\x66\x66\x66\x66\x06\x06\x06\x6c\xd8\x6e\x00\x00\x00" - "\x30\x7e\x0c\x18\x30\x70\xd8\xd8\xcc\xce\x76\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f" - "\x0e\xdb\x70\x30\x78\xcc\xcc\xcc\xcc\xdc\x6c\x00\x00\x00" - "\x1c\x36\x60\x60\xf8\x6c\x66\x66\x66\x6e\x3a\x00\x00\x00" - "\xcf\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x0f\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x78\xcc\x0c\x1c\x38\x6c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\xdc\x70" - "\xe0\x60\x60\x66\x66\x66\x66\x66\x66\x66\x3c\x00\x00\x00" - "\xe0\x60\x60\x60\x66\x66\x66\x66\x66\x66\x3e\x00\x00\x00" - "\xf8\x0c\x7c\xcc\xcc\xc0\xc0\xc0\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x78\xcc\xcc\xcc\x0c\x18\x30\x60\xc0\x7e" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\x0c\x0c\x0c\xd8\x70\x30\x18\x00\x00" - "\x00\x00\x00\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xc0\x7e" - "\x7e\xdb\xdb\xdb\xdb\xdb\xdb\x1b\x1b\x03\x03\x00\x00\x00" - "\x00\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\x7f\x03\x03\x03" - "\x60\xf0\xd8\xcc\xc6\x66\x36\x16\x1c\xd8\xfe\xc3\x00\x00" - "\x00\x00\x00\x00\x70\xd8\xcc\xcc\x6c\x38\x30\x60\xc0\x7e" - "\x78\xcc\xcc\xcc\xcc\xcc\xcf\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0f\x00\x00\x00" - "\x0c\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f" - "\x78\xcc\xcc\xc0\x60\x30\x18\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xdc\xd6\xd6\xd6\xd6\xd6\x76\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0" - "\x78\xcc\xcc\xcc\x78\xcc\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78" - "\xc0\xc0\xf0\xd8\xd8\xd8\xd8\xd8\xce\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00" - "\x10\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x00\x00\x00" - "\x00\x10\x10\x10\xdc\xd6\xd6\xd6\xd6\xd6\x76\x10\x10\x10" - "\x3c\x66\x66\x66\x66\x7c\x60\x60\xfe\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x66\x66\x66\x66\x7c\x60\xfe\x60\x60" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x78\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x00\x00\x00" - "\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x10\x10\x10" - "\x38\x38\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x12\xca\x2c\x79\x9e\x34\x53\x48" - "\xc0\xc0\xc0\xd8\xd8\xd8\x76\x00" - "\x00\x00\x30\x30\x00\x30\x30\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x00\x6c\x36\x1b\x36\x6c\x00\x00" - "\x00\x36\x6c\xd8\x6c\x36\x00\x00" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\x00\x00\x30\x30\x00\x00" - "\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x70\x3f\x00\x00" - "\x00\x00\x00\x00\xdb\xdb\x00\x00" - "\x01\x0e\x70\x80\x00\x00\x00\x00" - "\x1c\x30\x40\x00\x00\x00\x00\x00" - "\x1e\x35\x26\x00\x00\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\x6f\x3b\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x7c\xc6\xc6\xc0\xc0\xf8\xc0\x00" - "\x00\x00\x78\xcc\xc0\xc0\xf0\xc0" - "\x7c\xc6\xc6\xc6\xc6\x7f\x06\x00" - "\x00\x00\x78\xcc\xcc\xcc\x7e\x0c" - "\x7c\xc6\xc6\xc6\xc6\x07\x06\x00" - "\x00\x00\x78\xcc\xcc\xcc\x0e\x0c" - "\xc0\xc0\xfe\xc0\xc6\xc6\x7c\x00" - "\xc0\xc0\xfc\xc0\xcc\xcc\x78\x00" - "\x3e\x63\x36\x1c\xb8\xfe\x83\x00" - "\x00\x00\x78\xcc\xcc\x7c\x0c\x0e" - "\xc0\xc0\xfc\xc0\xc0\xfe\x03\x00" - "\x00\xc0\xc0\xf8\xc0\xc0\xf8\x0c" - "\x7c\xc6\xc6\xc6\xc0\xc0\xfe\x00" - "\x00\x00\x78\xcc\xcc\xc0\xc0\xfc" - "\x7c\xc6\xdf\xd6\xde\xc0\xc0\x00" - "\x00\x00\x7c\xc6\xcf\xd6\xdc\xc0" - "\x06\x06\x7f\xc6\xc6\xc6\x7c\x00" - "\x00\x0c\x0c\x7e\xcc\xcc\x78\x00" - "\xc0\xfc\xc6\xc6\xc0\xc0\xc0\x00" - "\x00\xc0\xc0\xf8\xcc\xcc\xc0\xc0" - "\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xc0\xf8" - "\xc0\xc0\xf3\xdb\xdb\xce\xc0\x00" - "\x00\xc0\xc0\xc0\xf3\xdb\xce\xc0" - "\xe7\x3c\x66\xc3\xc3\x66\x3c\x00" - "\xc0\x37\x0c\x66\xc3\xc6\x7c\x00" - "\xc0\xc0\xc6\xc6\x7e\x06\x06\x00" - "\xc0\xc0\xcc\xcc\xcc\xcc\x7c\x0c" - "\xfc\xfe\x06\xfc\xfe\x06\x06\x00" - "\xc0\xc0\xf8\xcc\xcc\xcc\xcc\x00" - "\x7c\xc6\xc6\x0c\x68\x9a\x66\x00" - "\x00\x10\x30\x78\xcc\xcc\x7a\x00" - "\x7c\xc6\xc6\xc6\xc6\x06\x07\x00" - "\x00\x00\x78\xcc\xcc\xcc\x0c\x0e" - "\x0f\xf0\x6c\x66\xc3\xc3\xff\x00" - "\x1c\xe0\x30\xc8\xcc\xcc\xfc\x00" - "\xc7\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\x0e\x0c\x0c\xcc\xcc\xcc\x78\x00" - "\x38\x7e\x06\xf8\x06\x7e\x38\x00" - "\x00\x38\x7e\x06\xfc\x06\x7e\x38" - "\xe0\x60\x60\x63\x63\x63\x3e\x00" - "\xe0\x60\x66\x66\x66\x66\x3c\x00" - "\xe0\x7e\x1e\x30\x60\x33\x1e\x00" - "\x00\x78\xcc\x0c\x30\x60\xc0\xfc" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x00" - "\x00\x00\x78\xcc\xcc\xcc\xcc\x00" - "\x7c\xc6\x06\xcc\x70\x18\x0c\x00" - "\x00\x30\x60\x30\x18\x30\x62\x3c" - "\x7e\xdb\xdb\xdb\x1b\x03\x03\x00" - "\x00\x00\xdb\xdb\xdb\xdb\x6f\x03" - "\x3c\x66\x66\x1c\xb8\xfe\x83\x00" - "\x00\x3c\x66\x66\x66\x1c\x70\xfe" - "\x7c\xc6\xc6\xc6\xc7\xc6\xc6\x00" - "\x00\x00\x78\xcc\xcc\xcc\xce\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x78\x00" - "\x06\x06\xc6\xc6\x7e\x06\x07\x00" - "\x0c\x0c\xcc\xcc\xcc\xfc\x0c\x0e" - "\x7e\xe7\x30\x18\x0c\xe7\x7e\x00" - "\x00\x00\xd6\xdb\xdb\xdb\x6b\x00" - "\x7c\xc6\xc6\xc6\xc0\xc0\xc0\x00" - "\x00\x00\x78\xcc\xcc\xcc\xc0\xc0" - "\x7c\xc6\x7c\xfc\x03\x83\x7e\x00" - "\x00\x00\x78\xcc\x78\x0c\xcc\x78" - "\xc0\xc0\xc0\xf0\xc0\xc0\xc0\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xe0\x00" - "\x18\x7e\xdb\xdb\xdb\x7e\x18\x00" - "\x18\x18\xde\xdb\xdb\xdb\x7b\x18" - "\x3e\x63\x63\x7e\x60\xff\x60\x00" - "\x00\x3c\x66\x66\x7c\x60\xfc\x60" - "\x3c\x66\xc3\xc3\xc3\x66\x3c\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x38\x58\x3e\x1b\x1b\xdb\x7e\x00" - "\x38\x58\x3e\x1b\x1b\xdb\x7e\x18" - "\x30\x30\x60\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "haik8 codepage (use only with armscii8 screenmap)", CIOLIB_HAIK8} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\xdc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x18\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x18\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x18\x00\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x9a\xa2\xa2\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x82\xba\xaa\xb2\xaa\xaa\x82\x7c\x00\x00\x00\x00\x00" - "\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x06\x3c\x06\x06\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x78\x00\x00" - "\x00\x18\x38\x18\x18\x18\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x3e\x00\x00" - "\x00\xe0\x30\x62\x36\xec\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00" - "\x00\x00\x00\x00\xc6\xc6\x66\x76\xdc\xcc\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x0c\x0c\x0c\x0c\x0c\x0c\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x38\x0c\x0c\x0c\x0c\x1c\x36\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x06\x06\x06\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x70\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x30\x30\x30\x18\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\xcc\xd6\xd6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x70\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x06\x06\x06\x0c\x0c\x0c\x0c\x0c\x0c\x0e\x00" - "\x00\x00\x00\x00\xfc\x06\x06\x06\x06\x06\x06\xfc\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xfc\x06\x06\x06\x06\x0c\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x66\xc6\xc6\xc6\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\xdc\x76\x66\xc6\xc6\xc6\xc6\xde\x00\x00\x00\x00" - "\x00\x00\x00\x00\x38\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x1c\x00" - "\x00\x00\x00\x00\x38\x0c\x0c\x0c\x0c\x0c\x0c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x66\xc6\xc6\xc6\xc6\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\xee\x66\x66\x66\x66\x66\x2c\xf8\x00\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x4c\xcc\xcc\xec\x0c\x0c\x0c\x0c\x0c\x0e\x00" - "\x00\x00\x00\x00\xfc\x46\xc6\xc6\xe6\x06\x06\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\xee\x66\x66\x6c\x78\x60\x60\x60\x60\x60\x70\x00" - "\x00\x00\x00\x00\xee\x66\x66\x34\x18\x0c\x06\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x06\x06\x66\x64\x6c\x6e\x60\x60\x60\x60\x00" - "\x00\x00\x00\x00\xfc\x06\x06\x06\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xf6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x66\x66\x66\x66\x66\xe6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x63\x63\x63\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x36\x36\x7f\x36\x36\x36\x7f\x36\x36\x00\x00\x00" - "\x0c\x0c\x3e\x63\x61\x60\x3e\x03\x43\x63\x3e\x0c\x0c\x00" - "\x00\x00\x00\x00\x61\x63\x06\x0c\x18\x33\x63\x00\x00\x00" - "\x00\x00\x1c\x36\x36\x1c\x3b\x6e\x66\x66\x3b\x00\x00\x00" - "\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x18\x0c\x06\x06\x06\x06\x06\x0c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x01\x03\x06\x0c\x18\x30\x60\x40\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x63\x6b\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x0c\x0c\x0c\x0c\x0c\x3f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x06\x0c\x18\x30\x63\x7f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x03\x1e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x06\x0e\x1e\x36\x66\x7f\x06\x06\x0f\x00\x00\x00" - "\x00\x00\x7f\x60\x60\x60\x7e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7f\x63\x03\x06\x0c\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3f\x03\x03\x06\x3c\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x06\x0c\x0c\x00\x0c\x0c\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x6f\x6f\x6f\x6c\x60\x3e\x00\x00\x00" - "\x00\x00\x08\x1c\x36\x63\x63\x7f\x63\x63\x63\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x33\x33\x33\x7e\x00\x00\x00" - "\x00\x00\x1e\x33\x61\x60\x60\x60\x61\x33\x1e\x00\x00\x00" - "\x00\x00\x7c\x36\x33\x33\x33\x33\x33\x36\x7c\x00\x00\x00" - "\x00\x00\x7f\x33\x31\x34\x3c\x34\x31\x33\x7f\x00\x00\x00" - "\x00\x00\x7f\x33\x31\x34\x3c\x34\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1e\x33\x61\x60\x60\x6f\x63\x33\x1d\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x7f\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x0f\x06\x06\x06\x06\x06\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x73\x33\x36\x36\x3c\x36\x36\x33\x73\x00\x00\x00" - "\x00\x00\x78\x30\x30\x30\x30\x30\x31\x33\x7f\x00\x00\x00" - "\x00\x00\x63\x77\x7f\x6b\x63\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x63\x73\x7b\x7f\x6f\x67\x63\x63\x63\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x63\x63\x6b\x6f\x3e\x07\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x36\x33\x33\x73\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x30\x1c\x06\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x36\x1c\x08\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x6b\x6b\x7f\x36\x36\x00\x00\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x3c\x66\x66\x66\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x7f\x63\x46\x0c\x18\x30\x61\x63\x7f\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x40\x60\x70\x38\x1c\x0e\x07\x03\x01\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x08\x1c\x36\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x70\x30\x30\x3c\x36\x33\x33\x33\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x60\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x0e\x06\x06\x1e\x36\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x7c\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x70\x30\x30\x36\x3b\x33\x33\x33\x73\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\x70\x30\x30\x33\x36\x3c\x36\x33\x73\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x7f\x6b\x6b\x6b\x6b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x33\x33\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x3e\x30\x30\x78\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x06\x0f\x00" - "\x00\x00\x00\x00\x00\x6e\x3b\x33\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x38\x0e\x63\x3e\x00\x00\x00" - "\x00\x00\x08\x18\x18\x7e\x18\x18\x18\x1b\x0e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x36\x1c\x1c\x36\x63\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x63\x63\x3f\x03\x06\x3c\x00" - "\x00\x00\x00\x00\x00\x7f\x66\x0c\x18\x33\x7f\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x3b\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x18\x7e\xc3\xc0\xc0\xc3\x7e\x18\x18\x00\x00\x00" - "\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x73\x7e\x00\x00\x00" - "\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x18\x18\x18\x18\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x3e\x63\x30\x1c\x36\x63\x63\x36\x1c\x06\x63\x3e\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\x9a\xa2\xa2\xa2\x9a\x44\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x1b\x36\x6c\x36\x1b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7f\x03\x03\x03\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\xba\xaa\xb2\xaa\xaa\x44\x38\x00\x00" - "\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x78\x0c\x38\x0c\x0c\x78\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x33\x33\x33\x33\x33\x3e\x30\x60\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x78" - "\x00\x18\x38\x18\x18\x18\x3c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\x36\x1b\x36\x6c\x00\x00\x00\x00\x00" - "\x00\x60\xe0\x63\x66\x6c\x18\x36\x6e\xda\x3f\x06\x06\x00" - "\x00\x60\xe0\x63\x66\x6c\x18\x30\x6e\xc3\x06\x0c\x1f\x00" - "\x00\xe0\x30\x63\x36\xec\x18\x36\x6e\xda\x3f\x06\x06\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00" - "\x00\x00\x00\x63\x63\x33\x3b\x6e\x66\x63\x63\x00\x00\x00" - "\x00\x00\x00\x7c\x06\x06\x06\x06\x06\x06\x7f\x00\x00\x00" - "\x00\x00\x00\x1c\x06\x06\x06\x06\x1e\x36\x63\x00\x00\x00" - "\x00\x00\x00\x7f\x06\x06\x06\x06\x06\x06\x06\x00\x00\x00" - "\x00\x00\x00\x7e\x03\x03\x03\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x00\x38\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\x00\x7e\x18\x18\x18\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x7e\x33\x63\x63\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x00\x66\x6b\x6b\x63\x63\x63\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x3c\x06\x06\x06\x0c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x03\x03\x06\x06\x06\x06\x06\x06\x07\x00" - "\x00\x00\x00\x7e\x03\x03\x03\x03\x03\x06\x7c\x00\x00\x00" - "\x00\x60\x60\x7e\x03\x03\x03\x06\x0c\x18\x18\x00\x00\x00" - "\x00\x00\x00\x7e\x63\x63\x63\x63\x63\x63\x7f\x00\x00\x00" - "\x00\x00\x00\x6e\x7b\x33\x63\x63\x63\x63\x6f\x00\x00\x00" - "\x00\x00\x00\x1c\x06\x06\x0c\x0c\x0c\x0c\x0c\x0c\x0e\x00" - "\x00\x00\x00\x1c\x06\x06\x06\x06\x06\x06\x3e\x00\x00\x00" - "\x00\x00\x00\x7e\x33\x63\x63\x63\x63\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x33\x33\x33\x33\x33\x1b\x0e\x7c\x00\x00\x00" - "\x00\x00\x00\x7c\x26\x66\x76\x06\x06\x06\x06\x06\x07\x00" - "\x00\x00\x00\x7e\x23\x63\x73\x03\x03\x03\x7f\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x6c\x78\x60\x60\x60\x70\x00" - "\x00\x00\x00\x63\x63\x33\x1e\x0c\x06\x03\x7f\x00\x00\x00" - "\x00\x00\x00\x7e\x03\x03\x33\x36\x36\x37\x30\x30\x30\x00" - "\x00\x00\x00\x7e\x03\x03\x03\x03\x03\x03\x03\x00\x00\x00" - "\x00\x00\x00\x6b\x6b\x6b\x6b\x6b\x7b\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x7e\x33\x33\x33\x33\x33\x33\x73\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x18\x18\x00\x18\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x30\x30\x60\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x38\x6c\xc6\xd6\xc6\x6c\x38\x00" - "\x18\x38\x18\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x1c\x30\x66\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x1c\x30\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x06\x0c\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x0c\x38\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x0c\x18\x30\x60\x30\x18\x0c\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x30\x18\x0c\x06\x0c\x18\x30\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x18\x3c\x66\x66\x7e\x66\x66\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x7c\xc6\xc6\xc6\xc6\xce\x7c\x0e" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x3c\x66\x70\x38\x0e\x66\x3c\x00" - "\x7e\x5a\x18\x18\x18\x18\x3c\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\xc6\x6c\x38\x38\x6c\xc6\x00" - "\x66\x66\x66\x3c\x18\x18\x3c\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x1c\x36\x30\x78\x30\x30\x78\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x18\x00\x38\x18\x18\x18\x3c\x00" - "\x06\x00\x06\x06\x06\x66\x66\x3c" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xdc\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x3e\x60\x3c\x06\x7c\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\x66\x66\x66\x3e\x06\x7c" - "\x00\x00\x7e\x4c\x18\x32\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x7e\xc0\xc0\x7e\x18\x18" - "\x38\x6c\x64\xf0\x60\xe6\xfc\x00" - "\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00" - "\x66\x66\x3c\x7e\x18\x7e\x18\x18" - "\x18\x18\x18\x00\x00\x18\x18\x18" - "\x3e\x63\x3c\x66\x66\x3c\xc6\x7c" - "\x00\xc6\x00\x00\x00\x00\x00\x00" - "\x7e\x81\x9d\xa1\xa1\x9d\x81\x7e" - "\x00\xc6\x6c\x38\x6c\xc6\x00\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\x00\x00\x7e\x06\x06\x00\x00" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x7e\x81\xb9\xa5\xb9\xa5\x81\x7e" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x18\x18\x7e\x18\x18\x00\x7e\x00" - "\x78\x0c\x18\x30\x7c\x00\x00\x00" - "\x78\x0c\x38\x0c\x78\x00\x00\x00" - "\x0c\x18\x30\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x7c\xc0" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\x38" - "\x18\x38\x18\x18\x3c\x00\x00\x00" - "\x00\x18\x00\x7e\x00\x18\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\xc3\xc6\xcc\xda\x36\x6e\xdf\x06" - "\xc3\xc6\xcc\xde\x33\x66\xcc\x0f" - "\xe1\x32\xe4\x3a\xf6\x2a\x5f\x86" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff" - "\x00\xc6\x66\x76\xdc\xcc\xc6\x00" - "\x00\xf8\x0c\x0c\x0c\x0c\xfe\x00" - "\x00\x38\x0c\x0c\x1c\x34\xe6\x00" - "\x00\xfe\x0c\x0c\x0c\x0c\x0c\x00" - "\x00\xfc\x06\x06\xc6\xc6\xc6\x00" - "\x00\x70\x18\x18\x18\x18\x18\x00" - "\x00\x3c\x18\x18\x0c\x18\x30\x00" - "\x00\xfc\x66\xc6\xc6\xc6\xc6\x00" - "\x00\xcc\xd6\xd6\xc6\xcc\x78\x00" - "\x00\x38\x0c\x0c\x18\x00\x00\x00" - "\x00\xfc\x06\x06\x0c\x0c\x0c\x0e" - "\x00\xfc\x06\x06\x06\x06\xfc\x00" - "\xc0\xfc\x06\x06\x0c\x18\x18\x00" - "\x00\xfc\x66\xc6\xc6\xc6\xfe\x00" - "\x00\xdc\x76\x66\xc6\xc6\xde\x00" - "\x00\x38\x0c\x18\x18\x18\x18\x1c" - "\x00\x38\x0c\x0c\x0c\x0c\x7c\x00" - "\x00\xfc\x66\xc6\xc6\xcc\x78\x00" - "\x00\x66\x66\x66\x66\x36\xfc\x00" - "\x00\xf8\x4c\xcc\xec\x0c\x0c\x0e" - "\x00\xfc\x46\xc6\xe6\x06\xfe\x00" - "\x00\x66\x66\x66\x7c\x60\x60\x70" - "\x00\x66\x36\x1c\x0c\x06\x7e\x00" - "\x00\xfc\x06\x66\x6c\x6e\x60\x60" - "\x00\xfc\x06\x06\x06\x06\x06\x00" - "\x00\xd6\xd6\xd6\xf6\xc6\x7c\x00" - "\x00\xfc\x66\x66\x66\xe6\xe6\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "ISO-8859-8 Hebrew", CIOLIB_ISO_8859_8} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xf8\xc0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xa2\xaa\xba\x82\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xf0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x6c\x6c\x00\xfe\xc6\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xf8\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xaa\xba\x82\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x1f\x18\x18\x18\x18" - "\x00\x00\x00\xf8\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\x00\x00\x00\x00" - "\x18\x18\x18\x1f\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x18\x18\x18\x18" - "\x00\x00\x00\xff\x18\x18\x18\x18" - "\x18\x18\x18\xff\x00\x00\x00\x00" - "\x18\x18\x18\xff\x18\x18\x18\x18" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x0e\x1b\x1b\x18\x18\x18\x18\x18" - "\x00\x00\x7c\x7c\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x03\x02\x06\x04\xcc\x68\x38\x10" - "\x00\x76\xdc\x00\x76\xdc\x00\x00" - "\x00\x0c\x18\x30\x60\x30\x18\x0c" - "\x00\x30\x18\x0c\x06\x0c\x18\x30" - "\x00\x00\x00\x00\x00\x42\x7e\x00" - "\x18\x18\x18\x18\x18\xd8\xd8\x70" - "\x00\x38\x6c\x6c\x38\x00\x00\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x18\x18\x00\x7e\x00\x18\x18" - "\x00\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x1f\x18\x1f\x18\x18\x18\x18" - "\x24\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\x7c\xc0\xf8\xc0\x7c\x00" - "\x00\x3f\x30\x37\x36\x36\x36\x36" - "\x20\x00\x70\x30\x30\x30\x78\x00" - "\x50\x00\x70\x30\x30\x30\x78\x00" - "\x00\xfe\x06\xf6\x36\x36\x36\x36" - "\x18\x1f\x18\x1f\x00\x00\x00\x00" - "\x36\x36\x36\x3f\x00\x00\x00\x00" - "\x36\x37\x30\x3f\x00\x00\x00\x00" - "\x18\xf8\x18\xf8\x00\x00\x00\x00" - "\x00\x06\x7e\x60\x60\x60\x60\x00" - "\x36\xf6\x06\xfe\x00\x00\x00\x00" - "\x18\x1f\x18\x1f\x18\x18\x18\x18" - "\x36\x36\x36\x37\x36\x36\x36\x36" - "\x36\x37\x30\x37\x36\x36\x36\x36" - "\x18\xf8\x18\xf8\x18\x18\x18\x18" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\x3c\x66\xc0\xf8\xc0\x66\x3c\x00" - "\x36\xf6\x06\xf6\x36\x36\x36\x36" - "\x30\x78\x30\x30\x30\x30\x78\x00" - "\x48\x78\x30\x30\x30\x30\x78\x00" - "\x00\xff\x00\xf7\x36\x36\x36\x36" - "\x18\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\xff\x00\x00\x00\x00" - "\x36\xf7\x00\xff\x00\x00\x00\x00" - "\x18\xff\x18\xff\x18\x18\x18\x18" - "\x06\x7e\x60\x60\x60\x60\x60\x00" - "\x36\xf7\x00\xf7\x36\x36\x36\x36" - "\x3c\x42\x99\xa1\xa1\x99\x42\x3c" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - , "Ukrainian font koi8-u", CIOLIB_KOI8_U} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x10\x10\x10\x00\x00\x10\x10\x00\x00\x00" - "\x00\x00\x24\x24\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x24\x24\x24\x7e\x24\x24\x24\x7e\x24\x24\x24\x00\x00\x00" - "\x00\x00\x08\x3f\x48\x48\x48\x3e\x09\x09\x09\x7e\x08\x00\x00\x00" - "\x00\x00\x00\x30\x49\x32\x04\x08\x10\x26\x49\x06\x00\x00\x00\x00" - "\x00\x00\x00\x18\x24\x24\x18\x25\x22\x22\x22\x1d\x00\x00\x00\x00" - "\x00\x18\x08\x08\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x10\x10\x10\x10\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x10\x08\x04\x04\x04\x04\x04\x04\x08\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x18\x7e\x18\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x08\x08\x08\x7f\x08\x08\x08\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x08\x10\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x01\x02\x04\x08\x10\x20\x40\x80\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x42\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x08\x18\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x04\x08\x10\x20\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x1c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x02\x06\x0a\x12\x22\x42\x7f\x02\x02\x02\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x40\x40\x40\x7c\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7e\x02\x02\x04\x04\x08\x08\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x3c\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x3e\x02\x02\x02\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x08\x08\x10\x00" - "\x00\x00\x00\x04\x08\x10\x20\x40\x20\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x20\x10\x08\x04\x02\x04\x08\x10\x20\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x04\x08\x10\x00\x00\x10\x10\x00\x00\x00" - "\x00\x00\x00\x1c\x22\x49\x55\x55\x56\x4c\x20\x1e\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x7c\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x40\x40\x40\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x78\x44\x42\x42\x42\x42\x42\x42\x44\x78\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x40\x40\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x40\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x3e\x40\x40\x40\x4e\x42\x42\x42\x42\x3e\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x7e\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x0e\x02\x02\x02\x02\x02\x02\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x42\x44\x48\x50\x60\x60\x50\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x40\x40\x40\x40\x40\x40\x40\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x41\x63\x55\x49\x41\x41\x41\x41\x41\x41\x00\x00\x00\x00" - "\x00\x00\x42\x62\x52\x52\x4a\x4a\x46\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x42\x7c\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x4a\x3c\x04\x02\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x42\x7c\x50\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x3c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7f\x08\x08\x08\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x41\x41\x22\x22\x14\x14\x08\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x41\x41\x41\x49\x55\x63\x41\x00\x00\x00\x00" - "\x00\x00\x41\x41\x22\x14\x08\x08\x14\x22\x41\x41\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x22\x14\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x7e\x02\x02\x04\x08\x10\x20\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\x40\x20\x10\x08\x04\x02\x01\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x04\x04\x04\x04\x04\x04\x04\x04\x3c\x00\x00\x00\x00" - "\x00\x00\x08\x14\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x00\x18\x10\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x40\x40\x40\x7c\x42\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x40\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x02\x02\x02\x3e\x42\x42\x42\x42\x42\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x0e\x10\x10\x7e\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x00\x40\x40\x40\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x08\x08\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x02\x02\x00\x0e\x02\x02\x02\x02\x02\x02\x02\x42\x3c\x00" - "\x00\x00\x40\x40\x40\x42\x44\x48\x70\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x70\x10\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x49\x49\x49\x49\x49\x49\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x42\x42\x42\x42\x42\x7c\x40\x40\x40\x00" - "\x00\x00\x00\x00\x00\x3e\x42\x42\x42\x42\x42\x3e\x02\x02\x02\x00" - "\x00\x00\x00\x00\x00\x5c\x62\x40\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x3c\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x7c\x10\x10\x10\x10\x10\x0e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x49\x49\x49\x49\x49\x49\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x24\x18\x24\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x00\x00\x00\x00\x7e\x04\x08\x10\x20\x40\x7e\x00\x00\x00\x00" - "\x00\x0c\x10\x10\x10\x10\x20\x10\x10\x10\x10\x0c\x00\x00\x00\x00" - "\x00\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00" - "\x00\x30\x08\x08\x08\x08\x04\x08\x08\x08\x08\x30\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x10\x10\x00\x00\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x08\x08\x3c\x4a\x48\x48\x4a\x3c\x08\x08\x00\x00\x00" - "\x00\x00\x1c\x22\x22\x20\x78\x20\x20\x20\x21\x7e\x00\x00\x00\x00" - "\x00\x00\x1e\x21\x20\x7e\x20\x7e\x20\x21\x1e\x00\x00\x00\x00\x00" - "\x00\x00\x41\x22\x14\x08\x08\x3e\x08\x3e\x08\x08\x00\x00\x00\x00" - "\x24\x18\x00\x3c\x42\x40\x40\x3c\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x20\x3c\x42\x42\x42\x3c\x04\x42\x3c\x00\x00\x00" - "\x00\x00\x24\x18\x00\x3c\x42\x40\x3c\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3e\x41\x41\x5d\x51\x51\x5d\x41\x41\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\x44\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x09\x12\x24\x48\x90\x48\x24\x12\x09\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x02\x02\x02\x00\x00\x00\x00\x00\x00" - "\x00\x10\x10\x00\x00\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x3e\x41\x5d\x55\x5d\x59\x55\x55\x41\x3e\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x24\x24\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x08\x08\x3e\x08\x08\x00\x3e\x00\x00\x00\x00" - "\x00\x00\x30\x48\x10\x20\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x70\x08\x30\x08\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x24\x18\x00\x7e\x02\x04\x08\x10\x20\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x7e\x41\x40\x40\x80\x00" - "\x00\x00\x3e\x4a\x4a\x4a\x3a\x0a\x0a\x0a\x0a\x0a\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x24\x18\x00\x7e\x04\x08\x10\x20\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x10\x70\x10\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x18\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x90\x48\x24\x12\x09\x12\x24\x48\x90\x00\x00\x00\x00" - "\x00\x00\x7f\x88\x88\x88\x8e\x88\x88\x88\x88\x7f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x91\x91\x9f\x90\x91\x6e\x00\x00\x00\x00" - "\x14\x14\x00\x41\x41\x22\x14\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x10\x10\x00\x10\x10\x10\x20\x40\x40\x42\x3c\x00\x00" - "\x30\x0c\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x0c\x30\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x18\x24\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x32\x4c\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x24\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x18\x24\x18\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x3f\x48\x48\x48\x7e\x48\x48\x48\x48\x4f\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x40\x40\x40\x40\x42\x3c\x04\x02\x3c\x00" - "\x18\x06\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x06\x18\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x0c\x12\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x14\x14\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x18\x06\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x06\x18\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x08\x14\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x14\x14\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x78\x44\x42\x42\xf2\x42\x42\x42\x44\x78\x00\x00\x00\x00" - "\x00\x19\x26\x00\x41\x61\x51\x49\x45\x43\x41\x41\x00\x00\x00\x00" - "\x30\x0c\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x0c\x30\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x18\x24\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x32\x4c\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x82\x44\x28\x10\x28\x44\x82\x00\x00\x00\x00\x00\x00" - "\x00\x00\x19\x26\x44\x4a\x4a\x52\x52\x22\x64\x98\x00\x00\x00\x00" - "\x30\x0c\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x0c\x30\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x18\x24\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x04\x08\x10\x41\x41\x22\x14\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x20\x20\x20\x3e\x21\x21\x21\x31\x2e\x20\x20\x20\x20\x00\x00" - "\x00\x00\x1e\x21\x21\x21\x3e\x21\x21\x21\x31\x2e\x20\x00\x00\x00" - "\x00\x10\x08\x04\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x1c\x22\x1c\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x09\x09\x3e\x48\x48\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x40\x40\x42\x3c\x08\x04\x78\x00" - "\x00\x20\x10\x08\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x10\x08\x04\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x08\x14\x22\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x22\x22\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x30\x4c\x04\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x20\x10\x08\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x24\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x24\x00\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\xff\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1d\x22\x45\x49\x51\x22\x5c\x00\x00\x00\x00" - "\x00\x20\x10\x08\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x00\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x20\x20\x20\x3e\x21\x21\x21\x21\x31\x2e\x20\x20\x20\x00\x00" - "\x00\x00\x24\x24\x00\x00\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - , NULL, NULL, "ISO-8859-15 West European, (thin)", CIOLIB_ISO_8859_15} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x00\x18\x18\x7e\xdb\xd8\x58\x38\x1c\x1e\xdb\xdb\x7e\x18\x18\x00" - "\x00\x00\x00\xe2\xa6\xec\x18\x18\x30\x60\x6e\xca\x8e\x00\x00\x00" - "\x00\x00\x00\x38\x6c\x38\x30\x76\x7e\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6c\x38\xfe\x38\x6c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x00\x00\x02\x06\x0c\x18\x18\x30\x60\x60\xc0\x80\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xce\xd6\xd6\xd6\xd6\xe6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x18\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x0c\x1c\x3c\x6c\xcc\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x18\x30\x00" - "\x00\x00\x00\x00\x0c\x18\x30\x60\x60\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x60\x30\x18\x0c\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xdc\xc0\x7e\x00\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xce\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xee\xee\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x06\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\x60\x60\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00" - "\x00\x00\x00\x80\xc0\x60\x60\x30\x18\x0c\x0c\x06\x02\x00\x00\x00" - "\x00\x00\x00\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x1c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x1c\x36\x30\xfc\x30\x30\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\x00\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x30\x30\x60\xc0\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x0c\x18\x20\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x38\x6c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x76\xdc\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x6c\x6c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x3f\x6c\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcf\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e\x00" - "\x66\x3c\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x18\x30\x40\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x30\x1e\x00" - "\x6c\x6c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x18\x18\x00\xfe\x66\x60\x60\x78\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x0c\x18\x20\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x3c\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\xf6\xf6\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x0c\x78\x00" - "\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x0c\x78\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x00\x02\x06\x7c\xce\xde\xd6\xd6\xd6\xd6\xf6\xe6\x7c\xc0\x80\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x60\x3c\x00" - "\x0c\x18\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xfe\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xce\x18\x0e\x00" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xf6\x18\xf0\x00" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x0c\x78\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x7c\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xce\xc6\xc6\x7c\x0c\x78\x00" - "\x00\x00\x00\xff\xdb\x99\x18\x1e\x3c\x78\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x30\x1e\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x1e\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x18\xf0\x00" - "\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x0c\x78\x00" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x78\x00\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x60\x30\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x36\x1c\x00\x00\x00" - "\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00\x00" - "\x00\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\x06\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6e\x19\x7f\xd8\xd8\xd8\x6f\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x30\x1c\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x30\x1e\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x10\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x0c\x7e\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x0c\x78\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x18\xf0\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7c\xce\xde\xd6\xf6\xe6\x7c\xc0\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x60\x3c\x00" - "\x00\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00" - "\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00" - "\x00\x18\x7e\xdb\xdb\xd8\x78\x1c\x1e\x9b\xdb\x7e\x18\x18" - "\x00\x00\xe6\xa6\xec\x1c\x18\x30\x70\x6e\xca\xce\x00\x00" - "\x00\x00\x38\x6c\x38\x30\x76\x7e\xcc\xcc\xcc\x76\x00\x00" - "\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x6c\x38\xfe\x38\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x06\x06\x0c\x0c\x18\x30\x30\x60\xc0\xc0\x00\x00" - "\x00\x00\x7c\xc6\xce\xd6\xd6\xd6\xd6\xe6\xc6\x7c\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x7c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xcc\xfe\x0c\x0c\x1e\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x0c\x18\x30\x60\x60\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xdc\xc0\x7e\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x06\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00" - "\x00\x00\x7c\x60\x60\x60\x60\x60\x60\x60\x60\x7c\x00\x00" - "\x00\x00\xc0\xc0\x60\x60\x30\x18\x18\x0c\x06\x06\x00\x00" - "\x00\x00\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x7c\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x1c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x1c\x36\x30\x30\xfc\x30\x30\x30\x30\x78\x00\x00" - "\x00\x00\x00\x00\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc" - "\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\xf0" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0e" - "\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00" - "\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x30\x30\x60\xc0" - "\x00\x00\x00\x00\x00\xfe\x86\x0c\x18\x30\x62\xfe\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x00\x38\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x76\xdc\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3f\x6c\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcf\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x66\x3c\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x0e\x18\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x30\x1e" - "\x6c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x18\x18\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x0c\x18\x20\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x7e\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\xf6\xf6\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x0c\x78" - "\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x0c\x78" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\x18\x3c\x66\x00\x00\x00\x00" - "\x02\x04\x7c\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\x7c\x40\x80" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x30\x1c" - "\x0c\x18\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xc6\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xfe\x00" - "\x00\x00\x38\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xce\x18\x0e" - "\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x0c\x78" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x0c\x78" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\xce\xc6\x7c\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\x7c\x00\x00" - "\x7c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xc6\xc6\xc6\x7c\x0c\x78" - "\x00\x00\xff\xdb\x99\x18\x1e\x3c\x78\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00" - "\x66\x3c\x00\xfe\xc6\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x18\x0e" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x0e" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x30\xe0" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x18\xf0" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x70" - "\x00\x00\x6c\x38\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00" - "\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x3c\x60\x38\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x36\x1c\x00\x00" - "\x00\x00\xdc\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00" - "\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x00\xdc\xfe\xf6\xe6\xc6\xc6\x06\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xcc\xcc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x19\x7f\xd8\xd8\xd8\x6f\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x18\x1e" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x18\x18\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x7e\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x0c\x78" - "\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x0c\x78" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x06\x7c\xce\xd6\xd6\xd6\xe6\x7c\xc0\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x30\x1e" - "\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x10\x38\x6c\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x76\xdc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xfc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x18\x18\x00\x18" - "\x00\xee\x66\xcc\x00\x00\x00\x00" - "\x00\x6c\xfe\x6c\x6c\x6c\xfe\x6c" - "\x18\x7e\xdb\xd8\x7e\x1b\xdb\x7e" - "\x00\x00\xc6\xcc\x18\x30\x66\xc6" - "\x00\x38\x6c\x3a\x7e\xcc\xcc\x76" - "\x00\x38\x18\x70\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x30\x30\x18\x0c" - "\x00\x30\x18\x0c\x0c\x0c\x18\x30" - "\x00\x00\x6c\x38\xfe\x38\x6c\x00" - "\x00\x00\x18\x18\x7e\x18\x18\x00" - "\x00\x00\x00\x00\x00\x38\x18\x70" - "\x00\x00\x00\x00\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18" - "\x00\x06\x0c\x18\x18\x30\x60\xc0" - "\x00\x7c\xc6\xce\xd6\xe6\xc6\x7c" - "\x00\x18\x78\x18\x18\x18\x18\x7e" - "\x00\x7c\xc6\x8c\x38\x60\xc2\xfe" - "\x00\x7c\xc6\x06\x3c\x06\xc6\x7c" - "\x00\x1c\x3c\x6c\xcc\xfe\x0c\x1e" - "\x00\xfe\xc0\xfc\x06\x06\xc6\x7c" - "\x00\x7c\xc6\xc0\xfc\xc6\xc6\x7c" - "\x00\xfe\xc6\x06\x0c\x18\x30\x30" - "\x00\x7c\xc6\xc6\x7c\xc6\xc6\x7c" - "\x00\x7c\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x18\x18\x00\x18\x18\x00" - "\x00\x00\x18\x18\x00\x18\x18\x70" - "\x00\x00\x18\x30\x60\x30\x18\x00" - "\x00\x00\x00\xfe\x00\xfe\x00\x00" - "\x00\x00\x30\x18\x0c\x18\x30\x00" - "\x00\x7c\xc6\xcc\x18\x18\x00\x18" - "\x00\x7c\xc6\xc6\xde\xdc\xc0\x7e" - "\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6" - "\x00\xfc\x66\x66\x7c\x66\x66\xfc" - "\x00\x3c\x66\xc2\xc0\xc2\x66\x3c" - "\x00\xf8\x6c\x66\x66\x66\x6c\xf8" - "\x00\xfe\x66\x60\x7c\x60\x66\xfe" - "\x00\xfe\x66\x60\x7c\x60\x60\xf0" - "\x00\x7c\xc6\xc0\xce\xc6\xc6\x7c" - "\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6" - "\x00\x3c\x18\x18\x18\x18\x18\x3c" - "\x00\x3c\x18\x18\x18\xd8\xd8\x70" - "\x00\xc6\xcc\xd8\xf0\xd8\xcc\xc6" - "\x00\xf0\x60\x60\x60\x62\x66\xfe" - "\x00\xc6\xc6\xee\xfe\xd6\xc6\xc6" - "\x00\xc6\xe6\xf6\xde\xce\xc6\xc6" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\xfc\x66\x66\x7c\x60\x60\xf0" - "\x00\x7c\xc6\xc6\xd6\xd6\x7c\x06" - "\x00\xfc\x66\x66\x7c\x78\x66\xe6" - "\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c" - "\x00\xff\xdb\x99\x18\x18\x18\x3c" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\xc6\xc6\xc6\xc6\x6c\x38\x10" - "\x00\xc6\xc6\xd6\xd6\xfe\xee\x6c" - "\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6" - "\x00\x66\x66\x66\x3c\x18\x18\x3c" - "\x00\xfe\xc6\x8c\x38\x62\xc6\xfe" - "\x00\x7c\x60\x60\x60\x60\x60\x7c" - "\x00\xc0\x60\x30\x30\x18\x0c\x06" - "\x00\x7c\x0c\x0c\x0c\x0c\x0c\x7c" - "\x00\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x38\x30\x18\x00\x00\x00\x00" - "\x00\x00\x00\x78\x0c\x7c\xcc\x76" - "\x00\xe0\x60\x7c\x66\x66\x66\xfc" - "\x00\x00\x00\x78\xcc\xc0\xcc\x78" - "\x00\x0e\x0c\x7c\xcc\xcc\xcc\x7e" - "\x00\x00\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x1c\x36\x30\xfc\x30\x30\x78" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xe0\x60\x7c\x66\x66\xe6" - "\x18\x18\x00\x38\x18\x18\x18\x3c" - "\x0c\x0c\x00\x1c\x0c\x0c\xcc\x78" - "\x00\xe0\x60\x66\x6c\x78\x6c\xe6" - "\x00\x38\x18\x18\x18\x18\x18\x3c" - "\x00\x00\x00\xec\xfe\xd6\xd6\xc6" - "\x00\x00\x00\xdc\x66\x66\x66\x66" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0e\x0e" - "\x00\x00\x00\xdc\x66\x60\x60\xf0" - "\x00\x00\x00\x7c\xc0\x7c\x06\xfc" - "\x00\x30\x30\xfc\x30\x30\x36\x1c" - "\x00\x00\x00\xcc\xcc\xcc\xcc\x76" - "\x00\x00\x00\xc6\xc6\x6c\x38\x10" - "\x00\x00\x00\xc6\xd6\xd6\xfe\x6c" - "\x00\x00\x00\xc6\x6c\x38\x6c\xc6" - "\x00\x00\x00\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\x00\xfe\x8c\x38\x62\xfe" - "\x00\x0e\x18\x18\x70\x18\x18\x0e" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x70\x18\x18\x0e\x18\x18\x70" - "\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x00\x7c\xc6\xc6\xfe\xc6\xc6" - "\x0c\x18\x7c\xc6\xc6\xfe\xc6\xc6" - "\x7c\x82\x7c\xc6\xc6\xfe\xc6\xc6" - "\xc6\x7c\x7c\xc6\xc6\xfe\xc6\xc6" - "\xc6\x38\x6c\xc6\xc6\xfe\xc6\xc6" - "\x38\x6c\x38\x6c\xc6\xfe\xc6\xc6" - "\x00\x3e\x78\xd8\xfe\xd8\xd8\xde" - "\x78\x30\x30\x30\x30\x78\x30\x1c" - "\x6c\x38\x7c\xc6\xc0\xc0\xc6\x7c" - "\x0e\x18\xfe\x62\x78\x60\x66\xfe" - "\xfe\x66\x60\x78\x60\x66\xfe\x1c" - "\x6c\xfe\x66\x60\x7c\x60\x66\xfe" - "\x18\xfe\x66\x60\x7c\x60\x66\xfe" - "\x0c\x18\x3c\x18\x18\x18\x18\x3c" - "\x3c\x42\x3c\x18\x18\x18\x18\x3c" - "\x3c\x00\x3c\x18\x18\x18\x18\x3c" - "\x00\xf8\x6c\x66\xf6\xf6\x6c\xf8" - "\xc6\xe6\xf6\xde\xce\xc6\x0c\x38" - "\x7c\x00\x7c\xc6\xc6\xc6\xc6\x7c" - "\xc6\xcc\xf8\xd8\xcc\xc6\x0c\x38" - "\x7c\x82\x7c\xc6\xc6\xc6\xc6\x7c" - "\x76\xdc\x7c\xc6\xc6\xc6\xc6\x7c" - "\xc6\x7c\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x03\x7e\xce\xde\xd6\xf6\xe6\xfc" - "\xc6\xc6\xc6\xc6\xc6\x7c\x30\x1e" - "\x1c\x30\xc6\xc6\xc6\xc6\xc6\x7c" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\x7c" - "\xc6\x00\xc6\xc6\xc6\xc6\xc6\x7c" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\x7c" - "\x7c\x00\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\x7c\xc6\xfc\xc6\xc6\xfc\xc0" - "\x00\x00\x00\x00\x00\x00\xc6\xfe" - "\x38\x6c\xc6\xfe\xc6\xce\x18\x0e" - "\x00\x00\x00\xe6\x6c\x78\x6c\xe6" - "\xfc\x66\x7e\x6c\x66\xe6\x18\x70" - "\x00\x42\x3c\x66\x66\x3c\x42\x00" - "\x76\xdc\x38\x18\x18\x18\x18\x3c" - "\xf0\x60\x60\x62\x66\xfe\x18\x70" - "\x3c\x66\x38\x6c\x6c\x38\xcc\x78" - "\x66\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x7c\xc0\x7c\x06\xc6\x7c" - "\x7c\x00\xfe\x60\x7c\x60\x66\xfe" - "\x3c\x66\xc0\xce\x66\x3e\x18\x70" - "\x00\xff\x99\x1e\x3c\x78\x18\x3c" - "\x00\x00\x00\x00\x00\x3c\x00\x00" - "\x6c\x38\xfe\x8c\x18\x32\x66\xfe" - "\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x0f" - "\x00\x00\x00\x00\x00\x00\x10\x1c" - "\x00\x00\xdc\x76\x66\xf0\x30\xe0" - "\x18\x30\x00\x00\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x38\x18\x18\x3c" - "\x38\x18\x18\x18\x18\x3c\x18\x70" - "\x6c\x38\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x04\x1c" - "\x00\x6c\x38\x7c\xc0\x7c\x06\xfc" - "\x00\x7c\x00\x7c\xc6\xfe\xc0\x7c" - "\x38\x60\x30\x7e\xcc\x7c\x0c\xf8" - "\x00\x30\x30\xfc\x30\x38\x76\x1c" - "\x00\xdc\xfe\xf6\xc6\xc6\xc6\xdc" - "\x6c\x38\x00\xfe\x8c\x38\x62\xfe" - "\x00\x00\xdc\xfe\xf6\xc6\x06\x1c" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x00\x78\x0c\x7c\xcc\x76" - "\x0c\x18\x20\x78\x0c\x7c\xcc\x76" - "\x00\x78\x84\x78\x0c\x7c\xcc\x76" - "\x6c\x38\x00\x78\x0c\x7c\xcc\x76" - "\x00\xcc\x00\x78\x0c\x7c\xcc\x76" - "\x00\x38\x6c\x78\x0c\x7c\xcc\x76" - "\x00\x00\x00\x6e\x3b\x7e\xd8\x7e" - "\x18\x00\x38\x18\x18\x3c\x18\x0e" - "\x00\xcc\x78\x78\xcc\xc0\xcc\x78" - "\x0c\x18\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x00\x7c\xc6\xfe\xc0\x7a\x1e" - "\x00\x6c\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x38\x00\x7c\xc6\xfe\xc0\x7c" - "\x0c\x18\x20\x38\x18\x18\x18\x3c" - "\x00\x3c\x42\x38\x18\x18\x18\x3c" - "\x00\x3c\x00\x38\x18\x18\x18\x3c" - "\x00\x0c\x3e\x0c\x7c\xcc\xcc\x76" - "\x00\x00\xdc\xe6\xc6\xc6\x18\x70" - "\x00\x7c\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\xe0\x66\x6c\x78\x6c\xe6\x1c" - "\x7c\xc6\x00\x7c\xc6\xc6\xc6\x7c" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x6c\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x00\x18\x00\x7e\x00\x18\x00" - "\x00\x06\x7c\xce\xd6\xe6\x7c\xc0" - "\x00\x00\xcc\xcc\xcc\x7e\x30\x1c" - "\x0c\x18\x20\xcc\xcc\xcc\xcc\x76" - "\x78\xcc\x00\xcc\xcc\xcc\xcc\x76" - "\x00\xcc\x00\xcc\xcc\xcc\xcc\x76" - "\x76\xdc\x00\xcc\xcc\xcc\xcc\x76" - "\x00\x78\x00\xcc\xcc\xcc\xcc\x76" - "\x18\x00\x00\x00\x00\x00\x00\x00" - , "ISO-8859-4 Baltic (VGA 9bit mapped)", CIOLIB_ISO_8859_4} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x63\x63\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00" - "\x00\x18\x7e\xdb\xdb\xe8\x78\x3c\x1e\x17\xdb\xdb\x7e\x18\x18\x00" - "\x00\xe6\xa6\xec\x0c\x18\x18\x30\x30\x60\x6e\xca\xce\x00\x00\x00" - "\x00\x38\x6c\x6c\x6c\x38\x38\x6d\xcd\xc6\xc6\xcb\x73\x00\x00\x00" - "\x00\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x66\x66\x3c\xff\xff\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x30\x60\xc3\xff\x00\x00\x00" - "\x00\xfe\xc6\x0c\x18\x3c\x06\x03\x03\x03\xc3\x66\x3c\x00\x00\x00" - "\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcd\xff\x0d\x0c\x1e\x00\x00\x00" - "\x00\xfe\xc0\xc0\xc0\xfc\xe6\xc3\x03\x03\xc3\x66\x3c\x00\x00\x00" - "\x00\x3c\x66\xc6\xc0\xfc\xe6\xc3\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x66\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\x67\x3f\x03\x63\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x03\x06\x0c\x18\x30\x70\x30\x18\x0c\x06\x03\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x7e\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc0\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\xc0\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x7e\xc3\xc3\xdf\xdb\xdb\xde\xc0\xc0\x7c\x00\x00\x00" - "\x00\x10\x38\x7c\xee\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\xfe\x63\x63\x63\x63\x7e\x63\x63\x63\x63\x63\xfe\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfc\x66\x63\x63\x63\x63\x63\x63\x63\x63\x66\xfc\x00\x00\x00" - "\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00\x00" - "\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x60\x60\xf8\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x67\x3d\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x0f\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x00\x00\x00" - "\x00\xc3\xe7\xff\xff\xdb\xdb\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00" - "\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfe\x63\x63\x63\x63\x63\x7e\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xcb\xcf\x7e\x3c\x06\x07\x00" - "\x00\xfe\x63\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\xf7\x00\x00\x00" - "\x00\x7e\xc3\xc3\xc0\xc0\x7e\x03\x03\x03\xc3\xc3\x7e\x00\x00\x00" - "\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00" - "\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xe7\x7e\x3c\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00\x00" - "\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00\x00" - "\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x00\x18\x3c\x66\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x06\x3e\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xde\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x0e\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c" - "\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xc3\xc3\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xde\x63\x63\x63\x63\x63\x63\x7e\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x0f" - "\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\x7c\x38\x38\x7c\xee\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x0c\x18\x70" - "\x00\x00\x00\x00\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x70\x18\x18\x18\x18\x1e\x1e\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10" - "\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18" - "\xd8\x83\xda\x13\xd8\x83\xda\x13\xd8\x83\xda\x13\xd8\x83\xda\x13" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x00\x7c\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x42\x7e\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xf8\x70\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\x88\x10\x60\x88\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x6c\x6c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x3c\x42\x99\xa1\xa1\x99\x42\x3c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xce\xdb\xdb\xfb\xdb\xdb\xce\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x02\x06\x3c\x60\x60\x7c\x66\x66\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x06\x00" - "\x00\x00\x00\x00\x00\x00\x1e\x36\x36\x66\x66\x66\xff\xc3\xc3\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x18\x7e\xdb\xdb\xdb\xdb\x7e\x18\x18\x3c" - "\x00\x00\x00\x00\x00\x00\x7e\x32\x32\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xce\xd6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x38\x38\xc6\xc6\xce\xd6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1e\x36\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xcc\xcc\xfc\x6c\xcc\xce\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\x54\x7c\x54\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\x66\x66\x7c\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf0\x60\x60\x7c\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xf6\xde\xde\xf6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3c\x66\x06\x0c\x06\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3e\x67\x03\x1f\x03\x67\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x03\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xb0\x30\x3e\x33\x33\x7e\x00\x00\x00" - "\x00\x00\x00\xce\xdb\xdb\xdb\xfb\xdb\xdb\xdb\xdb\xce\x00\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfe\x62\x62\x60\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x06\x00" - "\x00\x00\x00\x1e\x36\x66\x66\x66\x66\x66\x66\x66\xff\xc3\x81\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\x3c\x18\x7e\xdb\xdb\xdb\xdb\xdb\x7e\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xfe\x62\x62\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xce\xce\xd6\xe6\xe6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x38\x38\xc6\xc6\xce\xce\xd6\xe6\xe6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xe6\x66\x6c\x6c\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x3f\x66\x66\x66\x3e\x3e\x66\x66\x66\xe7\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xd6\xd6\x54\x54\x7c\x7c\x54\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\xc3\xc3\xc3\xc3\xf3\xdb\xdb\xdb\xdb\xf3\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00\x00\x00" - "\x00\x00\x00\x78\xcc\x06\x26\x3e\x26\x06\x06\xcc\x78\x00\x00\x00" - "\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03\x03\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00" - "\x00\x00\x00\xf8\xb0\x30\x30\x3c\x36\x36\x36\x36\x7c\x00\x00\x00" - , NULL, NULL, "Russian koi8-r (b)", CIOLIB_KOI8_R} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x18\x00\x18\x18\x00\x00" - "\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00" - "\x00\x18\x7e\xdb\xdb\xe8\x78\x3c\x1e\x17\x1b\xdb\xdb\x7e\x18\x18" - "\x00\x00\xe6\xa6\xec\x0c\x18\x18\x30\x30\x60\x6e\xca\xce\x00\x00" - "\x00\x00\x38\x6c\x6c\x6c\x38\x38\x6d\xcd\xc6\xc6\xcb\x73\x00\x00" - "\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00" - "\x00\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x66\x66\x3c\xff\xff\x3c\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x7e\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x00\x00\x7c\xc6\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\xc6\x7c\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x30\x60\xc3\xff\x00\x00" - "\x00\x00\xfe\xc6\x0c\x18\x3c\x06\x03\x03\x03\xc3\x66\x3c\x00\x00" - "\x00\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcd\xff\x0d\x0c\x1e\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xe6\xc3\x03\x03\xc3\x66\x3c\x00\x00" - "\x00\x00\x3c\x66\xc6\xc0\xfc\xe6\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x66\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\x67\x3f\x03\x63\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x7e\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x00\x00\x7e\xc3\xc3\xdf\xdb\xdb\xde\xc0\xc0\x7c\x00\x00" - "\x00\x00\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x63\x63\x63\x63\x63\xfe\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfc\x66\x63\x63\x63\x63\x63\x63\x63\x63\x66\xfc\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x60\x60\xf8\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0f\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xc3\xe7\xff\xff\xdb\xdb\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x63\x7e\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xcb\xcf\x7e\x3c\x06\x07" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\x66\xf7\x00\x00" - "\x00\x00\x7e\xc3\xc7\xc0\x60\x3c\x06\x03\xe3\xe3\xc3\x7e\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xe7\x7e\x3c\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00" - "\x00\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00" - "\x00\x00\x18\x3c\x66\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xde\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0e\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xe3\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xc3\xc3\xc3\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xde\x63\x63\x63\x63\x63\x63\x7e\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0f" - "\x00\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc3\xc3\x66\x66\x3c\x18\x18\x30\x30\xe0" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x70\x18\x18\x18\x18\x1e\x1e\x18\x18\x18\x18\x70\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xff\x00" - "\x00\x00\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xce\x18\x0f" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\x66\xf7\x18\xf0" - "\x00\x00\x00\x00\x82\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x82\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x0e\x3c" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x3c\x7e\xc3\xc7\xc0\x60\x3c\x06\x03\xe3\xe3\xc3\x7e\x00\x00" - "\x7e\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x66\x3c\x0c\x78" - "\x00\x00\xff\xdb\x99\x18\x1b\x1e\x3c\x78\xd8\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x7c\x00\x00\x00\x00\x00" - "\x6c\x38\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x18\x0f" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x1e" - "\x00\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x18\xf0" - "\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x0c\x78" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x78\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x3c\x60\x30\x00\x7b\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x30\x36\x1c\x00\x00" - "\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00" - "\x00\x00\x00\x6c\x38\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\x06\x1c\x00" - "\x00\x7c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x20\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x76\xdc\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x6c\x6c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x00\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3f\x6c\xcc\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x66\x3c\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00" - "\x0e\x18\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x18\x0f" - "\x66\x24\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x18\x18\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x0e\x18\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x7e\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfc\x66\x63\x63\x63\xf3\xf3\x63\x63\x63\x66\xfc\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x0c\x78" - "\x7e\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x06\x3c" - "\x3c\x66\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x76\xdc\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x66\x66\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x01\x3d\x66\xc7\xcb\xcb\xdb\xdb\xdb\xd3\xd3\x66\xbc\x80\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x19\x0e" - "\x18\x30\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xc6\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xfe\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xdc\xc6\xc3\xc3\xc3\xc3\xc6\xcc\xc0\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6e\x1b\x1b\x7f\xd8\xd8\xd8\x6f\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x30\x1c" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x30\x1e" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x10\x38\x10\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0e\x06\x7f\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x0c\x78" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x18\xf0" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7c\xce\xde\xd6\xd6\xf6\xe6\x7c\xc0\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x60\x3c" - "\x00\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x10\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, NULL, "ISO-8859-4 Baltic wide", CIOLIB_ISO_8859_4} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xf8\x60\x60\x60\x7c\x66\x66\x66\x66\x6c\x00\x00\x00\x00" - "\x18\x30\x00\x7e\x60\x60\x60\x60\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xf8\xc0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\xd8\xd8\xde\xdb\xdb\xdb\xde\x00\x00\x00\x00" - "\x00\x00\xd8\xd8\xd8\xd8\xd8\xfe\xdb\xdb\xdb\xde\x00\x00\x00\x00" - "\x00\x00\xfc\x30\x30\x30\x3c\x36\x36\x36\x36\x36\x00\x00\x00\x00" - "\x18\x30\x00\xc6\xcc\xd8\xf0\xf8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x28\x10\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x88\x8a\xcd\xea\xb8\x98\x8b\x88\x8b\x88\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x60\x60\x60\xf8\x60\x7c\x66\x66\x66\x66\x0c\x00\x00\x00" - "\x00\x00\x18\x30\x00\x7c\x60\x60\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x04\x04\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\x00\x00\x00\x18\x38\x78\xde\xdb\xdb\xde\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\xd8\xd8\xfe\xdb\xdb\xde\x00\x00\x00\x00" - "\x00\x00\x30\x30\x30\xfc\x30\x3c\x36\x36\x36\x36\x00\x00\x00\x00" - "\x00\x00\x18\x30\x00\xc4\xcc\xd8\xf0\xd8\xcc\xcc\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x28\x10\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x00\xfe\xc6\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\xf8\x60\x60\x60\x7c\x66\x66\x66\x6c\x00\x00\x00" - "\x18\x30\x00\x7e\x60\x60\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xf8\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x18\x38\x78\xd8\xde\xdb\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\xd8\xd8\xd8\xd8\xfe\xdb\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\xfc\x30\x30\x30\x3c\x36\x36\x36\x36\x00\x00\x00" - "\x18\x30\x00\xcc\xd8\xf0\xf0\xd8\xcc\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x28\x10\x00\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x88\x8a\xcd\xea\xb8\x98\x8b\x88\x8b\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x60\x60\xf8\x60\x7c\x66\x66\x66\x66\x0c\x00\x00" - "\x00\x00\x18\x30\x00\x7c\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xf0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x04\x04\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\x00\x00\x00\x38\x78\xde\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\xd8\xfe\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x30\x30\xfc\x30\x3c\x36\x36\x36\x36\x00\x00\x00" - "\x00\x00\x18\x30\x00\xcc\xd8\xf0\xd8\xcc\xcc\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00" - "\x00\x00\x28\x10\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\xf8\x60\x60\x7c\x66\x66\x6c\x00" - "\x18\x7e\x60\x60\x60\x60\x60\x00" - "\x3c\x66\xc0\xf8\xc0\x66\x3c\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\x30\x78\x30\x30\x30\x30\x78\x00" - "\x48\x78\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\x38\x78\xd8\xde\xdb\xdb\xde\x00" - "\xd8\xd8\xd8\xfe\xdb\xdb\xde\x00" - "\xfc\x30\x30\x3c\x36\x36\x36\x00" - "\x18\xd6\xcc\xf8\xf8\xcc\xc6\x00" - "\x00\x00\x00\x78\x00\x00\x00\x00" - "\x18\x66\x66\x3e\x06\x66\x3c\x00" - "\xc6\xc6\xc6\xc6\xfe\x38\x38\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - "\x8a\xcd\xea\xb8\x9b\x88\x8b\x00" - "\x24\x00\x3c\x66\x7e\x60\x3c\x00" - "\x60\x60\xf8\x60\x7c\x66\x66\x0c" - "\x18\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x7c\xc0\xf8\xc0\x7c\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x20\x00\x70\x30\x30\x30\x78\x00" - "\x50\x00\x70\x30\x30\x30\x78\x00" - "\x08\x00\x1c\x0c\x0c\xcc\xcc\x78" - "\x00\x00\x38\x78\xde\xdb\xde\x00" - "\x00\x00\xd8\xd8\xfe\xdb\xde\x00" - "\x30\x30\xfc\x30\x3c\x36\x36\x00" - "\x18\x10\xcc\xd8\xf0\xd8\xcc\x00" - "\x7e\xc0\x7c\xc6\x7c\x06\xfc\x00" - "\x18\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\xc6\xc6\xfe\x38\x38\x00" - , "ISO-8859-5 Cyrillic", CIOLIB_ISO_8859_5} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x18\x18\x7e\xdb\xd8\xd8\x7e\x1b\x1b\xdb\xdb\x7e\x18\x18\x00\x00" - "\x00\x00\xe6\xac\xec\x18\x18\x30\x30\x6e\x6a\xce\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x6c\x38\x76\xdc\xdc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00\x00" - "\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x30\x00\x00\x00\x00" - "\x00\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00\x00" - "\x00\x38\x6c\xce\xde\xde\xd6\xf6\xf6\xe6\x6c\x38\x00\x00\x00\x00" - "\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\xfc\x8c\x18\x30\x38\x0c\x06\x06\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\xfe\xc0\xc0\xf8\xcc\x06\x06\x06\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x38\x6c\xc0\xc0\xf8\xec\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\x6c\x38\x6c\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\xc6\x6e\x3e\x06\x06\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x60\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x3c\x66\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x7c\xee\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\xfe\x66\x62\x60\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\xfe\x66\x62\x60\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc0\xc0\xce\xc6\xc6\xce\x7a\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xe6\x66\x6c\x6c\x78\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x82\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xde\xfe\x7c\x0e\x06\x00\x00" - "\x00\xfc\x66\x66\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc0\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" - "\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xfe\xc6\x8c\x0c\x18\x10\x30\x60\x62\xc6\xfe\x00\x00\x00\x00" - "\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x00\x00\x00\x00" - "\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xdc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x1c\x0c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\xcc\x78" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c\x1e" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\x7c\x38\x7c\xee\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x7c\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\x0c\x38\x60\xc6\xfe\x00\x00\x00\x00" - "\x0e\x18\x18\x18\x18\x30\xe0\x30\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x70\x18\x18\x18\x18\x0c\x07\x0c\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x30\x4c\x52\xba\x94\x64\x18\x00\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x60\x60\x60\x6c\x6c\x6c\x3f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00\x30\x78\x30\x00\x00\x00" - "\x00\x60\x30\x38\x1c\x1c\x1c\x1c\x1c\x1c\x38\x30\x60\x00\x00\x00" - "\x00\x0c\x18\x38\x70\x70\x70\x70\x70\x70\x38\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6c\x36\x1b\x1b\x36\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x36\x6c\xd8\xd8\x6c\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00\x00" - "\x00\x60\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x3c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x7c\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xc2\xe6\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x92\x92\x00\x00\x00\x00" - "\x00\x03\x76\xdc\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x46\x96\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xde\xcf\x7b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\x6a\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\xc0\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00" - "\x00\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x66\x66\x66\x3e\x06\x0c\xd8\xfe\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f\x00" - "\x00\xc0\xc0\xc0\xfe\xc0\xc0\xc0\xc0\xf8\x0c\x0c\x78\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xc0\xc0\xc0\xc0\xf8\x0c\x38\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00" - "\x00\x7c\xc6\xc6\xc6\xcf\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xcf\xd6\xd6\xd6\xcc\xc0\xc0\xc0\x00" - "\x00\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x0c\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00" - "\x00\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x00\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xce\xc0\xc0\xc0\x00" - "\x00\xc0\x7e\xfb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\x78\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c\x00" - "\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xf0\x3c\x0e\x0c\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x66\x66\x06\x06\x06\x6c\xd8\x6e\x00\x00\x00\x00" - "\x00\x30\x7e\x0c\x18\x30\x70\xd8\xd8\xcc\xce\x76\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00" - "\x00\x0e\xdb\x70\x30\x78\xcc\xcc\xcc\xcc\xdc\x6c\x00\x00\x00\x00" - "\x00\x1c\x36\x60\x60\xf8\x6c\x66\x66\x66\x6e\x3a\x00\x00\x00\x00" - "\x00\xcf\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x78\xcc\x0c\x1c\x38\x6c\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\xdc\x70\x00" - "\x00\xe0\x60\x60\x66\x66\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x66\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00" - "\x00\xf8\x0c\x7c\xcc\xcc\xc0\xc0\xc0\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\xcc\xcc\xcc\x0c\x18\x30\x60\xc0\x7e\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\x0c\x0c\x0c\xd8\x70\x30\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xc0\x7e\x00" - "\x00\x7e\xdb\xdb\xdb\xdb\xdb\xdb\x1b\x1b\x03\x03\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\x7f\x03\x03\x03\x00" - "\x00\x60\xf0\xd8\xcc\xc6\x66\x36\x16\x1c\xd8\xfe\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\x70\xd8\xcc\xcc\x6c\x38\x30\x60\xc0\x7e\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcf\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00\x00\x00" - "\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0f\x00\x00\x00\x00" - "\x00\x0c\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f\x00" - "\x00\x78\xcc\xcc\xc0\x60\x30\x18\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xd6\xd6\xd6\xd6\xd6\x76\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00" - "\x00\x78\xcc\xcc\xcc\x78\xcc\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\xc0\xc0\xf0\xd8\xd8\xd8\xd8\xd8\xce\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00\x00" - "\x00\x10\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\xdc\xd6\xd6\xd6\xd6\xd6\x76\x10\x10\x10\x00" - "\x00\x3c\x66\x66\x66\x66\x7c\x60\x60\xfe\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x66\x66\x66\x66\x7c\x60\xfe\x60\x60\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x00\x00\x00\x00" - "\x00\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x10\x10\x10\x00" - "\x00\x38\x38\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\xfe" - "\x66\x66\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00" - "\x18\x7e\xdb\xd8\xd8\x7e\x1b\x1b\xdb\xdb\x7e\x18\x18\x00" - "\x00\xe6\xac\xec\x18\x18\x30\x30\x6e\x6a\xce\x00\x00\x00" - "\x38\x6c\x6c\x6c\x38\x76\xdc\xdc\xcc\xcc\x76\x00\x00\x00" - "\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x30\x00\x00\x00" - "\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00" - "\x38\x6c\xce\xde\xde\xd6\xf6\xf6\xe6\x6c\x38\x00\x00\x00" - "\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x38\x6c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\xfc\x8c\x18\x30\x38\x0c\x06\x06\xc6\x6c\x38\x00\x00\x00" - "\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\xfe\xc0\xc0\xf8\xcc\x06\x06\x06\xc6\x6c\x38\x00\x00\x00" - "\x38\x6c\xc0\xc0\xf8\xec\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00" - "\x38\x6c\xc6\xc6\x6c\x38\x6c\xc6\xc6\x6c\x38\x00\x00\x00" - "\x38\x6c\xc6\xc6\xc6\x6e\x3e\x06\x06\x6c\x38\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x60\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x3c\x66\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x10\x38\x7c\xee\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\xf8\x6c\x66\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\xfe\x66\x62\x60\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00" - "\xfe\x66\x62\x60\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc0\xc0\xce\xc6\xc6\xce\x7a\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\xe6\x66\x6c\x6c\x78\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\xf0\x60\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x82\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\xfc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xde\xfe\x7c\x0e\x06\x00" - "\xfc\x66\x66\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x7c\xc6\xc6\xc0\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00" - "\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00" - "\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00" - "\xfe\xc6\x8c\x0c\x18\x10\x30\x60\x62\xc6\xfe\x00\x00\x00" - "\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x00\x00\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xdc\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x1c\x0c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\xcc" - "\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc" - "\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\x60" - "\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c" - "\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00" - "\x10\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xee\x7c\x38\x7c\xee\xc6\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x7c" - "\x00\x00\x00\x00\xfe\xc6\x0c\x38\x60\xc6\xfe\x00\x00\x00" - "\x18\x18\x18\x18\x30\xe0\x30\x18\x18\x18\x18\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00" - "\x18\x18\x18\x18\x0c\x07\x0c\x18\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x30\x4c\x52\xba\x94\x64\x18\x00\x00\x00\x00" - "\xe0\x60\x60\x60\x60\x60\x60\x6c\x6c\x6c\x3f\x00\x00\x00" - "\x00\x00\x00\x00\x30\x78\x30\x00\x00\x30\x78\x30\x00\x00" - "\x60\x30\x38\x1c\x1c\x1c\x1c\x1c\x1c\x38\x30\x60\x00\x00" - "\x0c\x18\x38\x70\x70\x70\x70\x70\x70\x38\x18\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x6c\x36\x1b\x1b\x36\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\xd8\x6c\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00" - "\x60\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x3c\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc2\xe6\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x92\x92\x92\x00\x00\x00" - "\x03\x76\xdc\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x46\x96\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xde\xcf\x7b\x00\x00\x00" - "\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\x6a\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\xc0" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c" - "\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x3c\x66\x66\x66\x66\x66\x3e\x06\x0c\xd8\xfe\xc3\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f" - "\xc0\xc0\xc0\xfe\xc0\xc0\xc0\xc0\xf8\x0c\x0c\x78\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xc0\xc0\xc0\xc0\xf8\x0c\x38\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe" - "\x7c\xc6\xc6\xc6\xcf\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xfc\xc6\xcf\xd6\xd6\xd6\xcc\xc0\xc0\xc0" - "\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x0c\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00\x00" - "\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e" - "\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xce\xc0\xc0\xc0" - "\xc0\x7e\xfb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\x78\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c" - "\x18\x30\x18\x0c\x18\x30\x60\xc0\xf0\x3c\x0e\x0c\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x3c\x66\x66\x66\x66\x06\x06\x06\x6c\xd8\x6e\x00\x00\x00" - "\x30\x7e\x0c\x18\x30\x70\xd8\xd8\xcc\xce\x76\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f" - "\x0e\xdb\x70\x30\x78\xcc\xcc\xcc\xcc\xdc\x6c\x00\x00\x00" - "\x1c\x36\x60\x60\xf8\x6c\x66\x66\x66\x6e\x3a\x00\x00\x00" - "\xcf\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x0f\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x78\xcc\x0c\x1c\x38\x6c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\xdc\x70" - "\xe0\x60\x60\x66\x66\x66\x66\x66\x66\x66\x3c\x00\x00\x00" - "\xe0\x60\x60\x60\x66\x66\x66\x66\x66\x66\x3e\x00\x00\x00" - "\xf8\x0c\x7c\xcc\xcc\xc0\xc0\xc0\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x78\xcc\xcc\xcc\x0c\x18\x30\x60\xc0\x7e" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\x0c\x0c\x0c\xd8\x70\x30\x18\x00\x00" - "\x00\x00\x00\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xc0\x7e" - "\x7e\xdb\xdb\xdb\xdb\xdb\xdb\x1b\x1b\x03\x03\x00\x00\x00" - "\x00\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\x7f\x03\x03\x03" - "\x60\xf0\xd8\xcc\xc6\x66\x36\x16\x1c\xd8\xfe\xc3\x00\x00" - "\x00\x00\x00\x00\x70\xd8\xcc\xcc\x6c\x38\x30\x60\xc0\x7e" - "\x78\xcc\xcc\xcc\xcc\xcc\xcf\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0f\x00\x00\x00" - "\x0c\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f" - "\x78\xcc\xcc\xc0\x60\x30\x18\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xdc\xd6\xd6\xd6\xd6\xd6\x76\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0" - "\x78\xcc\xcc\xcc\x78\xcc\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78" - "\xc0\xc0\xf0\xd8\xd8\xd8\xd8\xd8\xce\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00" - "\x10\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x00\x00\x00" - "\x00\x10\x10\x10\xdc\xd6\xd6\xd6\xd6\xd6\x76\x10\x10\x10" - "\x3c\x66\x66\x66\x66\x7c\x60\x60\xfe\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x66\x66\x66\x66\x7c\x60\xfe\x60\x60" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x78\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x00\x00\x00" - "\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x10\x10\x10" - "\x38\x38\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x12\xca\x2c\x79\x9e\x34\x53\x48" - "\xc0\xc0\xc0\xd8\xd8\xd8\x76\x00" - "\x00\x00\x30\x30\x00\x30\x30\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x00\x6c\x36\x1b\x36\x6c\x00\x00" - "\x00\x36\x6c\xd8\x6c\x36\x00\x00" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\x00\x00\x30\x30\x00\x00" - "\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x70\x3f\x00\x00" - "\x00\x00\x00\x00\xdb\xdb\x00\x00" - "\x01\x0e\x70\x80\x00\x00\x00\x00" - "\x1c\x30\x40\x00\x00\x00\x00\x00" - "\x1e\x35\x26\x00\x00\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\x6f\x3b\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x7c\xc6\xc6\xc0\xc0\xf8\xc0\x00" - "\x00\x00\x78\xcc\xc0\xc0\xf0\xc0" - "\x7c\xc6\xc6\xc6\xc6\x7f\x06\x00" - "\x00\x00\x78\xcc\xcc\xcc\x7e\x0c" - "\x7c\xc6\xc6\xc6\xc6\x07\x06\x00" - "\x00\x00\x78\xcc\xcc\xcc\x0e\x0c" - "\xc0\xc0\xfe\xc0\xc6\xc6\x7c\x00" - "\xc0\xc0\xfc\xc0\xcc\xcc\x78\x00" - "\x3e\x63\x36\x1c\xb8\xfe\x83\x00" - "\x00\x00\x78\xcc\xcc\x7c\x0c\x0e" - "\xc0\xc0\xfc\xc0\xc0\xfe\x03\x00" - "\x00\xc0\xc0\xf8\xc0\xc0\xf8\x0c" - "\x7c\xc6\xc6\xc6\xc0\xc0\xfe\x00" - "\x00\x00\x78\xcc\xcc\xc0\xc0\xfc" - "\x7c\xc6\xdf\xd6\xde\xc0\xc0\x00" - "\x00\x00\x7c\xc6\xcf\xd6\xdc\xc0" - "\x06\x06\x7f\xc6\xc6\xc6\x7c\x00" - "\x00\x0c\x0c\x7e\xcc\xcc\x78\x00" - "\xc0\xfc\xc6\xc6\xc0\xc0\xc0\x00" - "\x00\xc0\xc0\xf8\xcc\xcc\xc0\xc0" - "\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xc0\xf8" - "\xc0\xc0\xf3\xdb\xdb\xce\xc0\x00" - "\x00\xc0\xc0\xc0\xf3\xdb\xce\xc0" - "\xe7\x3c\x66\xc3\xc3\x66\x3c\x00" - "\xc0\x37\x0c\x66\xc3\xc6\x7c\x00" - "\xc0\xc0\xc6\xc6\x7e\x06\x06\x00" - "\xc0\xc0\xcc\xcc\xcc\xcc\x7c\x0c" - "\xfc\xfe\x06\xfc\xfe\x06\x06\x00" - "\xc0\xc0\xf8\xcc\xcc\xcc\xcc\x00" - "\x7c\xc6\xc6\x0c\x68\x9a\x66\x00" - "\x00\x10\x30\x78\xcc\xcc\x7a\x00" - "\x7c\xc6\xc6\xc6\xc6\x06\x07\x00" - "\x00\x00\x78\xcc\xcc\xcc\x0c\x0e" - "\x0f\xf0\x6c\x66\xc3\xc3\xff\x00" - "\x1c\xe0\x30\xc8\xcc\xcc\xfc\x00" - "\xc7\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\x0e\x0c\x0c\xcc\xcc\xcc\x78\x00" - "\x38\x7e\x06\xf8\x06\x7e\x38\x00" - "\x00\x38\x7e\x06\xfc\x06\x7e\x38" - "\xe0\x60\x60\x63\x63\x63\x3e\x00" - "\xe0\x60\x66\x66\x66\x66\x3c\x00" - "\xe0\x7e\x1e\x30\x60\x33\x1e\x00" - "\x00\x78\xcc\x0c\x30\x60\xc0\xfc" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x00" - "\x00\x00\x78\xcc\xcc\xcc\xcc\x00" - "\x7c\xc6\x06\xcc\x70\x18\x0c\x00" - "\x00\x30\x60\x30\x18\x30\x62\x3c" - "\x7e\xdb\xdb\xdb\x1b\x03\x03\x00" - "\x00\x00\xdb\xdb\xdb\xdb\x6f\x03" - "\x3c\x66\x66\x1c\xb8\xfe\x83\x00" - "\x00\x3c\x66\x66\x66\x1c\x70\xfe" - "\x7c\xc6\xc6\xc6\xc7\xc6\xc6\x00" - "\x00\x00\x78\xcc\xcc\xcc\xce\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x78\x00" - "\x06\x06\xc6\xc6\x7e\x06\x07\x00" - "\x0c\x0c\xcc\xcc\xcc\xfc\x0c\x0e" - "\x7e\xe7\x30\x18\x0c\xe7\x7e\x00" - "\x00\x00\xd6\xdb\xdb\xdb\x6b\x00" - "\x7c\xc6\xc6\xc6\xc0\xc0\xc0\x00" - "\x00\x00\x78\xcc\xcc\xcc\xc0\xc0" - "\x7c\xc6\x7c\xfc\x03\x83\x7e\x00" - "\x00\x00\x78\xcc\x78\x0c\xcc\x78" - "\xc0\xc0\xc0\xf0\xc0\xc0\xc0\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xe0\x00" - "\x18\x7e\xdb\xdb\xdb\x7e\x18\x00" - "\x18\x18\xde\xdb\xdb\xdb\x7b\x18" - "\x3e\x63\x63\x7e\x60\xff\x60\x00" - "\x00\x3c\x66\x66\x7c\x60\xfc\x60" - "\x3c\x66\xc3\xc3\xc3\x66\x3c\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x38\x58\x3e\x1b\x1b\xdb\x7e\x00" - "\x38\x58\x3e\x1b\x1b\xdb\x7e\x18" - "\x30\x30\x60\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "ARMSCII-8 Character set", CIOLIB_ARMSCII8} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xdb\xdb\xc3\xc3\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc3\xe7\xff\xff\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\x66\x3c\x18\x18\x3c\x66\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xff\xc3\x86\x0c\x18\x30\x60\xc1\xc3\xff\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xdb\xdb\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xdb\xdb\xff\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\xc3\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x18\x18\x7e\xc3\xc0\xc0\xc0\xc3\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x00\x1e\x31\x60\x60\xfe\x60\xfc\x60\x31\x1e\x00\x00\x00\x00" - "\x00\x00\xc3\x66\x3c\x18\xff\x18\xff\x18\x18\x18\x00\x00\x00\x00" - "\x6c\x38\x10\x00\x7c\xc6\x60\x30\x18\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x6c\x38\x10\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xa2\xa2\xba\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\x70\x18\x78\xc8\x78\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xaa\xb2\xaa\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xf8\x18\x30\x18\xd8\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x10\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7e\x63\x60\xc0\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x38\x10\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x60\xe0\x60\x60\x60\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x88\xd8\x70\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\xcc\xcc\xcc\xce\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\xdb\xdb\xde\xd8\xdc\x67\x00\x00\x00\x00" - "\x00\xc3\x00\xc3\xc3\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x60\x30\x18\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x0c\x06\x7c\x00\x00" - "\x30\x18\x0c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x18\x30\x60\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x00\xc6\x00\xfe\x66\x60\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x30\x18\x0c\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x18\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x78\x6c\x66\x66\x66\xf6\x66\x66\x6c\x78\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x6c\x38\x10\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x02\x06\x7c\xce\xce\xde\xd6\xd6\xf6\xe6\xe6\x7c\xc0\x80\x00\x00" - "\x60\x30\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\xc3\xc3\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00" - "\xf0\x60\x7c\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xce\xdc\xd8\xcc\xc6\xd6\xdc\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x3b\x1b\x7e\xd8\xdc\x77\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x66\x60\x60\x66\x3c\x0c\x06\x3c\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x6c\x38\x38\x6c\x0c\x3c\x6c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x02\x06\x7c\xce\xde\xd6\xf6\xe6\x7c\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\xf0\x60\x7c\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x66\x66\x00\xee\x66\x66\x66\x66\x66\x3e\x06\x0c\x38\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x36\x36\x7f\x36\x36\x36\x7f\x36\x36\x00\x00\x00" - "\x08\x08\x3e\x63\x60\x60\x3e\x03\x03\x63\x3e\x08\x08\x00" - "\x00\x00\x00\x61\x63\x06\x0c\x18\x30\x63\x43\x00\x00\x00" - "\x00\x00\x1c\x36\x36\x1c\x3b\x6e\x66\x66\x3b\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\x7e\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x01\x03\x06\x0c\x18\x30\x60\x40\x00\x00\x00\x00" - "\x00\x00\x3e\x63\x67\x6f\x7b\x73\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x0c\x0c\x0c\x0c\x0c\x3f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x06\x0c\x18\x30\x63\x7f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x03\x1e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x06\x0e\x1e\x36\x66\x7f\x06\x06\x0f\x00\x00\x00" - "\x00\x00\x7e\x60\x60\x60\x7e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7f\x63\x03\x06\x0c\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3f\x03\x03\x06\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x00\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x06\x0c\x0c\x00\x0c\x0c\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x6f\x6f\x6f\x6e\x60\x3e\x00\x00\x00" - "\x00\x00\x08\x1c\x36\x63\x63\x7f\x63\x63\x63\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x33\x33\x33\x7e\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x60\x60\x33\x1e\x00\x00\x00" - "\x00\x00\x7c\x36\x33\x33\x33\x33\x33\x36\x7c\x00\x00\x00" - "\x00\x00\x7f\x33\x30\x34\x3c\x34\x30\x33\x7f\x00\x00\x00" - "\x00\x00\x7f\x33\x30\x34\x3c\x34\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x6f\x63\x33\x1d\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x7f\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x0f\x06\x06\x06\x06\x06\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x73\x33\x36\x36\x3c\x36\x36\x33\x73\x00\x00\x00" - "\x00\x00\x78\x30\x30\x30\x30\x30\x30\x33\x7f\x00\x00\x00" - "\x00\x00\x63\x77\x7f\x6b\x63\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x63\x73\x7b\x7f\x6f\x67\x63\x63\x63\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x63\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x63\x63\x63\x6b\x3e\x1c\x06\x03\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x36\x33\x33\x73\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x30\x1c\x06\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x36\x1c\x08\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x6b\x6b\x7f\x36\x00\x00\x00" - "\x00\x00\x63\x63\x63\x36\x1c\x36\x63\x63\x63\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x7f\x63\x06\x0c\x18\x30\x60\x63\x7f\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x40\x60\x30\x18\x0c\x06\x03\x01\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x08\x1c\x36\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x18\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x70\x30\x30\x3e\x33\x33\x33\x33\x6e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x60\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x0e\x06\x06\x3e\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x1e\x33\x30\x7c\x30\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x70\x30\x30\x36\x3b\x33\x33\x33\x73\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\x78\x00" - "\x00\x00\x70\x30\x30\x33\x36\x3c\x36\x33\x73\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x7f\x6b\x6b\x6b\x6b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x33\x33\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x3e\x30\x30\x78\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x06\x0f\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x38\x0e\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x08\x18\x7e\x18\x18\x18\x1b\x0e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x63\x36\x1c\x08\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x36\x1c\x1c\x36\x63\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x00\x00\x00\x7f\x66\x0c\x18\x33\x7f\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x08\x08\x3e\x63\x60\x60\x63\x3e\x08\x08\x00" - "\x00\x00\x1c\x36\x30\x30\x7c\x30\x30\x73\x7e\x00\x00\x00" - "\x00\x1e\x31\x60\xfe\x60\xfc\x60\x33\x1e\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x7e\x18\x7e\x18\x00\x00\x00" - "\x1c\x08\x00\x3e\x63\x30\x1c\x06\x63\x3e\x00\x00\x00\x00" - "\x00\x3e\x63\x30\x1c\x36\x63\x63\x36\x1c\x06\x63\x3e\x00" - "\x36\x1c\x08\x00\x3e\x63\x38\x0e\x63\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x3e\x41\x5d\x51\x51\x5d\x41\x3e\x00\x00\x00" - "\x00\x38\x04\x3c\x44\x3c\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x1b\x36\x6c\x36\x1b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7f\x03\x03\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3e\x41\x5d\x55\x59\x55\x41\x3e\x00\x00\x00" - "\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00" - "\x00\x38\x6c\x18\x30\x64\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x0c\x38\x0c\x6c\x38\x00\x00\x00\x00\x00\x00\x00" - "\x1c\x08\x00\x7f\x66\x0c\x18\x30\x63\x7f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x60\xc0\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x36\x1c\x08\x00\x7f\x66\x0c\x18\x33\x7f\x00\x00\x00\x00" - "\x00\x30\x70\x30\x30\x30\x78\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x44\x38\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\x36\x1b\x36\x6c\x00\x00\x00\x00\x00" - "\x00\x1f\x36\x66\x66\x67\x66\x66\x36\x1f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x36\x6b\x6b\x6e\x68\x37\x00\x00\x00\x00" - "\x66\x00\x66\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x30\x63\x63\x3e\x00\x00\x00" - "\x60\x30\x18\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x03\x06\x0c\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x08\x1c\x36\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x3b\x6e\x00\x08\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x00\x63\x63\x08\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x1c\x36\x1c\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x00\x00\x1f\x36\x66\x66\x67\x7e\x66\x66\x67\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x60\x60\x33\x1e\x0c\x06\x1c" - "\x60\x30\x18\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x06\x0c\x18\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x08\x1c\x36\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x00\x63\x63\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x60\x30\x18\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x06\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x18\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x66\x66\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x3c\x36\x33\x33\x7b\x33\x33\x36\x3c\x00\x00\x00" - "\x3b\x6e\x00\x63\x73\x7b\x7f\x6f\x67\x63\x63\x00\x00\x00" - "\x60\x30\x18\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x03\x06\x0c\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x08\x1c\x36\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x3b\x6e\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x63\x63\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x63\x36\x1c\x08\x1c\x36\x63\x00\x00\x00\x00" - "\x00\x03\x1e\x36\x67\x6f\x6b\x7b\x73\x36\x3c\x60\x00\x00" - "\x60\x30\x18\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x03\x06\x0c\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x08\x1c\x36\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x63\x63\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x06\x0c\x18\x00\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00" - "\x00\x78\x30\x3e\x33\x33\x3e\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x66\x6c\x67\x63\x6b\x6e\x60\x60\x00" - "\x00\x60\x30\x18\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x66\x66\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x1c\x36\x1c\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x0b\x3b\x6e\x68\x37\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x60\x60\x63\x3e\x0c\x06\x1c" - "\x00\x30\x18\x0c\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x03\x06\x0c\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x66\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x36\x1c\x36\x06\x3e\x66\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x6e\x33\x33\x33\x33\x33\x00\x00\x00" - "\x00\x60\x30\x18\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x03\x3e\x67\x6f\x7b\x73\x3e\x60\x00\x00" - "\x00\x60\x30\x18\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x66\x66\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x63\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x00\x78\x30\x3e\x33\x33\x33\x33\x3e\x30\x78\x00" - "\x00\x00\x66\x66\x00\x66\x66\x66\x66\x3e\x06\x66\x3c\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\xc6\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\xcc\xcc\x78" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x00\x30\x30\x78\x78\x30\x00" - "\x00\x00\x10\x7c\xc0\xc0\x7c\x10" - "\x00\x38\x60\x60\xf0\x60\xfc\x00" - "\x0e\x19\x30\x7e\x30\x19\x0e\x00" - "\x00\xcc\xcc\x78\x30\xfc\x30\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x00\x00" - "\x7e\xc0\x7c\xc6\x7c\x06\xfc\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x00\x00" - "\x7c\x82\xba\xa2\xba\x82\x7c\x00" - "\x1c\x06\x1e\x22\x1f\x3f\x00\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\xfe\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x82\xba\xb2\xaa\x82\x7c\x00" - "\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x00\x00\x00\x00" - "\x00\x10\x7c\x10\x00\x7c\x00\x00" - "\x1c\x36\x06\x18\x3e\x00\x00\x00" - "\x1e\x02\x0e\x02\x1e\x00\x00\x00" - "\x30\xfc\x98\x30\x64\xfc\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\xc0" - "\x7e\xca\xca\x7e\x0a\x0a\x0a\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x30\xfc\x98\x30\x64\xfc\x00\x00" - "\x06\x0e\x06\x06\x06\x00\x00\x00" - "\x0e\x11\x11\x11\x0e\x1f\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x58\xd8\xdc\xd8\x58\x3e\x00\x00" - "\x00\x6c\xd2\xde\xd0\x6e\x00\x00" - "\x00\xcc\xcc\x78\x30\x78\x00\x00" - "\x30\x00\x30\x60\xc0\xcc\x78\x00" - "\x18\x0c\x30\x78\xcc\xfc\xcc\x00" - "\x60\xc0\x30\x78\xcc\xfc\xcc\x00" - "\x78\x84\x30\x78\xcc\xfc\xcc\x00" - "\x66\x98\x30\x78\xcc\xfc\xcc\x00" - "\xcc\x00\x30\x78\xcc\xfc\xcc\x00" - "\x30\x48\x30\x78\xcc\xfc\xcc\x00" - "\x3e\x78\x98\x9c\xf8\x98\x9e\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x1c\x30" - "\x30\x18\xfe\x62\x78\x62\xfe\x00" - "\x18\x30\xfe\x62\x78\x62\xfe\x00" - "\x38\x44\xfe\x62\x78\x62\xfe\x00" - "\x66\x00\xfe\x62\x78\x62\xfe\x00" - "\x60\x30\x78\x30\x30\x30\x78\x00" - "\x18\x30\x78\x30\x30\x30\x78\x00" - "\x78\x84\x78\x30\x30\x30\x78\x00" - "\xcc\x00\x78\x30\x30\x30\x78\x00" - "\x78\x6c\x66\xf6\x66\x6c\x78\x00" - "\x66\x98\xe6\xf6\xde\xce\xc6\x00" - "\x30\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x18\x30\x7c\xc6\xc6\xc6\x7c\x00" - "\x38\x44\x7c\xc6\xc6\xc6\x7c\x00" - "\x66\x98\x7c\xc6\xc6\xc6\x7c\x00" - "\xc6\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\xc6\x6c\x38\x38\x6c\xc6\x00" - "\x06\x7c\xce\x9a\xb2\xe6\x78\xc0" - "\x60\x30\xcc\xcc\xcc\xcc\xfc\x00" - "\x18\x30\xcc\xcc\xcc\xcc\xfc\x00" - "\x78\x84\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\x00\xcc\xcc\xcc\xcc\xfc\x00" - "\x18\x30\xcc\xcc\x78\x30\x78\x00" - "\x60\x78\x6c\x78\x60\x60\x60\x00" - "\x78\xcc\xc4\xdc\xc6\xc6\xdc\xc0" - "\x30\x18\x78\x0c\x7c\xcc\x76\x00" - "\x18\x30\x78\x0c\x7c\xcc\x76\x00" - "\x78\x84\x78\x0c\x7c\xcc\x76\x00" - "\x66\x98\x78\x0c\x7c\xcc\x76\x00" - "\xcc\x00\x78\x0c\x7c\xcc\x76\x00" - "\x30\x48\x38\x0c\x7c\xcc\x76\x00" - "\x00\x00\xec\x32\x7e\xb0\x6e\x00" - "\x00\x00\x3c\x66\xc0\x66\x1c\x30" - "\x30\x18\x78\xcc\xfc\xc0\x78\x00" - "\x18\x30\x78\xcc\xfc\xc0\x78\x00" - "\x78\x84\x78\xcc\xfc\xc0\x78\x00" - "\xcc\x00\x78\xcc\xfc\xc0\x78\x00" - "\x60\x30\x00\x70\x30\x30\x78\x00" - "\x18\x30\x00\x70\x30\x30\x78\x00" - "\x70\x88\x00\x70\x30\x30\x78\x00" - "\xcc\x00\x00\x70\x30\x30\x78\x00" - "\x6c\x38\x6c\x0c\x6c\xcc\x78\x00" - "\x66\x98\xf8\xcc\xcc\xcc\xcc\x00" - "\x60\x30\x00\x7c\xc6\xc6\x7c\x00" - "\x18\x30\x00\x7c\xc6\xc6\x7c\x00" - "\x38\x44\x00\x7c\xc6\xc6\x7c\x00" - "\x66\x98\x00\x7c\xc6\xc6\x7c\x00" - "\xc6\x00\x00\x7c\xc6\xc6\x7c\x00" - "\x00\x00\x18\x00\x7e\x00\x18\x00" - "\x00\x00\x06\x7c\xde\xf6\x7c\xc0" - "\x60\x30\x00\xcc\xcc\xcc\x76\x00" - "\x18\x30\x00\xcc\xcc\xcc\x76\x00" - "\x30\x48\x00\xcc\xcc\xcc\x76\x00" - "\xcc\x00\x00\xcc\xcc\xcc\x76\x00" - "\x18\x30\xcc\xcc\xcc\x7c\x0c\xf8" - "\xe0\x78\x6c\x66\x6c\x78\xe0\x00" - "\xcc\x00\xcc\xcc\xcc\x7c\x0c\xf8" - , "ISO-8859-15 West European", CIOLIB_ISO_8859_15} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x3e\x0a\x12\x22\x78\x84\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x44\x44\x38\x10\x7c\x10\x10\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x20\x20\x20\x20\x60\xe0\xc0\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x21\x21\x21\x21\x23\x67\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x10\x10\xd6\x38\xee\x38\xd6\x10\x10\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x42\x42\x42\x00\x42\x42\x00\x00\x00\x00" - "\x00\x00\x7f\x89\x89\x89\x79\x09\x09\x09\x09\x09\x00\x00\x00\x00" - "\x00\x7c\x86\x40\x38\x44\x82\x82\x44\x38\x04\xc2\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x08\x04\xfe\x04\x08\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x20\x40\xfe\x40\x20\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x80\x80\x80\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x38\x38\x38\x10\x10\x10\x00\x10\x10\x00\x00\x00\x00" - "\x00\x42\x42\x42\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x44\x44\xfe\x44\x44\x44\xfe\x44\x44\x00\x00\x00\x00" - "\x10\x10\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x82\x84\x08\x10\x20\x42\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x38\x38\x47\x44\x44\x44\x3b\x00\x00\x00\x00" - "\x00\x20\x20\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x10\x10\x10\x10\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x20\x10\x08\x08\x08\x08\x08\x08\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x18\xff\x18\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x10\x20\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x02\x04\x08\x10\x20\x40\x80\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x92\x92\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\x08\x18\x38\x08\x08\x08\x08\x08\x08\x3e\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x04\x08\x10\x20\x40\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x02\x3c\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x14\x24\x44\x84\xfe\x04\x04\x04\x0e\x00\x00\x00\x00" - "\x00\x00\xfe\x80\x80\x80\xfc\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x40\x80\x80\xfc\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x02\x02\x04\x08\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7c\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7e\x02\x02\x02\x04\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x04\x08\x10\x20\x40\x20\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x40\x20\x10\x08\x04\x08\x10\x20\x40\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x02\x04\x08\x08\x00\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x82\x82\x9e\x92\x92\x8c\x80\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x42\x42\x42\x42\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x80\x82\x42\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x44\x42\x42\x42\x42\x42\x42\x44\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x9e\x82\x82\x46\x3a\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\xfe\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x0e\x04\x04\x04\x04\x04\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\xc2\x42\x42\x44\x48\x78\x44\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\xe0\x40\x40\x40\x40\x40\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x82\xc6\xaa\x92\x82\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x82\x82\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x82\x82\x82\x92\x8a\x7c\x04\x02\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x44\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x92\x92\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x44\x28\x10\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x44\x28\x10\x28\x44\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x44\x38\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x82\x04\x18\x20\x40\x82\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\x40\x20\x10\x08\x04\x02\x01\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x04\x04\x04\x04\x04\x04\x04\x04\x3c\x00\x00\x00\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x10\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\xc0\x40\x40\x78\x44\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x80\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x04\x04\x3c\x44\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x84\x78\x00" - "\x00\x00\xc0\x40\x40\x7c\x42\x42\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x10\x10\x00\x30\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x02\x02\x00\x06\x02\x02\x02\x02\x02\x02\x42\x42\x3c\x00" - "\x00\x00\xc0\x40\x40\x42\x44\x48\x78\x44\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x30\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\x92\x92\x92\x92\x92\x92\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x7c\x40\x40\xe0\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x04\x0e\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x7c\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x20\x20\x20\xf8\x20\x20\x20\x20\x22\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x44\x28\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x00\x00\x00\x00\xfe\x84\x08\x10\x20\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x10\x10\x10\x60\x10\x10\x10\x10\x0e\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x00\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x70\x08\x08\x08\x06\x08\x08\x08\x08\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x28\x44\x82\x82\x82\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x82\x42\x3c\x04\x02\x7c\x00\x00" - "\x00\x00\x84\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x84\x84\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x38\x44\x38\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x42\x40\x40\x42\x3c\x04\x02\x3c\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x84\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x44\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x82\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x38\x44\x38\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x08\x10\x20\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x8c\x52\x32\x7e\x88\x98\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x44\x84\x84\xfe\x84\x84\x84\x84\x86\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x30\x48\x84\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x82\x00\x00\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x82\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x82\x00\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x86\x8a\x92\xa2\xc2\x7c\x00\x00\x00\x00" - "\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\x42\xfc\x00\x00\x00\x00" - "\x00\x02\x3c\x4c\x8a\x92\x92\xa2\xa2\xc2\xc4\xb8\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x44\x28\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x06\x09\x08\x08\x08\x3e\x08\x08\x08\x08\x08\x48\x30\x00\x00" - "\x00\x08\x10\x20\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x76\xdc\x00\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x3c\x44\x44\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x20\x20\x00\x20\x20\x40\x80\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\xb2\xaa\xb2\xaa\xaa\x82\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x40\x9c\x02\x04\x08\x1e\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x46\x8a\x12\x3e\x02\x02\x00\x00" - "\x00\x00\x10\x10\x00\x10\x10\x10\x38\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x48\x90\x48\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x88\x44\x22\x44\x88\x00\x00\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x08\x10\x20\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x00\x7c\x82\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x20\x10\x08\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x9a\xa2\xa2\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x10\x10\x38\x44\x40\x40\x40\x48\x38\x10\x10\x00\x00\x00\x00" - "\x00\x00\x44\x44\x28\x10\x7c\x10\x7c\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x76\xdc\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x76\xdc\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x82\x7c\x82\x82\x82\x82\x7c\x82\x00\x00\x00\x00" - "\x00\x00\x34\x18\x2c\x06\x3e\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x44\x42\x42\xf2\x42\x42\x42\x44\xf8\x00\x00\x00\x00" - "\x7c\x82\x00\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x00\x44\x00\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x20\x10\x08\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x08\x08\x08\x08\x08\x18\x00\x00\x00\x00" - "\x08\x10\x20\x3c\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x38\x44\x00\x38\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x44\x00\x38\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x10\x10\x10\x10\x00\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x20\x10\x08\x3c\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x08\x10\x20\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x78\x84\x84\x84\xb8\x84\x82\x82\x82\xbc\x80\x00\x00\x00" - "\x7c\x82\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x10\x08\x04\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x76\xdc\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x42\x42\x42\x42\x42\x7c\x40\x40\xc0\x00\x00\x00" - "\x00\x00\xc0\x40\x40\x7c\x42\x42\x42\x42\x42\x7c\x40\x40\xe0\x00" - "\x00\x00\xe0\x40\x7c\x42\x42\x42\x42\x7c\x40\xe0\x00\x00\x00\x00" - "\x04\x08\x10\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x7c\x82\x00\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x20\x10\x08\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x00\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x04\x08\x10\x82\x82\x82\x44\x38\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\xe0\x31\x62\x34\xe8\x10\x2c\x54\xa4\xef\x04\x04\x00\x00" - "\x00\x00\x7e\x8a\x8a\x8a\x7a\x0a\x0a\x0a\x0a\x0a\x00\x00\x00\x00" - "\x00\x7c\x82\x40\x38\x44\x82\x82\x44\x38\x04\x82\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x7c\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x02\x3c\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x08\x08\x08\x08\x08\x18\x00\x00\x00\x00" - "\x00\x7c\x02\x3c\x02\x02\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\x88\x10\x20\x48\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xd6\x10\x10\x7c" - "\x10\x10\x38\xec\xfe\x7c\x10\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x1f\x03\x05\x7d\x84\x84\x84\x78" - "\x3e\x41\x41\x41\x3e\x08\x3e\x08" - "\x3f\x21\x3f\x20\x20\x20\x60\xc0" - "\x3f\x21\x3f\x21\x21\x23\x66\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x10\x38\x7c\x10\x10\x7c\x38\x10" - "\x24\x24\x24\x24\x24\x00\x24\x00" - "\x7f\x92\x92\x72\x12\x12\x12\x00" - "\x3e\x61\x38\x44\x44\x38\x8c\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x10\x38\x7c\x10\x7c\x38\x10\xfe" - "\x10\x38\x7c\x10\x10\x10\x10\x00" - "\x10\x10\x10\x10\x7c\x38\x10\x00" - "\x00\x08\x04\xfe\x04\x08\x00\x00" - "\x00\x20\x40\xfe\x40\x20\x00\x00" - "\x00\x00\x80\x80\x80\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x10\x38\x38\x10\x10\x00\x10\x00" - "\x24\x24\x24\x00\x00\x00\x00\x00" - "\x24\x24\xff\x24\xff\x24\x24\x00" - "\x10\x7c\x80\x78\x04\xf8\x10\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x44\x38\x56\x84\x84\x76\x00" - "\x20\x20\x40\x00\x00\x00\x00\x00" - "\x10\x20\x40\x40\x40\x20\x10\x00" - "\x20\x10\x08\x08\x08\x10\x20\x00" - "\x00\x44\x38\xfe\x38\x44\x00\x00" - "\x00\x10\x10\xfe\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x20" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x00" - "\x02\x04\x08\x10\x20\x40\x80\x00" - "\x7c\x82\x86\x8a\x92\xa2\x7c\x00" - "\x10\x30\x10\x10\x10\x10\x7c\x00" - "\x78\x84\x04\x10\x40\x84\xfc\x00" - "\x78\x84\x04\x38\x04\x84\x78\x00" - "\x08\x18\x28\x48\xfe\x08\x1c\x00" - "\xfc\x80\xf8\x04\x04\x84\x78\x00" - "\x38\x40\x80\xf8\x84\x84\x78\x00" - "\xfc\x84\x08\x10\x20\x20\x20\x00" - "\x78\x84\x84\x78\x84\x84\x78\x00" - "\x78\x84\x84\x7c\x04\x08\x70\x00" - "\x00\x10\x10\x00\x00\x10\x10\x00" - "\x00\x10\x10\x00\x00\x10\x10\x20" - "\x10\x20\x40\x80\x40\x20\x10\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x20\x10\x08\x04\x08\x10\x20\x00" - "\x78\x84\x04\x08\x10\x00\x10\x00" - "\x7c\x82\x9e\x92\x9e\x80\x78\x00" - "\x30\x48\x84\x84\xfc\x84\x84\x00" - "\xfc\x42\x42\x7c\x42\x42\xfc\x00" - "\x3c\x42\x80\x80\x80\x42\x3c\x00" - "\xf8\x44\x42\x42\x42\x44\xf8\x00" - "\xfe\x42\x48\x78\x48\x42\xfe\x00" - "\xfe\x42\x48\x78\x48\x40\xe0\x00" - "\x3c\x42\x80\x80\x8e\x42\x3e\x00" - "\x84\x84\x84\xfc\x84\x84\x84\x00" - "\x38\x10\x10\x10\x10\x10\x38\x00" - "\x0e\x04\x04\x04\x44\x44\x38\x00" - "\xc2\x44\x48\x70\x44\x42\xc2\x00" - "\xe0\x40\x40\x40\x40\x42\xfe\x00" - "\x82\xc6\xaa\x92\x82\x82\x82\x00" - "\x82\xc2\xa2\x92\x8a\x86\x82\x00" - "\x38\x44\x82\x82\x82\x44\x38\x00" - "\xfc\x42\x42\x7c\x40\x40\xe0\x00" - "\x38\x44\x82\x82\x82\x54\x38\x04" - "\xfc\x42\x42\x7c\x44\x42\xc2\x00" - "\x38\x84\x80\x78\x04\x84\x74\x00" - "\xfe\x92\x10\x10\x10\x10\x38\x00" - "\x84\x84\x84\x84\x84\x84\xfc\x00" - "\x84\x84\x84\x84\x84\x48\x30\x00" - "\x82\x82\x82\x92\xaa\xc6\x82\x00" - "\x82\x44\x28\x10\x28\x44\x82\x00" - "\x82\x44\x28\x10\x10\x10\x38\x00" - "\xfe\x84\x88\x10\x22\x42\xfe\x00" - "\x78\x40\x40\x40\x40\x40\x78\x00" - "\x80\x40\x20\x10\x08\x04\x02\x00" - "\x78\x08\x08\x08\x08\x08\x78\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x20\x20\x10\x00\x00\x00\x00\x00" - "\x00\x00\x78\x04\x7c\x84\x76\x00" - "\xc0\x40\x7c\x42\x42\x42\xdc\x00" - "\x00\x00\x78\x84\x80\x84\x78\x00" - "\x0c\x04\x7c\x84\x84\x84\x76\x00" - "\x00\x00\x78\x84\xfc\x80\x78\x00" - "\x38\x44\x40\xe0\x40\x40\xe0\x00" - "\x00\x00\x76\x84\x84\x7c\x04\xf8" - "\xc0\x40\x4c\x62\x42\x42\xc2\x00" - "\x10\x00\x30\x10\x10\x10\x38\x00" - "\x04\x00\x04\x04\x04\x84\x84\x78" - "\xc0\x40\x42\x44\x78\x44\xc2\x00" - "\x30\x10\x10\x10\x10\x10\x38\x00" - "\x00\x00\xec\x92\x92\x92\x82\x00" - "\x00\x00\xf8\x84\x84\x84\x84\x00" - "\x00\x00\x78\x84\x84\x84\x78\x00" - "\x00\x00\xdc\x42\x42\x7c\x40\xe0" - "\x00\x00\x76\x84\x84\x7c\x04\x0e" - "\x00\x00\xdc\x62\x40\x40\xe0\x00" - "\x00\x00\x7c\x80\x78\x04\xf8\x00" - "\x10\x10\x7c\x10\x10\x12\x0c\x00" - "\x00\x00\x84\x84\x84\x84\x76\x00" - "\x00\x00\x84\x84\x84\x48\x30\x00" - "\x00\x00\x82\x92\xaa\xc6\x82\x00" - "\x00\x00\x84\x48\x30\x48\x84\x00" - "\x00\x00\x84\x84\x84\x7c\x04\xf8" - "\x00\x00\xfc\x88\x30\x44\xfc\x00" - "\x18\x20\x20\xc0\x20\x20\x18\x00" - "\x10\x10\x10\x00\x10\x10\x10\x00" - "\x60\x10\x10\x0c\x10\x10\x60\x00" - "\x64\x98\x00\x00\x00\x00\x00\x00" - "\x00\x10\x28\x44\x82\x82\xfe\x00" - "\x78\x84\x80\x84\x78\x18\x04\x78" - "\x00\x84\x00\x84\x84\x84\x7a\x00" - "\x0c\x00\x78\x84\xfc\x80\x78\x00" - "\x7e\x81\x3c\x02\x3e\x42\x3d\x00" - "\x84\x00\x78\x04\x7c\x84\x7a\x00" - "\xc0\x00\x78\x04\x7c\x84\x7a\x00" - "\x20\x20\x78\x04\x7c\x84\x7a\x00" - "\x00\x00\x78\x80\x80\x78\x04\x38" - "\x7e\x81\x3c\x42\x7e\x40\x3c\x00" - "\x84\x00\x78\x84\xfc\x80\x78\x00" - "\x60\x00\x78\x84\xfc\x80\x78\x00" - "\x48\x00\x30\x10\x10\x10\x38\x00" - "\x7c\x82\x30\x10\x10\x10\x38\x00" - "\x60\x00\x30\x10\x10\x10\x38\x00" - "\x82\x38\x44\x82\xfe\x82\x82\x00" - "\x30\x10\x44\x82\xfe\x82\x82\x00" - "\x0c\xfc\x40\x78\x40\x40\xfc\x00" - "\x00\x00\x67\x19\x7f\x98\x77\x00" - "\x3f\x48\x88\xff\x88\x88\x8f\x00" - "\x78\x84\x78\x84\x84\x84\x78\x00" - "\x84\x00\x78\x84\x84\x84\x78\x00" - "\xc0\x00\x78\x84\x84\x84\x78\x00" - "\x7e\x81\x42\x42\x42\x42\x3c\x00" - "\x20\x10\x42\x42\x42\x42\x3c\x00" - "\x84\x00\x84\x84\x84\x7c\x04\xf8" - "\x42\x18\x24\x42\x42\x24\x18\x00" - "\x84\x00\x84\x84\x84\x84\x78\x00" - "\x00\x02\x7c\x8a\x82\xa2\x7c\x80" - "\x38\x44\x44\xe0\x40\x82\xfc\x00" - "\x3a\x44\x8a\x92\xa2\x44\xb8\x00" - "\x00\x42\x24\x18\x18\x24\x42\x00" - "\x0c\x12\x10\x38\x10\x10\x90\x60" - "\x1c\x00\x78\x04\x7c\x84\x7a\x00" - "\x18\x00\x30\x10\x10\x10\x38\x00" - "\x08\x10\x78\x84\x84\x84\x78\x00" - "\x08\x10\x84\x84\x84\x84\x7a\x00" - "\x64\x98\xb8\xc4\x84\x84\x84\x00" - "\x64\x98\x84\xa4\x94\x84\x84\x00" - "\x3c\x44\x44\x3a\x00\x7e\x00\x00" - "\x38\x44\x44\x38\x00\x7c\x00\x00" - "\x20\x00\x20\x40\x80\x84\x78\x00" - "\x7e\x81\xb9\xa5\xb9\xa5\x81\x7e" - "\x00\x00\x00\xfc\x0c\x0c\x00\x00" - "\x42\x44\x48\x56\x69\x42\x84\x0f" - "\x42\x44\x48\x53\x65\x49\x8f\x01" - "\x10\x10\x00\x10\x38\x38\x10\x00" - "\x00\x22\x44\x88\x44\x22\x00\x00" - "\x00\x44\x22\x11\x22\x44\x00\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x0c\x10\x44\x82\xfe\x82\x82\x00" - "\x7e\x10\x44\x82\xfe\x82\x82\x00" - "\x30\x10\x44\x82\xfe\x82\x82\x00" - "\x7e\x81\x9d\xa1\xa1\x9d\x81\x7e" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x10\x10\x7c\x80\x80\x7c\x10\x10" - "\x82\x44\x38\x7c\x10\x7c\x10\x10" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x64\x98\x3c\x02\x3e\x42\x3d\x00" - "\x64\x98\x38\x44\x82\xfe\x82\x82" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x00\x82\x7c\x82\x82\x7c\x82\x00" - "\x20\x7e\x04\x7c\x84\x84\x78\x00" - "\xf8\x44\x42\xf2\x42\x44\xf8\x00" - "\x78\xfc\x40\x78\x40\x40\xfc\x00" - "\x44\xfc\x40\x78\x40\x40\xfc\x00" - "\x60\xfc\x40\x78\x40\x40\xfc\x00" - "\x00\x00\x18\x08\x08\x08\x1c\x00" - "\x08\x10\x38\x10\x10\x10\x38\x00" - "\x38\x44\x38\x10\x10\x10\x38\x00" - "\x28\x00\x38\x10\x10\x10\x38\x00" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\x10\x10\x10\x00\x00\x10\x10\x10" - "\x10\x08\x38\x10\x10\x10\x38\x00" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x0c\x18\x24\x42\x42\x24\x18\x00" - "\x00\x78\x84\xf8\x84\xf8\x80\x80" - "\x3c\x18\x24\x42\x42\x24\x18\x00" - "\x30\x18\x24\x42\x42\x24\x18\x00" - "\x64\x98\x78\x84\x84\x84\x78\x00" - "\x64\x98\x18\x24\x42\x42\x24\x18" - "\x00\x42\x42\x42\x42\x7c\x40\x80" - "\xc0\x40\x78\x44\x44\x78\x40\xe0" - "\xe0\x40\x78\x44\x78\x40\xe0\x00" - "\x04\x08\x84\x84\x84\x84\x78\x00" - "\x78\x00\x84\x84\x84\x84\x78\x00" - "\x20\x80\x84\x84\x84\x84\x78\x00" - "\x04\x08\x84\x84\x84\x7c\x04\xf8" - "\x04\x08\x42\x24\x10\x10\x38\x00" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x08\x10\x20\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x20\x20\xfc\x20\x20\x00\xfc\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff" - "\xe1\x12\xe4\x1a\xf6\x2a\x5f\x82" - "\x3e\x4a\x4a\x3a\x0a\x0a\x0a\x00" - "\x3e\x41\x3c\x42\x42\x3c\x82\x7c" - "\x20\x20\x00\xf8\x00\x20\x20\x00" - "\x00\x00\x00\x00\x00\x08\x04\x38" - "\x38\x44\x44\x38\x00\x00\x00\x00" - "\x00\x44\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x08\x18\x08\x08\x1c\x00\x00\x00" - "\x78\x04\x38\x04\x78\x00\x00\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 850 Multilingual Latin I, (thin)", CIOLIB_CP850} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x18\x70\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x70\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\x36\x36\x7e\xd8\xd8\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xce\xde\xf6\xe6\xc6\x7c\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x04\x7c\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\x7c\x40\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\xd8\x70\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\xb2\xaa\xb2\xaa\xaa\x82\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x3e\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x60\xc0\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x7c\xc6\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x06\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x9a\xa2\xa2\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x7c\xc6\xc0\xc0\xc6\x7c\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x76\xdc\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x00\x00\x34\x18\x2c\x06\x3e\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\xf6\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x38\x6c\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x00\xc6\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x30\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x30\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00\x00\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00" - "\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\xf0\x60\x7c\x66\x66\x66\x66\x7c\x60\xf0\x00\x00\x00\x00" - "\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x30\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x0c\x18\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00" - "\x00\xe0\x30\x62\x36\xec\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x78\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x38\x18\x18\x18\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x06\x3c\x06\x06\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x7e\x00\x00" - "\x00\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\x7e\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff" - "\x00\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x3f\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00" - "\x00\x00\x00\x7f\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\xf8\xfe\xf8\xe0\xc0\x80\x00\x00" - "\x00\x00\x00\x02\x06\x0e\x3e\xfe\x3e\x0e\x06\x02\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00" - "\x00\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00" - "\x00\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18" - "\x00\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00" - "\x00\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00" - "\x00\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00" - "\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xd6\xc6\xc6\x6c\x38\x00\x00" - "\x00\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00" - "\x00\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0e\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x6c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\x7c\x38\x7c\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00" - "\x00\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00" - "\x00\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x36\x32\x30\x7c\x30\x30\x30\x78\x00\x00" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78" - "\x00\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c" - "\x00\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e" - "\x00\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00" - "\x00\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78" - "\x00\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00" - "\x00\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x0c\x78" - "\x00\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x0c\x78" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\x36\x76\xdc\xd8\x6e\x00\x00" - "\x00\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xce\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xce\xde\xf6\xe6\x7c\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xe6\xfc\x00\x00" - "\x00\x00\x04\x7c\xce\xce\xd6\xd6\xd6\xe6\xe6\x7c\x40\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\xd8\x70\x00" - "\x00\x00\x0c\x18\x30\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x30\x30\x00\x30\x30\x60\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x44\xba\xaa\xb2\xaa\xaa\x44\x38\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x00\x00\x00" - "\x00\x00\x60\xe0\x63\x66\x6c\x18\x30\x6e\xc3\x06\x0c\x1f" - "\x00\x00\x60\xe0\x63\x66\x6c\x1a\x36\x6e\xda\x3f\x06\x06" - "\x00\x00\x00\x18\x18\x00\x18\x18\x3c\x3c\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x30\x60\xc0\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x38\x6c\xc6\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x18\x0c\x06\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x38\x44\x9a\xa2\xa2\xa2\x9a\x44\x38\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x7c\xc6\xc0\xc0\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x76\xdc\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00" - "\x00\x00\x00\x34\x18\x2c\x06\x3e\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\xf6\x66\x66\x6c\xf8\x00\x00" - "\x38\x6c\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\xc6\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x30\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x18\x18\x18\x18\x00" - "\x30\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xcc\x00\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7c\x60\xc0" - "\x00\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x60\xf0" - "\x00\x00\x00\xf0\x60\x7c\x66\x66\x66\x7c\x60\xf0\x00\x00" - "\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x30\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8" - "\x0c\x18\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xff" - "\x00\xe0\x30\x63\x36\xec\x18\x36\x6e\xda\x3f\x06\x06\x00" - "\x00\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c" - "\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x78" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x18\x38\x18\x18\x18\x3c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x78\x0c\x38\x0c\x0c\x78\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x7e\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xfe\xd6\x10\x38" - "\x10\x38\x7c\xfe\xfe\x7c\x10\x38" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78" - "\x3c\x66\x66\x66\x3c\x18\x7e\x18" - "\x3f\x33\x3f\x30\x30\x70\xf0\xe0" - "\x7f\x63\x7f\x63\x63\x67\xe6\xc0" - "\x18\xdb\x3c\xe7\xe7\x3c\xdb\x18" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x18\x3c\x7e\x18\x18\x7e\x3c\x18" - "\x66\x66\x66\x66\x66\x00\x66\x00" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x61\x3c\x66\x66\x3c\x86\x7c" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x18\x3c\x7e\x18\x7e\x3c\x18\xff" - "\x18\x3c\x7e\x18\x18\x18\x18\x00" - "\x18\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x0c\xfe\x0c\x18\x00\x00" - "\x00\x30\x60\xfe\x60\x30\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x18\x18\x00\x18\x00" - "\x66\x66\x24\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x38\x6c\xc6\xd6\xc6\x6c\x38\x00" - "\x18\x38\x18\x18\x18\x18\x7e\x00" - "\x7c\xc6\x06\x1c\x30\x66\xfe\x00" - "\x7c\xc6\x06\x3c\x06\xc6\x7c\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfe\xc0\xc0\xfc\x06\xc6\x7c\x00" - "\x38\x60\xc0\xfc\xc6\xc6\x7c\x00" - "\xfe\xc6\x0c\x18\x30\x30\x30\x00" - "\x7c\xc6\xc6\x7c\xc6\xc6\x7c\x00" - "\x7c\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x06\x0c\x18\x30\x18\x0c\x06\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x7c\xc6\x0c\x18\x18\x00\x18\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3a\x00" - "\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x7c\xc6\xc6\xc6\xc6\xce\x7c\x0e" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x3c\x66\x30\x18\x0c\x66\x3c\x00" - "\x7e\x7e\x5a\x18\x18\x18\x3c\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00" - "\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x00" - "\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00" - "\x66\x66\x66\x3c\x18\x18\x3c\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x7c\x66\x66\x66\xdc\x00" - "\x00\x00\x7c\xc6\xc0\xc6\x7c\x00" - "\x1c\x0c\x7c\xcc\xcc\xcc\x76\x00" - "\x00\x00\x7c\xc6\xfe\xc0\x7c\x00" - "\x3c\x66\x60\xf8\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x18\x00\x38\x18\x18\x18\x3c\x00" - "\x06\x00\x06\x06\x06\x66\x66\x3c" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\xec\xfe\xd6\xd6\xd6\x00" - "\x00\x00\xdc\x66\x66\x66\x66\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x60\x60\xf0\x00" - "\x00\x00\x7e\xc0\x7c\x06\xfc\x00" - "\x30\x30\xfc\x30\x30\x36\x1c\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xc6\xc6\xc6\x6c\x38\x00" - "\x00\x00\xc6\xd6\xd6\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xc6\xc6\xc6\x7e\x06\xfc" - "\x00\x00\x7e\x4c\x18\x32\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x00" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\xc6\xfe\x00" - "\x7c\xc6\xc0\xc0\xc6\x7c\x0c\x78" - "\xcc\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x0c\x18\x7c\xc6\xfe\xc0\x7c\x00" - "\x7c\x82\x78\x0c\x7c\xcc\x76\x00" - "\xc6\x00\x78\x0c\x7c\xcc\x76\x00" - "\x30\x18\x78\x0c\x7c\xcc\x76\x00" - "\x30\x30\x78\x0c\x7c\xcc\x76\x00" - "\x00\x00\x7e\xc0\xc0\x7e\x0c\x38" - "\x7c\x82\x7c\xc6\xfe\xc0\x7c\x00" - "\xc6\x00\x7c\xc6\xfe\xc0\x7c\x00" - "\x30\x18\x7c\xc6\xfe\xc0\x7c\x00" - "\x66\x00\x38\x18\x18\x18\x3c\x00" - "\x7c\x82\x38\x18\x18\x18\x3c\x00" - "\x30\x18\x00\x38\x18\x18\x3c\x00" - "\xc6\x38\x6c\xc6\xfe\xc6\xc6\x00" - "\x38\x6c\x7c\xc6\xfe\xc6\xc6\x00" - "\x18\x30\xfe\xc0\xf8\xc0\xfe\x00" - "\x00\x00\x7e\x12\xfe\x90\xfe\x00" - "\x3e\x6c\xcc\xfe\xcc\xcc\xce\x00" - "\x7c\x82\x7c\xc6\xc6\xc6\x7c\x00" - "\xc6\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x30\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x78\x84\x00\xcc\xcc\xcc\x76\x00" - "\x60\x30\xcc\xcc\xcc\xcc\x76\x00" - "\xc6\x00\xc6\xc6\xc6\x7e\x06\xfc" - "\xc6\x38\x6c\xc6\xc6\x6c\x38\x00" - "\xc6\x00\xc6\xc6\xc6\xc6\x7c\x00" - "\x00\x02\x7c\xce\xd6\xe6\x7c\x80" - "\x38\x6c\x64\xf0\x60\x66\xfc\x00" - "\x3a\x6c\xce\xd6\xe6\x6c\xb8\x00" - "\x00\xc6\x6c\x38\x6c\xc6\x00\x00" - "\x0e\x1b\x18\x3c\x18\xd8\x70\x00" - "\x18\x30\x78\x0c\x7c\xcc\x76\x00" - "\x0c\x18\x00\x38\x18\x18\x3c\x00" - "\x0c\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x18\x30\xcc\xcc\xcc\xcc\x76\x00" - "\x76\xdc\x00\xdc\x66\x66\x66\x00" - "\x76\xdc\x00\xe6\xf6\xde\xce\x00" - "\x3c\x6c\x6c\x3e\x00\x7e\x00\x00" - "\x38\x6c\x6c\x38\x00\x7c\x00\x00" - "\x18\x00\x18\x18\x30\x63\x3e\x00" - "\x7e\x81\xb9\xa5\xb9\xa5\x81\x7e" - "\x00\x00\x00\xfe\x06\x06\x00\x00" - "\x63\xe6\x6c\x7e\x33\x66\xcc\x0f" - "\x63\xe6\x6c\x7a\x36\x6a\xdf\x06" - "\x18\x00\x18\x18\x3c\x3c\x18\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x30\x60\x38\x6c\xc6\xfe\xc6\x00" - "\x7c\x82\x38\x6c\xc6\xfe\xc6\x00" - "\x18\x0c\x38\x6c\xc6\xfe\xc6\x00" - "\x7e\x81\x9d\xa1\xa1\x9d\x81\x7e" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x18\x18\x7e\xc0\xc0\x7e\x18\x18" - "\x66\x66\x3c\x7e\x18\x7e\x18\x18" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x76\xdc\x7c\x06\x7e\xc6\x7e\x00" - "\x76\xdc\x38\x6c\xc6\xfe\xc6\x00" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00" - "\x30\x7e\x0c\x7c\xcc\xcc\x78\x00" - "\xf8\x6c\x66\xf6\x66\x6c\xf8\x00" - "\x7c\x82\xfe\xc0\xfc\xc0\xfe\x00" - "\xc6\x00\xfe\xc0\xfc\xc0\xfe\x00" - "\x30\x18\xfe\xc0\xfc\xc0\xfe\x00" - "\x00\x00\x38\x18\x18\x18\x3c\x00" - "\x0c\x18\x3c\x18\x18\x18\x3c\x00" - "\x3c\x42\x3c\x18\x18\x18\x3c\x00" - "\x66\x00\x3c\x18\x18\x18\x3c\x00" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\x18\x18\x18\x00\x00\x18\x18\x18" - "\x30\x18\x3c\x18\x18\x18\x3c\x00" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x30\x60\x38\x6c\xc6\x6c\x38\x00" - "\x78\xcc\xcc\xd8\xcc\xc6\xcc\x00" - "\x7c\x82\x38\x6c\xc6\x6c\x38\x00" - "\x0c\x06\x38\x6c\xc6\x6c\x38\x00" - "\x76\xdc\x7c\xc6\xc6\xc6\x7c\x00" - "\x76\xdc\x38\x6c\xc6\x6c\x38\x00" - "\x00\x00\x66\x66\x66\x66\x7c\xc0" - "\xe0\x60\x7c\x66\x66\x7c\x60\xf0" - "\xf0\x60\x7c\x66\x7c\x60\xf0\x00" - "\x18\x30\xc6\xc6\xc6\xc6\x7c\x00" - "\x7c\x82\x00\xc6\xc6\xc6\x7c\x00" - "\x60\x30\xc6\xc6\xc6\xc6\x7c\x00" - "\x18\x30\xc6\xc6\xc6\x7e\x06\xfc" - "\x0c\x18\x66\x66\x3c\x18\x3c\x00" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x18\x18\x7e\x18\x18\x00\x7e\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff" - "\xe1\x32\xe4\x3a\xf6\x2a\x5f\x86" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x61\x3c\x66\x66\x3c\x86\x7c" - "\x00\x18\x00\x7e\x00\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\x38" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x18\x38\x18\x18\x3c\x00\x00\x00" - "\x78\x0c\x38\x0c\x78\x00\x00\x00" - "\x78\x0c\x18\x30\x7c\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 850 Multilingual Latin I", CIOLIB_CP850} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x3e\x0a\x12\x22\x78\x84\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x44\x44\x38\x10\x7c\x10\x10\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x20\x20\x20\x20\x60\xe0\xc0\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x21\x21\x21\x21\x23\x67\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x10\x10\xd6\x38\xee\x38\xd6\x10\x10\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x42\x42\x42\x00\x42\x42\x00\x00\x00\x00" - "\x00\x00\x7f\x89\x89\x89\x79\x09\x09\x09\x09\x09\x00\x00\x00\x00" - "\x00\x7c\x86\x40\x38\x44\x82\x82\x44\x38\x04\xc2\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x08\x04\xfe\x04\x08\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x20\x40\xfe\x40\x20\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x80\x80\x80\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x38\x38\x38\x10\x10\x10\x00\x10\x10\x00\x00\x00\x00" - "\x00\x42\x42\x42\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x44\x44\xfe\x44\x44\x44\xfe\x44\x44\x00\x00\x00\x00" - "\x10\x10\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x82\x84\x08\x10\x20\x42\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x38\x38\x47\x44\x44\x44\x3b\x00\x00\x00\x00" - "\x00\x20\x20\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x10\x10\x10\x10\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x20\x10\x08\x08\x08\x08\x08\x08\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x18\xff\x18\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x10\x20\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x02\x04\x08\x10\x20\x40\x80\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x92\x92\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\x08\x18\x38\x08\x08\x08\x08\x08\x08\x3e\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x04\x08\x10\x20\x40\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x02\x3c\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x14\x24\x44\x84\xfe\x04\x04\x04\x0e\x00\x00\x00\x00" - "\x00\x00\xfe\x80\x80\x80\xfc\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x40\x80\x80\xfc\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x02\x02\x04\x08\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7c\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7e\x02\x02\x02\x04\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x04\x08\x10\x20\x40\x20\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x40\x20\x10\x08\x04\x08\x10\x20\x40\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x02\x04\x08\x08\x00\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x82\x82\x9e\x92\x92\x8c\x80\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x42\x42\x42\x42\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x80\x82\x42\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x44\x42\x42\x42\x42\x42\x42\x44\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x9e\x82\x82\x46\x3a\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\xfe\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x0e\x04\x04\x04\x04\x04\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\xc2\x42\x42\x44\x48\x78\x44\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\xe0\x40\x40\x40\x40\x40\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x82\xc6\xaa\x92\x82\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x82\x82\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x82\x82\x82\x92\x8a\x7c\x04\x02\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x44\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x92\x92\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x44\x28\x10\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x44\x28\x10\x28\x44\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x44\x38\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x82\x04\x18\x20\x40\x82\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\x40\x20\x10\x08\x04\x02\x01\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x04\x04\x04\x04\x04\x04\x04\x04\x3c\x00\x00\x00\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x10\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\xc0\x40\x40\x78\x44\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x80\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x04\x04\x3c\x44\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x84\x78\x00" - "\x00\x00\xc0\x40\x40\x7c\x42\x42\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x10\x10\x00\x30\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x02\x02\x00\x06\x02\x02\x02\x02\x02\x02\x42\x42\x3c\x00" - "\x00\x00\xc0\x40\x40\x42\x44\x48\x78\x44\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x30\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\x92\x92\x92\x92\x92\x92\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x7c\x40\x40\xe0\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x04\x0e\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x7c\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x20\x20\x20\xf8\x20\x20\x20\x20\x22\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x44\x28\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x00\x00\x00\x00\xfe\x84\x08\x10\x20\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x10\x10\x10\x60\x10\x10\x10\x10\x0e\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x00\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x70\x08\x08\x08\x06\x08\x08\x08\x08\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x28\x44\x82\x82\x82\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x82\x42\x3c\x04\x02\x7c\x00\x00" - "\x00\x00\x84\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x84\x84\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x38\x44\x38\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x42\x40\x40\x42\x3c\x04\x02\x3c\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x84\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x44\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x82\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x38\x44\x38\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x08\x10\x20\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x8c\x52\x32\x7e\x88\x98\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x44\x84\x84\xfe\x84\x84\x84\x84\x86\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x30\x48\x84\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x82\x00\x00\x00\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x82\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x82\x00\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x86\x8a\x92\xa2\xc2\x7c\x00\x00\x00\x00" - "\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\x42\xfc\x00\x00\x00\x00" - "\x00\x02\x3c\x4c\x8a\x92\x92\xa2\xa2\xc2\xc4\xb8\x00\x00\x00\x00" - "\x00\xf8\x84\x84\xf8\x84\x84\x9e\x84\x84\x84\x86\x00\x00\x00\x00" - "\x00\x06\x09\x08\x08\x08\x3e\x08\x08\x08\x08\x08\x48\x30\x00\x00" - "\x00\x08\x10\x20\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x76\xdc\x00\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x3c\x44\x44\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x20\x20\x00\x20\x20\x40\x80\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\xc0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x40\x9c\x02\x04\x08\x1e\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x46\x8a\x12\x3e\x02\x02\x00\x00" - "\x00\x00\x10\x10\x00\x10\x10\x10\x38\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x48\x90\x48\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x82\x7c\x82\x82\x82\x82\x7c\x82\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x62\x94\x98\x88\x98\x94\x62\x00\x00\x00\x00" - "\x00\x00\x78\x84\x84\x84\xb8\x84\x82\x82\x82\xbc\x80\x00\x00\x00" - "\x00\x00\xfe\x82\x82\x80\x80\x80\x80\x80\x80\x80\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x44\x44\x44\x44\x44\x44\x44\x00\x00\x00\x00" - "\x00\x00\x00\xfe\x82\x40\x20\x10\x20\x40\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x88\x88\x88\x88\x88\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x42\x42\x42\x42\x42\x7c\x40\x40\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x72\xd4\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x10\x38\x44\x44\x44\x38\x10\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\x82\x82\xfe\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x82\x44\x28\x28\x28\xee\x00\x00\x00\x00" - "\x00\x00\x1e\x10\x08\x04\x3e\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x99\x99\x99\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x01\x02\x7e\x89\x91\xa1\x7e\x40\x80\x00\x00\x00\x00" - "\x00\x00\x1c\x20\x40\x40\x78\x40\x40\x40\x20\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x10\x08\x04\x02\x04\x08\x10\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x08\x10\x20\x40\x20\x10\x08\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x11\x11\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10" - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x88\x88\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x7c\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x08\x08\x08\x08\x08\xe8\x28\x28\x28\x18\x00\x00\x00\x00" - "\x00\xd8\x64\x44\x44\x44\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\x88\x10\x20\x48\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xd6\x10\x10\x7c" - "\x10\x10\x38\xec\xfe\x7c\x10\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x1f\x03\x05\x7d\x84\x84\x84\x78" - "\x3e\x41\x41\x41\x3e\x08\x3e\x08" - "\x3f\x21\x3f\x20\x20\x20\x60\xc0" - "\x3f\x21\x3f\x21\x21\x23\x66\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x10\x38\x7c\x10\x10\x7c\x38\x10" - "\x24\x24\x24\x24\x24\x00\x24\x00" - "\x7f\x92\x92\x72\x12\x12\x12\x00" - "\x3e\x61\x38\x44\x44\x38\x8c\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x10\x38\x7c\x10\x7c\x38\x10\xfe" - "\x10\x38\x7c\x10\x10\x10\x10\x00" - "\x10\x10\x10\x10\x7c\x38\x10\x00" - "\x00\x08\x04\xfe\x04\x08\x00\x00" - "\x00\x20\x40\xfe\x40\x20\x00\x00" - "\x00\x00\x80\x80\x80\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x10\x38\x38\x10\x10\x00\x10\x00" - "\x24\x24\x24\x00\x00\x00\x00\x00" - "\x24\x24\xff\x24\xff\x24\x24\x00" - "\x10\x7c\x80\x78\x04\xf8\x10\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x44\x38\x56\x84\x84\x76\x00" - "\x20\x20\x40\x00\x00\x00\x00\x00" - "\x10\x20\x40\x40\x40\x20\x10\x00" - "\x20\x10\x08\x08\x08\x10\x20\x00" - "\x00\x44\x38\xfe\x38\x44\x00\x00" - "\x00\x10\x10\xfe\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x20" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x00" - "\x02\x04\x08\x10\x20\x40\x80\x00" - "\x7c\x82\x86\x8a\x92\xa2\x7c\x00" - "\x10\x30\x10\x10\x10\x10\x7c\x00" - "\x78\x84\x04\x10\x40\x84\xfc\x00" - "\x78\x84\x04\x38\x04\x84\x78\x00" - "\x08\x18\x28\x48\xfe\x08\x1c\x00" - "\xfc\x80\xf8\x04\x04\x84\x78\x00" - "\x38\x40\x80\xf8\x84\x84\x78\x00" - "\xfc\x84\x08\x10\x20\x20\x20\x00" - "\x78\x84\x84\x78\x84\x84\x78\x00" - "\x78\x84\x84\x7c\x04\x08\x70\x00" - "\x00\x10\x10\x00\x00\x10\x10\x00" - "\x00\x10\x10\x00\x00\x10\x10\x20" - "\x10\x20\x40\x80\x40\x20\x10\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x20\x10\x08\x04\x08\x10\x20\x00" - "\x78\x84\x04\x08\x10\x00\x10\x00" - "\x7c\x82\x9e\x92\x9e\x80\x78\x00" - "\x30\x48\x84\x84\xfc\x84\x84\x00" - "\xfc\x42\x42\x7c\x42\x42\xfc\x00" - "\x3c\x42\x80\x80\x80\x42\x3c\x00" - "\xf8\x44\x42\x42\x42\x44\xf8\x00" - "\xfe\x42\x48\x78\x48\x42\xfe\x00" - "\xfe\x42\x48\x78\x48\x40\xe0\x00" - "\x3c\x42\x80\x80\x8e\x42\x3e\x00" - "\x84\x84\x84\xfc\x84\x84\x84\x00" - "\x38\x10\x10\x10\x10\x10\x38\x00" - "\x0e\x04\x04\x04\x44\x44\x38\x00" - "\xc2\x44\x48\x70\x44\x42\xc2\x00" - "\xe0\x40\x40\x40\x40\x42\xfe\x00" - "\x82\xc6\xaa\x92\x82\x82\x82\x00" - "\x82\xc2\xa2\x92\x8a\x86\x82\x00" - "\x38\x44\x82\x82\x82\x44\x38\x00" - "\xfc\x42\x42\x7c\x40\x40\xe0\x00" - "\x38\x44\x82\x82\x82\x54\x38\x04" - "\xfc\x42\x42\x7c\x44\x42\xc2\x00" - "\x38\x84\x80\x78\x04\x84\x74\x00" - "\xfe\x92\x10\x10\x10\x10\x38\x00" - "\x84\x84\x84\x84\x84\x84\xfc\x00" - "\x84\x84\x84\x84\x84\x48\x30\x00" - "\x82\x82\x82\x92\xaa\xc6\x82\x00" - "\x82\x44\x28\x10\x28\x44\x82\x00" - "\x82\x44\x28\x10\x10\x10\x38\x00" - "\xfe\x84\x88\x10\x22\x42\xfe\x00" - "\x78\x40\x40\x40\x40\x40\x78\x00" - "\x80\x40\x20\x10\x08\x04\x02\x00" - "\x78\x08\x08\x08\x08\x08\x78\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x20\x20\x10\x00\x00\x00\x00\x00" - "\x00\x00\x78\x04\x7c\x84\x76\x00" - "\xc0\x40\x7c\x42\x42\x42\xdc\x00" - "\x00\x00\x78\x84\x80\x84\x78\x00" - "\x0c\x04\x7c\x84\x84\x84\x76\x00" - "\x00\x00\x78\x84\xfc\x80\x78\x00" - "\x38\x44\x40\xe0\x40\x40\xe0\x00" - "\x00\x00\x76\x84\x84\x7c\x04\xf8" - "\xc0\x40\x4c\x62\x42\x42\xc2\x00" - "\x10\x00\x30\x10\x10\x10\x38\x00" - "\x04\x00\x04\x04\x04\x84\x84\x78" - "\xc0\x40\x42\x44\x78\x44\xc2\x00" - "\x30\x10\x10\x10\x10\x10\x38\x00" - "\x00\x00\xec\x92\x92\x92\x82\x00" - "\x00\x00\xf8\x84\x84\x84\x84\x00" - "\x00\x00\x78\x84\x84\x84\x78\x00" - "\x00\x00\xdc\x42\x42\x7c\x40\xe0" - "\x00\x00\x76\x84\x84\x7c\x04\x0e" - "\x00\x00\xdc\x62\x40\x40\xe0\x00" - "\x00\x00\x7c\x80\x78\x04\xf8\x00" - "\x10\x10\x7c\x10\x10\x12\x0c\x00" - "\x00\x00\x84\x84\x84\x84\x76\x00" - "\x00\x00\x84\x84\x84\x48\x30\x00" - "\x00\x00\x82\x92\xaa\xc6\x82\x00" - "\x00\x00\x84\x48\x30\x48\x84\x00" - "\x00\x00\x84\x84\x84\x7c\x04\xf8" - "\x00\x00\xfc\x88\x30\x44\xfc\x00" - "\x18\x20\x20\xc0\x20\x20\x18\x00" - "\x10\x10\x10\x00\x10\x10\x10\x00" - "\x60\x10\x10\x0c\x10\x10\x60\x00" - "\x64\x98\x00\x00\x00\x00\x00\x00" - "\x00\x10\x28\x44\x82\x82\xfe\x00" - "\x78\x84\x80\x84\x78\x18\x04\x78" - "\x00\x84\x00\x84\x84\x84\x7a\x00" - "\x0c\x00\x78\x84\xfc\x80\x78\x00" - "\x7e\x81\x3c\x02\x3e\x42\x3d\x00" - "\x84\x00\x78\x04\x7c\x84\x7a\x00" - "\xc0\x00\x78\x04\x7c\x84\x7a\x00" - "\x20\x20\x78\x04\x7c\x84\x7a\x00" - "\x00\x00\x78\x80\x80\x78\x04\x38" - "\x7e\x81\x3c\x42\x7e\x40\x3c\x00" - "\x84\x00\x78\x84\xfc\x80\x78\x00" - "\x60\x00\x78\x84\xfc\x80\x78\x00" - "\x48\x00\x30\x10\x10\x10\x38\x00" - "\x7c\x82\x30\x10\x10\x10\x38\x00" - "\x60\x00\x30\x10\x10\x10\x38\x00" - "\x82\x38\x44\x82\xfe\x82\x82\x00" - "\x30\x10\x44\x82\xfe\x82\x82\x00" - "\x0c\xfc\x40\x78\x40\x40\xfc\x00" - "\x00\x00\x67\x19\x7f\x98\x77\x00" - "\x3f\x48\x88\xff\x88\x88\x8f\x00" - "\x78\x84\x78\x84\x84\x84\x78\x00" - "\x84\x00\x78\x84\x84\x84\x78\x00" - "\xc0\x00\x78\x84\x84\x84\x78\x00" - "\x7e\x81\x42\x42\x42\x42\x3c\x00" - "\x20\x10\x42\x42\x42\x42\x3c\x00" - "\x84\x00\x84\x84\x84\x7c\x04\xf8" - "\x42\x18\x24\x42\x42\x24\x18\x00" - "\x84\x00\x84\x84\x84\x84\x78\x00" - "\x00\x02\x7c\x8a\x82\xa2\x7c\x80" - "\x38\x44\x44\xe0\x40\x82\xfc\x00" - "\x3a\x44\x8a\x92\xa2\x44\xb8\x00" - "\xf8\x84\x84\xf8\x82\x87\x82\x83" - "\x0c\x12\x10\x38\x10\x10\x90\x60" - "\x1c\x00\x78\x04\x7c\x84\x7a\x00" - "\x18\x00\x30\x10\x10\x10\x38\x00" - "\x08\x10\x78\x84\x84\x84\x78\x00" - "\x08\x10\x84\x84\x84\x84\x7a\x00" - "\x64\x98\xb8\xc4\x84\x84\x84\x00" - "\x64\x98\x84\xa4\x94\x84\x84\x00" - "\x3c\x44\x44\x3a\x00\x7e\x00\x00" - "\x38\x44\x44\x38\x00\x7c\x00\x00" - "\x20\x00\x20\x40\x80\x84\x78\x00" - "\x00\x00\x00\xfc\xc0\xc0\x00\x00" - "\x00\x00\x00\xfc\x0c\x0c\x00\x00" - "\x42\x44\x48\x56\x69\x42\x84\x0f" - "\x42\x44\x48\x53\x65\x49\x8f\x01" - "\x10\x10\x00\x10\x38\x38\x10\x00" - "\x00\x22\x44\x88\x44\x22\x00\x00" - "\x00\x82\x7c\x82\x82\x7c\x82\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x18\x18\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\x36\x36\xf6\x36\x36\x36" - "\x00\x00\x00\x00\xfe\x36\x36\x36" - "\x00\x00\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x36\x36\x36\x36\xfe\x00\x00\x00" - "\x18\x18\xf8\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x18\x18\x1f\x18\x1f\x18\x18\x18" - "\x36\x36\x36\x36\x37\x36\x36\x36" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x18\x18\xff\x00\xff\x00\x00\x00" - "\x36\x36\x36\x36\xff\x00\x00\x00" - "\x00\x00\xff\x00\xff\x18\x18\x18" - "\x00\x00\x00\x00\xff\x36\x36\x36" - "\x36\x36\x36\x36\x3f\x00\x00\x00" - "\x18\x18\x1f\x18\x1f\x00\x00\x00" - "\x00\x00\x1f\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x3f\x36\x36\x36" - "\x36\x36\x36\x36\xff\x36\x36\x36" - "\x18\x18\xff\x18\xff\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x00\x00\x62\x94\x88\x94\x62\x00" - "\x00\x78\x84\xf8\x84\xf8\x80\x80" - "\x00\xfc\x84\x80\x80\x80\x80\x00" - "\x00\xfe\x28\x28\x28\x28\x28\x00" - "\xfc\x84\x40\x20\x40\x84\xfc\x00" - "\x00\x00\x7e\x88\x88\x88\x70\x00" - "\x00\x42\x42\x42\x42\x7c\x40\x80" - "\x00\x76\x88\x08\x08\x08\x08\x00" - "\xf8\x20\x70\x88\x88\x70\x20\xf8" - "\x38\x44\x82\xfe\x82\x44\x38\x00" - "\x38\x44\x82\x82\x28\x28\x6c\x00" - "\x1c\x10\x08\x7c\x84\x84\x78\x00" - "\x00\x00\x7c\x92\x92\x7c\x00\x00" - "\x02\x04\x7e\x89\x91\x7e\x40\x80" - "\x38\x40\x80\xf8\x80\x40\x38\x00" - "\x78\x84\x84\x84\x84\x84\x84\x00" - "\x00\xfc\x00\xfc\x00\xfc\x00\x00" - "\x20\x20\xfc\x20\x20\x00\xfc\x00" - "\x40\x20\x10\x20\x40\x00\xfc\x00" - "\x10\x20\x40\x20\x10\x00\xfc\x00" - "\x0e\x11\x11\x10\x10\x10\x10\x10" - "\x08\x08\x08\x08\x08\x88\x88\x70" - "\x20\x20\x00\xf8\x00\x20\x20\x00" - "\x00\x64\x98\x00\x64\x98\x00\x00" - "\x38\x44\x44\x38\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x07\x04\x04\x04\x64\x24\x1c\x0c" - "\x58\x44\x44\x44\x44\x00\x00\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 865 Norwegian, (thin)", CIOLIB_CP865} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xf8\xf8\x60\x60\x7c\x7e\x66\x66\x6e\x6c\x00\x00\x00\x00" - "\x18\x10\x7e\x7e\x60\x60\x60\x60\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x60\x60\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x10\x7c\x7c\x60\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x66\x66\xcc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xdb\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\xfe\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\xfe\x18\x18\xfe\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xf8\xc0\xc0\xf8\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x86\x8c\x18\x30\x6a\xca\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\xd8\xd8\xde\xdb\xdb\xdb\xde\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xc0\xc0\x60\x30\x00\x00\x00\x00\x00" - "\x00\x00\x00\xd8\xd8\xd8\xd8\xfe\xdb\xd9\xdb\xde\x00\x00\x00\x00" - "\x18\x10\xc2\xc6\xcc\xd8\xf0\xf8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xfc\x30\x30\x3c\x3e\x36\x36\x36\x36\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\xfe\x38\x38\x00\x00\x00\x00" - "\x00\x00\x60\x60\x60\xf8\x60\x7c\x7e\x66\x66\x66\x0c\x0c\x00\x00" - "\x00\x00\xc0\xc0\xc0\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x60\xc0\xc0\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xf1\x5b\x55\x51\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x38\x78\x78\xde\xd9\xd9\xde\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\x60\x30\x30\x60\xc0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\xd8\xd8\xfe\xd9\xd9\xde\x00\x00\x00\x00" - "\x00\x00\x00\x18\x10\xc4\xcc\xd8\xf0\xd8\xcc\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xfc\x30\x3c\x36\x36\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x28\x10\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x28\x10\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x5a\x3c\x66\x66\x3c\x5a\x00\x00\x00\x00\x00" - "\x00\x00\x06\x06\x7e\x7e\x60\x60\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x30\x40\x40\x30\x48\x48\x30\x08\x08\x30\x00\x00\x00\x00" - "\x6c\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x7c\x82\x9a\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xf0\xf0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x33\x66\xcc\xcc\x66\x33\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\x02\x02\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x92\xaa\xb2\xaa\x82\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x28\x28\x10\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7e\x7e\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x84\xcc\xfc\xcc\xc6\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xe8\xe8\xe8\x68\x28\x28\x28\x28\x28\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x8a\xcd\xea\xb8\x9b\x88\x8b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\x66\x33\x33\x66\xcc\x00\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xf8\xf8\x60\x60\x7c\x7e\x66\x6e\x6c\x00\x00\x00" - "\x18\x10\x7e\x7e\x60\x60\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x60\x60\x60\xc0\x00\x00" - "\x00\x00\x00\x18\x10\x7c\x7c\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x66\x66\x66\xcc\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xdb\x00\x00\x00" - "\x00\x00\x18\x18\xfe\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\xfe\x18\x18\x18\xfe\x18\x18\x00\x00\x00" - "\x00\x00\x3c\x62\x60\xfe\xc0\xfe\x60\x62\x3c\x00\x00\x00" - "\x00\x00\x00\x86\x8c\x18\x30\x6a\xca\x00\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\xd8\xd8\xde\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x00\x00\x30\x60\xc0\xc0\x60\x30\x00\x00\x00\x00" - "\x00\x00\xd8\xd8\xd8\xd8\xfe\xdb\xd9\xdb\xde\x00\x00\x00" - "\x18\x10\xc6\xcc\xd8\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xfc\x30\x30\x3c\x3e\x36\x36\x36\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x38\x38\x00\x00" - "\x00\x00\x60\x60\xf8\x60\x7c\x7e\x66\x66\x66\x0e\x0c\x00" - "\x00\x00\x00\xc0\xc0\xc0\x60\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xc0\x60\x60\x60\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\x66\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xf1\x5b\x55\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x38\x78\xd8\xde\xd9\xde\x00\x00\x00" - "\x00\x00\x00\x00\xc0\x60\x30\x30\x60\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\xd8\xfe\xd9\xd9\xde\x00\x00\x00" - "\x00\x00\x00\x18\x10\xcc\xd8\xf0\xd8\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xfc\x30\x3c\x36\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x28\x10\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x28\x10\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x5a\x3c\x66\x66\x3c\x5a\x00\x00\x00\x00" - "\x00\x00\x06\x06\x7e\x7e\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x30\x40\x40\x30\x48\x48\x30\x08\x08\x30\x00\x00" - "\x6c\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfc\x00\x00\x00" - "\x00\x7c\x82\x9a\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xf0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x33\x66\xcc\xcc\x66\x33\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xfe\x02\x02\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x92\xaa\xb2\xaa\x82\x7c\x00\x00\x00\x00\x00\x00" - "\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x10\x28\x28\x10\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7e\x7e\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x84\xcc\xfc\xcc\xc6\xc0\xc0\xc0\x00" - "\x00\x00\x7c\xe8\xe8\xe8\x68\x28\x28\x28\x28\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x8a\xcd\xea\xb8\x9b\x88\x8b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xf0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\xcc\x66\x33\x33\x66\xcc\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\x00\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfc\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\xc6\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\xcc\xcc\x78" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xfc\xfc\x30\x3c\x36\x33\x36\x00" - "\x10\x7e\x60\x60\x60\x60\x60\x00" - "\x00\x00\x00\x00\x00\x60\x30\x30" - "\x00\x00\x10\x7e\x60\x60\x60\x00" - "\x00\x00\x00\x00\x00\xcc\x66\x66" - "\x00\x00\x00\x00\x00\xdb\xdb\x00" - "\x00\x18\xfe\x18\x18\x18\x18\x00" - "\x00\x18\xfe\x18\x18\xfe\x18\x00" - "\x3c\x62\xf8\xc0\xf8\x62\x3c\x00" - "\x00\x86\x8c\x18\x30\x6a\xca\x00" - "\x38\x78\xd8\xde\xdb\xdb\xde\x00" - "\x00\x30\x60\xc0\xc0\x60\x30\x00" - "\xd8\xd8\xd8\xfe\xd9\xd9\xde\x00" - "\x18\xd6\xcc\xf8\xf8\xcc\xc6\x00" - "\xfc\xfc\x30\x3c\x36\x36\x36\x00" - "\xc6\xc6\xc6\xc6\xfe\x38\x38\x00" - "\x60\xf8\x60\x7c\x7e\x66\x66\x0c" - "\xc0\xc0\x60\x00\x00\x00\x00\x00" - "\xc0\x60\x60\x00\x00\x00\x00\x00" - "\xcc\xcc\x66\x00\x00\x00\x00\x00" - "\xcc\x66\x66\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf1\x5b\x55\x51\x00\x00\x00\x00" - "\x00\x00\x38\x78\xde\xd9\xde\x00" - "\x00\xc0\x60\x30\x30\x60\xc0\x00" - "\x00\x00\xd8\xd8\xfe\xd9\xde\x00" - "\x18\x10\xcc\xd8\xf0\xd8\xcc\x00" - "\x00\x00\xfc\x30\x3c\x36\x36\x00" - "\x00\x00\xc6\xc6\xfe\x38\x38\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6b\x63\x63\x3f\x03\x63\x3e\x00" - "\x00\x10\xcc\xcc\xcc\x7c\x0c\xf8" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\x00\x5a\x3c\x66\x66\x3c\x5a\x00" - "\x06\x7e\x7e\x60\x60\x60\x60\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x30\x40\x30\x48\x30\x08\x30\x00" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\x7c\x82\x9a\xa2\x9a\x82\x7c\x00" - "\x3c\x62\xc0\xf8\xc0\x62\x3c\x00" - "\x00\x33\x66\xcc\xcc\x66\x33\x00" - "\x00\x00\x00\x00\xfe\xfe\x02\x00" - "\x00\x00\x00\x00\xf8\xf8\x00\x00" - "\x7c\x92\xaa\xb2\xaa\x82\x7c\x00" - "\x66\x00\x18\x18\x18\x18\x18\x00" - "\x00\x10\x28\x28\x10\x00\x00\x00" - "\x00\x00\x18\x7e\x18\x00\x7e\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x18\x00\x18\x18\x18\x18\x18\x00" - "\x00\x00\x06\x7e\x60\x60\x60\x00" - "\x00\x84\xcc\xfc\xcc\xc6\xc0\xc0" - "\x7c\xe8\xe8\x68\x28\x28\x28\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00" - "\x6c\x00\x78\xcc\xfc\xc0\x78\x00" - "\x8a\xcd\xea\xb8\x9b\x88\x8b\x00" - "\x00\x00\x3e\x60\x7c\x60\x3e\x00" - "\x00\xcc\x66\x33\x33\x66\xcc\x00" - "\x0c\x00\x0c\x0c\x0c\xcc\xcc\x78" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x00\x66\x00\x18\x18\x18\x18\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - , "Codepage 1251 Cyrillic", CIOLIB_CP1251} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x30\x60\x60\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x06\x06\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xec\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00" - "\x00\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x66\xc3\x99\xa1\xa1\x99\xc3\x66\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x03\x03\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x06\x1e\x06\x66\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x06\x0c\x18\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xc0\x90\xb8\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xbf\xb1\x30\x30\x3e\x30\x30\x31\x31\x3f\x00\x00\x00\x00" - "\x00\x00\xb3\xb3\x33\x33\x3f\x33\x33\x33\x33\x00\x00\x00\x00\x00" - "\x00\x00\xbc\x98\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x9e\xb3\x33\x33\x33\x33\x33\x33\x1e\x00\x00\x00\x00\x00" - "\x00\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x1e\x00" - "\x00\x00\xb3\xb3\x33\x33\x1e\x0c\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\x9e\xb3\x21\x21\x21\x21\x21\x33\x12\x33\x00\x00\x00\x00" - "\x0c\x08\x00\x66\x00\x18\x18\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\x62\x60\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x00\x00\x7c\x00\x00\x00\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\x60\x30\x18\x18\x30\x60\xc0\xfe\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x7e\x99\x99\x99\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x18\xdb\xdb\xdb\xdb\xdb\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\x66\x24\xe7\x00\x00\x00\x00" - "\x00\xc3\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\xc3\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\x7b\xce\xcc\xcc\xcc\xcc\x7b\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\x7c\xc6\xc0\x78\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\xdc\x66\x66\x66\x66\x66\x66\x06\x06\x06\x00" - "\x00\x00\x38\x10\x00\x18\x18\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x18\xc3\x00\x00\xe7\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7b\xce\xcc\xcc\xcc\xcc\x7b\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\x42\x66\x3c\x00\x00" - "\x00\x7c\x60\x30\x18\x78\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x78\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x0c\x18\x30\x60\xc0\xc0\xc0\xc0\x78\x0c\x0c\x78\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x06\x06\x06\x00" - "\x00\x00\x3e\x63\x63\x63\x7f\x63\x63\x63\x63\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x0c\x0c\x0c\x36\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7f\x60\x60\x60\x00" - "\x00\x00\x00\x00\x00\x82\xc6\xc6\x6c\x6c\x38\x38\x00\x00\x00\x00" - "\x00\x00\xfc\x60\xc0\x78\x30\x60\xc0\xc0\xc0\x7c\x06\x06\x3c\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x66\x66\x66\x66\x66\x7c\x60\x60\x60\x00" - "\x00\x00\x00\x00\x00\x3e\x63\xc0\xc0\x60\x38\x0c\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x7f\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe7\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x5c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x10\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x10\x00" - "\x00\x00\x00\x00\x00\x66\xc3\xc3\xc3\xdb\xff\x66\x00\x00\x00\x00" - "\x00\x00\xc3\x00\x00\x18\x18\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\xc3\x00\x00\xe7\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\xe7\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\x66\xc3\xc3\xc3\xdb\xff\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x00\x00" - "\x00\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18" - "\x00\x00\x00\x00\xc2\xc6\x1c\x38\x60\xc6\x86\x00\x00\x00" - "\x00\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00" - "\x00\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xd6\xc6\xc6\x6c\x38\x00\x00" - "\x00\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00" - "\x00\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x06\x0c\x18\x30\x30\x18\x0c\x06\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x60\x30\x18\x0c\x0c\x18\x30\x60\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xdc\xc0\x7c\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x1e\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\xe6\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00" - "\x00\x00\x00\xc6\xc6\x6c\x7c\x38\x7c\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xfe\xc6\x86\x0c\x18\x30\x62\xc6\xfe\x00\x00" - "\x00\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00" - "\x00\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x60\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x78\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78" - "\x00\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c" - "\x00\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x7c\x60\x60\x60" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c" - "\x00\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00" - "\x00\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x6c\x38\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8" - "\x00\x00\x00\x00\x00\x00\xfe\x8c\x38\x70\xc6\xfe\x00\x00" - "\x00\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x30\x60\x60\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x06\x06\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xec\xfc\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18" - "\x00\x00\x00\x7c\xc6\x60\x38\x6c\xc6\x6c\x38\x0c\xc6\x7c" - "\x00\x00\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x66\xc3\x99\xa1\xa1\x99\xc3\x66\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x03\x03\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x06\x1e\x06\x66\x3c\x00\x00\x00\x00\x00\x00\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x06\x0c\x18\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc0\x90\xb8\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xbf\xb1\x30\x30\x3e\x30\x31\x31\x3f\x00\x00" - "\x00\x00\x00\xb3\xb3\x33\x33\x3f\x33\x33\x33\x33\x00\x00" - "\x00\x00\x00\xbc\x98\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00" - "\x00\x00\x00\x9e\xb3\x33\x33\x33\x33\x33\x33\x1e\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x3e" - "\x00\x00\x00\xb3\xb3\x33\x33\x1e\x0c\x0c\x0c\x1e\x00\x00" - "\x00\x00\x00\x9e\xb3\x21\x21\x21\x21\x33\x12\x33\x00\x00" - "\x00\x0c\x08\x00\x66\x00\x18\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\xfe\x62\x60\x60\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xc6\xc6\xfe\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xfe\xc6\x86\x0c\x18\x30\x62\xc6\xfe\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xe6\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfe\x82\x00\x00\x7c\x00\x00\x82\xfe\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xfe\xc0\x60\x30\x18\x30\x60\xc0\xfe\x00\x00" - "\x00\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x3c\x18\x7e\x99\x99\x7e\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xc6\xc6\x6c\x7c\x38\x7c\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x18\xdb\xdb\xdb\xdb\x7e\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\x66\x24\xe7\x00\x00" - "\x00\x00\xc3\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\xc3\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x38\x10\x00\x7b\xce\xcc\xcc\xcc\x7b\x00\x00" - "\x00\x00\x38\x10\x00\x7c\xc6\xc0\x78\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x10\x00\xdc\x66\x66\x66\x66\x66\x06\x06" - "\x00\x00\x00\x38\x10\x00\x18\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x18\xc3\x00\x00\xe7\x66\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7b\xce\xcc\xcc\xcc\x7b\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\xc0\xc0" - "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\x42\x66\x3c" - "\x00\x00\x7c\x60\x30\x18\x78\xcc\xcc\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x78\xc0\xc6\x7c\x00\x00" - "\x00\xfc\x0c\x18\x30\x60\xc0\xc0\xc0\xc0\x78\x0c\x0c\x78" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x06\x06" - "\x00\x00\x00\x3e\x63\x63\x63\x7f\x63\x63\x63\x3e\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\x38\x6c\x0c\x0c\x0c\x36\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7f\x60\x60" - "\x00\x00\x00\x00\x00\x00\x82\xc6\xc6\x6c\x6c\x38\x00\x00" - "\x00\xfc\x60\xc0\x78\x30\x60\xc0\xc0\xc0\x7c\x06\x06\x7c" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3c\x66\x66\x66\x66\x7c\x60\x60" - "\x00\x00\x00\x00\x00\x00\x3e\x63\xc0\x60\x38\x0c\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\x7f\xcc\xcc\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe7\x66\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x5c\xd6\xd6\xd6\xd6\x7c\x10\x10" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10" - "\x00\x00\x00\x00\x00\x00\x66\xc3\xc3\xdb\xff\x66\x00\x00" - "\x00\x00\x00\xc3\x00\x00\x18\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\xc3\x00\x00\xe7\x66\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\x38\x10\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x10\x00\xe7\x66\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\x38\x10\x00\x66\xc3\xc3\xdb\xff\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x18\x18\x00\x18\x00" - "\x66\x66\x24\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x38\x6c\xc6\xd6\xc6\x6c\x38\x00" - "\x18\x38\x18\x18\x18\x18\x7e\x00" - "\x7c\xc6\x06\x1c\x30\x66\xfe\x00" - "\x7c\xc6\x06\x3c\x06\xc6\x7c\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfe\xc0\xc0\xfc\x06\xc6\x7c\x00" - "\x3c\x60\xc0\xfc\xc6\xc6\x7c\x00" - "\xfe\xc6\x06\x0c\x18\x30\x30\x00" - "\x7c\xc6\xc6\x7c\xc6\xc6\x7c\x00" - "\x7c\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x06\x0c\x18\x30\x18\x0c\x06\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x7c\xc6\x0c\x18\x18\x00\x18\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3a\x00" - "\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x7c\xc6\xc6\xc6\xc6\xce\x7c\x0e" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x3c\x66\x30\x18\x0c\x66\x3c\x00" - "\x7e\x5a\x18\x18\x18\x18\x3c\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00" - "\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x00" - "\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00" - "\x66\x66\x66\x3c\x18\x18\x3c\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x7c\xc6\xc0\xc6\x7c\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x7c\xc6\xfe\xc0\x7c\x00" - "\x3c\x66\x60\xf8\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x18\x00\x38\x18\x18\x18\x3c\x00" - "\x06\x00\x06\x06\x06\x66\x66\x3c" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\xec\xfe\xd6\xd6\xc6\x00" - "\x00\x00\xdc\x66\x66\x66\x66\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x60\x60\xf0\x00" - "\x00\x00\x7e\xc0\x7c\x06\xfc\x00" - "\x30\x30\xfc\x30\x30\x36\x1c\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xc6\xc6\xc6\x6c\x38\x00" - "\x00\x00\xc6\xd6\xd6\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xc6\xc6\xc6\x7e\x06\xfc" - "\x00\x00\x7e\x4c\x18\x32\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x00" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x40\x30\x00\x00\x00\x00\x00" - "\x0c\x02\x0c\x00\x00\x00\x00\x00" - "\x3c\x66\x60\xf8\x60\x66\xfe\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\x7e\xc0\x7c\xc6\x7c\x06\xfc\x00" - "\x66\x00\x00\x00\x00\x00\x00\x00" - "\x38\x44\xba\xa2\xba\x44\x38\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x33\x66\xcc\x66\x33\x00" - "\x00\x00\x00\xff\x03\x00\x00\x00" - "\x00\x00\x00\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x00\x00\x00\x00" - "\x30\x30\xfc\x30\x30\x00\xfc\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x70\x08\x30\x08\x70\x00\x00\x00" - "\x08\x10\x00\x00\x00\x00\x00\x00" - "\x08\xd3\x00\x00\x00\x00\x00\x00" - "\x5c\xb6\x63\x7f\x63\x63\x63\x00" - "\x18\x18\x00\x00\x00\x00\x00\x00" - "\x5f\x90\x10\x1e\x10\x10\x1f\x00" - "\xb3\xb3\x33\x3f\x33\x33\x33\x00" - "\x5e\x8c\x0c\x0c\x0c\x0c\x1e\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x5c\xb6\x63\x63\x63\x36\x1c\x00" - "\x40\xc0\x4c\x52\x04\x08\x1e\x00" - "\xb3\xb3\x33\x1e\x0c\x0c\x1e\x00" - "\x5c\xb6\x63\x63\x36\x14\x77\x00" - "\x08\xd3\x00\x30\x30\x30\x3c\x00" - "\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\xfe\xc0\xc0\xc0\xc0\xc0\xc0\x00" - "\x10\x38\x6c\xc6\xc6\xc6\xfe\x00" - "\xfe\xc0\xc0\xfc\xc0\xc0\xfe\x00" - "\xfe\x06\x0c\x18\x30\x60\xfe\x00" - "\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00" - "\x7c\xc6\xc6\xfe\xc6\xc6\x7c\x00" - "\x7e\x18\x18\x18\x18\x18\x7e\x00" - "\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00" - "\x10\x38\x6c\xc6\xc6\xc6\xc6\x00" - "\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\xfe\xc6\x00\x38\x00\xc6\xfe\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xff\x66\x66\x66\x66\x66\x66\x00" - "\xfc\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xfe\xc0\x60\x30\x60\xc0\xfe\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x10\x7c\xd6\xd6\x7c\x10\x38\x00" - "\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00" - "\x10\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x38\x6c\xc6\xc6\x6c\x28\xee\x00" - "\xc3\x3c\x18\x18\x18\x18\x3c\x00" - "\x66\x00\x66\x66\x3c\x18\x3c\x00" - "\x08\x10\x76\xcc\xcc\xcc\x76\x00" - "\x08\x10\x7e\xc0\x7c\xc0\x7e\x00" - "\x08\x10\xbc\x66\x66\x66\x66\x06" - "\x08\x10\x30\x30\x30\x30\x3c\x00" - "\x08\xd3\x00\xe6\x66\x66\x3c\x00" - "\x00\x00\x7a\xcc\xcc\xcc\x7a\x00" - "\x78\xcc\xd8\xfc\xc6\xc6\xfc\x80" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x7c" - "\x7e\x30\x18\x7c\xc6\xc6\x7c\x00" - "\x00\x00\x7e\xc0\x7c\xc0\x7e\x00" - "\x7e\x06\x1c\x30\x60\x3e\x02\x1c" - "\x00\x00\xbc\x66\x66\x66\x66\x06" - "\x7c\xc6\xe6\x3e\x86\xc6\x7c\x00" - "\x00\x00\x30\x30\x30\x30\x1c\x00" - "\x00\x00\xc6\xdc\xf0\xdc\xc6\x00" - "\x7c\xc6\x06\x1e\x36\x66\xc6\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xdd\xc0" - "\x00\x00\x82\xc6\xc6\x6c\x38\x00" - "\x7e\x18\x30\x3c\x60\x3e\x02\x1c" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xff\x66\x66\x66\x66\x00" - "\x00\x00\x7c\xc6\xc6\xfc\xc0\xc0" - "\x00\x00\x7e\xc0\xc0\x7c\x06\x1c" - "\x00\x00\x7e\xd8\xcc\xcc\x78\x00" - "\x00\x00\xfc\x30\x30\x36\x1c\x00" - "\x00\x00\xe6\x66\x66\x66\x3c\x00" - "\x00\x00\x1c\x56\xd6\xd6\x7c\x10" - "\x00\x00\xc2\x6c\x38\x6c\x86\x00" - "\x00\x00\x10\xd6\xd6\xd6\x7c\x10" - "\x00\x00\x44\xd6\xd6\xd6\x6c\x00" - "\xcc\x00\x30\x30\x30\x30\x3c\x00" - "\x66\x00\xe6\x66\x66\x66\x3c\x00" - "\x08\x10\x7c\xc6\xc6\xc6\x7c\x00" - "\x08\x10\xe6\x66\x66\x66\x3c\x00" - "\x08\x10\x44\xd6\xd6\xd6\x6c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "ISO-8859-7 Greek", CIOLIB_ISO_8859_7} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x00\x00\x00" - "\x00\x00\x60\xf0\x60\x6c\x76\x66\x66\x66\x66\xe6\x06\x0c\x30\x00" - "\x00\x00\x18\x10\x00\xfe\xc2\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x62\xc0\xf8\xc0\x62\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x18\x10\x00\x78\x30\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x36\x24\x00\x78\x30\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x0c\x08\x00\x3c\x18\x18\x18\x18\x18\x18\x18\xb0\x60\x00" - "\x00\x00\x00\x00\x00\x3c\x4c\x4c\x4e\x49\x49\xce\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xfe\xc9\xc9\xce\x00\x00\x00\x00" - "\x00\x00\x60\xf0\x60\x60\x7c\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x10\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\xfe\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x24\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x10\x10\x38\x00" - "\x00\x00\x00\x00\x07\x88\xcb\xab\xa8\xab\x9b\x88\x00\x00\x00\x00" - "\x00\x60\xf8\x60\x60\x7c\x76\x66\x66\x66\x66\xe7\x00\x00\x00\x00" - "\x18\x10\xfe\x66\x62\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xe8\xd0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x36\x24\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\xb0\x60\x00\x00" - "\x00\x00\x7c\x6c\x6c\x6c\x6e\x69\x69\x69\x69\xce\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xfe\xc9\xc9\xc9\xc9\xce\x00\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe7\x00\x00\x00\x00" - "\x18\x10\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00\x00" - "\x02\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x6c\x38\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x10\x10\x38\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - , NULL, NULL, "Russian koi8-r (c)", CIOLIB_KOI8_R} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x00\x18\x18\x7e\xdb\xd8\x58\x38\x1c\x1e\xdb\xdb\x7e\x18\x18\x00" - "\x00\x00\x00\xe2\xa6\xec\x18\x18\x30\x60\x6e\xca\x8e\x00\x00\x00" - "\x00\x00\x00\x38\x6c\x38\x30\x76\x7e\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6c\x38\xfe\x38\x6c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x00\x00\x02\x06\x0c\x18\x18\x30\x60\x60\xc0\x80\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xce\xd6\xd6\xd6\xd6\xe6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x18\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x0c\x1c\x3c\x6c\xcc\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x18\x30\x00" - "\x00\x00\x00\x00\x0c\x18\x30\x60\x60\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x60\x30\x18\x0c\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xdc\xc0\x7e\x00\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xce\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xee\xee\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x06\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\x60\x60\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00" - "\x00\x00\x00\x80\xc0\x60\x60\x30\x18\x0c\x0c\x06\x02\x00\x00\x00" - "\x00\x00\x00\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x1c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x1c\x36\x30\xfc\x30\x30\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\x00\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x30\x30\x60\xc0\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xfe\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xce\x18\x0e\x00" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xf6\x18\xf0\x00" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x0c\x78\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x7c\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xce\xc6\xc6\x7c\x0c\x78\x00" - "\x00\x00\x00\xff\xdb\x99\x18\x1e\x3c\x78\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x30\x1e\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x1e\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x18\xf0\x00" - "\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x0c\x78\x00" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x78\x00\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x60\x30\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x36\x1c\x00\x00\x00" - "\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00\x00" - "\x00\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\x06\x1c\x00\x00\x00" - "\x00\x7c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x0c\x18\x20\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x38\x6c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x76\xdc\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x6c\x6c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x3f\x6c\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcf\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e\x00" - "\x66\x3c\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x18\x30\x40\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x30\x1e\x00" - "\x6c\x6c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x18\x18\x00\xfe\x66\x60\x60\x78\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x0c\x18\x20\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x3c\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\xf6\xf6\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x0c\x78\x00" - "\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x0c\x78\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x00\x02\x06\x7c\xce\xde\xd6\xd6\xd6\xd6\xf6\xe6\x7c\xc0\x80\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x60\x3c\x00" - "\x0c\x18\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6e\x19\x7f\xd8\xd8\xd8\x6f\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x30\x1c\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x30\x1e\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x10\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x0c\x7e\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x0c\x78\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x18\xf0\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7c\xce\xde\xd6\xf6\xe6\x7c\xc0\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x60\x3c\x00" - "\x00\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00" - "\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00" - "\x00\x18\x7e\xdb\xdb\xd8\x78\x1c\x1e\x9b\xdb\x7e\x18\x18" - "\x00\x00\xe6\xa6\xec\x1c\x18\x30\x70\x6e\xca\xce\x00\x00" - "\x00\x00\x38\x6c\x38\x30\x76\x7e\xcc\xcc\xcc\x76\x00\x00" - "\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x6c\x38\xfe\x38\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x06\x06\x0c\x0c\x18\x30\x30\x60\xc0\xc0\x00\x00" - "\x00\x00\x7c\xc6\xce\xd6\xd6\xd6\xd6\xe6\xc6\x7c\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x7c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xcc\xfe\x0c\x0c\x1e\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x0c\x18\x30\x60\x60\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xdc\xc0\x7e\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x06\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00" - "\x00\x00\x7c\x60\x60\x60\x60\x60\x60\x60\x60\x7c\x00\x00" - "\x00\x00\xc0\xc0\x60\x60\x30\x18\x18\x0c\x06\x06\x00\x00" - "\x00\x00\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x7c\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x1c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x1c\x36\x30\x30\xfc\x30\x30\x30\x30\x78\x00\x00" - "\x00\x00\x00\x00\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc" - "\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\xf0" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0e" - "\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00" - "\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x30\x30\x60\xc0" - "\x00\x00\x00\x00\x00\xfe\x86\x0c\x18\x30\x62\xfe\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xfe\x00" - "\x00\x00\x38\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xce\x18\x0e" - "\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x0c\x78" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x0c\x78" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\xce\xc6\x7c\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\x7c\x00\x00" - "\x7c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xc6\xc6\xc6\x7c\x0c\x78" - "\x00\x00\xff\xdb\x99\x18\x1e\x3c\x78\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00" - "\x66\x3c\x00\xfe\xc6\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x18\x0e" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x0e" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x30\xe0" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x18\xf0" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x70" - "\x00\x00\x6c\x38\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00" - "\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x3c\x60\x38\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x36\x1c\x00\x00" - "\x00\x00\xdc\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00" - "\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x00\xdc\xfe\xf6\xe6\xc6\xc6\x06\x1c\x00\x00" - "\x7c\x00\x38\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x76\xdc\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3f\x6c\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcf\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x66\x3c\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x0e\x18\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x30\x1e" - "\x6c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x18\x18\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x0c\x18\x20\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x7e\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\xf6\xf6\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x0c\x78" - "\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x0c\x78" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\x18\x3c\x66\x00\x00\x00\x00" - "\x02\x04\x7c\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\x7c\x40\x80" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x30\x1c" - "\x0c\x18\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xc6\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00" - "\x00\x00\x00\x7c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xcc\xcc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x19\x7f\xd8\xd8\xd8\x6f\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x18\x1e" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x18\x18\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x7e\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x0c\x78" - "\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x0c\x78" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x06\x7c\xce\xd6\xd6\xd6\xe6\x7c\xc0\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x30\x1e" - "\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x10\x38\x6c\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x76\xdc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xfc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x18\x18\x00\x18" - "\x00\xee\x66\xcc\x00\x00\x00\x00" - "\x00\x6c\xfe\x6c\x6c\x6c\xfe\x6c" - "\x18\x7e\xdb\xd8\x7e\x1b\xdb\x7e" - "\x00\x00\xc6\xcc\x18\x30\x66\xc6" - "\x00\x38\x6c\x3a\x7e\xcc\xcc\x76" - "\x00\x38\x18\x70\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x30\x30\x18\x0c" - "\x00\x30\x18\x0c\x0c\x0c\x18\x30" - "\x00\x00\x6c\x38\xfe\x38\x6c\x00" - "\x00\x00\x18\x18\x7e\x18\x18\x00" - "\x00\x00\x00\x00\x00\x38\x18\x70" - "\x00\x00\x00\x00\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18" - "\x00\x06\x0c\x18\x18\x30\x60\xc0" - "\x00\x7c\xc6\xce\xd6\xe6\xc6\x7c" - "\x00\x18\x78\x18\x18\x18\x18\x7e" - "\x00\x7c\xc6\x8c\x38\x60\xc2\xfe" - "\x00\x7c\xc6\x06\x3c\x06\xc6\x7c" - "\x00\x1c\x3c\x6c\xcc\xfe\x0c\x1e" - "\x00\xfe\xc0\xfc\x06\x06\xc6\x7c" - "\x00\x7c\xc6\xc0\xfc\xc6\xc6\x7c" - "\x00\xfe\xc6\x06\x0c\x18\x30\x30" - "\x00\x7c\xc6\xc6\x7c\xc6\xc6\x7c" - "\x00\x7c\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x18\x18\x00\x18\x18\x00" - "\x00\x00\x18\x18\x00\x18\x18\x70" - "\x00\x00\x18\x30\x60\x30\x18\x00" - "\x00\x00\x00\xfe\x00\xfe\x00\x00" - "\x00\x00\x30\x18\x0c\x18\x30\x00" - "\x00\x7c\xc6\xcc\x18\x18\x00\x18" - "\x00\x7c\xc6\xc6\xde\xdc\xc0\x7e" - "\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6" - "\x00\xfc\x66\x66\x7c\x66\x66\xfc" - "\x00\x3c\x66\xc2\xc0\xc2\x66\x3c" - "\x00\xf8\x6c\x66\x66\x66\x6c\xf8" - "\x00\xfe\x66\x60\x7c\x60\x66\xfe" - "\x00\xfe\x66\x60\x7c\x60\x60\xf0" - "\x00\x7c\xc6\xc0\xce\xc6\xc6\x7c" - "\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6" - "\x00\x3c\x18\x18\x18\x18\x18\x3c" - "\x00\x3c\x18\x18\x18\xd8\xd8\x70" - "\x00\xc6\xcc\xd8\xf0\xd8\xcc\xc6" - "\x00\xf0\x60\x60\x60\x62\x66\xfe" - "\x00\xc6\xc6\xee\xfe\xd6\xc6\xc6" - "\x00\xc6\xe6\xf6\xde\xce\xc6\xc6" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\xfc\x66\x66\x7c\x60\x60\xf0" - "\x00\x7c\xc6\xc6\xd6\xd6\x7c\x06" - "\x00\xfc\x66\x66\x7c\x78\x66\xe6" - "\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c" - "\x00\xff\xdb\x99\x18\x18\x18\x3c" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\xc6\xc6\xc6\xc6\x6c\x38\x10" - "\x00\xc6\xc6\xd6\xd6\xfe\xee\x6c" - "\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6" - "\x00\x66\x66\x66\x3c\x18\x18\x3c" - "\x00\xfe\xc6\x8c\x38\x62\xc6\xfe" - "\x00\x7c\x60\x60\x60\x60\x60\x7c" - "\x00\xc0\x60\x30\x30\x18\x0c\x06" - "\x00\x7c\x0c\x0c\x0c\x0c\x0c\x7c" - "\x00\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x38\x30\x18\x00\x00\x00\x00" - "\x00\x00\x00\x78\x0c\x7c\xcc\x76" - "\x00\xe0\x60\x7c\x66\x66\x66\xfc" - "\x00\x00\x00\x78\xcc\xc0\xcc\x78" - "\x00\x0e\x0c\x7c\xcc\xcc\xcc\x7e" - "\x00\x00\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x1c\x36\x30\xfc\x30\x30\x78" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xe0\x60\x7c\x66\x66\xe6" - "\x18\x18\x00\x38\x18\x18\x18\x3c" - "\x0c\x0c\x00\x1c\x0c\x0c\xcc\x78" - "\x00\xe0\x60\x66\x6c\x78\x6c\xe6" - "\x00\x38\x18\x18\x18\x18\x18\x3c" - "\x00\x00\x00\xec\xfe\xd6\xd6\xc6" - "\x00\x00\x00\xdc\x66\x66\x66\x66" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0e\x0e" - "\x00\x00\x00\xdc\x66\x60\x60\xf0" - "\x00\x00\x00\x7c\xc0\x7c\x06\xfc" - "\x00\x30\x30\xfc\x30\x30\x36\x1c" - "\x00\x00\x00\xcc\xcc\xcc\xcc\x76" - "\x00\x00\x00\xc6\xc6\x6c\x38\x10" - "\x00\x00\x00\xc6\xd6\xd6\xfe\x6c" - "\x00\x00\x00\xc6\x6c\x38\x6c\xc6" - "\x00\x00\x00\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\x00\xfe\x8c\x38\x62\xfe" - "\x00\x0e\x18\x18\x70\x18\x18\x0e" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x70\x18\x18\x0e\x18\x18\x70" - "\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xfe" - "\x38\x6c\xc6\xfe\xc6\xce\x18\x0e" - "\x00\x00\x00\xe6\x6c\x78\x6c\xe6" - "\xfc\x66\x7e\x6c\x66\xe6\x18\x70" - "\x00\x42\x3c\x66\x66\x3c\x42\x00" - "\x76\xdc\x38\x18\x18\x18\x18\x3c" - "\xf0\x60\x60\x62\x66\xfe\x18\x70" - "\x3c\x66\x38\x6c\x6c\x38\xcc\x78" - "\x66\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x7c\xc0\x7c\x06\xc6\x7c" - "\x7c\x00\xfe\x60\x7c\x60\x66\xfe" - "\x3c\x66\xc0\xce\x66\x3e\x18\x70" - "\x00\xff\x99\x1e\x3c\x78\x18\x3c" - "\x00\x00\x00\x00\x00\x3c\x00\x00" - "\x6c\x38\xfe\x8c\x18\x32\x66\xfe" - "\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x0f" - "\x00\x00\x00\x00\x00\x00\x10\x1c" - "\x00\x00\xdc\x76\x66\xf0\x30\xe0" - "\x18\x30\x00\x00\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x38\x18\x18\x3c" - "\x38\x18\x18\x18\x18\x3c\x18\x70" - "\x6c\x38\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x04\x1c" - "\x00\x6c\x38\x7c\xc0\x7c\x06\xfc" - "\x00\x7c\x00\x7c\xc6\xfe\xc0\x7c" - "\x38\x60\x30\x7e\xcc\x7c\x0c\xf8" - "\x00\x30\x30\xfc\x30\x38\x76\x1c" - "\x00\xdc\xfe\xf6\xc6\xc6\xc6\xdc" - "\x6c\x38\x00\xfe\x8c\x38\x62\xfe" - "\x00\x00\xdc\xfe\xf6\xc6\x06\x1c" - "\x7c\x00\x7c\xc6\xc6\xfe\xc6\xc6" - "\x0c\x18\x7c\xc6\xc6\xfe\xc6\xc6" - "\x7c\x82\x7c\xc6\xc6\xfe\xc6\xc6" - "\xc6\x7c\x7c\xc6\xc6\xfe\xc6\xc6" - "\xc6\x38\x6c\xc6\xc6\xfe\xc6\xc6" - "\x38\x6c\x38\x6c\xc6\xfe\xc6\xc6" - "\x00\x3e\x78\xd8\xfe\xd8\xd8\xde" - "\x78\x30\x30\x30\x30\x78\x30\x1c" - "\x6c\x38\x7c\xc6\xc0\xc0\xc6\x7c" - "\x0e\x18\xfe\x62\x78\x60\x66\xfe" - "\xfe\x66\x60\x78\x60\x66\xfe\x1c" - "\x6c\xfe\x66\x60\x7c\x60\x66\xfe" - "\x18\xfe\x66\x60\x7c\x60\x66\xfe" - "\x0c\x18\x3c\x18\x18\x18\x18\x3c" - "\x3c\x42\x3c\x18\x18\x18\x18\x3c" - "\x3c\x00\x3c\x18\x18\x18\x18\x3c" - "\x00\xf8\x6c\x66\xf6\xf6\x6c\xf8" - "\xc6\xe6\xf6\xde\xce\xc6\x0c\x38" - "\x7c\x00\x7c\xc6\xc6\xc6\xc6\x7c" - "\xc6\xcc\xf8\xd8\xcc\xc6\x0c\x38" - "\x7c\x82\x7c\xc6\xc6\xc6\xc6\x7c" - "\x76\xdc\x7c\xc6\xc6\xc6\xc6\x7c" - "\xc6\x7c\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x03\x7e\xce\xde\xd6\xf6\xe6\xfc" - "\xc6\xc6\xc6\xc6\xc6\x7c\x30\x1e" - "\x1c\x30\xc6\xc6\xc6\xc6\xc6\x7c" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\x7c" - "\xc6\x00\xc6\xc6\xc6\xc6\xc6\x7c" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\x7c" - "\x7c\x00\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\x7c\xc6\xfc\xc6\xc6\xfc\xc0" - "\x00\x7c\x00\x78\x0c\x7c\xcc\x76" - "\x0c\x18\x20\x78\x0c\x7c\xcc\x76" - "\x00\x78\x84\x78\x0c\x7c\xcc\x76" - "\x6c\x38\x00\x78\x0c\x7c\xcc\x76" - "\x00\xcc\x00\x78\x0c\x7c\xcc\x76" - "\x00\x38\x6c\x78\x0c\x7c\xcc\x76" - "\x00\x00\x00\x6e\x3b\x7e\xd8\x7e" - "\x18\x00\x38\x18\x18\x3c\x18\x0e" - "\x00\xcc\x78\x78\xcc\xc0\xcc\x78" - "\x0c\x18\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x00\x7c\xc6\xfe\xc0\x7a\x1e" - "\x00\x6c\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x38\x00\x7c\xc6\xfe\xc0\x7c" - "\x0c\x18\x20\x38\x18\x18\x18\x3c" - "\x00\x3c\x42\x38\x18\x18\x18\x3c" - "\x00\x3c\x00\x38\x18\x18\x18\x3c" - "\x00\x0c\x3e\x0c\x7c\xcc\xcc\x76" - "\x00\x00\xdc\xe6\xc6\xc6\x18\x70" - "\x00\x7c\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\xe0\x66\x6c\x78\x6c\xe6\x1c" - "\x7c\xc6\x00\x7c\xc6\xc6\xc6\x7c" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x6c\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x00\x18\x00\x7e\x00\x18\x00" - "\x00\x06\x7c\xce\xd6\xe6\x7c\xc0" - "\x00\x00\xcc\xcc\xcc\x7e\x30\x1c" - "\x0c\x18\x20\xcc\xcc\xcc\xcc\x76" - "\x78\xcc\x00\xcc\xcc\xcc\xcc\x76" - "\x00\xcc\x00\xcc\xcc\xcc\xcc\x76" - "\x76\xdc\x00\xcc\xcc\xcc\xcc\x76" - "\x00\x78\x00\xcc\xcc\xcc\xcc\x76" - "\x18\x00\x00\x00\x00\x00\x00\x00" - , "ISO-8859-4 Baltic", CIOLIB_ISO_8859_4} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xdb\xdb\xc3\xc3\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc3\xe7\xff\xff\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\x66\x3c\x18\x18\x3c\x66\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xff\xc3\x86\x0c\x18\x30\x60\xc1\xc3\xff\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xdb\xdb\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xdb\xdb\xff\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\xc3\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x18\x18\x7e\xc3\xc0\xc0\xc0\xc3\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x82\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x82\x00\x00\x00" - "\x00\x00\xc3\x66\x3c\x18\xff\x18\xff\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xa2\xa2\xba\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\x70\x18\x78\xc8\x78\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xaa\xb2\xaa\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xf8\x18\x30\x18\xd8\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7e\x63\x60\xc0\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x06\x3c\x00\x00" - "\x00\x60\xe0\x60\x60\x60\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x88\xd8\x70\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x66\xce\x96\x3e\x06\x06\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x60\xce\x9b\x06\x0c\x1f\x00\x00" - "\x00\xf0\x30\x72\x36\xec\x18\x30\x66\xce\x96\x3e\x06\x06\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x60\x30\x18\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x0c\x06\x7c\x00\x00" - "\x30\x18\x0c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x18\x30\x60\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x00\xc6\x00\xfe\x66\x60\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x30\x18\x0c\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x18\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x78\x6c\x66\x66\x66\xf6\x66\x66\x6c\x78\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x6c\x38\x10\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x02\x06\x7c\xce\xce\xde\xd6\xd6\xf6\xe6\xe6\x7c\xc0\x80\x00\x00" - "\x60\x30\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\xc3\xc3\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00" - "\xf0\x60\x7c\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xce\xdc\xd8\xcc\xc6\xd6\xdc\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x3b\x1b\x7e\xd8\xdc\x77\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x66\x60\x60\x66\x3c\x0c\x06\x3c\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x6c\x38\x38\x6c\x0c\x3c\x6c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x02\x06\x7c\xce\xde\xd6\xf6\xe6\x7c\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\xf0\x60\x7c\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x66\x66\x00\xee\x66\x66\x66\x66\x66\x3e\x06\x0c\x38\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x36\x36\x7f\x36\x36\x36\x7f\x36\x36\x00\x00\x00" - "\x08\x08\x3e\x63\x60\x60\x3e\x03\x03\x63\x3e\x08\x08\x00" - "\x00\x00\x00\x61\x63\x06\x0c\x18\x30\x63\x43\x00\x00\x00" - "\x00\x00\x1c\x36\x36\x1c\x3b\x6e\x66\x66\x3b\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\x7e\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x01\x03\x06\x0c\x18\x30\x60\x40\x00\x00\x00\x00" - "\x00\x00\x3e\x63\x67\x6f\x7b\x73\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x0c\x0c\x0c\x0c\x0c\x3f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x06\x0c\x18\x30\x63\x7f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x03\x1e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x06\x0e\x1e\x36\x66\x7f\x06\x06\x0f\x00\x00\x00" - "\x00\x00\x7e\x60\x60\x60\x7e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7f\x63\x03\x06\x0c\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3f\x03\x03\x06\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x00\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x06\x0c\x0c\x00\x0c\x0c\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x6f\x6f\x6f\x6e\x60\x3e\x00\x00\x00" - "\x00\x00\x08\x1c\x36\x63\x63\x7f\x63\x63\x63\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x33\x33\x33\x7e\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x60\x60\x33\x1e\x00\x00\x00" - "\x00\x00\x7c\x36\x33\x33\x33\x33\x33\x36\x7c\x00\x00\x00" - "\x00\x00\x7f\x33\x30\x34\x3c\x34\x30\x33\x7f\x00\x00\x00" - "\x00\x00\x7f\x33\x30\x34\x3c\x34\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x6f\x63\x33\x1d\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x7f\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x0f\x06\x06\x06\x06\x06\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x73\x33\x36\x36\x3c\x36\x36\x33\x73\x00\x00\x00" - "\x00\x00\x78\x30\x30\x30\x30\x30\x30\x33\x7f\x00\x00\x00" - "\x00\x00\x63\x77\x7f\x6b\x63\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x63\x73\x7b\x7f\x6f\x67\x63\x63\x63\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x63\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x63\x63\x63\x6b\x3e\x1c\x06\x03\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x36\x33\x33\x73\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x30\x1c\x06\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x36\x1c\x08\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x6b\x6b\x7f\x36\x00\x00\x00" - "\x00\x00\x63\x63\x63\x36\x1c\x36\x63\x63\x63\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x7f\x63\x06\x0c\x18\x30\x60\x63\x7f\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x40\x60\x30\x18\x0c\x06\x03\x01\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x08\x1c\x36\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x18\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x70\x30\x30\x3e\x33\x33\x33\x33\x6e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x60\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x0e\x06\x06\x3e\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x1e\x33\x30\x7c\x30\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x70\x30\x30\x36\x3b\x33\x33\x33\x73\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\x78\x00" - "\x00\x00\x70\x30\x30\x33\x36\x3c\x36\x33\x73\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x7f\x6b\x6b\x6b\x6b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x33\x33\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x3e\x30\x30\x78\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x06\x0f\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x38\x0e\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x08\x18\x7e\x18\x18\x18\x1b\x0e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x63\x36\x1c\x08\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x36\x1c\x1c\x36\x63\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x00\x00\x00\x7f\x66\x0c\x18\x33\x7f\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x08\x08\x3e\x63\x60\x60\x63\x3e\x08\x08\x00" - "\x00\x00\x1c\x36\x30\x30\x7c\x30\x30\x73\x7e\x00\x00\x00" - "\x00\x00\x00\x42\x3c\x66\x66\x66\x3c\x42\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x7e\x18\x7e\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x3e\x63\x30\x1c\x36\x63\x63\x36\x1c\x06\x63\x3e\x00" - "\x00\x63\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3e\x41\x5d\x51\x51\x5d\x41\x3e\x00\x00\x00" - "\x00\x38\x04\x3c\x44\x3c\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x1b\x36\x6c\x36\x1b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7f\x03\x03\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3e\x41\x5d\x55\x59\x55\x41\x3e\x00\x00\x00" - "\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00" - "\x00\x38\x6c\x18\x30\x64\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x0c\x38\x0c\x6c\x38\x00\x00\x00\x00\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x60\xc0\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x0c\x06\x1c" - "\x00\x30\x70\x30\x30\x30\x78\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x44\x38\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\x36\x1b\x36\x6c\x00\x00\x00\x00\x00" - "\x00\x60\xe0\x63\x66\x6c\x18\x33\x67\xcf\x1f\x03\x03\x00" - "\x00\x60\xe0\x63\x66\x6c\x18\x30\x6e\xc3\x06\x0c\x1f\x00" - "\x00\xf0\x30\x63\xf6\x6c\x18\x33\x67\xcf\x1f\x03\x03\x00" - "\x00\x00\x18\x18\x00\x18\x18\x30\x63\x63\x3e\x00\x00\x00" - "\x60\x30\x18\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x03\x06\x0c\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x08\x1c\x36\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x3b\x6e\x00\x08\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x00\x63\x63\x08\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x1c\x36\x1c\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x00\x00\x1f\x36\x66\x66\x67\x7e\x66\x66\x67\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x60\x60\x33\x1e\x0c\x06\x1c" - "\x60\x30\x18\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x06\x0c\x18\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x08\x1c\x36\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x00\x63\x63\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x60\x30\x18\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x06\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x18\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x66\x66\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x3c\x36\x33\x33\x7b\x33\x33\x36\x3c\x00\x00\x00" - "\x3b\x6e\x00\x63\x73\x7b\x7f\x6f\x67\x63\x63\x00\x00\x00" - "\x60\x30\x18\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x03\x06\x0c\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x08\x1c\x36\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x3b\x6e\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x63\x63\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x63\x36\x1c\x08\x1c\x36\x63\x00\x00\x00\x00" - "\x00\x03\x1e\x36\x67\x6f\x6b\x7b\x73\x36\x3c\x60\x00\x00" - "\x60\x30\x18\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x03\x06\x0c\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x08\x1c\x36\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x63\x63\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x06\x0c\x18\x00\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00" - "\x00\x78\x30\x3e\x33\x33\x3e\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x66\x6c\x67\x63\x6b\x6e\x60\x60\x00" - "\x00\x60\x30\x18\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x66\x66\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x1c\x36\x1c\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x0b\x3b\x6e\x68\x37\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x60\x60\x63\x3e\x0c\x06\x1c" - "\x00\x30\x18\x0c\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x03\x06\x0c\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x66\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x36\x1c\x36\x06\x3e\x66\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x6e\x33\x33\x33\x33\x33\x00\x00\x00" - "\x00\x60\x30\x18\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x03\x3e\x67\x6f\x7b\x73\x3e\x60\x00\x00" - "\x00\x60\x30\x18\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x66\x66\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x63\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x00\x78\x30\x3e\x33\x33\x33\x33\x3e\x30\x78\x00" - "\x00\x00\x66\x66\x00\x66\x66\x66\x66\x3e\x06\x66\x3c\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\xc6\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\xcc\xcc\x78" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x00\x30\x30\x78\x78\x30\x00" - "\x00\x00\x10\x7c\xc0\xc0\x7c\x10" - "\x00\x38\x60\x60\xf0\x60\xfc\x00" - "\x00\xc3\x3c\x66\x66\x3c\xc3\x00" - "\x00\xcc\xcc\x78\x30\xfc\x30\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\x7e\xc0\x7c\xc6\x7c\x06\xfc\x00" - "\xc6\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x82\xba\xa2\xba\x82\x7c\x00" - "\x1c\x06\x1e\x22\x1f\x3f\x00\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\xfe\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x82\xba\xb2\xaa\x82\x7c\x00" - "\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x00\x00\x00\x00" - "\x00\x10\x7c\x10\x00\x7c\x00\x00" - "\x1c\x36\x06\x18\x3e\x00\x00\x00" - "\x1e\x02\x0e\x02\x1e\x00\x00\x00" - "\x18\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\xc0" - "\x7e\xca\xca\x7e\x0a\x0a\x0a\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x30" - "\x06\x0e\x06\x06\x06\x00\x00\x00" - "\x0e\x11\x11\x11\x0e\x1f\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x60\xe0\x66\x6c\x33\x67\x0f\x03" - "\x60\xe0\x66\x6c\x36\x6a\x04\x0e" - "\xf0\x20\x96\x6c\x33\x67\x0f\x03" - "\x30\x00\x30\x60\xc0\xcc\x78\x00" - "\x18\x0c\x30\x78\xcc\xfc\xcc\x00" - "\x60\xc0\x30\x78\xcc\xfc\xcc\x00" - "\x78\x84\x30\x78\xcc\xfc\xcc\x00" - "\x66\x98\x30\x78\xcc\xfc\xcc\x00" - "\xcc\x00\x30\x78\xcc\xfc\xcc\x00" - "\x30\x48\x30\x78\xcc\xfc\xcc\x00" - "\x3e\x78\x98\x9c\xf8\x98\x9e\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x1c\x30" - "\x30\x18\xfe\x62\x78\x62\xfe\x00" - "\x18\x30\xfe\x62\x78\x62\xfe\x00" - "\x38\x44\xfe\x62\x78\x62\xfe\x00" - "\x66\x00\xfe\x62\x78\x62\xfe\x00" - "\x60\x30\x78\x30\x30\x30\x78\x00" - "\x18\x30\x78\x30\x30\x30\x78\x00" - "\x78\x84\x78\x30\x30\x30\x78\x00" - "\xcc\x00\x78\x30\x30\x30\x78\x00" - "\x78\x6c\x66\xf6\x66\x6c\x78\x00" - "\x66\x98\xe6\xf6\xde\xce\xc6\x00" - "\x30\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x18\x30\x7c\xc6\xc6\xc6\x7c\x00" - "\x38\x44\x7c\xc6\xc6\xc6\x7c\x00" - "\x66\x98\x7c\xc6\xc6\xc6\x7c\x00" - "\xc6\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\xc6\x6c\x38\x38\x6c\xc6\x00" - "\x06\x7c\xce\x9a\xb2\xe6\x78\xc0" - "\x60\x30\xcc\xcc\xcc\xcc\xfc\x00" - "\x18\x30\xcc\xcc\xcc\xcc\xfc\x00" - "\x78\x84\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\x00\xcc\xcc\xcc\xcc\xfc\x00" - "\x18\x30\xcc\xcc\x78\x30\x78\x00" - "\x60\x78\x6c\x78\x60\x60\x60\x00" - "\x78\xcc\xc4\xdc\xc6\xc6\xdc\xc0" - "\x30\x18\x78\x0c\x7c\xcc\x76\x00" - "\x18\x30\x78\x0c\x7c\xcc\x76\x00" - "\x78\x84\x78\x0c\x7c\xcc\x76\x00" - "\x66\x98\x78\x0c\x7c\xcc\x76\x00" - "\xcc\x00\x78\x0c\x7c\xcc\x76\x00" - "\x30\x48\x38\x0c\x7c\xcc\x76\x00" - "\x00\x00\xec\x32\x7e\xb0\x6e\x00" - "\x00\x00\x3c\x66\xc0\x66\x1c\x30" - "\x30\x18\x78\xcc\xfc\xc0\x78\x00" - "\x18\x30\x78\xcc\xfc\xc0\x78\x00" - "\x78\x84\x78\xcc\xfc\xc0\x78\x00" - "\xcc\x00\x78\xcc\xfc\xc0\x78\x00" - "\x60\x30\x00\x70\x30\x30\x78\x00" - "\x18\x30\x00\x70\x30\x30\x78\x00" - "\x70\x88\x00\x70\x30\x30\x78\x00" - "\xcc\x00\x00\x70\x30\x30\x78\x00" - "\x6c\x38\x6c\x0c\x6c\xcc\x78\x00" - "\x66\x98\xf8\xcc\xcc\xcc\xcc\x00" - "\x60\x30\x00\x7c\xc6\xc6\x7c\x00" - "\x18\x30\x00\x7c\xc6\xc6\x7c\x00" - "\x38\x44\x00\x7c\xc6\xc6\x7c\x00" - "\x66\x98\x00\x7c\xc6\xc6\x7c\x00" - "\xc6\x00\x00\x7c\xc6\xc6\x7c\x00" - "\x00\x00\x18\x00\x7e\x00\x18\x00" - "\x00\x00\x06\x7c\xde\xf6\x7c\xc0" - "\x60\x30\x00\xcc\xcc\xcc\x76\x00" - "\x18\x30\x00\xcc\xcc\xcc\x76\x00" - "\x30\x48\x00\xcc\xcc\xcc\x76\x00" - "\xcc\x00\x00\xcc\xcc\xcc\x76\x00" - "\x18\x30\xcc\xcc\xcc\x7c\x0c\xf8" - "\xe0\x78\x6c\x66\x6c\x78\xe0\x00" - "\xcc\x00\xcc\xcc\xcc\x7c\x0c\xf8" - , "ISO-8859-1 West European", CIOLIB_ISO_8859_1} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xa5\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xdb\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x06\x0e\x1a\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xa2\xaa\xba\x82\x7c\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xa5\x99\x81\x7e\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\x7e\x00\x00\x00" - "\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00" - "\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00" - "\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\xf8\xfe\xf8\xe0\xc0\x80\x00\x00\x00" - "\x00\x00\x02\x06\x0e\x3e\xfe\x3e\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00" - "\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x6c\x6c\x00\xfe\xc6\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xaa\xba\x82\x7c\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xfe\x7c\x38\x7c" - "\x10\x10\x38\x7c\xfe\x7c\x38\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78" - "\x3c\x66\x66\x66\x3c\x18\x7e\x18" - "\x3f\x33\x3f\x30\x30\x70\xf0\xe0" - "\x7f\x63\x7f\x63\x63\x67\xe6\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x18\x3c\x7e\x18\x18\x7e\x3c\x18" - "\x66\x66\x66\x66\x66\x00\x66\x00" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x63\x38\x6c\x6c\x38\xcc\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x18\x3c\x7e\x18\x7e\x3c\x18\xff" - "\x18\x3c\x7e\x18\x18\x18\x18\x00" - "\x18\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x0c\xfe\x0c\x18\x00\x00" - "\x00\x30\x60\xfe\x60\x30\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\xc6\xfe\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x18\x18\x18\x18" - "\x18\xf8\x18\xf8\x18\x18\x18\x18" - "\x36\x36\x36\xf6\x36\x36\x36\x36" - "\x00\x00\x00\xfe\x36\x36\x36\x36" - "\x00\xf8\x18\xf8\x18\x18\x18\x18" - "\x36\xf6\x06\xf6\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\xfe\x06\xf6\x36\x36\x36\x36" - "\x36\xf6\x06\xfe\x00\x00\x00\x00" - "\x36\x36\x36\xfe\x00\x00\x00\x00" - "\x18\xf8\x18\xf8\x00\x00\x00\x00" - "\x00\x00\x00\xf8\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x00\x00\x00\x00" - "\x18\x18\x18\xff\x00\x00\x00\x00" - "\x00\x00\x00\xff\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x18\x18\x18\x18" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x18\x18\x18\xff\x18\x18\x18\x18" - "\x18\x1f\x18\x1f\x18\x18\x18\x18" - "\x36\x36\x36\x37\x36\x36\x36\x36" - "\x36\x37\x30\x3f\x00\x00\x00\x00" - "\x00\x3f\x30\x37\x36\x36\x36\x36" - "\x36\xf7\x00\xff\x00\x00\x00\x00" - "\x00\xff\x00\xf7\x36\x36\x36\x36" - "\x36\x37\x30\x37\x36\x36\x36\x36" - "\x00\xff\x00\xff\x00\x00\x00\x00" - "\x36\xf7\x00\xf7\x36\x36\x36\x36" - "\x18\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\xff\x00\x00\x00\x00" - "\x00\xff\x00\xff\x18\x18\x18\x18" - "\x00\x00\x00\xff\x36\x36\x36\x36" - "\x36\x36\x36\x3f\x00\x00\x00\x00" - "\x18\x1f\x18\x1f\x00\x00\x00\x00" - "\x00\x1f\x18\x1f\x18\x18\x18\x18" - "\x00\x00\x00\x3f\x36\x36\x36\x36" - "\x36\x36\x36\xff\x36\x36\x36\x36" - "\x18\xff\x18\xff\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x00\x00\x00\x00" - "\x00\x00\x00\x1f\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\x24\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x30\x18\x0c\x06\x0c\x18\x30" - "\x00\x0c\x18\x30\x60\x30\x18\x0c" - "\x0e\x1b\x1b\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xd8\xd8\x70" - "\x00\x18\x18\x00\x7e\x00\x18\x18" - "\x00\x76\xdc\x00\x76\xdc\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x00\x00\x00\x38\x38\x00\x00\x00" - "\x03\x02\x06\x04\xcc\x68\x38\x10" - "\x3c\x42\x99\xa1\xa1\x99\x42\x3c" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x7c\x7c\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x42\x7e\x00" - , "Codepage 866 Russian", CIOLIB_CP866M2} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x3e\x0a\x12\x22\x78\x84\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x44\x44\x38\x10\x7c\x10\x10\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x20\x20\x20\x20\x60\xe0\xc0\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x21\x21\x21\x21\x23\x67\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x10\x10\xd6\x38\xee\x38\xd6\x10\x10\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x42\x42\x42\x00\x42\x42\x00\x00\x00\x00" - "\x00\x00\x7f\x89\x89\x89\x79\x09\x09\x09\x09\x09\x00\x00\x00\x00" - "\x00\x7c\x86\x40\x38\x44\x82\x82\x44\x38\x04\xc2\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x08\x04\xfe\x04\x08\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x20\x40\xfe\x40\x20\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x80\x80\x80\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x38\x38\x38\x10\x10\x10\x00\x10\x10\x00\x00\x00\x00" - "\x00\x42\x42\x42\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x44\x44\xfe\x44\x44\x44\xfe\x44\x44\x00\x00\x00\x00" - "\x10\x10\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x82\x84\x08\x10\x20\x42\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x38\x38\x47\x44\x44\x44\x3b\x00\x00\x00\x00" - "\x00\x20\x20\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x10\x10\x10\x10\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x20\x10\x08\x08\x08\x08\x08\x08\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x18\xff\x18\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x10\x20\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x02\x04\x08\x10\x20\x40\x80\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x92\x92\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\x08\x18\x38\x08\x08\x08\x08\x08\x08\x3e\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x04\x08\x10\x20\x40\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x02\x3c\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x14\x24\x44\x84\xfe\x04\x04\x04\x0e\x00\x00\x00\x00" - "\x00\x00\xfe\x80\x80\x80\xfc\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x40\x80\x80\xfc\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x02\x02\x04\x08\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7c\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7e\x02\x02\x02\x04\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x04\x08\x10\x20\x40\x20\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x40\x20\x10\x08\x04\x08\x10\x20\x40\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x02\x04\x08\x08\x00\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x82\x82\x9e\x92\x92\x8c\x80\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x42\x42\x42\x42\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x80\x82\x42\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x44\x42\x42\x42\x42\x42\x42\x44\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x9e\x82\x82\x46\x3a\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\xfe\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x0e\x04\x04\x04\x04\x04\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\xc2\x42\x42\x44\x48\x78\x44\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\xe0\x40\x40\x40\x40\x40\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x82\xc6\xaa\x92\x82\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x82\x82\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x82\x82\x82\x92\x8a\x7c\x04\x02\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x44\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x92\x92\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x44\x28\x10\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x44\x28\x10\x28\x44\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x44\x38\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x82\x04\x18\x20\x40\x82\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\x40\x20\x10\x08\x04\x02\x01\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x04\x04\x04\x04\x04\x04\x04\x04\x3c\x00\x00\x00\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x10\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\xc0\x40\x40\x78\x44\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x80\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x04\x04\x3c\x44\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x84\x78\x00" - "\x00\x00\xc0\x40\x40\x7c\x42\x42\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x10\x10\x00\x30\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x02\x02\x00\x06\x02\x02\x02\x02\x02\x02\x42\x42\x3c\x00" - "\x00\x00\xc0\x40\x40\x42\x44\x48\x78\x44\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x30\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\x92\x92\x92\x92\x92\x92\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x7c\x40\x40\xe0\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x04\x0e\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x7c\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x20\x20\x20\xf8\x20\x20\x20\x20\x22\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x44\x28\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x00\x00\x00\x00\xfe\x84\x08\x10\x20\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x10\x10\x10\x60\x10\x10\x10\x10\x0e\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x00\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x70\x08\x08\x08\x06\x08\x08\x08\x08\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x28\x44\x82\x82\x82\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x82\x42\x3c\x04\x02\x7c\x00\x00" - "\x00\x00\x84\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x84\x84\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x38\x44\x38\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x42\x40\x40\x42\x3c\x04\x02\x3c\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x84\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x44\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x82\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x38\x44\x38\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x08\x10\x20\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x8c\x52\x32\x7e\x88\x98\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x44\x84\x84\xfe\x84\x84\x84\x84\x86\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x30\x48\x84\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x82\x00\x00\x00\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x82\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x82\x00\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x10\x10\x38\x44\x40\x40\x40\x48\x38\x10\x10\x00\x00\x00\x00" - "\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\x42\xfc\x00\x00\x00\x00" - "\x00\x00\x44\x44\x28\x10\x7c\x10\x7c\x10\x10\x10\x00\x00\x00\x00" - "\x00\xf8\x84\x84\xf8\x84\x84\x9e\x84\x84\x84\x86\x00\x00\x00\x00" - "\x00\x06\x09\x08\x08\x08\x3e\x08\x08\x08\x08\x08\x48\x30\x00\x00" - "\x00\x08\x10\x20\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x76\xdc\x00\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x3c\x44\x44\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x20\x20\x00\x20\x20\x40\x80\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\xc0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x40\x9c\x02\x04\x08\x1e\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x46\x8a\x12\x3e\x02\x02\x00\x00" - "\x00\x00\x10\x10\x00\x10\x10\x10\x38\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x48\x90\x48\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x88\x44\x22\x44\x88\x00\x00\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x62\x94\x98\x88\x98\x94\x62\x00\x00\x00\x00" - "\x00\x00\x78\x84\x84\x84\xb8\x84\x82\x82\x82\xbc\x80\x00\x00\x00" - "\x00\x00\xfe\x82\x82\x80\x80\x80\x80\x80\x80\x80\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x44\x44\x44\x44\x44\x44\x44\x00\x00\x00\x00" - "\x00\x00\x00\xfe\x82\x40\x20\x10\x20\x40\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x88\x88\x88\x88\x88\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x42\x42\x42\x42\x42\x7c\x40\x40\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x72\xd4\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x10\x38\x44\x44\x44\x38\x10\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\x82\x82\xfe\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x82\x44\x28\x28\x28\xee\x00\x00\x00\x00" - "\x00\x00\x1e\x10\x08\x04\x3e\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x99\x99\x99\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x01\x02\x7e\x89\x91\xa1\x7e\x40\x80\x00\x00\x00\x00" - "\x00\x00\x1c\x20\x40\x40\x78\x40\x40\x40\x20\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x10\x08\x04\x02\x04\x08\x10\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x08\x10\x20\x40\x20\x10\x08\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x11\x11\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10" - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x88\x88\x70\x70\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x7c\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x08\x08\x08\x08\x08\xe8\x28\x28\x28\x18\x00\x00\x00\x00" - "\x00\xd8\x64\x44\x44\x44\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\x88\x10\x20\x48\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xd6\x10\x10\x7c" - "\x10\x10\x38\xec\xfe\x7c\x10\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x1f\x03\x05\x7d\x84\x84\x84\x78" - "\x3e\x41\x41\x41\x3e\x08\x3e\x08" - "\x3f\x21\x3f\x20\x20\x20\x60\xc0" - "\x3f\x21\x3f\x21\x21\x23\x66\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x10\x38\x7c\x10\x10\x7c\x38\x10" - "\x24\x24\x24\x24\x24\x00\x24\x00" - "\x7f\x92\x92\x72\x12\x12\x12\x00" - "\x3e\x61\x38\x44\x44\x38\x8c\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x10\x38\x7c\x10\x7c\x38\x10\xfe" - "\x10\x38\x7c\x10\x10\x10\x10\x00" - "\x10\x10\x10\x10\x7c\x38\x10\x00" - "\x00\x08\x04\xfe\x04\x08\x00\x00" - "\x00\x20\x40\xfe\x40\x20\x00\x00" - "\x00\x00\x80\x80\x80\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x10\x38\x38\x10\x10\x00\x10\x00" - "\x24\x24\x24\x00\x00\x00\x00\x00" - "\x24\x24\xff\x24\xff\x24\x24\x00" - "\x10\x7c\x80\x78\x04\xf8\x10\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x44\x38\x56\x84\x84\x76\x00" - "\x20\x20\x40\x00\x00\x00\x00\x00" - "\x10\x20\x40\x40\x40\x20\x10\x00" - "\x20\x10\x08\x08\x08\x10\x20\x00" - "\x00\x44\x38\xfe\x38\x44\x00\x00" - "\x00\x10\x10\xfe\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x20" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x00" - "\x02\x04\x08\x10\x20\x40\x80\x00" - "\x7c\x82\x86\x8a\x92\xa2\x7c\x00" - "\x10\x30\x10\x10\x10\x10\x7c\x00" - "\x78\x84\x04\x10\x40\x84\xfc\x00" - "\x78\x84\x04\x38\x04\x84\x78\x00" - "\x08\x18\x28\x48\xfe\x08\x1c\x00" - "\xfc\x80\xf8\x04\x04\x84\x78\x00" - "\x38\x40\x80\xf8\x84\x84\x78\x00" - "\xfc\x84\x08\x10\x20\x20\x20\x00" - "\x78\x84\x84\x78\x84\x84\x78\x00" - "\x78\x84\x84\x7c\x04\x08\x70\x00" - "\x00\x10\x10\x00\x00\x10\x10\x00" - "\x00\x10\x10\x00\x00\x10\x10\x20" - "\x10\x20\x40\x80\x40\x20\x10\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x20\x10\x08\x04\x08\x10\x20\x00" - "\x78\x84\x04\x08\x10\x00\x10\x00" - "\x7c\x82\x9e\x92\x9e\x80\x78\x00" - "\x30\x48\x84\x84\xfc\x84\x84\x00" - "\xfc\x42\x42\x7c\x42\x42\xfc\x00" - "\x3c\x42\x80\x80\x80\x42\x3c\x00" - "\xf8\x44\x42\x42\x42\x44\xf8\x00" - "\xfe\x42\x48\x78\x48\x42\xfe\x00" - "\xfe\x42\x48\x78\x48\x40\xe0\x00" - "\x3c\x42\x80\x80\x8e\x42\x3e\x00" - "\x84\x84\x84\xfc\x84\x84\x84\x00" - "\x38\x10\x10\x10\x10\x10\x38\x00" - "\x0e\x04\x04\x04\x44\x44\x38\x00" - "\xc2\x44\x48\x70\x44\x42\xc2\x00" - "\xe0\x40\x40\x40\x40\x42\xfe\x00" - "\x82\xc6\xaa\x92\x82\x82\x82\x00" - "\x82\xc2\xa2\x92\x8a\x86\x82\x00" - "\x38\x44\x82\x82\x82\x44\x38\x00" - "\xfc\x42\x42\x7c\x40\x40\xe0\x00" - "\x38\x44\x82\x82\x82\x54\x38\x04" - "\xfc\x42\x42\x7c\x44\x42\xc2\x00" - "\x38\x84\x80\x78\x04\x84\x74\x00" - "\xfe\x92\x10\x10\x10\x10\x38\x00" - "\x84\x84\x84\x84\x84\x84\xfc\x00" - "\x84\x84\x84\x84\x84\x48\x30\x00" - "\x82\x82\x82\x92\xaa\xc6\x82\x00" - "\x82\x44\x28\x10\x28\x44\x82\x00" - "\x82\x44\x28\x10\x10\x10\x38\x00" - "\xfe\x84\x88\x10\x22\x42\xfe\x00" - "\x78\x40\x40\x40\x40\x40\x78\x00" - "\x80\x40\x20\x10\x08\x04\x02\x00" - "\x78\x08\x08\x08\x08\x08\x78\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x20\x20\x10\x00\x00\x00\x00\x00" - "\x00\x00\x78\x04\x7c\x84\x76\x00" - "\xc0\x40\x7c\x42\x42\x42\xdc\x00" - "\x00\x00\x78\x84\x80\x84\x78\x00" - "\x0c\x04\x7c\x84\x84\x84\x76\x00" - "\x00\x00\x78\x84\xfc\x80\x78\x00" - "\x38\x44\x40\xe0\x40\x40\xe0\x00" - "\x00\x00\x76\x84\x84\x7c\x04\xf8" - "\xc0\x40\x4c\x62\x42\x42\xc2\x00" - "\x10\x00\x30\x10\x10\x10\x38\x00" - "\x04\x00\x04\x04\x04\x84\x84\x78" - "\xc0\x40\x42\x44\x78\x44\xc2\x00" - "\x30\x10\x10\x10\x10\x10\x38\x00" - "\x00\x00\xec\x92\x92\x92\x82\x00" - "\x00\x00\xf8\x84\x84\x84\x84\x00" - "\x00\x00\x78\x84\x84\x84\x78\x00" - "\x00\x00\xdc\x42\x42\x7c\x40\xe0" - "\x00\x00\x76\x84\x84\x7c\x04\x0e" - "\x00\x00\xdc\x62\x40\x40\xe0\x00" - "\x00\x00\x7c\x80\x78\x04\xf8\x00" - "\x10\x10\x7c\x10\x10\x12\x0c\x00" - "\x00\x00\x84\x84\x84\x84\x76\x00" - "\x00\x00\x84\x84\x84\x48\x30\x00" - "\x00\x00\x82\x92\xaa\xc6\x82\x00" - "\x00\x00\x84\x48\x30\x48\x84\x00" - "\x00\x00\x84\x84\x84\x7c\x04\xf8" - "\x00\x00\xfc\x88\x30\x44\xfc\x00" - "\x18\x20\x20\xc0\x20\x20\x18\x00" - "\x10\x10\x10\x00\x10\x10\x10\x00" - "\x60\x10\x10\x0c\x10\x10\x60\x00" - "\x64\x98\x00\x00\x00\x00\x00\x00" - "\x00\x10\x28\x44\x82\x82\xfe\x00" - "\x78\x84\x80\x84\x78\x18\x04\x78" - "\x00\x84\x00\x84\x84\x84\x7a\x00" - "\x0c\x00\x78\x84\xfc\x80\x78\x00" - "\x7e\x81\x3c\x02\x3e\x42\x3d\x00" - "\x84\x00\x78\x04\x7c\x84\x7a\x00" - "\xc0\x00\x78\x04\x7c\x84\x7a\x00" - "\x20\x20\x78\x04\x7c\x84\x7a\x00" - "\x00\x00\x78\x80\x80\x78\x04\x38" - "\x7e\x81\x3c\x42\x7e\x40\x3c\x00" - "\x84\x00\x78\x84\xfc\x80\x78\x00" - "\x60\x00\x78\x84\xfc\x80\x78\x00" - "\x48\x00\x30\x10\x10\x10\x38\x00" - "\x7c\x82\x30\x10\x10\x10\x38\x00" - "\x60\x00\x30\x10\x10\x10\x38\x00" - "\x82\x38\x44\x82\xfe\x82\x82\x00" - "\x30\x10\x44\x82\xfe\x82\x82\x00" - "\x0c\xfc\x40\x78\x40\x40\xfc\x00" - "\x00\x00\x67\x19\x7f\x98\x77\x00" - "\x3f\x48\x88\xff\x88\x88\x8f\x00" - "\x78\x84\x78\x84\x84\x84\x78\x00" - "\x84\x00\x78\x84\x84\x84\x78\x00" - "\xc0\x00\x78\x84\x84\x84\x78\x00" - "\x7e\x81\x42\x42\x42\x42\x3c\x00" - "\x20\x10\x42\x42\x42\x42\x3c\x00" - "\x84\x00\x84\x84\x84\x7c\x04\xf8" - "\x42\x18\x24\x42\x42\x24\x18\x00" - "\x84\x00\x84\x84\x84\x84\x78\x00" - "\x10\x10\x7e\x80\x80\x7e\x10\x10" - "\x38\x44\x44\xe0\x40\x82\xfc\x00" - "\x44\x28\x10\x7c\x10\x7c\x10\x10" - "\xf8\x84\x84\xf8\x82\x87\x82\x83" - "\x0c\x12\x10\x38\x10\x10\x90\x60" - "\x1c\x00\x78\x04\x7c\x84\x7a\x00" - "\x18\x00\x30\x10\x10\x10\x38\x00" - "\x08\x10\x78\x84\x84\x84\x78\x00" - "\x08\x10\x84\x84\x84\x84\x7a\x00" - "\x64\x98\xb8\xc4\x84\x84\x84\x00" - "\x64\x98\x84\xa4\x94\x84\x84\x00" - "\x3c\x44\x44\x3a\x00\x7e\x00\x00" - "\x38\x44\x44\x38\x00\x7c\x00\x00" - "\x20\x00\x20\x40\x80\x84\x78\x00" - "\x00\x00\x00\xfc\xc0\xc0\x00\x00" - "\x00\x00\x00\xfc\x0c\x0c\x00\x00" - "\x42\x44\x48\x56\x69\x42\x84\x0f" - "\x42\x44\x48\x53\x65\x49\x8f\x01" - "\x10\x10\x00\x10\x38\x38\x10\x00" - "\x00\x22\x44\x88\x44\x22\x00\x00" - "\x00\x44\x22\x11\x22\x44\x00\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x18\x18\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\x36\x36\xf6\x36\x36\x36" - "\x00\x00\x00\x00\xfe\x36\x36\x36" - "\x00\x00\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x36\x36\x36\x36\xfe\x00\x00\x00" - "\x18\x18\xf8\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x18\x18\x1f\x18\x1f\x18\x18\x18" - "\x36\x36\x36\x36\x37\x36\x36\x36" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x18\x18\xff\x00\xff\x00\x00\x00" - "\x36\x36\x36\x36\xff\x00\x00\x00" - "\x00\x00\xff\x00\xff\x18\x18\x18" - "\x00\x00\x00\x00\xff\x36\x36\x36" - "\x36\x36\x36\x36\x3f\x00\x00\x00" - "\x18\x18\x1f\x18\x1f\x00\x00\x00" - "\x00\x00\x1f\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x3f\x36\x36\x36" - "\x36\x36\x36\x36\xff\x36\x36\x36" - "\x18\x18\xff\x18\xff\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x00\x00\x62\x94\x88\x94\x62\x00" - "\x00\x78\x84\xf8\x84\xf8\x80\x80" - "\x00\xfc\x84\x80\x80\x80\x80\x00" - "\x00\xfe\x28\x28\x28\x28\x28\x00" - "\xfc\x84\x40\x20\x40\x84\xfc\x00" - "\x00\x00\x7e\x88\x88\x88\x70\x00" - "\x00\x42\x42\x42\x42\x7c\x40\x80" - "\x00\x76\x88\x08\x08\x08\x08\x00" - "\xf8\x20\x70\x88\x88\x70\x20\xf8" - "\x38\x44\x82\xfe\x82\x44\x38\x00" - "\x38\x44\x82\x82\x28\x28\x6c\x00" - "\x1c\x10\x08\x7c\x84\x84\x78\x00" - "\x00\x00\x7c\x92\x92\x7c\x00\x00" - "\x02\x04\x7e\x89\x91\x7e\x40\x80" - "\x38\x40\x80\xf8\x80\x40\x38\x00" - "\x78\x84\x84\x84\x84\x84\x84\x00" - "\x00\xfc\x00\xfc\x00\xfc\x00\x00" - "\x20\x20\xfc\x20\x20\x00\xfc\x00" - "\x40\x20\x10\x20\x40\x00\xfc\x00" - "\x10\x20\x40\x20\x10\x00\xfc\x00" - "\x0e\x11\x11\x10\x10\x10\x10\x10" - "\x08\x08\x08\x08\x08\x88\x88\x70" - "\x20\x20\x00\xf8\x00\x20\x20\x00" - "\x00\x64\x98\x00\x64\x98\x00\x00" - "\x38\x44\x44\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00" - "\x07\x04\x04\x04\x64\x24\x1c\x0c" - "\x58\x44\x44\x44\x44\x00\x00\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 437 English, (thin)", CIOLIB_CP437} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00" - "\x00\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00" - "\x00\x00\x00\x66\xff\xff\xff\xff\x7e\x7e\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\xff\x7e\x7e\x3c\x3c\x18\x18\x00" - "\x00\x00\x00\x18\x3c\x3c\x18\x66\xff\xff\x66\x18\x3c\x7e\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\xff\xff\xff\x7e\x18\x3c\x7e\x00\x00" - "\x00\x00\x00\x00\x00\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xe7\xc3\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x3c\x66\x42\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xc3\x99\xbd\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x00\x00\x3f\x33\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00\x00" - "\x00\x00\x00\x7f\x63\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\xe7\x3c\xdb\x18\x18\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\xf8\xfe\xfe\xf8\xe0\xc0\x80\x00\x00\x00" - "\x00\x00\x00\x02\x06\x0e\x3e\xfe\xfe\x3e\x0e\x06\x02\x00\x00\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\xfe\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00" - "\x00\x18\x3c\x7e\xff\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\xff\x7e\x3c\x18\x00" - "\x00\x00\x00\x00\x00\x08\x0c\x0e\xff\x0e\x0c\x08\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x30\x70\xff\x70\x30\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x24\x66\xff\x66\x24\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x63\x63\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00" - "\x00\x18\x7e\xdb\xdb\xe8\x78\x3c\x1e\x17\xdb\xdb\x7e\x18\x18\x00" - "\x00\xe6\xa6\xec\x0c\x18\x18\x30\x30\x60\x6e\xca\xce\x00\x00\x00" - "\x00\x38\x6c\x6c\x6c\x38\x38\x6d\xcd\xc6\xc6\xcb\x73\x00\x00\x00" - "\x00\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x66\x66\x3c\xff\xff\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x30\x60\xc3\xff\x00\x00\x00" - "\x00\xfe\xc6\x0c\x18\x3c\x06\x03\x03\x03\xc3\x66\x3c\x00\x00\x00" - "\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcd\xff\x0d\x0c\x1e\x00\x00\x00" - "\x00\xfe\xc0\xc0\xc0\xfc\xe6\xc3\x03\x03\xc3\x66\x3c\x00\x00\x00" - "\x00\x3c\x66\xc6\xc0\xfc\xe6\xc3\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x66\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\x67\x3f\x03\x63\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x03\x06\x0c\x18\x30\x70\x30\x18\x0c\x06\x03\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x7e\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc0\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\xc0\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x7e\xc3\xc3\xdf\xdb\xdb\xde\xc0\xc0\x7c\x00\x00\x00" - "\x00\x10\x38\x7c\xee\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\xfe\x63\x63\x63\x63\x7e\x63\x63\x63\x63\x63\xfe\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfc\x66\x63\x63\x63\x63\x63\x63\x63\x63\x66\xfc\x00\x00\x00" - "\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00\x00" - "\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x60\x60\xf8\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x67\x3d\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x0f\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x00\x00\x00" - "\x00\xc3\xe7\xff\xff\xdb\xdb\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00" - "\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfe\x63\x63\x63\x63\x63\x7e\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xcb\xcf\x7e\x3c\x06\x07\x00" - "\x00\xfe\x63\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\xf7\x00\x00\x00" - "\x00\x7e\xc3\xc3\xc0\xc0\x7e\x03\x03\x03\xc3\xc3\x7e\x00\x00\x00" - "\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00" - "\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xe7\x7e\x3c\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00\x00" - "\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00\x00" - "\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x00\x18\x3c\x66\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x06\x3e\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xde\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x0e\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c" - "\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xc3\xc3\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xde\x63\x63\x63\x63\x63\x63\x7e\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x0f" - "\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\x7c\x38\x38\x7c\xee\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x0c\x18\x70" - "\x00\x00\x00\x00\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x70\x18\x18\x18\x18\x1e\x1e\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfe\x62\x62\x60\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\xfe\x62\x62\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x1e\x36\x66\x66\x66\x66\x66\x66\x66\xff\xc3\x81\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xd6\xd6\x54\x54\x7c\x7c\x54\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xce\xce\xd6\xe6\xe6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x38\x38\xc6\xc6\xce\xce\xd6\xe6\xe6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xe6\x66\x6c\x6c\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x18\x7e\xdb\xdb\xdb\xdb\xdb\x7e\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x06\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00" - "\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00\x00\x00" - "\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03\x03\x00" - "\x00\x00\x00\xf8\xb0\x30\x30\x3c\x36\x36\x36\x36\x7c\x00\x00\x00" - "\x00\x00\x00\xc3\xc3\xc3\xc3\xf3\xdb\xdb\xdb\xdb\xf3\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x78\xcc\x06\x26\x3e\x26\x06\x06\xcc\x78\x00\x00\x00" - "\x00\x00\x00\xce\xdb\xdb\xdb\xfb\xdb\xdb\xdb\xdb\xce\x00\x00\x00" - "\x00\x00\x00\x3f\x66\x66\x66\x3e\x3e\x66\x66\x66\xe7\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x02\x06\x3c\x60\x60\x7c\x66\x66\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\x66\x66\x7c\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x32\x32\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1e\x36\x36\x66\x66\x66\xff\xc3\xc3\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\x54\x7c\x54\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3c\x66\x06\x0c\x06\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xce\xd6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x38\x38\xc6\xc6\xce\xd6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1e\x36\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10" - "\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18" - "\xd8\x83\xda\x13\xd8\x83\xda\x13\xd8\x83\xda\x13\xd8\x83\xda\x13" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x3c\x18\x7e\xdb\xdb\xdb\xdb\x7e\x18\x18\x3c" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x06\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x03\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xb0\x30\x3e\x33\x33\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xf6\xde\xde\xf6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf0\x60\x60\x7c\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3e\x67\x03\x1f\x03\x67\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xce\xdb\xdb\xfb\xdb\xdb\xce\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xcc\xcc\xfc\x6c\xcc\xce\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x7e\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x00\x7c\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xf8\x70\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x00\x3c\x42\x99\xa1\xa1\x99\x42\x3c\x00\x00\x00\x00\x00" - "\x00\x70\x88\x10\x60\x88\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x42\x7e\x00\x00\x00" - , NULL, NULL, "Codepage 866 (b) Russian", CIOLIB_CP866M2} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x18\x70\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x70\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\x36\x36\x7e\xd8\xd8\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xce\xd6\xe6\xc6\x7c\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x04\x7c\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\x7c\x40\x00\x00\x00" - "\x00\xf8\xcc\xcc\xf8\xc4\xcc\xde\xcc\xcc\xcc\xc6\x00\x00\x00\x00" - "\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\xd8\x70\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\xc0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x3e\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\xd8\xd8\xd8\xdc\x76\x00\x00\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\x6c\x6c\x6c\x6c\x6c\x6c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x60\x30\x18\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xd8\xd8\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00" - "\x00\x00\x00\x00\x76\xdc\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x7e\x18\x3c\x66\x66\x66\x66\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\x6c\x6c\x6c\x6c\xee\x00\x00\x00\x00" - "\x00\x00\x1e\x30\x18\x0c\x3e\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xdb\xdb\xdb\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x03\x06\x7e\xdb\xdb\xf3\x7e\x60\xc0\x00\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7c\x60\x60\x60\x30\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x6c\x36\x36\x36\x36\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x7e\x00\x00" - "\x00\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\x7e\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff" - "\x00\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x3f\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00" - "\x00\x00\x00\x7f\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\xf8\xfe\xf8\xe0\xc0\x80\x00\x00" - "\x00\x00\x00\x02\x06\x0e\x3e\xfe\x3e\x0e\x06\x02\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00" - "\x00\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00" - "\x00\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18" - "\x00\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00" - "\x00\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00" - "\x00\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00" - "\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xd6\xc6\xc6\x6c\x38\x00\x00" - "\x00\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00" - "\x00\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0e\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x6c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\x7c\x38\x7c\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00" - "\x00\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00" - "\x00\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x36\x32\x30\x7c\x30\x30\x30\x78\x00\x00" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78" - "\x00\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c" - "\x00\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e" - "\x00\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00" - "\x00\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78" - "\x00\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00" - "\x00\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x0c\x78" - "\x00\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x0c\x78" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\x36\x76\xdc\xd8\x6e\x00\x00" - "\x00\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xce\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xce\xde\xf6\xe6\x7c\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xe6\xfc\x00\x00" - "\x00\x00\x04\x7c\xce\xce\xd6\xd6\xd6\xe6\xe6\x7c\x40\x00" - "\x00\x00\xfc\x66\x66\x7c\x62\x66\x6f\x66\x66\xf3\x00\x00" - "\x00\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\xd8\x70\x00" - "\x00\x00\x0c\x18\x30\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x30\x30\x00\x30\x30\x60\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x00\x00\x00" - "\x00\x00\x60\xe0\x63\x66\x6c\x18\x30\x6e\xc3\x06\x0c\x1f" - "\x00\x00\x60\xe0\x63\x66\x6c\x1a\x36\x6e\xda\x3f\x06\x06" - "\x00\x00\x00\x18\x18\x00\x18\x18\x3c\x3c\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x76\xdc\xd8\xd8\xdc\x76\x00\x00" - "\x00\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xcc\x00\x00" - "\x00\x00\x00\xfe\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x6c\x6c\x6c\x6c\x6c\x00\x00" - "\x00\x00\x00\xfe\xc6\x60\x30\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xd8\xd8\xd8\xd8\x70\x00\x00" - "\x00\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7c\x60\xc0" - "\x00\x00\x00\x00\x00\x76\xdc\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x7e\x18\x3c\x66\x66\x66\x3c\x18\x7e\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\x6c\x38\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xc6\x6c\x6c\x6c\xee\x00\x00" - "\x00\x00\x00\x1e\x30\x18\x0c\x3e\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xdb\xdb\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x03\x06\x7e\xdb\xdb\xf3\x7e\x60\xc0\x00\x00" - "\x00\x00\x00\x1e\x30\x60\x60\x7e\x60\x60\x30\x1e\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00" - "\x00\x6c\x36\x36\x36\x36\x36\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x7e\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xfe\xd6\x10\x38" - "\x10\x38\x7c\xfe\xfe\x7c\x10\x38" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78" - "\x3c\x66\x66\x66\x3c\x18\x7e\x18" - "\x3f\x33\x3f\x30\x30\x70\xf0\xe0" - "\x7f\x63\x7f\x63\x63\x67\xe6\xc0" - "\x18\xdb\x3c\xe7\xe7\x3c\xdb\x18" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x18\x3c\x7e\x18\x18\x7e\x3c\x18" - "\x66\x66\x66\x66\x66\x00\x66\x00" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x61\x3c\x66\x66\x3c\x86\x7c" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x18\x3c\x7e\x18\x7e\x3c\x18\xff" - "\x18\x3c\x7e\x18\x18\x18\x18\x00" - "\x18\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x0c\xfe\x0c\x18\x00\x00" - "\x00\x30\x60\xfe\x60\x30\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x18\x18\x00\x18\x00" - "\x66\x66\x24\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x38\x6c\xc6\xd6\xc6\x6c\x38\x00" - "\x18\x38\x18\x18\x18\x18\x7e\x00" - "\x7c\xc6\x06\x1c\x30\x66\xfe\x00" - "\x7c\xc6\x06\x3c\x06\xc6\x7c\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfe\xc0\xc0\xfc\x06\xc6\x7c\x00" - "\x38\x60\xc0\xfc\xc6\xc6\x7c\x00" - "\xfe\xc6\x0c\x18\x30\x30\x30\x00" - "\x7c\xc6\xc6\x7c\xc6\xc6\x7c\x00" - "\x7c\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x06\x0c\x18\x30\x18\x0c\x06\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x7c\xc6\x0c\x18\x18\x00\x18\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3a\x00" - "\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x7c\xc6\xc6\xc6\xc6\xce\x7c\x0e" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x3c\x66\x30\x18\x0c\x66\x3c\x00" - "\x7e\x7e\x5a\x18\x18\x18\x3c\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00" - "\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x00" - "\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00" - "\x66\x66\x66\x3c\x18\x18\x3c\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x7c\x66\x66\x66\xdc\x00" - "\x00\x00\x7c\xc6\xc0\xc6\x7c\x00" - "\x1c\x0c\x7c\xcc\xcc\xcc\x76\x00" - "\x00\x00\x7c\xc6\xfe\xc0\x7c\x00" - "\x3c\x66\x60\xf8\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x18\x00\x38\x18\x18\x18\x3c\x00" - "\x06\x00\x06\x06\x06\x66\x66\x3c" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\xec\xfe\xd6\xd6\xd6\x00" - "\x00\x00\xdc\x66\x66\x66\x66\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x60\x60\xf0\x00" - "\x00\x00\x7e\xc0\x7c\x06\xfc\x00" - "\x30\x30\xfc\x30\x30\x36\x1c\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xc6\xc6\xc6\x6c\x38\x00" - "\x00\x00\xc6\xd6\xd6\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xc6\xc6\xc6\x7e\x06\xfc" - "\x00\x00\x7e\x4c\x18\x32\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x00" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\xc6\xfe\x00" - "\x7c\xc6\xc0\xc0\xc6\x7c\x0c\x78" - "\xcc\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x0c\x18\x7c\xc6\xfe\xc0\x7c\x00" - "\x7c\x82\x78\x0c\x7c\xcc\x76\x00" - "\xc6\x00\x78\x0c\x7c\xcc\x76\x00" - "\x30\x18\x78\x0c\x7c\xcc\x76\x00" - "\x30\x30\x78\x0c\x7c\xcc\x76\x00" - "\x00\x00\x7e\xc0\xc0\x7e\x0c\x38" - "\x7c\x82\x7c\xc6\xfe\xc0\x7c\x00" - "\xc6\x00\x7c\xc6\xfe\xc0\x7c\x00" - "\x30\x18\x7c\xc6\xfe\xc0\x7c\x00" - "\x66\x00\x38\x18\x18\x18\x3c\x00" - "\x7c\x82\x38\x18\x18\x18\x3c\x00" - "\x30\x18\x00\x38\x18\x18\x3c\x00" - "\xc6\x38\x6c\xc6\xfe\xc6\xc6\x00" - "\x38\x6c\x7c\xc6\xfe\xc6\xc6\x00" - "\x18\x30\xfe\xc0\xf8\xc0\xfe\x00" - "\x00\x00\x7e\x12\xfe\x90\xfe\x00" - "\x3e\x6c\xcc\xfe\xcc\xcc\xce\x00" - "\x7c\x82\x7c\xc6\xc6\xc6\x7c\x00" - "\xc6\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x30\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x78\x84\x00\xcc\xcc\xcc\x76\x00" - "\x60\x30\xcc\xcc\xcc\xcc\x76\x00" - "\xc6\x00\xc6\xc6\xc6\x7e\x06\xfc" - "\xc6\x38\x6c\xc6\xc6\x6c\x38\x00" - "\xc6\x00\xc6\xc6\xc6\xc6\x7c\x00" - "\x00\x02\x7c\xce\xd6\xe6\x7c\x80" - "\x38\x6c\x64\xf0\x60\x66\xfc\x00" - "\x3a\x6c\xce\xd6\xe6\x6c\xb8\x00" - "\xf8\xcc\xcc\xfa\xc6\xcf\xc6\xc7" - "\x0e\x1b\x18\x3c\x18\xd8\x70\x00" - "\x18\x30\x78\x0c\x7c\xcc\x76\x00" - "\x0c\x18\x00\x38\x18\x18\x3c\x00" - "\x0c\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x18\x30\xcc\xcc\xcc\xcc\x76\x00" - "\x76\xdc\x00\xdc\x66\x66\x66\x00" - "\x76\xdc\x00\xe6\xf6\xde\xce\x00" - "\x3c\x6c\x6c\x3e\x00\x7e\x00\x00" - "\x38\x6c\x6c\x38\x00\x7c\x00\x00" - "\x18\x00\x18\x18\x30\x63\x3e\x00" - "\x00\x00\x00\xfe\xc0\xc0\x00\x00" - "\x00\x00\x00\xfe\x06\x06\x00\x00" - "\x63\xe6\x6c\x7e\x33\x66\xcc\x0f" - "\x63\xe6\x6c\x7a\x36\x6a\xdf\x06" - "\x18\x00\x18\x18\x3c\x3c\x18\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x18\x18\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\x36\x36\xf6\x36\x36\x36" - "\x00\x00\x00\x00\xfe\x36\x36\x36" - "\x00\x00\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x36\x36\x36\x36\xfe\x00\x00\x00" - "\x18\x18\xf8\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x18\x18\x1f\x18\x1f\x18\x18\x18" - "\x36\x36\x36\x36\x37\x36\x36\x36" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x18\x18\xff\x00\xff\x00\x00\x00" - "\x36\x36\x36\x36\xff\x00\x00\x00" - "\x00\x00\xff\x00\xff\x18\x18\x18" - "\x00\x00\x00\x00\xff\x36\x36\x36" - "\x36\x36\x36\x36\x3f\x00\x00\x00" - "\x18\x18\x1f\x18\x1f\x00\x00\x00" - "\x00\x00\x1f\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x3f\x36\x36\x36" - "\x36\x36\x36\x36\xff\x36\x36\x36" - "\x18\x18\xff\x18\xff\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x00\x00\x76\xdc\xc8\xdc\x76\x00" - "\x78\xcc\xcc\xd8\xcc\xc6\xcc\x00" - "\xfe\xc6\xc0\xc0\xc0\xc0\xc0\x00" - "\x00\x00\xfe\x6c\x6c\x6c\x6c\x00" - "\xfe\xc6\x60\x30\x60\xc6\xfe\x00" - "\x00\x00\x7e\xd8\xd8\xd8\x70\x00" - "\x00\x00\x66\x66\x66\x66\x7c\xc0" - "\x00\x76\xdc\x18\x18\x18\x18\x00" - "\x7e\x18\x3c\x66\x66\x3c\x18\x7e" - "\x38\x6c\xc6\xfe\xc6\x6c\x38\x00" - "\x38\x6c\xc6\xc6\x6c\x6c\xee\x00" - "\x0e\x18\x0c\x3e\x66\x66\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x00\x00" - "\x06\x0c\x7e\xdb\xdb\x7e\x60\xc0" - "\x1e\x30\x60\x7e\x60\x30\x1e\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\x00" - "\x00\xfe\x00\xfe\x00\xfe\x00\x00" - "\x18\x18\x7e\x18\x18\x00\x7e\x00" - "\x30\x18\x0c\x18\x30\x00\x7e\x00" - "\x0c\x18\x30\x18\x0c\x00\x7e\x00" - "\x0e\x1b\x1b\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xd8\xd8\x70" - "\x00\x18\x00\x7e\x00\x18\x00\x00" - "\x00\x76\xdc\x00\x76\xdc\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x0f\x0c\x0c\x0c\xec\x6c\x3c\x1c" - "\x6c\x36\x36\x36\x36\x00\x00\x00" - "\x78\x0c\x18\x30\x7c\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 865 Norwegian", CIOLIB_CP865} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xa5\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xdb\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x06\x0e\x1a\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xf8\xc0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xa2\xaa\xba\x82\x7c\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xa5\x99\x81\x7e\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\x7e\x00\x00\x00" - "\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00" - "\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00" - "\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\xf8\xfe\xf8\xe0\xc0\x80\x00\x00\x00" - "\x00\x00\x02\x06\x0e\x3e\xfe\x3e\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00" - "\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x6c\x6c\x00\xfe\xc6\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xf8\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xf0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xaa\xba\x82\x7c\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xfe\x7c\x38\x7c" - "\x10\x10\x38\x7c\xfe\x7c\x38\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78" - "\x3c\x66\x66\x66\x3c\x18\x7e\x18" - "\x3f\x33\x3f\x30\x30\x70\xf0\xe0" - "\x7f\x63\x7f\x63\x63\x67\xe6\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x18\x3c\x7e\x18\x18\x7e\x3c\x18" - "\x66\x66\x66\x66\x66\x00\x66\x00" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x63\x38\x6c\x6c\x38\xcc\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x18\x3c\x7e\x18\x7e\x3c\x18\xff" - "\x18\x3c\x7e\x18\x18\x18\x18\x00" - "\x18\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x0c\xfe\x0c\x18\x00\x00" - "\x00\x30\x60\xfe\x60\x30\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\xc6\xfe\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x18\x18\x18\x18" - "\x18\xf8\x18\xf8\x18\x18\x18\x18" - "\x36\x36\x36\xf6\x36\x36\x36\x36" - "\x00\x00\x00\xfe\x36\x36\x36\x36" - "\x00\xf8\x18\xf8\x18\x18\x18\x18" - "\x36\xf6\x06\xf6\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\xfe\x06\xf6\x36\x36\x36\x36" - "\x36\xf6\x06\xfe\x00\x00\x00\x00" - "\x36\x36\x36\xfe\x00\x00\x00\x00" - "\x18\xf8\x18\xf8\x00\x00\x00\x00" - "\x00\x00\x00\xf8\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x00\x00\x00\x00" - "\x18\x18\x18\xff\x00\x00\x00\x00" - "\x00\x00\x00\xff\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x18\x18\x18\x18" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x18\x18\x18\xff\x18\x18\x18\x18" - "\x18\x1f\x18\x1f\x18\x18\x18\x18" - "\x36\x36\x36\x37\x36\x36\x36\x36" - "\x36\x37\x30\x3f\x00\x00\x00\x00" - "\x00\x3f\x30\x37\x36\x36\x36\x36" - "\x36\xf7\x00\xff\x00\x00\x00\x00" - "\x00\xff\x00\xf7\x36\x36\x36\x36" - "\x36\x37\x30\x37\x36\x36\x36\x36" - "\x00\xff\x00\xff\x00\x00\x00\x00" - "\x36\xf7\x00\xf7\x36\x36\x36\x36" - "\x18\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\xff\x00\x00\x00\x00" - "\x00\xff\x00\xff\x18\x18\x18\x18" - "\x00\x00\x00\xff\x36\x36\x36\x36" - "\x36\x36\x36\x3f\x00\x00\x00\x00" - "\x18\x1f\x18\x1f\x00\x00\x00\x00" - "\x00\x1f\x18\x1f\x18\x18\x18\x18" - "\x00\x00\x00\x3f\x36\x36\x36\x36" - "\x36\x36\x36\xff\x36\x36\x36\x36" - "\x18\xff\x18\xff\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x00\x00\x00\x00" - "\x00\x00\x00\x1f\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\x24\x00\x3c\x66\x7e\x60\x3c\x00" - "\x06\x7e\x60\x60\x60\x60\x60\x00" - "\x00\x06\x7e\x60\x60\x60\x60\x00" - "\x3c\x66\xc0\xf8\xc0\x66\x3c\x00" - "\x00\x00\x7c\xc0\xf8\xc0\x7c\x00" - "\x30\x78\x30\x30\x30\x30\x78\x00" - "\x20\x00\x70\x30\x30\x30\x78\x00" - "\x48\x78\x30\x30\x30\x30\x78\x00" - "\x50\x00\x70\x30\x30\x30\x78\x00" - "\x00\x00\x00\x38\x38\x00\x00\x00" - "\x03\x02\x06\x04\xcc\x68\x38\x10" - "\x3c\x42\x99\xa1\xa1\x99\x42\x3c" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x7c\x7c\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x42\x7e\x00" - , "Ukrainian font cp866u", CIOLIB_CP866U} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x10\x10\x10\x00\x00\x10\x10\x00\x00\x00" - "\x00\x00\x24\x24\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x24\x24\x24\x7e\x24\x24\x24\x7e\x24\x24\x24\x00\x00\x00" - "\x00\x00\x08\x3f\x48\x48\x48\x3e\x09\x09\x09\x7e\x08\x00\x00\x00" - "\x00\x00\x00\x30\x49\x32\x04\x08\x10\x26\x49\x06\x00\x00\x00\x00" - "\x00\x00\x00\x18\x24\x24\x18\x25\x22\x22\x22\x1d\x00\x00\x00\x00" - "\x00\x18\x08\x08\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x10\x10\x10\x10\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x10\x08\x04\x04\x04\x04\x04\x04\x08\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x18\x7e\x18\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x08\x08\x08\x7f\x08\x08\x08\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x08\x10\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x01\x02\x04\x08\x10\x20\x40\x80\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x42\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x08\x18\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x04\x08\x10\x20\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x1c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x02\x06\x0a\x12\x22\x42\x7f\x02\x02\x02\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x40\x40\x40\x7c\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7e\x02\x02\x04\x04\x08\x08\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x3c\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x3e\x02\x02\x02\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x08\x08\x10\x00" - "\x00\x00\x00\x04\x08\x10\x20\x40\x20\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x20\x10\x08\x04\x02\x04\x08\x10\x20\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x04\x08\x10\x00\x00\x10\x10\x00\x00\x00" - "\x00\x00\x00\x1c\x22\x49\x55\x55\x56\x4c\x20\x1e\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x7c\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x40\x40\x40\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x78\x44\x42\x42\x42\x42\x42\x42\x44\x78\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x40\x40\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x40\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x3e\x40\x40\x40\x4e\x42\x42\x42\x42\x3e\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x7e\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x0e\x02\x02\x02\x02\x02\x02\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x42\x44\x48\x50\x60\x60\x50\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x40\x40\x40\x40\x40\x40\x40\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x41\x63\x55\x49\x41\x41\x41\x41\x41\x41\x00\x00\x00\x00" - "\x00\x00\x42\x62\x52\x52\x4a\x4a\x46\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x42\x7c\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x4a\x3c\x04\x02\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x42\x7c\x50\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x3c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7f\x08\x08\x08\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x41\x41\x22\x22\x14\x14\x08\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x41\x41\x41\x49\x55\x63\x41\x00\x00\x00\x00" - "\x00\x00\x41\x41\x22\x14\x08\x08\x14\x22\x41\x41\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x22\x14\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x7e\x02\x02\x04\x08\x10\x20\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\x40\x20\x10\x08\x04\x02\x01\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x04\x04\x04\x04\x04\x04\x04\x04\x3c\x00\x00\x00\x00" - "\x00\x00\x08\x14\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x00\x18\x10\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x40\x40\x40\x7c\x42\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x40\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x02\x02\x02\x3e\x42\x42\x42\x42\x42\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x0e\x10\x10\x7e\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x00\x40\x40\x40\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x08\x08\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x02\x02\x00\x0e\x02\x02\x02\x02\x02\x02\x02\x42\x3c\x00" - "\x00\x00\x40\x40\x40\x42\x44\x48\x70\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x70\x10\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x49\x49\x49\x49\x49\x49\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x42\x42\x42\x42\x42\x7c\x40\x40\x40\x00" - "\x00\x00\x00\x00\x00\x3e\x42\x42\x42\x42\x42\x3e\x02\x02\x02\x00" - "\x00\x00\x00\x00\x00\x5c\x62\x40\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x3c\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x7c\x10\x10\x10\x10\x10\x0e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x49\x49\x49\x49\x49\x49\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x24\x18\x24\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x00\x00\x00\x00\x7e\x04\x08\x10\x20\x40\x7e\x00\x00\x00\x00" - "\x00\x0c\x10\x10\x10\x10\x20\x10\x10\x10\x10\x0c\x00\x00\x00\x00" - "\x00\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00" - "\x00\x30\x08\x08\x08\x08\x04\x08\x08\x08\x08\x30\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x10\x10\x00\x00\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x08\x08\x3c\x4a\x48\x48\x4a\x3c\x08\x08\x00\x00\x00" - "\x00\x00\x1c\x22\x22\x20\x78\x20\x20\x20\x21\x7e\x00\x00\x00\x00" - "\x00\x00\x41\x3e\x22\x22\x22\x3e\x41\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x41\x22\x14\x08\x08\x3e\x08\x3e\x08\x08\x00\x00\x00\x00" - "\x00\x08\x08\x08\x08\x08\x00\x00\x08\x08\x08\x08\x08\x00\x00\x00" - "\x00\x00\x3c\x42\x20\x3c\x42\x42\x42\x3c\x04\x42\x3c\x00\x00\x00" - "\x00\x24\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x41\x41\x5d\x51\x51\x5d\x41\x41\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\x44\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x09\x12\x24\x48\x90\x48\x24\x12\x09\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x02\x02\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x41\x5d\x55\x59\x55\x55\x41\x41\x3e\x00\x00\x00\x00" - "\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x24\x24\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x08\x08\x3e\x08\x08\x00\x3e\x00\x00\x00\x00" - "\x00\x00\x30\x48\x10\x20\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x70\x08\x30\x08\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x02\x04\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x7e\x41\x40\x40\x80\x00" - "\x00\x00\x7c\x52\x52\x52\x5c\x50\x50\x50\x50\x50\x50\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x04\x08\x00" - "\x00\x00\x10\x30\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x18\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x90\x48\x24\x12\x09\x12\x24\x48\x90\x00\x00\x00\x00" - "\x00\x10\x30\x10\x11\x12\x04\x08\x11\x23\x45\x0f\x01\x01\x00\x00" - "\x00\x10\x30\x10\x11\x12\x04\x08\x10\x26\x49\x02\x04\x0f\x00\x00" - "\x00\x30\x48\x10\x09\x4a\x34\x08\x11\x23\x45\x0f\x01\x01\x00\x00" - "\x00\x00\x00\x10\x10\x00\x10\x10\x10\x20\x40\x40\x42\x3c\x00\x00" - "\x30\x0c\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x0c\x30\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x18\x24\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x32\x4c\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x24\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x18\x24\x18\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x3f\x48\x48\x48\x7e\x48\x48\x48\x48\x4f\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x40\x40\x40\x40\x42\x3c\x04\x02\x3c\x00" - "\x18\x06\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x06\x18\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x0c\x12\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x14\x14\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x18\x06\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x06\x18\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x08\x14\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x14\x14\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x78\x44\x42\x42\xf2\x42\x42\x42\x44\x78\x00\x00\x00\x00" - "\x00\x19\x26\x00\x41\x61\x51\x49\x45\x43\x41\x41\x00\x00\x00\x00" - "\x30\x0c\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x0c\x30\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x18\x24\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x32\x4c\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x22\x14\x08\x14\x22\x00\x00\x00\x00\x00\x00" - "\x00\x00\x01\x1a\x24\x4a\x4a\x52\x52\x24\x58\x80\x00\x00\x00\x00" - "\x30\x0c\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x0c\x30\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x18\x24\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x04\x08\x00\x41\x41\x22\x14\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x20\x20\x38\x24\x22\x22\x22\x24\x38\x20\x20\x20\x00\x00\x00" - "\x00\x00\x1e\x21\x21\x21\x3e\x21\x21\x21\x3e\x20\x20\x20\x00\x00" - "\x00\x10\x08\x04\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x1c\x22\x1c\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x09\x09\x3e\x48\x48\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x40\x40\x42\x3c\x08\x04\x78\x00" - "\x00\x20\x10\x08\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x10\x08\x04\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x08\x14\x22\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x22\x22\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x1d\x02\x06\x0a\x02\x3e\x42\x42\x42\x3e\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x20\x10\x08\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x24\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x24\x00\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x08\x00\x3e\x00\x08\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1d\x22\x45\x49\x51\x22\x5c\x00\x00\x00\x00" - "\x00\x20\x10\x08\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x04\x08\x00\x00\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x00\x20\x20\x38\x24\x24\x24\x28\x30\x20\x20\x20\x00\x00\x00" - "\x00\x00\x24\x24\x00\x00\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - , NULL, NULL, "ISO-8859-1 West European, (thin)", CIOLIB_ISO_8859_1} - ,{"\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x81\xe7\xa5\x99\x81\x99\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x7e\xff\x99\xdb\xe7\xff\xe7\x7e\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x38\x38\x10\xd6\xfe\xd6\x10\x38\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\xfe\xfe\x54\x10\x38\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x30\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x18\x00\x00\x00\x00" - "\x00\x20\x30\x38\x3c\x36\x36\x30\x70\xf0\xf0\x60\x00\x00\x00\x00" - "\x00\x00\x3e\x22\x3e\x22\x22\x22\x22\x26\x6e\xe4\x40\x00\x00\x00" - "\x00\x00\x00\x10\x92\x54\x28\xc6\x28\x54\x92\x10\x00\x00\x00\x00" - "\x00\x00\x40\x60\x70\x78\x7c\x7e\x7c\x78\x70\x60\x40\x00\x00\x00" - "\x00\x00\x02\x06\x0e\x1e\x3e\x7e\x3e\x1e\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7e\xf4\xf4\xf4\x74\x14\x14\x14\x14\x14\x00\x00\x00\x00" - "\x00\x1e\x30\x78\xdc\xce\xe7\x73\x3b\x1e\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\xff\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x0c\x06\xff\x06\x0c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xff\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x33\x66\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x66\xff\x66\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x3c\x3c\x7e\x7e\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x7e\x7e\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x77\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x00\x10\x7c\xd6\xd0\xd0\x70\x38\x1c\x16\x16\xd6\x7c\x10\x00\x00" - "\x00\x00\xc6\xc6\x0c\x0c\x18\x30\x30\x60\x60\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x70\xd6\xdc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x1c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\xff\x3c\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xd6\xd6\xd6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x0c\x18\x30\x60\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x0c\xcc\xcc\xcc\xcc\xfe\x0c\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\x06\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\x0c\x18\x70\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x1c\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc0\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x0c\x18\x30\x30\x00\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x7c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xcc\xf8\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xce\xc6\xc6\xc6\x66\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xf6\xde\x7c\x0c\x06\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xd8\xcc\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\x60\x38\x0c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x38\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xfe\x06\x0c\x0c\x18\x18\x30\x60\x60\xc0\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x00\x70\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x06\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x66\x60\x60\xf0\x60\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\x7c" - "\x00\x00\x00\xc0\xc0\xc0\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xfe\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc0\x70\x1c\x06\x06\x7c\x00\x00\x00" - "\x00\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x30\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xd6\xd6\xfe\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x0c\x18\x30\x60\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x30\x60\x30\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0c\x06\x0c\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x7c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x7e\xc3\x66\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\x54\x7c\x38\x38\x38\x7c\x54\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xce\xde\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x44\x38\xc6\xce\xde\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x6c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x66\x3c\x00\x00\x00" - "\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x10\x10\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x03\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x06\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x06\x00" - "\x00\x00\xf0\xb0\x30\x30\x3c\x36\x36\x36\x36\x36\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xf2\xda\xda\xda\xda\xda\xf6\x00\x00\x00" - "\x00\x00\x30\x30\x30\x30\x3c\x36\x36\x36\x36\x36\x3c\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3e\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\x66\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3c\x66\x66\x66\x66\x66\xff\xc3\x66\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\x7c\x38\x38\x38\x7c\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x06\x3c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x44\x38\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x10\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11" - "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x10" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x03\x06\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x06\x00" - "\x00\x00\x00\x00\x00\x00\xf0\xb0\x30\x3c\x36\x36\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfa\xce\xce\xfa\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x60\x60\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x06\x3e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xd6\xd6\xf6\xd6\xd6\xcc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x6c\x6c\x00\xfe\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xf8\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf8\xc0\xc6\x7c\x00\x00\x00" - "\x24\x24\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x36\x36\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x44\x38\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x44\x38\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x18\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x66\x66\x3c\x66\x66\x66\x66\x3c\x66\x66\x00\x00\x00" - "\x06\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x0c\x0c\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, NULL, "Codepage 1131 Belarusian, (swiss)", CIOLIB_CP1131} - ,{ - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\xff\xff\x66\x66\xff\xff\x66\x66\x66\x66\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x62\x62\x66\x66\x0c\x0c\x18\x18\x30\x30\x66\x66\x46\x46\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x38\x38\x67\x67\x66\x66\x3f\x3f\x00\x00" - "\x06\x06\x0c\x0c\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x00\x00" - // 0x30 - "\x3c\x3c\x66\x66\x6e\x6e\x76\x76\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x0e\x0e\x1e\x1e\x66\x66\x7f\x7f\x06\x06\x06\x06\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x66\x66\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x0e\x0e\x18\x18\x30\x30\x60\x60\x30\x30\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x0c\x0c\x06\x06\x0c\x0c\x18\x18\x70\x70\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x3c\x66\x66\x6e\x6e\x6e\x6e\x60\x60\x62\x62\x3c\x3c\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x10 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\x0c\x0c\x12\x12\x30\x30\x7c\x7c\x30\x30\x62\x62\xfc\xfc\x00\x00" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x10\x10\x30\x30\x7f\x7f\x7f\x7f\x30\x30\x10\x10\x00\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x7f\x7f\x1c\x1c\x3e\x3e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\x00\x00\x00\xe0\xe0\xf0\xf0\x38\x38\x18\x18\x18\x18" - "\x18\x18\x18\x18\x1c\x1c\x0f\x0f\x07\x07\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x38\x38\xf0\xf0\xe0\xe0\x00\x00\x00\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\xff\xff" - "\xc0\xc0\xe0\xe0\x70\x70\x38\x38\x1c\x1c\x0e\x0e\x07\x07\x03\x03" - "\x03\x03\x07\x07\x0e\x0e\x1c\x1c\x38\x38\x70\x70\xe0\xe0\xc0\xc0" - "\xff\xff\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\xff\xff\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x3c\x3c\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00" - "\x36\x36\x7f\x7f\x7f\x7f\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x00\x00\x00\x07\x07\x0f\x0f\x1c\x1c\x18\x18\x18\x18" - "\xc3\xc3\xe7\xe7\x7e\x7e\x3c\x3c\x3c\x3c\x7e\x7e\xe7\xe7\xc3\xc3" - "\x00\x00\x3c\x3c\x7e\x7e\x66\x66\x66\x66\x7e\x7e\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x66\x66\x66\x66\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - "\xff\xff\x7f\x7f\x3f\x3f\x1f\x1f\x0f\x0f\x07\x07\x03\x03\x01\x01" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xff\xff\xfe\xfe\xfc\xfc\xf8\xf8\xf0\xf0\xe0\xe0\xc0\xc0\x80\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x7f\x7f\x1c\x1c\x3e\x3e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\x00\x00\x00\xe0\xe0\xf0\xf0\x38\x38\x18\x18\x18\x18" - "\x18\x18\x18\x18\x1c\x1c\x0f\x0f\x07\x07\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x38\x38\xf0\xf0\xe0\xe0\x00\x00\x00\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\xff\xff" - "\xc0\xc0\xe0\xe0\x70\x70\x38\x38\x1c\x1c\x0e\x0e\x07\x07\x03\x03" - "\x03\x03\x07\x07\x0e\x0e\x1c\x1c\x38\x38\x70\x70\xe0\xe0\xc0\xc0" - "\xff\xff\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\xff\xff\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x3c\x3c\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00" - "\x36\x36\x7f\x7f\x7f\x7f\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x00\x00\x00\x07\x07\x0f\x0f\x1c\x1c\x18\x18\x18\x18" - "\xc3\xc3\xe7\xe7\x7e\x7e\x3c\x3c\x3c\x3c\x7e\x7e\xe7\xe7\xc3\xc3" - "\x00\x00\x3c\x3c\x7e\x7e\x66\x66\x66\x66\x7e\x7e\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x66\x66\x66\x66\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - "\xff\xff\x7f\x7f\x3f\x3f\x1f\x1f\x0f\x0f\x07\x07\x03\x03\x01\x01" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xff\xff\xfe\xfe\xfc\xfc\xf8\xf8\xf0\xf0\xe0\xe0\xc0\xc0\x80\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - , NULL - , - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x00\x00\x18\x00" - "\x66\x66\x66\x00\x00\x00\x00\x00" - "\x66\x66\xff\x66\xff\x66\x66\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x62\x66\x0c\x18\x30\x66\x46\x00" - "\x3c\x66\x3c\x38\x67\x66\x3f\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x03\x06\x0c\x18\x30\x60\x00" - // 0x30 - "\x3c\x66\x6e\x76\x66\x66\x3c\x00" - "\x18\x18\x38\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x0c\x30\x60\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x06\x0e\x1e\x66\x7f\x06\x06\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x3c\x66\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x0c\x18\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x18\x00\x00\x18\x00\x00" - "\x00\x00\x18\x00\x00\x18\x18\x30" - "\x0e\x18\x30\x60\x30\x18\x0e\x00" - "\x00\x00\x7e\x00\x7e\x00\x00\x00" - "\x70\x18\x0c\x06\x0c\x18\x70\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x66\x6e\x6e\x60\x62\x3c\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x10 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\x0c\x12\x30\x7c\x30\x62\xfc\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x18" - "\x00\x10\x30\x7f\x7f\x30\x10\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x08\x1c\x3e\x7f\x7f\x1c\x3e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\xff\xff\x00\x00\x00\x00" - "\x00\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\xe0\xf0\x38\x18\x18" - "\x18\x18\x1c\x0f\x07\x00\x00\x00" - "\x18\x18\x38\xf0\xe0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff" - "\xc0\xe0\x70\x38\x1c\x0e\x07\x03" - "\x03\x07\x0e\x1c\x38\x70\xe0\xc0" - "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\x03\x03\x03\x03\x03\x03" - "\x00\x3c\x7e\x7e\x7e\x7e\x3c\x00" - "\x00\x00\x00\x00\x00\xff\xff\x00" - "\x36\x7f\x7f\x7f\x3e\x1c\x08\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x07\x0f\x1c\x18\x18" - "\xc3\xe7\x7e\x3c\x3c\x7e\xe7\xc3" - "\x00\x3c\x7e\x66\x66\x7e\x3c\x00" - "\x18\x18\x66\x66\x18\x18\x3c\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x1c\x3e\x7f\x3e\x1c\x08\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x03\x3e\x76\x36\x36\x00" - "\xff\x7f\x3f\x1f\x0f\x07\x03\x01" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\xff\xff" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x08\x1c\x3e\x7f\x7f\x1c\x3e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\xff\xff\x00\x00\x00\x00" - "\x00\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\xe0\xf0\x38\x18\x18" - "\x18\x18\x1c\x0f\x07\x00\x00\x00" - "\x18\x18\x38\xf0\xe0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff" - "\xc0\xe0\x70\x38\x1c\x0e\x07\x03" - "\x03\x07\x0e\x1c\x38\x70\xe0\xc0" - "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\x03\x03\x03\x03\x03\x03" - "\x00\x3c\x7e\x7e\x7e\x7e\x3c\x00" - "\x00\x00\x00\x00\x00\xff\xff\x00" - "\x36\x7f\x7f\x7f\x3e\x1c\x08\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x07\x0f\x1c\x18\x18" - "\xc3\xe7\x7e\x3c\x3c\x7e\xe7\xc3" - "\x00\x3c\x7e\x66\x66\x7e\x3c\x00" - "\x18\x18\x66\x66\x18\x18\x3c\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x1c\x3e\x7f\x3e\x1c\x08\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x03\x3e\x76\x36\x36\x00" - "\xff\x7f\x3f\x1f\x0f\x07\x03\x01" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\xff\xff" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x00\x00\x03\x3e\x76\x36\x36\x00" - , "Commodore 64 (UPPER)", CIOLIB_PETSCIIU} - ,{ - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\xff\xff\x66\x66\xff\xff\x66\x66\x66\x66\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x62\x62\x66\x66\x0c\x0c\x18\x18\x30\x30\x66\x66\x46\x46\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x38\x38\x67\x67\x66\x66\x3f\x3f\x00\x00" - "\x06\x06\x0c\x0c\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x00\x00" - // 0x30 - "\x3c\x3c\x66\x66\x6e\x6e\x76\x76\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x0e\x0e\x1e\x1e\x66\x66\x7f\x7f\x06\x06\x06\x06\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x66\x66\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x0e\x0e\x18\x18\x30\x30\x60\x60\x30\x30\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x0c\x0c\x06\x06\x0c\x0c\x18\x18\x70\x70\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x3c\x66\x66\x6e\x6e\x6e\x6e\x60\x60\x62\x62\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x00\x00" - "\x00\x00\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x00\x00\x0e\x0e\x18\x18\x3e\x3e\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x7c\x7c" - "\x00\x00\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x18\x18\x00\x00\x38\x38\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x00\x00\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\x06\x3c\x3c" - "\x00\x00\x60\x60\x60\x60\x6c\x6c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x7f\x7f\x7f\x7f\x6b\x6b\x63\x63\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x10 - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x7e\x7e\x18\x18\x18\x18\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x7f\x3e\x3e\x36\x36\x00\x00" - "\x00\x00\x00\x00\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x0c\x0c\x78\x78" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\x0c\x0c\x12\x12\x30\x30\x7c\x7c\x30\x30\x62\x62\xfc\xfc\x00\x00" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x10\x10\x30\x30\x7f\x7f\x7f\x7f\x30\x30\x10\x10\x00\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x50 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - "\x33\x33\x99\x99\xcc\xcc\x66\x66\x33\x33\x99\x99\xcc\xcc\x66\x66" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xcc\xcc\x99\x99\x33\x33\x66\x66\xcc\xcc\x99\x99\x33\x33\x66\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x01\x01\x03\x03\x06\x06\x6c\x6c\x78\x78\x70\x70\x60\x60\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x50 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - "\x33\x33\x99\x99\xcc\xcc\x66\x66\x33\x33\x99\x99\xcc\xcc\x66\x66" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xcc\xcc\x99\x99\x33\x33\x66\x66\xcc\xcc\x99\x99\x33\x33\x66\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x01\x01\x03\x03\x06\x06\x6c\x6c\x78\x78\x70\x70\x60\x60\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - , NULL - , - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x00\x00\x18\x00" - "\x66\x66\x66\x00\x00\x00\x00\x00" - "\x66\x66\xff\x66\xff\x66\x66\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x62\x66\x0c\x18\x30\x66\x46\x00" - "\x3c\x66\x3c\x38\x67\x66\x3f\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x03\x06\x0c\x18\x30\x60\x00" - // 0x30 - "\x3c\x66\x6e\x76\x66\x66\x3c\x00" - "\x18\x18\x38\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x0c\x30\x60\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x06\x0e\x1e\x66\x7f\x06\x06\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x3c\x66\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x0c\x18\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x18\x00\x00\x18\x00\x00" - "\x00\x00\x18\x00\x00\x18\x18\x30" - "\x0e\x18\x30\x60\x30\x18\x0e\x00" - "\x00\x00\x7e\x00\x7e\x00\x00\x00" - "\x70\x18\x0c\x06\x0c\x18\x70\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x66\x6e\x6e\x60\x62\x3c\x00" - "\x00\x00\x3c\x06\x3e\x66\x3e\x00" - "\x00\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x3c\x60\x60\x60\x3c\x00" - "\x00\x06\x06\x3e\x66\x66\x3e\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x0e\x18\x3e\x18\x18\x18\x00" - "\x00\x00\x3e\x66\x66\x3e\x06\x7c" - "\x00\x60\x60\x7c\x66\x66\x66\x00" - "\x00\x18\x00\x38\x18\x18\x3c\x00" - "\x00\x06\x00\x06\x06\x06\x06\x3c" - "\x00\x60\x60\x6c\x78\x6c\x66\x00" - "\x00\x38\x18\x18\x18\x18\x3c\x00" - "\x00\x00\x66\x7f\x7f\x6b\x63\x00" - "\x00\x00\x7c\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - // 0x10 - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x3e\x66\x66\x3e\x06\x06" - "\x00\x00\x7c\x66\x60\x60\x60\x00" - "\x00\x00\x3e\x60\x3c\x06\x7c\x00" - "\x00\x18\x7e\x18\x18\x18\x0e\x00" - "\x00\x00\x66\x66\x66\x66\x3e\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\x63\x6b\x7f\x3e\x36\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x3e\x0c\x78" - "\x00\x00\x7e\x0c\x18\x30\x7e\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\x0c\x12\x30\x7c\x30\x62\xfc\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x18" - "\x00\x10\x30\x7f\x7f\x30\x10\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x50 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - "\x33\x99\xcc\x66\x33\x99\xcc\x66" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xcc\x99\x33\x66\xcc\x99\x33\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x01\x03\x06\x6c\x78\x70\x60\x00" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x50 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - "\x33\x99\xcc\x66\x33\x99\xcc\x66" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xcc\x99\x33\x66\xcc\x99\x33\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x01\x03\x06\x6c\x78\x70\x60\x00" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - , "Commodore 64 (Lower)", CIOLIB_PETSCIIL} - ,{ - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\xff\xff\x66\x66\xff\xff\x66\x66\x66\x66\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x62\x62\x66\x66\x0c\x0c\x18\x18\x30\x30\x66\x66\x46\x46\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x38\x38\x67\x67\x66\x66\x3f\x3f\x00\x00" - "\x06\x06\x0c\x0c\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x00\x00" - // 0x30 - "\x3c\x3c\x66\x66\x6e\x6e\x76\x76\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x0e\x0e\x1e\x1e\x66\x66\x7f\x7f\x06\x06\x06\x06\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x66\x66\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x0e\x0e\x18\x18\x30\x30\x60\x60\x30\x30\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x0c\x0c\x06\x06\x0c\x0c\x18\x18\x70\x70\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x3c\x66\x66\x6e\x6e\x6e\x6e\x60\x60\x62\x62\x3c\x3c\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x10 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\x0c\x0c\x12\x12\x30\x30\x7c\x7c\x30\x30\x62\x62\xfc\xfc\x00\x00" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x10\x10\x30\x30\x7f\x7f\x7f\x7f\x30\x30\x10\x10\x00\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x7f\x7f\x1c\x1c\x3e\x3e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\x00\x00\x00\xe0\xe0\xf0\xf0\x38\x38\x18\x18\x18\x18" - "\x18\x18\x18\x18\x1c\x1c\x0f\x0f\x07\x07\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x38\x38\xf0\xf0\xe0\xe0\x00\x00\x00\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\xff\xff" - "\xc0\xc0\xe0\xe0\x70\x70\x38\x38\x1c\x1c\x0e\x0e\x07\x07\x03\x03" - "\x03\x03\x07\x07\x0e\x0e\x1c\x1c\x38\x38\x70\x70\xe0\xe0\xc0\xc0" - "\xff\xff\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\xff\xff\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x3c\x3c\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00" - "\x36\x36\x7f\x7f\x7f\x7f\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x00\x00\x00\x07\x07\x0f\x0f\x1c\x1c\x18\x18\x18\x18" - "\xc3\xc3\xe7\xe7\x7e\x7e\x3c\x3c\x3c\x3c\x7e\x7e\xe7\xe7\xc3\xc3" - "\x00\x00\x3c\x3c\x7e\x7e\x66\x66\x66\x66\x7e\x7e\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x66\x66\x66\x66\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - "\xff\xff\x7f\x7f\x3f\x3f\x1f\x1f\x0f\x0f\x07\x07\x03\x03\x01\x01" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xff\xff\xfe\xfe\xfc\xfc\xf8\xf8\xf0\xf0\xe0\xe0\xc0\xc0\x80\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x7f\x7f\x1c\x1c\x3e\x3e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\x00\x00\x00\xe0\xe0\xf0\xf0\x38\x38\x18\x18\x18\x18" - "\x18\x18\x18\x18\x1c\x1c\x0f\x0f\x07\x07\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x38\x38\xf0\xf0\xe0\xe0\x00\x00\x00\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\xff\xff" - "\xc0\xc0\xe0\xe0\x70\x70\x38\x38\x1c\x1c\x0e\x0e\x07\x07\x03\x03" - "\x03\x03\x07\x07\x0e\x0e\x1c\x1c\x38\x38\x70\x70\xe0\xe0\xc0\xc0" - "\xff\xff\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\xff\xff\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x3c\x3c\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00" - "\x36\x36\x7f\x7f\x7f\x7f\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x00\x00\x00\x07\x07\x0f\x0f\x1c\x1c\x18\x18\x18\x18" - "\xc3\xc3\xe7\xe7\x7e\x7e\x3c\x3c\x3c\x3c\x7e\x7e\xe7\xe7\xc3\xc3" - "\x00\x00\x3c\x3c\x7e\x7e\x66\x66\x66\x66\x7e\x7e\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x66\x66\x66\x66\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - "\xff\xff\x7f\x7f\x3f\x3f\x1f\x1f\x0f\x0f\x07\x07\x03\x03\x01\x01" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xff\xff\xfe\xfe\xfc\xfc\xf8\xf8\xf0\xf0\xe0\xe0\xc0\xc0\x80\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - , NULL - , - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x00\x00\x18\x00" - "\x66\x66\x66\x00\x00\x00\x00\x00" - "\x66\x66\xff\x66\xff\x66\x66\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x62\x66\x0c\x18\x30\x66\x46\x00" - "\x3c\x66\x3c\x38\x67\x66\x3f\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x03\x06\x0c\x18\x30\x60\x00" - // 0x30 - "\x3c\x66\x6e\x76\x66\x66\x3c\x00" - "\x18\x18\x38\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x0c\x30\x60\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x06\x0e\x1e\x66\x7f\x06\x06\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x3c\x66\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x0c\x18\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x18\x00\x00\x18\x00\x00" - "\x00\x00\x18\x00\x00\x18\x18\x30" - "\x0e\x18\x30\x60\x30\x18\x0e\x00" - "\x00\x00\x7e\x00\x7e\x00\x00\x00" - "\x70\x18\x0c\x06\x0c\x18\x70\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x66\x6e\x6e\x60\x62\x3c\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x10 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\x0c\x12\x30\x7c\x30\x62\xfc\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x18" - "\x00\x10\x30\x7f\x7f\x30\x10\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x08\x1c\x3e\x7f\x7f\x1c\x3e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\xff\xff\x00\x00\x00\x00" - "\x00\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\xe0\xf0\x38\x18\x18" - "\x18\x18\x1c\x0f\x07\x00\x00\x00" - "\x18\x18\x38\xf0\xe0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff" - "\xc0\xe0\x70\x38\x1c\x0e\x07\x03" - "\x03\x07\x0e\x1c\x38\x70\xe0\xc0" - "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\x03\x03\x03\x03\x03\x03" - "\x00\x3c\x7e\x7e\x7e\x7e\x3c\x00" - "\x00\x00\x00\x00\x00\xff\xff\x00" - "\x36\x7f\x7f\x7f\x3e\x1c\x08\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x07\x0f\x1c\x18\x18" - "\xc3\xe7\x7e\x3c\x3c\x7e\xe7\xc3" - "\x00\x3c\x7e\x66\x66\x7e\x3c\x00" - "\x18\x18\x66\x66\x18\x18\x3c\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x1c\x3e\x7f\x3e\x1c\x08\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x03\x3e\x76\x36\x36\x00" - "\xff\x7f\x3f\x1f\x0f\x07\x03\x01" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\xff\xff" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x08\x1c\x3e\x7f\x7f\x1c\x3e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\xff\xff\x00\x00\x00\x00" - "\x00\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\xe0\xf0\x38\x18\x18" - "\x18\x18\x1c\x0f\x07\x00\x00\x00" - "\x18\x18\x38\xf0\xe0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff" - "\xc0\xe0\x70\x38\x1c\x0e\x07\x03" - "\x03\x07\x0e\x1c\x38\x70\xe0\xc0" - "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\x03\x03\x03\x03\x03\x03" - "\x00\x3c\x7e\x7e\x7e\x7e\x3c\x00" - "\x00\x00\x00\x00\x00\xff\xff\x00" - "\x36\x7f\x7f\x7f\x3e\x1c\x08\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x07\x0f\x1c\x18\x18" - "\xc3\xe7\x7e\x3c\x3c\x7e\xe7\xc3" - "\x00\x3c\x7e\x66\x66\x7e\x3c\x00" - "\x18\x18\x66\x66\x18\x18\x3c\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x1c\x3e\x7f\x3e\x1c\x08\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x03\x3e\x76\x36\x36\x00" - "\xff\x7f\x3f\x1f\x0f\x07\x03\x01" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\xff\xff" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x00\x00\x03\x3e\x76\x36\x36\x00" - , "Commodore 128 (UPPER)", CIOLIB_PETSCIIU} - ,{ - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\xff\xff\x66\x66\xff\xff\x66\x66\x66\x66\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x62\x62\x66\x66\x0c\x0c\x18\x18\x30\x30\x66\x66\x46\x46\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x38\x38\x67\x67\x66\x66\x3f\x3f\x00\x00" - "\x06\x06\x0c\x0c\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x00\x00" - // 0x30 - "\x3c\x3c\x66\x66\x6e\x6e\x76\x76\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x0e\x0e\x1e\x1e\x66\x66\x7f\x7f\x06\x06\x06\x06\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x66\x66\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x0e\x0e\x18\x18\x30\x30\x60\x60\x30\x30\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x0c\x0c\x06\x06\x0c\x0c\x18\x18\x70\x70\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x3c\x66\x66\x6e\x6e\x6e\x6e\x60\x60\x62\x62\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3e\x3e\x00\x00" - "\x1c\x1c\x36\x36\x30\x30\x78\x78\x30\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x7c\x7c" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x3c" - "\x60\x60\x60\x60\x66\x66\x6c\x6c\x78\x78\x7c\x7c\x66\x66\x00\x00" - "\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x10 - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x30\x30\x30\x30\xfc\xfc\x30\x30\x30\x30\x36\x36\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x7f\x36\x36\x22\x22\x00\x00" - "\x00\x00\x00\x00\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x06\x06\x7c\x7c" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\x0c\x0c\x12\x12\x30\x30\x7c\x7c\x30\x30\x62\x62\xfc\xfc\x00\x00" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x10\x10\x30\x30\x7f\x7f\x7f\x7f\x30\x30\x10\x10\x00\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x50 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - "\x33\x33\x99\x99\xcc\xcc\x66\x66\x33\x33\x99\x99\xcc\xcc\x66\x66" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xcc\xcc\x99\x99\x33\x33\x66\x66\xcc\xcc\x99\x99\x33\x33\x66\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x01\x01\x03\x03\x06\x06\x6c\x6c\x78\x78\x70\x70\x60\x60\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x50 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - "\x33\x33\x99\x99\xcc\xcc\x66\x66\x33\x33\x99\x99\xcc\xcc\x66\x66" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xcc\xcc\x99\x99\x33\x33\x66\x66\xcc\xcc\x99\x99\x33\x33\x66\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x01\x01\x03\x03\x06\x06\x6c\x6c\x78\x78\x70\x70\x60\x60\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - , NULL - , - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x00\x00\x18\x00" - "\x66\x66\x66\x00\x00\x00\x00\x00" - "\x66\x66\xff\x66\xff\x66\x66\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x62\x66\x0c\x18\x30\x66\x46\x00" - "\x3c\x66\x3c\x38\x67\x66\x3f\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x03\x06\x0c\x18\x30\x60\x00" - // 0x30 - "\x3c\x66\x6e\x76\x66\x66\x3c\x00" - "\x18\x18\x38\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x0c\x30\x60\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x06\x0e\x1e\x66\x7f\x06\x06\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x3c\x66\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x0c\x18\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x18\x00\x00\x18\x00\x00" - "\x00\x00\x18\x00\x00\x18\x18\x30" - "\x0e\x18\x30\x60\x30\x18\x0e\x00" - "\x00\x00\x7e\x00\x7e\x00\x00\x00" - "\x70\x18\x0c\x06\x0c\x18\x70\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x66\x6e\x6e\x60\x62\x3c\x00" - "\x00\x00\x3c\x06\x3e\x66\x3e\x00" - "\x60\x60\x7c\x66\x66\x66\x7c\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x06\x06\x3e\x66\x66\x66\x3e\x00" - "\x00\x00\x3c\x66\x7e\x60\x3e\x00" - "\x1c\x36\x30\x78\x30\x30\x30\x00" - "\x00\x00\x3e\x66\x66\x3e\x06\x7c" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x18\x00\x18\x18\x18\x18\x18\x00" - "\x06\x00\x06\x06\x06\x06\x66\x3c" - "\x60\x60\x66\x6c\x78\x7c\x66\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\x63\x77\x7f\x6b\x63\x00" - "\x00\x00\x7c\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - // 0x10 - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x3e\x66\x66\x3e\x06\x06" - "\x00\x00\x7c\x66\x60\x60\x60\x00" - "\x00\x00\x3c\x60\x3c\x06\x7c\x00" - "\x30\x30\xfc\x30\x30\x36\x1c\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\x63\x6b\x7f\x36\x22\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x3e\x06\x7c" - "\x00\x00\x7e\x0c\x18\x30\x7e\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\x0c\x12\x30\x7c\x30\x62\xfc\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x18" - "\x00\x10\x30\x7f\x7f\x30\x10\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x50 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - "\x33\x99\xcc\x66\x33\x99\xcc\x66" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xcc\x99\x33\x66\xcc\x99\x33\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x01\x03\x06\x6c\x78\x70\x60\x00" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x50 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - "\x33\x99\xcc\x66\x33\x99\xcc\x66" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xcc\x99\x33\x66\xcc\x99\x33\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x01\x03\x06\x6c\x78\x70\x60\x00" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - , "Commodore 128 (Lower)", CIOLIB_PETSCIIL} - ,{ - // 0x40 - "\x00\x00\x36\x36\x7f\x7f\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x03\x03\x07\x07\x0e\x0e\x1c\x1c\x38\x38\x70\x70\xe0\xe0\xc0\xc0" - "\xc0\xc0\xe0\xe0\x70\x70\x38\x38\x1c\x1c\x0e\x0e\x07\x07\x03\x03" - "\x01\x01\x03\x03\x07\x07\x0f\x0f\x1f\x1f\x3f\x3f\x7f\x7f\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x80\x80\xc0\xc0\xe0\xe0\xf0\xf0\xf8\xf8\xfc\xfc\xfe\xfe\xff\xff" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - // 0x50 - "\x00\x00\x1c\x1c\x1c\x1c\x77\x77\x77\x77\x08\x08\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x3c\x3c\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x78\x78\x60\x60\x78\x78\x60\x60\x7e\x7e\x18\x18\x1e\x1e\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x7e\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x18\x18\x30\x30\x7e\x7e\x30\x30\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x0c\x0c\x7e\x7e\x0c\x0c\x18\x18\x00\x00\x00\x00" - // 0x00 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\xff\xff\x66\x66\x66\x66\xff\xff\x66\x66\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x00\x00\x66\x66\x6c\x6c\x18\x18\x30\x30\x66\x66\x46\x46\x00\x00" - "\x1c\x1c\x36\x36\x1c\x1c\x38\x38\x6f\x6f\x66\x66\x3b\x3b\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0e\x0e\x1c\x1c\x18\x18\x18\x18\x1c\x1c\x0e\x0e\x00\x00" - "\x00\x00\x70\x70\x38\x38\x18\x18\x18\x18\x38\x38\x70\x70\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x40\x40\x00\x00" - // 0x10 - "\x00\x00\x3c\x3c\x66\x66\x6e\x6e\x76\x76\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x0c\x0c\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x0c\x0c\x1c\x1c\x3c\x3c\x6c\x6c\x7e\x7e\x0c\x0c\x00\x00" - "\x00\x00\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x3c\x3c\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x3e\x3e\x06\x06\x0c\x0c\x38\x38\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x30\x30" - "\x06\x06\x0c\x0c\x18\x18\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\x60\x60\x30\x30\x18\x18\x0c\x0c\x18\x18\x30\x30\x60\x60\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - // 0x20 - "\x00\x00\x3c\x3c\x66\x66\x6e\x6e\x6e\x6e\x60\x60\x3e\x3e\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x66\x66\x66\x66\x7e\x7e\x66\x66\x00\x00" - "\x00\x00\x7c\x7c\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x78\x78\x6c\x6c\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x00\x00\x7e\x7e\x60\x60\x7c\x7c\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x60\x60\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x3e\x3e\x60\x60\x60\x60\x6e\x6e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x00\x00\x06\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x66\x66\x6c\x6c\x78\x78\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x00\x00\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x00\x00\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x00\x00" - "\x00\x00\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x30 - "\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x6c\x6c\x36\x36\x00\x00" - "\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x6c\x6c\x66\x66\x00\x00" - "\x00\x00\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x06\x06\x3c\x3c\x00\x00" - "\x00\x00\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x3c\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x00\x00\x1e\x1e\x18\x18\x18\x18\x18\x18\x18\x18\x1e\x1e\x00\x00" - "\x00\x00\x40\x40\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00" - "\x00\x00\x78\x78\x18\x18\x18\x18\x18\x18\x18\x18\x78\x78\x00\x00" - "\x00\x00\x08\x08\x1c\x1c\x36\x36\x63\x63\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00" - // 0x60 - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x7e\x7e\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x00\x00" - "\x00\x00\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x00\x00\x0e\x0e\x18\x18\x3e\x3e\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x7c\x7c" - "\x00\x00\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x18\x18\x00\x00\x38\x38\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x00\x00\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\x06\x3c\x3c" - "\x00\x00\x60\x60\x60\x60\x6c\x6c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x7f\x7f\x7f\x7f\x6b\x6b\x63\x63\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x70 - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x7e\x7e\x18\x18\x18\x18\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x7f\x3e\x3e\x36\x36\x00\x00" - "\x00\x00\x00\x00\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x0c\x0c\x78\x78" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x7e\x7e\x18\x18\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x7e\x7e\x78\x78\x7c\x7c\x6e\x6e\x66\x66\x06\x06\x00\x00" - "\x08\x08\x18\x18\x38\x38\x78\x78\x38\x38\x18\x18\x08\x08\x00\x00" - "\x10\x10\x18\x18\x1c\x1c\x1e\x1e\x1c\x1c\x18\x18\x10\x10\x00\x00" - /* Inverted */ - // 0xC0 - "\xff\xff\xc9\xc9\x80\x80\x80\x80\xc1\xc1\xe3\xe3\xf7\xf7\xff\xff" - "\xe7\xe7\xe7\xe7\xe7\xe7\xe0\xe0\xe0\xe0\xe7\xe7\xe7\xe7\xe7\xe7" - "\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc" - "\xe7\xe7\xe7\xe7\xe7\xe7\x07\x07\x07\x07\xff\xff\xff\xff\xff\xff" - "\xe7\xe7\xe7\xe7\xe7\xe7\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xe7" - "\xff\xff\xff\xff\xff\xff\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xe7" - "\xfc\xfc\xf8\xf8\xf1\xf1\xe3\xe3\xc7\xc7\x8f\x8f\x1f\x1f\x3f\x3f" - "\x3f\x3f\x1f\x1f\x8f\x8f\xc7\xc7\xe3\xe3\xf1\xf1\xf8\xf8\xfc\xfc" - "\xfe\xfe\xfc\xfc\xf8\xf8\xf0\xf0\xe0\xe0\xc0\xc0\x80\x80\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x7f\x7f\x3f\x3f\x1f\x1f\x0f\x0f\x07\x07\x03\x03\x01\x01\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\xff\xff\xff\xff" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - // 0xD0 - "\xff\xff\xe3\xe3\xe3\xe3\x88\x88\x88\x88\xf7\xf7\xe3\xe3\xff\xff" - "\xff\xff\xff\xff\xff\xff\xe0\xe0\xe0\xe0\xe7\xe7\xe7\xe7\xe7\xe7" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\xe7\xe7\xe7\xe7\xe7\xe7\x00\x00\x00\x00\xe7\xe7\xe7\xe7\xe7\xe7" - "\xff\xff\xff\xff\xc3\xc3\x81\x81\x81\x81\x81\x81\xc3\xc3\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xe7\xe7\xe7\xe7\xe7\xe7" - "\xe7\xe7\xe7\xe7\xe7\xe7\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xe7\xe7\xe7\xe7\xe7\xe7\xe0\xe0\xe0\xe0\xff\xff\xff\xff\xff\xff" - "\x87\x87\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xe7\xe7\xe1\xe1\xff\xff" - "\xff\xff\xe7\xe7\xc3\xc3\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xc3\xc3\xe7\xe7\xff\xff" - "\xff\xff\xe7\xe7\xcf\xcf\x81\x81\xcf\xcf\xe7\xe7\xff\xff\xff\xff" - "\xff\xff\xe7\xe7\xf3\xf3\x81\x81\xf3\xf3\xe7\xe7\xff\xff\xff\xff" - // 0x80 - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff\xe7\xe7\xff\xff" - "\xff\xff\x99\x99\x99\x99\x99\x99\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x99\x99\x00\x00\x99\x99\x99\x99\x00\x00\x99\x99\xff\xff" - "\xe7\xe7\xc1\xc1\x9f\x9f\xc3\xc3\xf9\xf9\x83\x83\xe7\xe7\xff\xff" - "\xff\xff\x99\x99\x93\x93\xe7\xe7\xcf\xcf\x99\x99\xb9\xb9\xff\xff" - "\xe3\xe3\xc9\xc9\xe3\xe3\xc7\xc7\x90\x90\x99\x99\xc4\xc4\xff\xff" - "\xff\xff\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xf1\xf1\xe3\xe3\xe7\xe7\xe7\xe7\xe3\xe3\xf1\xf1\xff\xff" - "\xff\xff\x8f\x8f\xc7\xc7\xe7\xe7\xe7\xe7\xc7\xc7\x8f\x8f\xff\xff" - "\xff\xff\x99\x99\xc3\xc3\x00\x00\xc3\xc3\x99\x99\xff\xff\xff\xff" - "\xff\xff\xe7\xe7\xe7\xe7\x81\x81\xe7\xe7\xe7\xe7\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe7\xe7\xe7\xe7\xcf\xcf" - "\xff\xff\xff\xff\xff\xff\x81\x81\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\xf9\xf9\xf3\xf3\xe7\xe7\xcf\xcf\x9f\x9f\xbf\xbf\xff\xff" - // 0x90 - "\xff\xff\xc3\xc3\x99\x99\x91\x91\x89\x89\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\xe7\xe7\xc7\xc7\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\xf3\xf3\xe7\xe7\xcf\xcf\x81\x81\xff\xff" - "\xff\xff\x81\x81\xf3\xf3\xe7\xe7\xf3\xf3\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\xf3\xf3\xe3\xe3\xc3\xc3\x93\x93\x81\x81\xf3\xf3\xff\xff" - "\xff\xff\x81\x81\x9f\x9f\x83\x83\xf9\xf9\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\xc3\xc3\x9f\x9f\x83\x83\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\x81\x81\xf9\xf9\xf3\xf3\xe7\xe7\xcf\xcf\xcf\xcf\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\xc3\xc3\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\xc1\xc1\xf9\xf9\xf3\xf3\xc7\xc7\xff\xff" - "\xff\xff\xff\xff\xe7\xe7\xe7\xe7\xff\xff\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\xff\xff\xe7\xe7\xe7\xe7\xff\xff\xe7\xe7\xe7\xe7\xcf\xcf" - "\xf9\xf9\xf3\xf3\xe7\xe7\xcf\xcf\xe7\xe7\xf3\xf3\xf9\xf9\xff\xff" - "\xff\xff\xff\xff\x81\x81\xff\xff\xff\xff\x81\x81\xff\xff\xff\xff" - "\x9f\x9f\xcf\xcf\xe7\xe7\xf3\xf3\xe7\xe7\xcf\xcf\x9f\x9f\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\xf3\xf3\xe7\xe7\xff\xff\xe7\xe7\xff\xff" - // 0xA0 - "\xff\xff\xc3\xc3\x99\x99\x91\x91\x91\x91\x9f\x9f\xc1\xc1\xff\xff" - "\xff\xff\xe7\xe7\xc3\xc3\x99\x99\x99\x99\x81\x81\x99\x99\xff\xff" - "\xff\xff\x83\x83\x99\x99\x83\x83\x99\x99\x99\x99\x83\x83\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\x9f\x9f\x9f\x9f\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\x87\x87\x93\x93\x99\x99\x99\x99\x93\x93\x87\x87\xff\xff" - "\xff\xff\x81\x81\x9f\x9f\x83\x83\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\xff\xff\x81\x81\x9f\x9f\x83\x83\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xff\xff\xc1\xc1\x9f\x9f\x9f\x9f\x91\x91\x99\x99\xc1\xc1\xff\xff" - "\xff\xff\x99\x99\x99\x99\x81\x81\x99\x99\x99\x99\x99\x99\xff\xff" - "\xff\xff\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xff\xff\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\x99\x99\x93\x93\x87\x87\x87\x87\x93\x93\x99\x99\xff\xff" - "\xff\xff\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\xff\xff\x9c\x9c\x88\x88\x80\x80\x94\x94\x9c\x9c\x9c\x9c\xff\xff" - "\xff\xff\x99\x99\x89\x89\x81\x81\x81\x81\x91\x91\x99\x99\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - // 0xB0 - "\xff\xff\x83\x83\x99\x99\x99\x99\x83\x83\x9f\x9f\x9f\x9f\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\x99\x99\x99\x99\x93\x93\xc9\xc9\xff\xff" - "\xff\xff\x83\x83\x99\x99\x99\x99\x83\x83\x93\x93\x99\x99\xff\xff" - "\xff\xff\xc3\xc3\x9f\x9f\xc3\xc3\xf9\xf9\xf9\xf9\xc3\xc3\xff\xff" - "\xff\xff\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x81\x81\xff\xff" - "\xff\xff\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xe7\xe7\xff\xff" - "\xff\xff\x9c\x9c\x9c\x9c\x94\x94\x80\x80\x88\x88\x9c\x9c\xff\xff" - "\xff\xff\x99\x99\x99\x99\xc3\xc3\xc3\xc3\x99\x99\x99\x99\xff\xff" - "\xff\xff\x99\x99\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\x81\x81\xf3\xf3\xe7\xe7\xcf\xcf\x9f\x9f\x81\x81\xff\xff" - "\xff\xff\xe1\xe1\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe1\xe1\xff\xff" - "\xff\xff\xbf\xbf\x9f\x9f\xcf\xcf\xe7\xe7\xf3\xf3\xf9\xf9\xff\xff" - "\xff\xff\x87\x87\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x87\x87\xff\xff" - "\xff\xff\xf7\xf7\xe3\xe3\xc9\xc9\x9c\x9c\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff" - // 0xE0 - "\xff\xff\xe7\xe7\xc3\xc3\x81\x81\x81\x81\xc3\xc3\xe7\xe7\xff\xff" - "\xff\xff\xff\xff\xc3\xc3\xf9\xf9\xc1\xc1\x99\x99\xc1\xc1\xff\xff" - "\xff\xff\x9f\x9f\x9f\x9f\x83\x83\x99\x99\x99\x99\x83\x83\xff\xff" - "\xff\xff\xff\xff\xc3\xc3\x9f\x9f\x9f\x9f\x9f\x9f\xc3\xc3\xff\xff" - "\xff\xff\xf9\xf9\xf9\xf9\xc1\xc1\x99\x99\x99\x99\xc1\xc1\xff\xff" - "\xff\xff\xff\xff\xc3\xc3\x99\x99\x81\x81\x9f\x9f\xc3\xc3\xff\xff" - "\xff\xff\xf1\xf1\xe7\xe7\xc1\xc1\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\xff\xff\xc1\xc1\x99\x99\x99\x99\xc1\xc1\xf9\xf9\x83\x83" - "\xff\xff\x9f\x9f\x9f\x9f\x83\x83\x99\x99\x99\x99\x99\x99\xff\xff" - "\xff\xff\xe7\xe7\xff\xff\xc7\xc7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xff\xff\xf9\xf9\xff\xff\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xc3\xc3" - "\xff\xff\x9f\x9f\x9f\x9f\x93\x93\x87\x87\x93\x93\x99\x99\xff\xff" - "\xff\xff\xc7\xc7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xff\xff\xff\xff\x99\x99\x80\x80\x80\x80\x94\x94\x9c\x9c\xff\xff" - "\xff\xff\xff\xff\x83\x83\x99\x99\x99\x99\x99\x99\x99\x99\xff\xff" - "\xff\xff\xff\xff\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - // 0xF0 - "\xff\xff\xff\xff\x83\x83\x99\x99\x99\x99\x83\x83\x9f\x9f\x9f\x9f" - "\xff\xff\xff\xff\xc1\xc1\x99\x99\x99\x99\xc1\xc1\xf9\xf9\xf9\xf9" - "\xff\xff\xff\xff\x83\x83\x99\x99\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xff\xff\xff\xff\xc1\xc1\x9f\x9f\xc3\xc3\xf9\xf9\x83\x83\xff\xff" - "\xff\xff\xe7\xe7\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xf1\xf1\xff\xff" - "\xff\xff\xff\xff\x99\x99\x99\x99\x99\x99\x99\x99\xc1\xc1\xff\xff" - "\xff\xff\xff\xff\x99\x99\x99\x99\x99\x99\xc3\xc3\xe7\xe7\xff\xff" - "\xff\xff\xff\xff\x9c\x9c\x94\x94\x80\x80\xc1\xc1\xc9\xc9\xff\xff" - "\xff\xff\xff\xff\x99\x99\xc3\xc3\xe7\xe7\xc3\xc3\x99\x99\xff\xff" - "\xff\xff\xff\xff\x99\x99\x99\x99\x99\x99\xc1\xc1\xf3\xf3\x87\x87" - "\xff\xff\xff\xff\x81\x81\xf3\xf3\xe7\xe7\xcf\xcf\x81\x81\xff\xff" - "\xff\xff\xe7\xe7\xc3\xc3\x81\x81\x81\x81\xe7\xe7\xc3\xc3\xff\xff" - "\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7" - "\xff\xff\x81\x81\x87\x87\x83\x83\x91\x91\x99\x99\xf9\xf9\xff\xff" - "\xf7\xf7\xe7\xe7\xc7\xc7\x87\x87\xc7\xc7\xe7\xe7\xf7\xf7\xff\xff" - "\xef\xef\xe7\xe7\xe3\xe3\xe1\xe1\xe3\xe3\xe7\xe7\xef\xef\xff\xff" - , NULL - , - // 0x40 - "\x00\x36\x7f\x7f\x3e\x1c\x08\x00" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x03\x07\x0e\x1c\x38\x70\xe0\xc0" - "\xc0\xe0\x70\x38\x1c\x0e\x07\x03" - "\x01\x03\x07\x0f\x1f\x3f\x7f\xff" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x80\xc0\xe0\xf0\xf8\xfc\xfe\xff" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - // 0x50 - "\x00\x1c\x1c\x77\x77\x08\x1c\x00" - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\x00\x00\x3c\x7e\x7e\x7e\x3c\x00" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x78\x60\x78\x60\x7e\x18\x1e\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x00" - "\x00\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x30\x7e\x30\x18\x00\x00" - "\x00\x18\x0c\x7e\x0c\x18\x00\x00" - // 0x00 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x18\x18\x18\x00\x18\x00" - "\x00\x66\x66\x66\x00\x00\x00\x00" - "\x00\x66\xff\x66\x66\xff\x66\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\x66\x6c\x18\x30\x66\x46\x00" - "\x1c\x36\x1c\x38\x6f\x66\x3b\x00" - "\x00\x18\x18\x18\x00\x00\x00\x00" - "\x00\x0e\x1c\x18\x18\x1c\x0e\x00" - "\x00\x70\x38\x18\x18\x38\x70\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x06\x0c\x18\x30\x60\x40\x00" - // 0x10 - "\x00\x3c\x66\x6e\x76\x66\x3c\x00" - "\x00\x18\x38\x18\x18\x18\x7e\x00" - "\x00\x3c\x66\x0c\x18\x30\x7e\x00" - "\x00\x7e\x0c\x18\x0c\x66\x3c\x00" - "\x00\x0c\x1c\x3c\x6c\x7e\x0c\x00" - "\x00\x7e\x60\x7c\x06\x66\x3c\x00" - "\x00\x3c\x60\x7c\x66\x66\x3c\x00" - "\x00\x7e\x06\x0c\x18\x30\x30\x00" - "\x00\x3c\x66\x3c\x66\x66\x3c\x00" - "\x00\x3c\x66\x3e\x06\x0c\x38\x00" - "\x00\x00\x18\x18\x00\x18\x18\x00" - "\x00\x00\x18\x18\x00\x18\x18\x30" - "\x06\x0c\x18\x30\x18\x0c\x06\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x00\x3c\x66\x0c\x18\x00\x18\x00" - // 0x20 - "\x00\x3c\x66\x6e\x6e\x60\x3e\x00" - "\x00\x18\x3c\x66\x66\x7e\x66\x00" - "\x00\x7c\x66\x7c\x66\x66\x7c\x00" - "\x00\x3c\x66\x60\x60\x66\x3c\x00" - "\x00\x78\x6c\x66\x66\x6c\x78\x00" - "\x00\x7e\x60\x7c\x60\x60\x7e\x00" - "\x00\x7e\x60\x7c\x60\x60\x60\x00" - "\x00\x3e\x60\x60\x6e\x66\x3e\x00" - "\x00\x66\x66\x7e\x66\x66\x66\x00" - "\x00\x7e\x18\x18\x18\x18\x7e\x00" - "\x00\x06\x06\x06\x06\x66\x3c\x00" - "\x00\x66\x6c\x78\x78\x6c\x66\x00" - "\x00\x60\x60\x60\x60\x60\x7e\x00" - "\x00\x63\x77\x7f\x6b\x63\x63\x00" - "\x00\x66\x76\x7e\x7e\x6e\x66\x00" - "\x00\x3c\x66\x66\x66\x66\x3c\x00" - // 0x30 - "\x00\x7c\x66\x66\x7c\x60\x60\x00" - "\x00\x3c\x66\x66\x66\x6c\x36\x00" - "\x00\x7c\x66\x66\x7c\x6c\x66\x00" - "\x00\x3c\x60\x3c\x06\x06\x3c\x00" - "\x00\x7e\x18\x18\x18\x18\x18\x00" - "\x00\x66\x66\x66\x66\x66\x7e\x00" - "\x00\x66\x66\x66\x66\x3c\x18\x00" - "\x00\x63\x63\x6b\x7f\x77\x63\x00" - "\x00\x66\x66\x3c\x3c\x66\x66\x00" - "\x00\x66\x66\x3c\x18\x18\x18\x00" - "\x00\x7e\x0c\x18\x30\x60\x7e\x00" - "\x00\x1e\x18\x18\x18\x18\x1e\x00" - "\x00\x40\x60\x30\x18\x0c\x06\x00" - "\x00\x78\x18\x18\x18\x18\x78\x00" - "\x00\x08\x1c\x36\x63\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00" - // 0x60 - "\x00\x18\x3c\x7e\x7e\x3c\x18\x00" - "\x00\x00\x3c\x06\x3e\x66\x3e\x00" - "\x00\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x3c\x60\x60\x60\x3c\x00" - "\x00\x06\x06\x3e\x66\x66\x3e\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x0e\x18\x3e\x18\x18\x18\x00" - "\x00\x00\x3e\x66\x66\x3e\x06\x7c" - "\x00\x60\x60\x7c\x66\x66\x66\x00" - "\x00\x18\x00\x38\x18\x18\x3c\x00" - "\x00\x06\x00\x06\x06\x06\x06\x3c" - "\x00\x60\x60\x6c\x78\x6c\x66\x00" - "\x00\x38\x18\x18\x18\x18\x3c\x00" - "\x00\x00\x66\x7f\x7f\x6b\x63\x00" - "\x00\x00\x7c\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - // 0x70 - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x3e\x66\x66\x3e\x06\x06" - "\x00\x00\x7c\x66\x60\x60\x60\x00" - "\x00\x00\x3e\x60\x3c\x06\x7c\x00" - "\x00\x18\x7e\x18\x18\x18\x0e\x00" - "\x00\x00\x66\x66\x66\x66\x3e\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\x63\x6b\x7f\x3e\x36\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x3e\x0c\x78" - "\x00\x00\x7e\x0c\x18\x30\x7e\x00" - "\x00\x18\x3c\x7e\x7e\x18\x3c\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x7e\x78\x7c\x6e\x66\x06\x00" - "\x08\x18\x38\x78\x38\x18\x08\x00" - "\x10\x18\x1c\x1e\x1c\x18\x10\x00" - /* Inverted */ - // 0xC0 - "\xff\xc9\x80\x80\xc1\xe3\xf7\xff" - "\xe7\xe7\xe7\xe0\xe0\xe7\xe7\xe7" - "\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc" - "\xe7\xe7\xe7\x07\x07\xff\xff\xff" - "\xe7\xe7\xe7\x07\x07\xe7\xe7\xe7" - "\xff\xff\xff\x07\x07\xe7\xe7\xe7" - "\xfc\xf8\xf1\xe3\xc7\x8f\x1f\x3f" - "\x3f\x1f\x8f\xc7\xe3\xf1\xf8\xfc" - "\xfe\xfc\xf8\xf0\xe0\xc0\x80\x00" - "\xff\xff\xff\xff\xf0\xf0\xf0\xf0" - "\x7f\x3f\x1f\x0f\x07\x03\x01\x00" - "\xf0\xf0\xf0\xf0\xff\xff\xff\xff" - "\x0f\x0f\x0f\x0f\xff\xff\xff\xff" - "\x00\x00\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\x00\x00" - "\xff\xff\xff\xff\x0f\x0f\x0f\x0f" - // 0xD0 - "\xff\xe3\xe3\x88\x88\xf7\xe3\xff" - "\xff\xff\xff\xe0\xe0\xe7\xe7\xe7" - "\xff\xff\xff\x00\x00\xff\xff\xff" - "\xe7\xe7\xe7\x00\x00\xe7\xe7\xe7" - "\xff\xff\xc3\x81\x81\x81\xc3\xff" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f" - "\xff\xff\xff\x00\x00\xe7\xe7\xe7" - "\xe7\xe7\xe7\x00\x00\xff\xff\xff" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xe7\xe7\xe7\xe0\xe0\xff\xff\xff" - "\x87\x9f\x87\x9f\x81\xe7\xe1\xff" - "\xff\xe7\xc3\x81\xe7\xe7\xe7\xff" - "\xff\xe7\xe7\xe7\x81\xc3\xe7\xff" - "\xff\xe7\xcf\x81\xcf\xe7\xff\xff" - "\xff\xe7\xf3\x81\xf3\xe7\xff\xff" - // 0x80 - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xe7\xe7\xe7\xe7\xff\xe7\xff" - "\xff\x99\x99\x99\xff\xff\xff\xff" - "\xff\x99\x00\x99\x99\x00\x99\xff" - "\xe7\xc1\x9f\xc3\xf9\x83\xe7\xff" - "\xff\x99\x93\xe7\xcf\x99\xb9\xff" - "\xe3\xc9\xe3\xc7\x90\x99\xc4\xff" - "\xff\xe7\xe7\xe7\xff\xff\xff\xff" - "\xff\xf1\xe3\xe7\xe7\xe3\xf1\xff" - "\xff\x8f\xc7\xe7\xe7\xc7\x8f\xff" - "\xff\x99\xc3\x00\xc3\x99\xff\xff" - "\xff\xe7\xe7\x81\xe7\xe7\xff\xff" - "\xff\xff\xff\xff\xff\xe7\xe7\xcf" - "\xff\xff\xff\x81\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xe7\xe7\xff" - "\xff\xf9\xf3\xe7\xcf\x9f\xbf\xff" - // 0x90 - "\xff\xc3\x99\x91\x89\x99\xc3\xff" - "\xff\xe7\xc7\xe7\xe7\xe7\x81\xff" - "\xff\xc3\x99\xf3\xe7\xcf\x81\xff" - "\xff\x81\xf3\xe7\xf3\x99\xc3\xff" - "\xff\xf3\xe3\xc3\x93\x81\xf3\xff" - "\xff\x81\x9f\x83\xf9\x99\xc3\xff" - "\xff\xc3\x9f\x83\x99\x99\xc3\xff" - "\xff\x81\xf9\xf3\xe7\xcf\xcf\xff" - "\xff\xc3\x99\xc3\x99\x99\xc3\xff" - "\xff\xc3\x99\xc1\xf9\xf3\xc7\xff" - "\xff\xff\xe7\xe7\xff\xe7\xe7\xff" - "\xff\xff\xe7\xe7\xff\xe7\xe7\xcf" - "\xf9\xf3\xe7\xcf\xe7\xf3\xf9\xff" - "\xff\xff\x81\xff\xff\x81\xff\xff" - "\x9f\xcf\xe7\xf3\xe7\xcf\x9f\xff" - "\xff\xc3\x99\xf3\xe7\xff\xe7\xff" - // 0xA0 - "\xff\xc3\x99\x91\x91\x9f\xc1\xff" - "\xff\xe7\xc3\x99\x99\x81\x99\xff" - "\xff\x83\x99\x83\x99\x99\x83\xff" - "\xff\xc3\x99\x9f\x9f\x99\xc3\xff" - "\xff\x87\x93\x99\x99\x93\x87\xff" - "\xff\x81\x9f\x83\x9f\x9f\x81\xff" - "\xff\x81\x9f\x83\x9f\x9f\x9f\xff" - "\xff\xc1\x9f\x9f\x91\x99\xc1\xff" - "\xff\x99\x99\x81\x99\x99\x99\xff" - "\xff\x81\xe7\xe7\xe7\xe7\x81\xff" - "\xff\xf9\xf9\xf9\xf9\x99\xc3\xff" - "\xff\x99\x93\x87\x87\x93\x99\xff" - "\xff\x9f\x9f\x9f\x9f\x9f\x81\xff" - "\xff\x9c\x88\x80\x94\x9c\x9c\xff" - "\xff\x99\x89\x81\x81\x91\x99\xff" - "\xff\xc3\x99\x99\x99\x99\xc3\xff" - // 0xB0 - "\xff\x83\x99\x99\x83\x9f\x9f\xff" - "\xff\xc3\x99\x99\x99\x93\xc9\xff" - "\xff\x83\x99\x99\x83\x93\x99\xff" - "\xff\xc3\x9f\xc3\xf9\xf9\xc3\xff" - "\xff\x81\xe7\xe7\xe7\xe7\xe7\xff" - "\xff\x99\x99\x99\x99\x99\x81\xff" - "\xff\x99\x99\x99\x99\xc3\xe7\xff" - "\xff\x9c\x9c\x94\x80\x88\x9c\xff" - "\xff\x99\x99\xc3\xc3\x99\x99\xff" - "\xff\x99\x99\xc3\xe7\xe7\xe7\xff" - "\xff\x81\xf3\xe7\xcf\x9f\x81\xff" - "\xff\xe1\xe7\xe7\xe7\xe7\xe1\xff" - "\xff\xbf\x9f\xcf\xe7\xf3\xf9\xff" - "\xff\x87\xe7\xe7\xe7\xe7\x87\xff" - "\xff\xf7\xe3\xc9\x9c\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\x00\xff" - // 0xE0 - "\xff\xe7\xc3\x81\x81\xc3\xe7\xff" - "\xff\xff\xc3\xf9\xc1\x99\xc1\xff" - "\xff\x9f\x9f\x83\x99\x99\x83\xff" - "\xff\xff\xc3\x9f\x9f\x9f\xc3\xff" - "\xff\xf9\xf9\xc1\x99\x99\xc1\xff" - "\xff\xff\xc3\x99\x81\x9f\xc3\xff" - "\xff\xf1\xe7\xc1\xe7\xe7\xe7\xff" - "\xff\xff\xc1\x99\x99\xc1\xf9\x83" - "\xff\x9f\x9f\x83\x99\x99\x99\xff" - "\xff\xe7\xff\xc7\xe7\xe7\xc3\xff" - "\xff\xf9\xff\xf9\xf9\xf9\xf9\xc3" - "\xff\x9f\x9f\x93\x87\x93\x99\xff" - "\xff\xc7\xe7\xe7\xe7\xe7\xc3\xff" - "\xff\xff\x99\x80\x80\x94\x9c\xff" - "\xff\xff\x83\x99\x99\x99\x99\xff" - "\xff\xff\xc3\x99\x99\x99\xc3\xff" - // 0xF0 - "\xff\xff\x83\x99\x99\x83\x9f\x9f" - "\xff\xff\xc1\x99\x99\xc1\xf9\xf9" - "\xff\xff\x83\x99\x9f\x9f\x9f\xff" - "\xff\xff\xc1\x9f\xc3\xf9\x83\xff" - "\xff\xe7\x81\xe7\xe7\xe7\xf1\xff" - "\xff\xff\x99\x99\x99\x99\xc1\xff" - "\xff\xff\x99\x99\x99\xc3\xe7\xff" - "\xff\xff\x9c\x94\x80\xc1\xc9\xff" - "\xff\xff\x99\xc3\xe7\xc3\x99\xff" - "\xff\xff\x99\x99\x99\xc1\xf3\x87" - "\xff\xff\x81\xf3\xe7\xcf\x81\xff" - "\xff\xe7\xc3\x81\x81\xe7\xc3\xff" - "\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7" - "\xff\x81\x87\x83\x91\x99\xf9\xff" - "\xf7\xe7\xc7\x87\xc7\xe7\xf7\xff" - "\xef\xe7\xe3\xe1\xe3\xe7\xef\xff" - , "Atari", CIOLIB_ATASCII} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\x83\x83\x39\x39\x29\x29\x23\x23\x3f\x3f\x81\x81\xff\xff" - "\xff\xff\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x39\x39\x7f\x7f" - "\xff\xff\x03\x03\x99\x99\x93\x93\x99\x99\x99\x99\x03\x03\xff\xff" - "\xff\xff\x83\x83\x39\x39\x3f\x3f\x3f\x3f\x39\x39\x83\x83\xf7\xf7" - "\xff\xff\x0f\x0f\x87\x87\x93\x93\x99\x99\x99\x99\x03\x03\xff\xff" - "\xff\xff\x01\x01\x9f\x9f\x83\x83\x9f\x9f\x99\x99\x03\x03\xf7\xf7" - "\xfb\xfb\x01\x01\x9c\x9c\x87\x87\x9f\x9f\x9f\x9f\x1f\x1f\xff\xff" - "\xf7\xf7\x83\x83\x39\x39\x3f\x3f\x31\x31\x39\x39\x81\x81\xfd\xfd" - "\xff\xff\x39\x39\x39\x39\x21\x21\x39\x39\x39\x39\x39\x39\x7f\x7f" - "\xff\xff\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xfd\xfd\xf9\xf9\xf9\xf9\xf9\xf9\x19\x19\x39\x39\x03\x03\x7f\x7f" - "\xff\xff\x39\x39\x33\x33\x27\x27\x33\x33\x39\x39\x39\x39\x7f\x7f" - "\xff\xff\x1f\x1f\x9f\x9f\x9f\x9f\x9f\x9f\x99\x99\x03\x03\xf7\xf7" - "\xff\xff\x39\x39\x11\x11\x01\x01\x29\x29\x39\x39\x39\x39\x7f\x7f" - "\xff\xff\x39\x39\x29\x29\x21\x21\x31\x31\x39\x39\x39\x39\xff\xff" - "\xff\xff\x83\x83\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xff\xff\x03\x03\x99\x99\x99\x99\x93\x93\x9f\x9f\x1f\x1f\xff\xff" - "\xff\xff\x83\x83\x39\x39\x39\x39\x29\x29\x35\x35\x8b\x8b\xfd\xfd" - "\xff\xff\x03\x03\x99\x99\x93\x93\x99\x99\x99\x99\x19\x19\xfb\xfb" - "\xff\xff\x83\x83\x3f\x3f\x83\x83\xf9\xf9\x39\x39\x03\x03\x7f\x7f" - "\xf7\xf7\x03\x03\xc9\xc9\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xdf\xdf" - "\x7f\x7f\x31\x31\x33\x33\x33\x33\x33\x33\x33\x33\x81\x81\xff\xff" - "\x7f\x7f\x39\x39\x39\x39\x93\x93\x93\x93\xc7\xc7\xef\xef\xff\xff" - "\x7f\x7f\x39\x39\x39\x39\x29\x29\x01\x01\x11\x11\x39\x39\xff\xff" - "\x3f\x3f\x39\x39\x39\x39\xa3\xa3\x39\x39\x39\x39\x39\x39\xfd\xfd" - "\xfd\xfd\x39\x39\x39\x39\xa3\xa3\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\x01\x01\xf3\xf3\xe7\xe7\xcd\xcd\x99\x99\x81\x81\xfd\xfd" - "\xff\xff\x81\x81\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x81\x81\xff\xff" - "\x3f\x3f\x9f\x9f\xcf\xcf\xe7\xe7\xf3\xf3\xf9\xf9\xfc\xfc\xfe\xfe" - "\xff\xff\x81\x81\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\x81\x81\xff\xff" - "\xe7\xe7\xc3\xc3\x99\x99\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x1c\x1c\x1c\x1c\x18\x18\x18\x18\x00\x00\x18\x18\x10\x10" - "\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x18\x18\x7e\x7e\xc0\xc0\x7c\x7c\x06\x06\xfc\xfc\x30\x30\x00\x00" - "\x63\x63\xa6\xa6\xcc\xcc\x18\x18\x33\x33\x65\x65\xc6\xc6\x80\x80" - "\x3c\x3c\x66\x66\x64\x64\x7b\x7b\xce\xce\xc6\xc6\x7b\x7b\x00\x00" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x80\x80" - "\x00\x00\x7c\x7c\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\x8c\x8c\x38\x38\x66\x66\xfe\xfe\x00\x00" - "\x20\x20\x7c\x7c\xc6\xc6\x1e\x1e\x06\x06\xc6\xc6\x7c\x7c\x00\x00" - "\x80\x80\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x06\x06\x06\x06\x02\x02" - "\x00\x00\xfe\xfe\xc0\xc0\xfc\xfc\x06\x06\xc6\xc6\xfc\xfc\x00\x00" - "\x00\x00\x7c\x7c\xc0\xc0\xfc\xfc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x80\x80\xfe\xfe\xcc\xcc\x98\x98\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x18\x18\x30\x30\x60\x60\xc0\xc0\x60\x60\x30\x30\x18\x18\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x06\x06\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x0c\x0c\x18\x18\x00\x00\x18\x18\x10\x10" - "\x00\x00\x7c\x7c\xc6\xc6\xd6\xd6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\xc6\xc6\x80\x80" - "\x00\x00\xfc\xfc\x66\x66\x6c\x6c\x66\x66\x66\x66\xfc\xfc\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x08\x08" - "\x00\x00\xf0\xf0\x78\x78\x6c\x6c\x66\x66\x66\x66\xfc\xfc\x00\x00" - "\x00\x00\xfe\xfe\x60\x60\x7c\x7c\x60\x60\x66\x66\xfc\xfc\x08\x08" - "\x04\x04\xfe\xfe\x63\x63\x78\x78\x60\x60\x60\x60\xe0\xe0\x00\x00" - "\x08\x08\x7c\x7c\xc6\xc6\xc0\xc0\xce\xce\xc6\xc6\x7e\x7f\x02\x02" - "\x00\x00\xc6\xc6\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\xc6\xc6\x80\x80" - "\x00\x00\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x02\x02\x06\x06\x06\x06\x06\x06\xe6\xe6\xc6\xc6\xfc\xfc\x80\x80" - "\x00\x00\xc6\xc6\xcc\xcc\xd8\xd8\xcc\xcc\xc6\xc6\xc6\xc6\x80\x80" - "\x00\x00\xe0\xe0\x60\x60\x60\x60\x60\x60\x66\x66\xfc\xfc\x08\x08" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x80\x80" - "\x00\x00\xc6\xc6\xd6\xd6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\xfc\xfc\x66\x66\x66\x66\x6c\x6c\x60\x60\xe0\xe0\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\xd6\xd6\xca\xca\x74\x74\x02\x02" - "\x00\x00\xfc\xfc\x66\x66\x6c\x6c\x66\x66\x66\x66\xe6\xe6\x04\x04" - "\x00\x00\x7e\x7e\xc0\xc0\x7c\x7c\x06\x06\xc6\xc6\xfc\xfc\x80\x80" - "\x08\x08\xfc\xfc\x36\x36\x30\x30\x30\x30\x30\x30\x30\x30\x20\x20" - "\x80\x80\xce\xce\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x80\x80\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x10\x10\x00\x00" - "\x80\x80\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\x80\x80\xc6\xc6\xc6\xc6\x5c\x5c\xc6\xc6\xc6\xc6\xc6\xc6\x02\x02" - "\x02\x02\xc6\xc6\xc6\xc6\x5c\x5c\x18\x18\x18\x18\x18\x18\x08\x08" - "\x00\x00\xfe\xfe\x0c\x0c\x18\x18\x32\x32\x66\x66\xfe\xfe\x02\x02" - "\x00\x00\x7e\x7e\x30\x30\x30\x30\x30\x30\x30\x30\x7e\x7e\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x01\x01" - "\x00\x00\x7e\x7e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x7e\x7e\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\xe0\xe0\x60\x60\x6c\x6c\x66\x66\x66\x66\x66\x66\xfc\xfc\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\xc2\xc2\xc0\xc0\xc2\xc2\x7e\x7e\x00\x00" - "\x0e\x0e\x0c\x0c\x6c\x6c\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\xc6\xc6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\x1e\x1e\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x30\x30\x20\x20" - "\x00\x00\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x76\x76\x06\x06\xfc\xfc" - "\xe0\xe0\x60\x60\x6c\x6c\x66\x66\x66\x66\x66\x66\xe6\xe6\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x10\x10" - "\x02\x02\x06\x06\x00\x00\x06\x06\x06\x06\xc6\xc6\xc6\xc6\x7c\x7c" - "\xe0\xe0\x60\x60\x66\x66\x6c\x6c\x78\x78\x6c\x6c\xe6\xe6\x02\x02" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x10\x10" - "\x00\x00\x00\x00\xfc\xfc\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\x80\x80" - "\x00\x00\x00\x00\xfc\xfc\x66\x66\x66\x66\x66\x66\xe6\xe6\x04\x04" - "\x00\x00\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\xfc\xfc\x66\x66\x66\x66\x6c\x6c\x60\x60\xe0\xe0" - "\x00\x00\x00\x00\x7e\x7e\xcc\xcc\xcc\xcc\x6c\x6c\x0c\x0c\x0e\x0e" - "\x00\x00\x08\x08\xfc\xfc\x66\x66\x60\x60\x60\x60\x60\x60\x40\x40" - "\x00\x00\x00\x00\x7e\x7e\xc0\xc0\x7c\x7c\x06\x06\xfc\xfc\x00\x00" - "\x30\x30\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x30\x30\x20\x20" - "\x00\x00\x80\x80\xce\xce\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x00\x00\x80\x80\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x00\x00" - "\x00\x00\x02\x02\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x5c\x5c\xc6\xc6\xc6\xc6\x02\x02" - "\x00\x00\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\x5e\x5e\x06\x06\x7c\x7c" - "\x00\x00\x00\x00\xfe\xfe\x8c\x8c\x18\x18\x32\x32\xfe\xfe\x00\x00" - "\x1c\x1c\x30\x30\x30\x30\x60\x60\x30\x30\x30\x30\x1c\x1c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x38\x38\x0c\x0c\x0c\x0c\x06\x06\x0c\x0c\x0c\x0c\x38\x38\x00\x00" - "\x76\x76\xdc\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x9f\x9f\xe7\xe7\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\xf3\xf3\xcf\xcf\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\x83\x83\x39\x39\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\x89\x89\x23\x23\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\x39\x39\xff\xff\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\x83\x83\x39\x39\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\xff\xff\x80\x80\x33\x33\x20\x20\x33\x33\x33\x33\x30\x30\x77\x77" - "\xff\xff\x83\x83\x39\x39\x3f\x3f\x3f\x3f\x39\x39\x83\x83\xcf\xcf" - "\x9f\x9f\xcf\xcf\x03\x03\x9f\x9f\x83\x83\x9f\x9f\x01\x01\xff\xff" - "\xe7\xe7\xcf\xcf\x03\x03\x9f\x9f\x83\x83\x9f\x9f\x01\x01\xff\xff" - "\xcf\xcf\x33\x33\x03\x03\x9f\x9f\x83\x83\x9f\x9f\x01\x01\xff\xff" - "\x33\x33\xff\xff\x03\x03\x9f\x9f\x83\x83\x9f\x9f\x01\x01\xff\xff" - "\x3f\x3f\xcf\xcf\x03\x03\xcf\xcf\xcf\xcf\xcf\xcf\x03\x03\xff\xff" - "\xf3\xf3\xcf\xcf\x03\x03\xcf\xcf\xcf\xcf\xcf\xcf\x03\x03\xff\xff" - "\xcf\xcf\x33\x33\xff\xff\x03\x03\xcf\xcf\xcf\xcf\x03\x03\xff\xff" - "\x33\x33\xff\xff\x03\x03\xcf\xcf\xcf\xcf\xcf\xcf\x03\x03\xff\xff" - "\xff\xff\x1f\x1f\x8f\x8f\x87\x87\x13\x13\x99\x99\x03\x03\xff\xff" - "\x89\x89\x23\x23\x19\x19\x09\x09\x21\x21\x31\x31\x39\x39\xff\xff" - "\xcf\xcf\xe7\xe7\x83\x83\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xcf\xcf\x83\x83\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xcf\xcf\x33\x33\xff\xff\x87\x87\x33\x33\x33\x33\x87\x87\xff\xff" - "\x89\x89\x23\x23\xff\xff\x83\x83\x39\x39\x39\x39\x83\x83\xff\xff" - "\x39\x39\xff\xff\x83\x83\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xff\xff\xff\xff\x3c\x3c\x99\x99\xe7\xe7\x99\x99\x3c\x3c\xff\xff" - "\xfe\xfe\x85\x85\x3b\x3b\x35\x35\x29\x29\x59\x59\xa3\xa3\x7f\x7f" - "\xcf\xcf\xe7\xe7\x7f\x7f\x31\x31\x33\x33\x33\x33\x81\x81\xff\xff" - "\xe7\xe7\xcf\xcf\x7f\x7f\x31\x31\x33\x33\x33\x33\x81\x81\xff\xff" - "\xcf\xcf\x33\x33\x7f\x7f\x31\x31\x33\x33\x33\x33\x81\x81\xff\xff" - "\xff\xff\x33\x33\x7f\x7f\x31\x31\x33\x33\x33\x33\x81\x81\xff\xff" - "\xf3\xf3\xe7\xe7\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xc3\xc3\xff\xff" - "\x0f\x0f\x9f\x9f\x83\x83\x99\x99\x83\x83\x9f\x9f\x9f\x9f\x0f\x0f" - "\x83\x83\x39\x39\x39\x39\x23\x23\x39\x39\x39\x39\x23\x23\x3f\x3f" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00" - "\x10\x10\x18\x18\x00\x00\x18\x18\x18\x18\x1c\x1c\x1c\x1c\x00\x00" - "\x00\x00\x18\x18\x7e\x7e\xc0\xc0\xc0\xc0\xc0\xc0\x7e\x7e\x18\x18" - "\x08\x08\x3c\x3c\x66\x66\xf8\xf8\x60\x60\x66\x66\xfc\xfc\x08\x08" - "\xc6\xc6\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\xc6\xc6\x00\x00\x00\x00" - "\xc6\xc6\xc6\xc6\x6c\x6c\x38\x38\x10\x10\xfe\xfe\x10\x10\x10\x10" - "\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7c\x7c\xc0\xc0\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x03\x03\x3e\x3e" - "\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x7c\x82\x82\x9a\x9a\xa2\xa2\xa2\xa2\x9a\x9a\x82\x82\x7c\x7c" - "\x00\x00\x78\x78\xcc\xcc\xcc\xcc\xf6\xf6\x00\x00\xfe\xfe\x00\x00" - "\x00\x00\x12\x12\x6c\x6c\xd8\xd8\x6c\x6c\x12\x12\x00\x00\x00\x00" - "\xfe\xfe\x06\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x7c\x82\x82\xb2\xb2\xaa\xaa\xb2\xb2\xaa\xaa\x82\x82\x7c\x7c" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x78\x78\xcc\xcc\x78\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x30\x30\x30\xfc\xfc\x30\x30\x30\x30\x00\x00\xfc\xfc\x00\x00" - "\x70\x70\xd8\xd8\x30\x30\x60\x60\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\x18\x18\x70\x70\x18\x18\xf0\xf0\x00\x00\x00\x00\x00\x00" - "\x30\x30\x60\x60\xc0\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\xff\xff\xc0\xc0" - "\x7e\x7e\xec\xec\xec\xec\x6c\x6c\x2c\x2c\x2c\x2c\x2e\x2e\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x60\x60\xe0\xe0\x60\x60\x60\x60\xf0\xf0\x00\x00\x00\x00\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\x78\x78\x00\x00\xfc\xfc\x00\x00\x00\x00" - "\x00\x00\x48\x48\x36\x36\x1b\x1b\x36\x36\x48\x48\x00\x00\x00\x00" - "\x63\x63\xe6\xe6\x6c\x6c\x7b\x7b\x37\x37\x6f\x6f\xc3\xc3\x00\x00" - "\x63\x63\xe6\xe6\x6c\x6c\x7e\x7e\x33\x33\x66\x66\xcf\xcf\x00\x00" - "\xc3\xc3\xe6\xe6\x6c\x6c\xdb\xdb\x37\x37\x6f\x6f\xc3\xc3\x00\x00" - "\x08\x08\x18\x18\x00\x00\x18\x18\x30\x30\x66\x66\x3c\x3c\x00\x00" - "\x60\x60\x18\x18\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\x0c\x0c\x30\x30\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\x7c\x7c\xc6\xc6\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\x76\x76\xdc\xdc\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\xc6\xc6\x00\x00\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\x7c\x7c\xc6\xc6\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\x00\x00\x7f\x7f\xcc\xcc\xdf\xdf\xcc\xcc\xcc\xcc\xcf\xcf\x88\x88" - "\x00\x00\x7c\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x60\x60\x30\x30\xfc\xfc\x60\x60\x7c\x7c\x60\x60\xfe\xfe\x00\x00" - "\x18\x18\x30\x30\xfc\xfc\x60\x60\x7c\x7c\x60\x60\xfe\xfe\x00\x00" - "\x30\x30\xcc\xcc\xfc\xfc\x60\x60\x7c\x7c\x60\x60\xfe\xfe\x00\x00" - "\xcc\xcc\x00\x00\xfc\xfc\x60\x60\x7c\x7c\x60\x60\xfe\xfe\x00\x00" - "\xc0\xc0\x30\x30\xfc\xfc\x30\x30\x30\x30\x30\x30\xfc\xfc\x00\x00" - "\x0c\x0c\x30\x30\xfc\xfc\x30\x30\x30\x30\x30\x30\xfc\xfc\x00\x00" - "\x30\x30\xcc\xcc\x00\x00\xfc\xfc\x30\x30\x30\x30\xfc\xfc\x00\x00" - "\xcc\xcc\x00\x00\xfc\xfc\x30\x30\x30\x30\x30\x30\xfc\xfc\x00\x00" - "\x00\x00\xe0\xe0\x70\x70\x78\x78\xec\xec\x66\x66\xfc\xfc\x00\x00" - "\x76\x76\xdc\xdc\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x18\x18\x7c\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x30\x30\x7c\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\xcc\xcc\x00\x00\x78\x78\xcc\xcc\xcc\xcc\x78\x78\x00\x00" - "\x76\x76\xdc\xdc\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xc6\xc6\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\xc3\xc3\x66\x66\x18\x18\x66\x66\xc3\xc3\x00\x00" - "\x01\x01\x7a\x7a\xc4\xc4\xca\xca\xd6\xd6\xa6\xa6\x5c\x5c\x80\x80" - "\x30\x30\x18\x18\x80\x80\xce\xce\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x18\x18\x30\x30\x80\x80\xce\xce\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x30\x30\xcc\xcc\x80\x80\xce\xce\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x00\x00\xcc\xcc\x80\x80\xce\xce\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x00\x00" - "\xf0\xf0\x60\x60\x7c\x7c\x66\x66\x7c\x7c\x60\x60\x60\x60\xf0\xf0" - "\x7c\x7c\xc6\xc6\xc6\xc6\xdc\xdc\xc6\xc6\xc6\xc6\xdc\xdc\xc0\xc0" - "\x30\x30\x18\x18\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x30\x30\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\x76\x76\xdc\xdc\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\xc6\xc6\x00\x00\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\x7c\x7c\xc6\xc6\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x1b\x1b\x7e\x7e\xc8\xc8\x7f\x7f\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\xc6\xc6\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x30\x30\x18\x18\x7c\x7c\xc6\xc6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\x18\x18\x30\x30\x7c\x7c\xc6\xc6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7c\x7c\xc6\xc6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\xc6\xc6\x00\x00\x7c\x7c\xc6\xc6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\x30\x30\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x7e\x7e\x18\x18\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x76\x76\xdc\xdc\x00\x00\xfc\xfc\xc6\xc6\xc6\xc6\xc6\xc6\x02\x02" - "\x30\x30\x18\x18\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x30\x30\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x76\x76\xdc\xdc\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x6c\x6c\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x7e\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x03\x03\x3e\x3e\x6e\x6e\x7e\x7e\x76\x76\x7c\x7c\xc0\xc0" - "\x76\x76\xdc\xdc\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\xc6\xc6\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\x80\x80\xc6\xc6\xc6\xc6\x6c\x6c\x38\x38\xf0\xf0" - "\xf0\xf0\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\xf0\xf0" - "\x00\x00\xc6\xc6\x80\x80\xc6\xc6\xc6\xc6\x6c\x6c\x38\x38\xf0\xf0" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x1c\x1c\x1c\x18\x18\x18\x00\x18\x18\x10\x00\x00\x00\x00" - "\x36\x36\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00\x00" - "\x00\x28\x7e\xa8\xfc\x7e\x2a\xfc\x28\x00\x00\x00\x00\x00" - "\x00\x01\x33\x56\x6c\x18\x36\x6a\xcc\x80\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\x68\xd2\xcc\xcc\x7a\x00\x00\x00\x00\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x03\x0c\x18\x30\x30\x30\x30\x18\x0c\x03\x00\x00\x00\x00" - "\xc0\x30\x18\x0c\x0c\x0c\x0c\x18\x30\xc0\x00\x00\x00\x00" - "\x00\xc6\x6c\x38\xfe\x38\x6c\xc6\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x01\x03\x06\x0c\x08\x18\x30\x20\x60\xc0\x80\x00\x00\x00" - "\x00\x7c\xce\xd6\xd6\xd6\xd6\xe6\x7c\x00\x00\x00\x00\x00" - "\x00\x18\x38\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x46\x1c\x30\x62\x66\x7e\x00\x00\x00\x00\x00" - "\x20\x7c\xc6\x06\x1e\x06\x06\xc6\x7c\x00\x00\x00\x00\x00" - "\x40\x66\x66\x66\x3e\x06\x06\x06\x06\x02\x00\x00\x00\x00" - "\x00\xfe\xc0\xc0\xfc\x06\x86\xc6\xfc\x00\x00\x00\x00\x00" - "\x00\x7c\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x80\xfe\xc6\x8c\x8c\x18\x18\x30\x30\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x06\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\xff\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x60\x30\x18\x0c\x06\x03\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x3c\x66\x46\x0c\x18\x18\x00\x18\x18\x10\x00\x00\x00\x00" - "\x00\x7c\xc6\xd6\xd6\xd6\xdc\xc0\x7c\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xde\xc6\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x6c\x66\x66\x66\xfc\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x08\x00\x00\x00\x00" - "\x00\xf8\x6c\x6c\x66\x66\x66\x66\xfc\x00\x00\x00\x00\x00" - "\x00\xfe\x60\x60\x7c\x60\x60\x66\xfc\x08\x00\x00\x00\x00" - "\x04\xfc\x66\x62\x78\x60\x60\x60\xe0\x00\x00\x00\x00\x00" - "\x02\x7e\xc6\xc2\xc0\xce\xc6\xc6\x7e\x02\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xde\xc6\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x00\x7e\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x02\x06\x06\x06\x06\xe6\xc6\xc6\xfc\x80\x00\x00\x00\x00" - "\x00\xc6\xc6\xcc\xd8\xcc\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x62\x62\x66\xfc\x04\x00\x00\x00\x00" - "\x00\xc6\xc6\xee\xfe\xd6\xd6\xc6\xc6\x80\x00\x00\x00\x00" - "\x00\xc6\xd6\xd6\xde\xce\xce\xc6\xc6\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x66\x6c\x60\x60\xe0\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xd6\xce\x7c\x02\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x6c\x66\x66\x66\xe6\x04\x00\x00\x00\x00" - "\x00\x7e\xc0\xc0\x7c\x06\x86\xc6\xfc\x80\x00\x00\x00\x00" - "\x04\xfc\x36\x32\x30\x30\x30\x30\x30\x20\x00\x00\x00\x00" - "\x80\xce\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x80\xc6\xc6\xc6\x6c\x6c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x80\xc6\xc6\xd6\xd6\xfe\xee\xee\xc6\x00\x00\x00\x00\x00" - "\x80\xc6\xc6\xc6\x5c\xc6\xc6\xc6\xc6\x02\x00\x00\x00\x00" - "\x02\xc6\xc6\xc6\x5c\x18\x18\x18\x18\x08\x00\x00\x00\x00" - "\x00\xfe\x86\x0c\x18\x32\x62\xc6\xfe\x02\x00\x00\x00\x00" - "\x00\x7e\x30\x30\x30\x30\x30\x30\x7e\x00\x00\x00\x00\x00" - "\x80\xc0\x60\x30\x10\x18\x0c\x04\x06\x03\x01\x00\x00\x00" - "\x00\x7e\x0c\x0c\x0c\x0c\x0c\x0c\x7e\x00\x00\x00\x00\x00" - "\x18\x3c\x66\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\xe0\x60\x6c\x66\x66\x66\x66\x66\xfc\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00\x00" - "\x0e\x0c\x6c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xdc\xc0\xc0\x7e\x00\x00\x00\x00\x00" - "\x1e\x30\x7c\x30\x30\x30\x30\x30\x30\x20\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\x76\x06\x06\xfc\x00\x00\x00" - "\xe0\x60\x6c\x66\x66\x66\x66\x66\xe6\x04\x00\x00\x00\x00" - "\x18\x00\x18\x18\x18\x18\x18\x18\x18\x10\x00\x00\x00\x00" - "\x06\x00\x06\x06\x06\x46\x66\x66\x66\x66\x3c\x00\x00\x00" - "\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x10\x00\x00\x00\x00" - "\x00\x00\xfc\xd6\xd6\xd6\xd6\xd6\xd6\x80\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x66\x66\xe6\x04\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x66\x6c\x60\x60\xe0\x00\x00\x00" - "\x00\x00\x7e\xcc\xcc\xcc\xcc\x6c\x0c\x0c\x0e\x00\x00\x00" - "\x00\x08\xfc\x66\x60\x60\x60\x60\x60\x40\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00\x00\x00" - "\x30\x30\x7c\x30\x30\x30\x30\x30\x30\x20\x00\x00\x00\x00" - "\x00\x80\xce\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x00\x80\xc6\xc6\xc6\x6c\x6c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x02\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x00\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\x5c\xc6\xc6\xc6\x02\x00\x00\x00\x00" - "\x00\x80\xc6\xc6\xc6\xc6\xc6\x5e\x06\x06\x7c\x00\x00\x00" - "\x00\x00\xfe\x86\x0c\x38\x60\xc2\xfe\x00\x00\x00\x00\x00" - "\x00\x07\x1c\x30\x30\xe0\x30\x30\x1c\x07\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\xe0\x38\x0c\x0c\x07\x0c\x0c\x38\xe0\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xb4\xe8\xb2\xe8\xb4\xe8\xb2\xe8\xb4\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x10\x18\x18\x00\x18\x18\x1c\x1c\x1c\x00\x00\x00\x00\x00" - "\x00\x10\x7c\xd0\xd0\xd0\xd0\x7c\x10\x00\x00\x00\x00\x00" - "\x08\x3c\x66\x60\xf8\x60\x62\x66\xfc\x08\x00\x00\x00\x00" - "\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00\x00\x00\x00\x00\x00\x00" - "\x00\xc6\xc6\x6c\x38\x10\xfe\x10\x10\x00\x00\x00\x00\x00" - "\x00\x18\x18\x18\x00\x18\x18\x18\x00\x00\x00\x00\x00\x00" - "\x7c\xc0\x7c\xc6\xc6\xc6\x7c\x06\x7c\x00\x00\x00\x00\x00" - "\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x82\x9a\xa2\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xf6\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00\x00" - "\xff\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x82\xb2\xaa\xb2\xaa\x82\x7c\x00\x00\x00\x00\x00" - "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xf0\x18\x70\x18\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x60\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x80\xcc\xcc\xcc\xcc\xfe\xc0\x00\x00\x00\x00" - "\x00\x7e\xec\xec\xec\x6c\x2c\x2c\x2e\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x30\x00\x00\x00" - "\x60\xe0\x60\x60\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x42\xc4\x48\x56\x2a\x4f\x82\x02\x00\x00\x00\x00\x00" - "\x00\x42\xc4\x48\x56\x2a\x46\x88\x0e\x00\x00\x00\x00\x00" - "\xc0\x22\xe4\x28\xd6\x2a\x4f\x82\x02\x00\x00\x00\x00\x00" - "\x08\x18\x00\x18\x18\x30\x62\x66\x3c\x00\x00\x00\x00\x00" - "\x60\x18\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x0c\x30\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x7c\xc6\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x76\xdc\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\xc6\x00\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x7c\xc6\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x00\x7f\xcc\xcc\xde\xcc\xcc\xcc\xcf\x80\x00\x00\x00\x00" - "\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x30\x00\x00\x00\x00" - "\x60\x30\xfc\x60\x60\x78\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x18\x30\xfc\x60\x60\x78\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x20\x50\xfc\x60\x60\x78\x60\x60\xfe\x00\x00\x00\x00\x00" - "\xcc\x00\xfc\x60\x60\x78\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x30\x0c\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x0c\x30\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x10\x28\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x66\x00\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x00\xf8\x6c\x6c\xf6\x66\x66\x66\xfc\x00\x00\x00\x00\x00" - "\x76\xdc\xc6\xe6\xf6\xde\xce\xc6\xc6\x00\x00\x00\x00\x00" - "\x30\x18\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x18\x30\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x10\x28\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x76\xdc\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x00\x42\x66\x3c\x18\x3c\x66\x42\x00\x00\x00\x00\x00\x00" - "\x00\x7a\xc4\xca\xd6\xd6\xa6\x46\xbc\x00\x00\x00\x00\x00" - "\xb0\xda\xc4\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x98\xb6\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x90\xaa\xc4\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\xa8\xce\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x0c\x18\xc3\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x00\xf0\x60\x7c\x66\x66\x7c\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xdc\xc6\xc6\xc6\xdc\xc0\x00\x00\x00\x00" - "\x30\x18\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x18\x30\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x10\x28\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x76\xdc\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x6c\x00\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x7c\xc6\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x00\x10\x7c\x16\x16\x7c\xd0\xd0\x7c\x10\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x30\x00\x00\x00\x00" - "\x30\x18\x7c\xc6\xc6\xdc\xc0\xc0\x7e\x00\x00\x00\x00\x00" - "\x18\x30\x7c\xc6\xc6\xdc\xc0\xc0\x7e\x00\x00\x00\x00\x00" - "\x10\x28\x7c\xc6\xc6\xdc\xc0\xc0\x7e\x00\x00\x00\x00\x00" - "\x6c\x00\x7c\xc6\xc6\xdc\xc0\xc0\x7e\x00\x00\x00\x00\x00" - "\x30\x18\x00\x18\x18\x18\x18\x18\x0c\x00\x00\x00\x00\x00" - "\x0c\x18\x00\x18\x18\x18\x18\x18\x0c\x00\x00\x00\x00\x00" - "\x08\x14\x00\x18\x18\x18\x18\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x14\x00\x18\x18\x18\x18\x18\x0c\x00\x00\x00\x00\x00" - "\x18\x7e\x18\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x76\xdc\xfc\x66\x66\x66\x66\x66\xe6\x02\x00\x00\x00\x00" - "\x30\x18\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x18\x30\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x10\x28\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x76\xdc\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x28\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x10\x00\x7c\x00\x10\x00\x00\x00\x00\x00\x00\x00" - "\x00\x02\x7c\xce\xd6\xd6\xd6\xe6\x7c\x80\x00\x00\x00\x00" - "\x76\x9c\xce\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x18\xb0\xce\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x10\xa8\xce\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x28\x80\xce\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x18\xb0\xc6\xc6\xc6\xc6\xc6\x5e\x06\x06\xfc\x00\x00\x00" - "\x00\x00\xf0\x60\x7c\x66\x66\x7c\x60\xf0\x00\x00\x00\x00" - "\x28\x80\xc6\xc6\xc6\xc6\xc6\x5e\x06\x06\xfc\x00\x00\x00" - , NULL, "P0T NOoDLE (Amiga)", CIOLIB_ISO_8859_1} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x6c\x6c\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x00\x00\x66\x66\xac\xac\xd8\xd8\x36\x36\x6a\x6a\xcc\xcc\x00\x00" - "\x38\x38\x6c\x6c\x68\x68\x76\x76\xdc\xdc\xce\xce\x7b\x7b\x00\x00" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x80\x80" - "\x3c\x3c\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\x3c\x3c\x00\x00" - "\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x06\x06\x3c\x3c\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7c\x7c\x06\x06\x1c\x1c\x06\x06\x06\x06\x06\x06\x7c\x7c\x00\x00" - "\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\xfe\xfe\x0c\x0c\x0c\x0c\x00\x00" - "\x7c\x7c\x60\x60\x7c\x7c\x06\x06\x06\x06\x06\x06\x7c\x7c\x00\x00" - "\x3c\x3c\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x06\x06\x06\x06\x0c\x0c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x3e\x3e\x06\x06\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x06\x06\x18\x18\x60\x60\x18\x18\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x60\x60\x18\x18\x06\x06\x18\x18\x60\x60\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x18\x18\x00\x00\x18\x18\x00\x00" - "\x7c\x7c\xc6\xc6\xde\xde\xd6\xd6\xde\xde\xc0\xc0\x78\x78\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x60\x60\x30\x30\x1e\x1e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x60\x60\x6e\x6e\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x0e\x0e\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x3c\x3c\x00\x00" - "\xc6\xc6\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x00\x00" - "\x78\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xdc\x7e\x7e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x06\x06\x06\x06\x7c\x7c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x3c\x3c\x18\x18\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\xc3\xc3\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\xfc\xfc\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x01\x01" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x10\x10\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x1c\x1c\x30\x30\x30\x30\x30\x30\x7c\x7c\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x3c\x3c" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x78\x78" - "\x60\x60\x60\x60\x66\x66\x6c\x6c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x00\x00\xec\xec\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x3e\x3e\x60\x60\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x30\x30\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\x6c\x6c\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x06\x06\x3c\x3c" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x0e\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x70\x70\x18\x18\x18\x18\x0e\x0e\x18\x18\x18\x18\x70\x70\x00\x00" - "\x72\x72\x9c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0f\x0f\x3c\x3c\xf0\xf0\xc3\xc3\x0f\x0f\x3c\x3c\xf0\xf0\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x0c\x0c\x3e\x3e\x6c\x6c\x3e\x3e\x0c\x0c\x00\x00\x00\x00" - "\x1c\x1c\x36\x36\x30\x30\x78\x78\x30\x30\x30\x30\x7e\x7e\x00\x00" - "\x42\x42\x3c\x3c\x66\x66\x3c\x3c\x42\x42\x00\x00\x00\x00\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x60\x60\x3c\x3c\x66\x66\x3c\x3c\x06\x06\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\x9d\x9d\xa1\xa1\xa1\xa1\x9d\x9d\x42\x42\x3c\x3c" - "\x1c\x1c\x24\x24\x44\x44\x3c\x3c\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\x00\x00\x33\x33\x66\x66\xcc\xcc\x66\x66\x33\x33\x00\x00\x00\x00" - "\x3e\x3e\x06\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\xb9\xb9\xa5\xa5\xb9\xb9\xa5\xa5\x42\x42\x3c\x3c" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x7e\x7e\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x30\x30\x7c\x7c\x00\x00\x00\x00\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x0c\x0c\x78\x78\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x7f\x7f\x60\x60" - "\x3e\x3e\x7a\x7a\x7a\x7a\x3a\x3a\x0a\x0a\x0a\x0a\x0a\x0a\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x30\x30\x70\x70\x30\x30\x30\x30\x30\x30\x00\x00\x00\x00\x00\x00" - "\x38\x38\x44\x44\x44\x44\x38\x38\x00\x00\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\x66\x66\x33\x33\x66\x66\xcc\xcc\x00\x00\x00\x00" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x32\x32\x66\x66\xcf\xcf\x02\x02" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x3e\x3e\x62\x62\xc4\xc4\x0e\x0e" - "\xc0\xc0\x23\x23\x66\x66\x2c\x2c\xd9\xd9\x33\x33\x67\x67\x01\x01" - "\x18\x18\x00\x00\x18\x18\x30\x30\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x1f\x1f\x3c\x3c\x3c\x3c\x6f\x6f\x7c\x7c\xcc\xcc\xcf\xcf\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x30\x30\x1e\x1e\x0c\x0c\x18\x18" - "\x30\x30\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x66\x66\x00\x00\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\xf6\xf6\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x71\x71\xce\xce\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\xc3\xc3\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x3f\x3f\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\xfc\xfc\x00\x00" - "\x30\x30\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x24\x24\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x08\x08\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\xc0\xc0\xc0\xc0\xfc\xfc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x6c\x6c\x66\x66\x66\x66\x6c\x6c\x60\x60" - "\x30\x30\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x1b\x1b\x7f\x7f\xd8\xd8\x77\x77\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x18\x18" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x60\x60\xfc\xfc\x18\x18\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x00\x00" - "\x30\x30\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x00\x00\xff\xff\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x02\x02\x7c\x7c\xce\xce\xd6\xd6\xe6\xe6\x7c\x7c\x80\x80" - "\x30\x30\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - , NULL - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x00\x18\x00" - "\x6c\x6c\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\x66\xac\xd8\x36\x6a\xcc\x00" - "\x38\x6c\x68\x76\xdc\xce\x7b\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x03\x06\x0c\x18\x30\x60\xc0\x80" - "\x3c\x66\x6e\x7e\x76\x66\x3c\x00" - "\x38\x18\x18\x18\x18\x18\x18\x00" - "\x3c\x06\x3c\x60\x60\x60\x7e\x00" - "\x7c\x06\x1c\x06\x06\x06\x7c\x00" - "\x0c\xcc\xcc\xcc\xfe\x0c\x0c\x00" - "\x7c\x60\x7c\x06\x06\x06\x7c\x00" - "\x3c\x60\x7c\x66\x66\x66\x3c\x00" - "\x7e\x06\x06\x0c\x18\x18\x18\x00" - "\x3c\x66\x3c\x66\x66\x66\x3c\x00" - "\x3c\x66\x66\x66\x3e\x06\x3c\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x00\x06\x18\x60\x18\x06\x00\x00" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x00\x60\x18\x06\x18\x60\x00\x00" - "\x3c\x66\x06\x1c\x18\x00\x18\x00" - "\x7c\xc6\xde\xd6\xde\xc0\x78\x00" - "\x3c\x66\x66\x66\x7e\x66\x66\x00" - "\x7c\x66\x7c\x66\x66\x66\x7c\x00" - "\x1e\x30\x60\x60\x60\x30\x1e\x00" - "\x7c\x66\x66\x66\x66\x66\x7c\x00" - "\x7e\x60\x60\x60\x78\x60\x7e\x00" - "\x7e\x60\x60\x60\x78\x60\x60\x00" - "\x3c\x60\x6e\x66\x66\x66\x3e\x00" - "\x66\x66\x66\x66\x7e\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x0e\x06\x06\x06\x06\x06\x3c\x00" - "\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x78\xcc\xcc\xcc\xcc\xdc\x7e\x00" - "\x7c\x66\x66\x66\x7c\x66\x66\x00" - "\x3c\x60\x3c\x06\x06\x06\x7c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc3\x66\x3c\x18\x3c\x66\xc3\x00" - "\xc3\x66\x3c\x18\x18\x18\x18\x00" - "\xfe\x0c\x18\x30\x60\xc0\xfc\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x03\x01" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x18\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x06\x3e\x66\x3e\x00" - "\x60\x60\x7c\x66\x66\x66\x7c\x00" - "\x00\x00\x3c\x60\x60\x60\x3c\x00" - "\x06\x06\x3e\x66\x66\x66\x3e\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x1c\x30\x30\x30\x7c\x30\x30\x00" - "\x00\x00\x3e\x66\x66\x3e\x06\x3c" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x18\x00\x18\x18\x18\x18\x0c\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x0c\x78" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x18\x18\x18\x18\x18\x18\x0c\x00" - "\x00\x00\xec\xfe\xd6\xc6\xc6\x00" - "\x00\x00\x7c\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x3e\x66\x66\x3e\x06\x06" - "\x00\x00\x3e\x60\x60\x60\x60\x00" - "\x00\x00\x3c\x60\x3c\x06\x7c\x00" - "\x30\x30\x7c\x30\x30\x30\x1c\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\xc6\xc6\xd6\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\x66\x66\x66\x3e\x06\x3c" - "\x00\x00\x7e\x0c\x18\x30\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x72\x9c\x00\x00\x00\x00\x00\x00" - "\x0f\x3c\xf0\xc3\x0f\x3c\xf0\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x00\x18\x18\x18\x18\x18\x00" - "\x00\x0c\x3e\x6c\x3e\x0c\x00\x00" - "\x1c\x36\x30\x78\x30\x30\x7e\x00" - "\x42\x3c\x66\x3c\x42\x00\x00\x00" - "\xc3\x66\x3c\x18\x3c\x18\x18\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\x3c\x60\x3c\x66\x3c\x06\x3c\x00" - "\x66\x66\x00\x00\x00\x00\x00\x00" - "\x3c\x42\x9d\xa1\xa1\x9d\x42\x3c" - "\x1c\x24\x44\x3c\x00\x7e\x00\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x3e\x06\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x3c\x42\xb9\xa5\xb9\xa5\x42\x3c" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x3c\x00\x00\x00\x00\x00" - "\x18\x18\x7e\x18\x18\x00\x7e\x00" - "\x78\x0c\x18\x30\x7c\x00\x00\x00" - "\x78\x0c\x18\x0c\x78\x00\x00\x00" - "\x18\x30\x60\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x60" - "\x3e\x7a\x7a\x3a\x0a\x0a\x0a\x00" - "\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x30" - "\x30\x70\x30\x30\x30\x00\x00\x00" - "\x38\x44\x44\x38\x00\x7c\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x40\xc6\x4c\x58\x32\x66\xcf\x02" - "\x40\xc6\x4c\x58\x3e\x62\xc4\x0e" - "\xc0\x23\x66\x2c\xd9\x33\x67\x01" - "\x18\x00\x18\x30\x60\x66\x3c\x00" - "\x30\x18\x3c\x66\x7e\x66\x66\x00" - "\x0c\x18\x3c\x66\x7e\x66\x66\x00" - "\x18\x66\x3c\x66\x7e\x66\x66\x00" - "\x71\x8e\x3c\x66\x7e\x66\x66\x00" - "\x66\x00\x3c\x66\x7e\x66\x66\x00" - "\x18\x24\x3c\x66\x7e\x66\x66\x00" - "\x1f\x3c\x3c\x6f\x7c\xcc\xcf\x00" - "\x1e\x30\x60\x60\x30\x1e\x0c\x18" - "\x30\x18\x7e\x60\x78\x60\x7e\x00" - "\x0c\x18\x7e\x60\x78\x60\x7e\x00" - "\x18\x66\x7e\x60\x78\x60\x7e\x00" - "\x66\x00\x7e\x60\x78\x60\x7e\x00" - "\x30\x18\x3c\x18\x18\x18\x3c\x00" - "\x0c\x18\x3c\x18\x18\x18\x3c\x00" - "\x18\x66\x3c\x18\x18\x18\x3c\x00" - "\x66\x00\x3c\x18\x18\x18\x3c\x00" - "\x78\x6c\x66\xf6\x66\x6c\x78\x00" - "\x71\xce\xe6\xf6\xde\xce\xc6\x00" - "\x30\x18\x3c\x66\x66\x66\x3c\x00" - "\x0c\x18\x3c\x66\x66\x66\x3c\x00" - "\x18\x66\x3c\x66\x66\x66\x3c\x00" - "\x71\x8e\x3c\x66\x66\x66\x3c\x00" - "\xc3\x3c\x66\x66\x66\x66\x3c\x00" - "\x00\xc6\x6c\x38\x6c\xc6\x00\x00" - "\x3f\x66\x6e\x7e\x76\x66\xfc\x00" - "\x30\x18\x66\x66\x66\x66\x3c\x00" - "\x0c\x18\x66\x66\x66\x66\x3c\x00" - "\x18\x24\x66\x66\x66\x66\x3c\x00" - "\x66\x00\x66\x66\x66\x66\x3c\x00" - "\x06\x08\xc3\x66\x3c\x18\x18\x00" - "\xc0\xc0\xfc\xc6\xfc\xc0\xc0\x00" - "\x3c\x66\x66\x6c\x66\x66\x6c\x60" - "\x30\x18\x3c\x06\x3e\x66\x3e\x00" - "\x0c\x18\x3c\x06\x3e\x66\x3e\x00" - "\x18\x66\x3c\x06\x3e\x66\x3e\x00" - "\x71\x8e\x3c\x06\x3e\x66\x3e\x00" - "\x66\x00\x3c\x06\x3e\x66\x3e\x00" - "\x18\x24\x3c\x06\x3e\x66\x3e\x00" - "\x00\x00\x7e\x1b\x7f\xd8\x77\x00" - "\x00\x00\x3c\x60\x60\x60\x3c\x18" - "\x30\x18\x3c\x66\x7e\x60\x3c\x00" - "\x0c\x18\x3c\x66\x7e\x60\x3c\x00" - "\x18\x66\x3c\x66\x7e\x60\x3c\x00" - "\x66\x00\x3c\x66\x7e\x60\x3c\x00" - "\x30\x18\x00\x18\x18\x18\x0c\x00" - "\x0c\x18\x00\x18\x18\x18\x0c\x00" - "\x18\x66\x00\x18\x18\x18\x0c\x00" - "\x00\x66\x00\x18\x18\x18\x0c\x00" - "\x60\xfc\x18\x3c\x66\x66\x3c\x00" - "\x71\x8e\x00\x7c\x66\x66\x66\x00" - "\x30\x18\x00\x3c\x66\x66\x3c\x00" - "\x0c\x18\x00\x3c\x66\x66\x3c\x00" - "\x18\x66\x00\x3c\x66\x66\x3c\x00" - "\x71\x8e\x00\x3c\x66\x66\x3c\x00" - "\x00\x66\x00\x3c\x66\x66\x3c\x00" - "\x00\x18\x00\xff\x00\x18\x00\x00" - "\x00\x02\x7c\xce\xd6\xe6\x7c\x80" - "\x30\x18\x00\x66\x66\x66\x3e\x00" - "\x0c\x18\x00\x66\x66\x66\x3e\x00" - "\x18\x66\x00\x66\x66\x66\x3e\x00" - "\x00\x66\x00\x66\x66\x66\x3e\x00" - "\x0c\x18\x00\x66\x66\x3c\x18\x30" - "\xc0\xc0\xf8\xcc\xcc\xf8\xc0\xc0" - "\x00\x66\x00\x66\x66\x3c\x18\x30" - , "mO'sOul (Amiga)", CIOLIB_ISO_8859_1} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x6c\x6c\x6c\x6c\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x10\x10\x7c\x7c\xd0\xd0\x7c\x7c\x16\x16\x16\x16\x7c\x7c\x10\x10" - "\x60\x60\x96\x96\x6c\x6c\x18\x18\x30\x30\x6c\x6c\xd2\xd2\x0c\x0c" - "\x70\x70\xd8\xd8\x70\x70\xf6\xf6\xdc\xdc\xd8\xd8\x7c\x7c\x06\x06" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x03\x07\x0e\x0c\x18\x18\x18\x18\x18\x18\x0c\x0e\x07\x03\x00\x00" - "\xc0\xe0\x70\x30\x18\x18\x18\x18\x18\x18\x30\x70\xe0\xc0\x00\x00" - "\x00\x00\x6c\x6c\x38\x38\xfe\xfe\x38\x38\x6c\x6c\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x80\x80" - "\x00\x00\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\x7c\x7c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x7c\x7c\x06\x06\x3c\x3c\x60\x60\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\x3c\x3c\x06\x06\x1c\x1c\x06\x06\x46\x46\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x18\x18\x30\x30\x6c\x6c\xcc\xcc\xfe\xfe\x0c\x0c\x00\x00" - "\xf8\xf8\xc0\xc0\xfc\xfc\x06\x06\x46\x46\xcc\xcc\x78\x78\x00\x00" - "\x70\x70\xc0\xc0\xfc\xfc\xc6\xc6\xc6\xc6\xcc\xcc\x78\x78\x00\x00" - "\xfe\xfe\x06\x06\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x78\x78\xcc\xcc\x7c\x7c\xc6\xc6\xc6\xc6\xcc\xcc\x78\x78\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x30\x30" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x0c\x0c\x06\x06\x03\x03\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x7c\x7c\xc6\xc6\x06\x06\x3c\x3c\x30\x30\x00\x00\x30\x30\x00\x00" - "\x7c\x7c\xc6\xc6\xde\xde\xd6\xd6\xde\xde\xc0\xc0\x7e\x7e\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xfe\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xf8\xf8\xcc\xcc\xfc\xfc\xc6\xc6\xc6\xc6\xcc\xcc\xf8\xf8\x00\x00" - "\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00" - "\x38\x38\x60\x60\xc0\xc0\xce\xce\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06" - "\xc6\xc6\xc6\xc6\xc6\xc6\xfe\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0e\x0e\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xc6\xc6\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\x7c\x7c\x0c\x0c" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xfc\xfc\xd8\xd8\xcc\xcc\x06\x06" - "\x78\x78\xc0\xc0\x7c\x7c\x06\x06\x46\x46\xc6\xc6\x7c\x7c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x38\x38\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x00\x00" - "\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\xfe\xfe\x00\x00" - "\x3c\x3f\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3f\x3c\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x01\x01" - "\x3c\xfc\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xfc\x3c\x00\x00" - "\x10\x10\x38\x38\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x06\x06\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x38\x38\x6c\x6c\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x7e\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x18\x18\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0c\x0c\x00\x00\x1c\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x4c\x4c\x38\x38" - "\xc0\xc0\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x00\x00\xc4\xc4\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0" - "\x00\x00\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06" - "\x00\x00\xfc\xfc\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00" - "\x00\x00\x78\x78\xc0\xc0\x7c\x7c\x06\x06\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x32\x32\x1c\x1c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x38\x38\x00\x00" - "\x00\x00\xc6\xc6\xd6\xd6\xfe\xfe\x7c\x7c\x6c\x6c\x44\x44\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\x00\x00\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xfe\xfe\x00\x00" - "\x0e\x0f\x19\x18\x18\x18\x70\x70\x18\x18\x18\x19\x0f\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x70\xf0\x98\x18\x18\x18\x0e\x0e\x18\x18\x18\x98\xf0\x70\x00\x00" - "\x72\x72\x9c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x38\x38\x70\x70\xe0\xe0\xc1\xc1\x83\x83\x07\x07\x0e\x0e\x1c\x1c" - "\xcf\xcf\xf7\xf7\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xe7\xe7\xdf\xdf\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xcf\xcf\x33\x33\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x8d\x8d\x63\x63\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x93\x93\xff\xff\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x87\x87\x33\x33\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xc0\xc0\x93\x93\x30\x30\x03\x03\x33\x33\x33\x33\x30\x30\xff\xff" - "\x87\x87\x33\x33\x3f\x3f\x3f\x3f\x3f\x3f\x33\x33\x87\x87\xcf\xcf" - "\xcf\xcf\xf7\xf7\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xe7\xe7\xdf\xdf\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xe7\xe7\x99\x99\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\x93\x93\xff\xff\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xcf\xcf\xf7\xf7\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xe7\xe7\xdf\xdf\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xe7\xe7\x99\x99\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\x93\x93\xff\xff\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\x07\x07\x33\x33\x39\x39\x19\x19\x39\x39\x39\x39\x03\x03\xff\xff" - "\x8d\x8d\x63\x63\x19\x19\x09\x09\x21\x21\x31\x31\x39\x39\xff\xff" - "\xcf\xcf\xf7\xf7\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xcf\xcf\x33\x33\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\x8d\x8d\x63\x63\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\x93\x93\xff\xff\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xff\xff\x83\x83\x29\x29\x00\x00\x24\x24\x38\x38\x81\x81\xff\xff" - "\x87\x87\x33\x33\x21\x21\x09\x09\x19\x19\x39\x39\x83\x83\xff\xff" - "\xcf\xcf\xf7\xf7\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\x99\x99\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\x93\x93\xff\xff\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x39\x39\x39\x39\x83\x83\xf3\xf3\xf3\xf3\xff\xff" - "\x3f\x3f\x07\x07\x33\x33\x39\x39\x03\x03\x3f\x3f\x3f\x3f\x3f\x3f" - "\xff\xff\x87\x87\x33\x33\x23\x23\x39\x39\x39\x39\x23\x23\x3f\x3f" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x30\x30\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x38\x38\x6c\x6c\x60\x60\xf8\xf8\x60\x60\x60\x60\xfe\xfe\x00\x00" - "\x00\x00\xc6\xc6\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\xc6\xc6\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x3e\x3e\x0c\x0c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18" - "\x78\x78\xc0\xc0\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x06\x06\x3c\x3c" - "\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\x99\x99\xa1\xa1\xa1\xa1\x99\x99\x42\x42\x3c\x3c" - "\x00\x00\x7e\x7e\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\x36\x36\x6c\x6c\xd8\xd8\x6c\x6c\x36\x36\x00\x00\x00\x00" - "\xfe\x7f\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\xb9\xb9\xa5\xa5\xb9\xb9\xa5\xa5\x42\x42\x3c\x3c" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x10\x7c\x7c\x10\x10\x00\x00\x7c\x7c\x00\x00\x00\x00" - "\x70\x70\x18\x18\x30\x30\x60\x60\x78\x78\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x30\x30\x18\x18\x70\x70\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0" - "\x00\x00\x7e\x7e\xf4\xf4\x74\x74\x14\x14\x14\x14\x14\x14\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x30\x30\x70\x70\x30\x30\x30\x30\x78\x78\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\xd8\xd8\x6c\x6c\x36\x36\x6c\x6c\xd8\xd8\x00\x00\x00\x00" - "\x63\x63\xe6\xe6\x6c\x6c\x7b\x7b\x37\x35\x6d\x6f\xc3\xc3\x80\x80" - "\x63\x63\xe6\xe6\x6c\x6c\x7e\x7f\x33\x36\x66\x6f\xcf\xc0\x80\x80" - "\xc0\xc0\x66\xc6\x6c\x6c\xdb\xdb\x37\x35\x6d\x6f\xc3\xc3\x00\x00" - "\x30\x30\x00\x00\x30\x30\x3c\x3c\x06\x06\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x78\x78\xcc\xcc\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x3f\x3f\x6c\x6c\xcf\xcf\xfc\xfc\xcc\xcc\xcc\xcc\xcf\xcf\x00\x00" - "\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x30\x30\x08\x08\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x18\x18\x20\x20\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x18\x18\x66\x66\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x6c\x6c\x00\x00\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x30\x30\x08\x08\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xe6\xe6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\x72\x72\x9c\x9c\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x7c\x7c\xd6\xd6\xff\xff\xdb\xdb\xc7\xc7\x7e\x7e\x00\x00" - "\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x0c\x0c\x00\x00" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0" - "\x00\x00\x78\x78\xcc\xcc\xdc\xdc\xc6\xc6\xc6\xc6\xdc\xdc\xc0\xc0" - "\x30\x30\x08\x08\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x72\x72\x9c\x9c\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x1b\x1b\x7f\x7f\xd8\xd8\xd8\xd8\x7f\x7f\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x30\x30\x08\x08\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0c\x0c\x16\x16\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x72\x72\x9c\x9c\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x66\x66\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7f\xfe\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\xc0\xc0\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - , NULL, NULL , "MicroKnight Plus (Amiga)", CIOLIB_ISO_8859_1} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x83\x83\x39\x39\x21\x21\x29\x29\x21\x21\x3f\x3f\x87\x87\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x81\x81\x99\x99\x99\x99\x99\x99\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x99\x99\x99\x99\x83\x83\xff\xff" - "\xe1\xe1\xcf\xcf\x9f\x9f\x9f\x9f\x9f\x9f\xcf\xcf\xe1\xe1\xff\xff" - "\x87\x87\x93\x93\x99\x99\x99\x99\x99\x99\x93\x93\x87\x87\xff\xff" - "\x81\x81\x9f\x9f\x9f\x9f\x87\x87\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\x81\x81\x9f\x9f\x9f\x9f\x87\x87\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xc3\xc3\x99\x99\x9f\x9f\x91\x91\x99\x99\x99\x99\xc1\xc1\xff\xff" - "\x99\x99\x99\x99\x99\x99\x81\x81\x99\x99\x99\x99\x99\x99\xff\xff" - "\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\x99\x99\xc3\xc3\xff\xff" - "\x9c\x9c\x99\x99\x93\x93\x87\x87\x93\x93\x99\x99\x9c\x9c\xff\xff" - "\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\x9c\x9c\x88\x88\x80\x80\x94\x94\x9c\x9c\x9c\x9c\x9c\x9c\xff\xff" - "\x9c\x9c\x8c\x8c\x84\x84\x90\x90\x98\x98\x9c\x9c\x9c\x9c\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\x91\x91\xc0\xc0\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x93\x93\x99\x99\x99\x99\xff\xff" - "\xc3\xc3\x99\x99\x8f\x8f\xc3\xc3\xf1\xf1\x99\x99\xc3\xc3\xff\xff" - "\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x99\x99\x99\x99\x99\x99\x99\x99\x99\x81\xc3\xc3\xe7\xe7\xff\xff" - "\x9c\x9c\x9c\x9c\x9c\x9c\x94\x94\x80\x80\x88\x88\x9c\x9c\xff\xff" - "\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xc3\xc3\x99\x99\x3c\x3c\xff\xff" - "\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\x80\x80\xf9\xf9\xf3\xf3\xe7\xe7\xcf\xcf\x9f\x9f\x80\x80\xff\xff" - "\xc3\xc0\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xc0\xc3\xff\xff" - "\x3f\x3f\x9f\x9f\xcf\xcf\xe7\xe7\xf3\xf3\xf9\xf9\xfc\xfc\xfe\xfe" - "\xc3\x03\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\x03\xc3\xff\xff" - "\xf7\xf7\xe3\xe3\xc9\xc9\x9c\x9c\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x6c\x6c\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x03\x03\x66\x66\xac\xac\xd8\xd8\x36\x36\x6a\x6a\xcc\xcc\x00\x00" - "\x38\x38\x6c\x6c\x68\x68\x76\x76\xdc\xdc\xce\xce\x7b\x7b\x00\x00" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x03\x07\x0e\x0c\x18\x18\x18\x18\x18\x18\x0c\x0e\x07\x03\x00\x00" - "\xc0\xe0\x70\x30\x18\x18\x18\x18\x18\x18\x30\x70\xe0\xc0\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x80\x80" - "\x3c\x3c\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x38\x38\x78\x78\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcc\xfe\xfe\x0c\x0c\x0c\x0c\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x1c\x1c\x30\x30\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x06\x06\x06\x06\x0c\x0c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x0c\x0c\x38\x38\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x0c\x0c\x06\x06\x03\x03\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - "\x7c\x7c\xc6\xc6\xde\xde\xd6\xd6\xde\xde\xc0\xc0\x78\x78\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x60\x60\x30\x30\x1e\x1e\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\xc6\xc6\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x78\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xdc\x7e\x7e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x6c\x6c\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x70\x70\x3c\x3c\x0e\x0e\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x3c\x3c\x18\x18\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\xc3\xc3\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\xfe\xfe\x00\x00" - "\x3c\x3f\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3f\x3c\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x01\x01" - "\x3c\xfc\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xfc\x3c\x00\x00" - "\x10\x10\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x1c\x1c\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x3c\x3c" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x78\x78" - "\x60\x60\x60\x60\x66\x66\x6c\x6c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x00\x00\xec\xec\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x30\x30\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\x6c\x6c\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x0e\x0f\x19\x18\x18\x18\x70\x70\x18\x18\x18\x19\x0f\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x70\xf0\x98\x18\x18\x18\x0e\x0e\x18\x18\x18\x98\xf0\x70\x00\x00" - "\x72\x72\x9c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0f\x0f\x3c\x3c\xf0\xf0\xc3\xc3\x0f\x0f\x3c\x3c\xf0\xf0\x00\x00" - "\xcf\xcf\xe7\xe7\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\x8e\x8e\x71\x71\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\x99\x99\xff\xff\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe7\xe7\xdb\xdb\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe0\xe0\xc3\xc3\xc3\xc3\x90\x90\x83\x83\x33\x33\x30\x30\xff\xff" - "\xe1\xe1\xcf\xcf\x9f\x9f\x9f\x9f\xcf\xcf\xe1\xe1\xf3\xf3\xe7\xe7" - "\xcf\xcf\xe7\xe7\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xf3\xf3\xe7\xe7\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xe7\xe7\x99\x99\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\x99\x99\xff\xff\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xcf\xcf\xe7\xe7\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\x99\x99\xff\xff\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\x87\x87\x93\x93\x99\x99\x09\x09\x99\x99\x93\x93\x87\x87\xff\xff" - "\x8e\x8e\x31\x31\x19\x19\x09\x09\x21\x21\x31\x31\x39\x39\xff\xff" - "\xcf\xcf\xe7\xe7\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x8e\x8e\x71\x71\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x3c\x3c\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\x39\x39\x93\x93\xc7\xc7\x93\x93\x39\x39\xff\xff\xff\xff" - "\xc0\xc0\x99\x99\x91\x91\x81\x81\x89\x89\x99\x99\x03\x03\xff\xff" - "\xcf\xcf\xe7\xe7\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xe7\xe7\xdb\xdb\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x99\x99\xff\xff\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf9\xf9\xf7\xf7\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xff\xff" - "\x3f\x3f\x3f\x3f\x03\x03\x39\x39\x03\x03\x3f\x3f\x3f\x3f\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x93\x93\x99\x99\x99\x99\x93\x93\x9f\x9f" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x0c\x0c\x3e\x3e\x6c\x6c\x3e\x3e\x0c\x0c\x00\x00\x00\x00" - "\x1c\x1c\x36\x36\x30\x30\x78\x78\x30\x30\x30\x30\x7e\x7e\x00\x00" - "\x42\x42\x3c\x3c\x66\x66\x3c\x3c\x42\x42\x00\x00\x00\x00\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x60\x60\x3c\x3c\x66\x66\x3c\x3c\x06\x06\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x7e\x81\x81\x9d\x9d\xb1\xb1\x9d\x9d\x81\x81\x7e\x7e\x00\x00" - "\x1c\x1c\x24\x24\x44\x44\x3c\x3c\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\x00\x00\x33\x33\x66\x66\xcc\xcc\x66\x66\x33\x33\x00\x00\x00\x00" - "\xfe\x7f\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x7e\x81\x81\xb9\xb9\xa5\xa5\xb9\xb9\xa5\xa5\x81\x81\x7e\x7e" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x7e\x7e\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x30\x30\x7c\x7c\x00\x00\x00\x00\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x0c\x0c\x78\x78\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x7f\x7f\x60\x60" - "\x3e\x3e\x7a\x7a\x7a\x7a\x3a\x3a\x0a\x0a\x0a\x0a\x0a\x0a\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x30\x30\x70\x70\x30\x30\x30\x30\x30\x30\x00\x00\x00\x00\x00\x00" - "\x38\x38\x44\x44\x44\x44\x38\x38\x00\x00\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\x66\x66\x33\x33\x66\x66\xcc\xcc\x00\x00\x00\x00" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x30\x32\x62\x66\xc6\xcf\x02\x02" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x3e\x3e\x62\x62\xc4\xc4\x0e\x0e" - "\xc0\xc0\x23\x23\x66\x66\x2c\x2c\xd8\x1a\x32\x36\x66\x6f\xc2\xc2" - "\x18\x18\x00\x00\x18\x18\x30\x30\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x1f\x1f\x3c\x3c\x3c\x3c\x6f\x6f\x7c\x7c\xcc\xcc\xcf\xcf\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x30\x30\x1e\x1e\x0c\x0c\x18\x18" - "\x30\x30\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x66\x66\x00\x00\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\xf6\xf6\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x71\x71\xce\xce\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\xc3\xc3\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x3f\x3f\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\xfc\xfc\x00\x00" - "\x30\x30\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x24\x24\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x08\x08\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\xc0\xc0\xc0\xc0\xfc\xfc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x6c\x6c\x66\x66\x66\x66\x6c\x6c\x60\x60" - "\x30\x30\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x1b\x1b\x7f\x7f\xd8\xd8\x77\x77\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x18\x18" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x60\x60\xfc\xfc\x18\x18\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x00\x00" - "\x30\x30\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x7e\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x02\x02\x7c\x7c\xce\xce\xd6\xd6\xe6\xe6\x7c\x7c\x80\x80" - "\x30\x30\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - , NULL, NULL, "Topaz Plus (Amiga)", CIOLIB_ISO_8859_1} - ,{ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x6c\x6c\x6c\x6c\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x10\x10\x7c\x7c\xd0\xd0\x7c\x7c\x16\x16\x16\x16\x7c\x7c\x10\x10" - "\x60\x60\x96\x96\x7c\x7c\x18\x18\x30\x30\x6c\x6c\xd2\xd2\x0c\x0c" - "\x70\x70\xd8\xd8\x70\x70\xf6\xf6\xdc\xdc\xd8\xd8\x7c\x7c\x06\x06" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x60\x60\x60\x60\x30\x30\x18\x18\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x6c\x6c\x38\x38\xfe\xfe\x38\x38\x6c\x6c\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7f\x7f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x80\x80" - "\x00\x00\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\x7c\x7c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x7c\x7c\x06\x06\x3c\x3c\x60\x60\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\x3c\x3c\x06\x06\x1c\x1c\x06\x06\x46\x46\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x18\x18\x30\x30\x6c\x6c\xcc\xcc\xfe\xfe\x0c\x0c\x00\x00" - "\xf8\xf8\xc0\xc0\xfc\xfc\x06\x06\x46\x46\xcc\xcc\x78\x78\x00\x00" - "\x70\x70\xc0\xc0\xfc\xfc\xc6\xc6\xc6\xc6\xcc\xcc\x78\x78\x00\x00" - "\xfe\xfe\x06\x06\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x78\x78\xcc\xcc\x7c\x7c\xc6\xc6\xc6\xc6\xcc\xcc\x78\x78\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x18\x18\x30\x30\x60\x60\x30\x30\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\x00\x00\x30\x30\x18\x18\x0c\x0c\x18\x18\x30\x30\x00\x00\x00\x00" - "\x7c\x7c\xc6\xc6\x06\x06\x3c\x3c\x30\x30\x00\x00\x30\x30\x00\x00" - "\x7c\x7c\xc6\xc6\xde\xde\xd6\xd6\xde\xde\xc0\xc0\x7e\x7e\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xfe\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xf8\xf8\xcc\xcc\xfc\xfc\xc6\xc6\xc6\xc6\xcc\xcc\xf8\xf8\x00\x00" - "\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00" - "\x38\x38\x60\x60\xc0\xc0\xce\xce\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06" - "\xc6\xc6\xc6\xc6\xc6\xc6\xfe\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0e\x0e\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xc6\xc6\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\x7c\x7c\x0c\x0c" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xfc\xfc\xd8\xd8\xcc\xcc\x06\x06" - "\x78\x78\xc0\xc0\x7c\x7c\x06\x06\x46\x46\xc6\xc6\x7c\x7c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x38\x38\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x00\x00" - "\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\xfe\xfe\x00\x00" - "\x38\x38\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x38\x38\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x01\x01" - "\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x38\x38\x00\x00" - "\x10\x10\x38\x38\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x06\x06\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x38\x38\x6c\x6c\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x7e\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x18\x18\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0c\x0c\x00\x00\x1c\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x4c\x4c\x38\x38" - "\xc0\xc0\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x00\x00\xc4\xc4\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0" - "\x00\x00\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06" - "\x00\x00\xfc\xfc\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00" - "\x00\x00\x78\x78\xc0\xc0\x7c\x7c\x06\x06\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x32\x32\x1c\x1c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x38\x38\x00\x00" - "\x00\x00\xc6\xc6\xd6\xd6\xfe\xfe\x7c\x7c\x6c\x6c\x44\x44\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\x00\x00\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xfe\xfe\x00\x00" - "\x0c\x0c\x18\x18\x18\x18\x30\x30\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x30\x30\x18\x18\x18\x18\x0c\x0c\x18\x18\x18\x18\x30\x30\x00\x00" - "\x72\x72\x9c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x38\x38\x70\x70\xe0\xe0\xc1\xc1\x83\x83\x07\x07\x0e\x0e\x1c\x1c" - "\xcf\xcf\xf7\xf7\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xe7\xe7\xdf\xdf\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xcf\xcf\x33\x33\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x8d\x8d\x63\x63\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x93\x93\xff\xff\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x87\x87\x33\x33\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xc0\xc0\x93\x93\x30\x30\x03\x03\x33\x33\x33\x33\x30\x30\xff\xff" - "\x87\x87\x33\x33\x3f\x3f\x3f\x3f\x3f\x3f\x33\x33\x87\x87\xcf\xcf" - "\xcf\xcf\xf7\xf7\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xe7\xe7\xdf\xdf\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xe7\xe7\x99\x99\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\x93\x93\xff\xff\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xcf\xcf\xf7\xf7\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xe7\xe7\xdf\xdf\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xe7\xe7\x99\x99\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\x93\x93\xff\xff\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\x07\x07\x33\x33\x39\x39\x19\x19\x39\x39\x39\x39\x03\x03\xff\xff" - "\x8d\x8d\x63\x63\x19\x19\x09\x09\x21\x21\x31\x31\x39\x39\xff\xff" - "\xcf\xcf\xf7\xf7\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xcf\xcf\x33\x33\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\x8d\x8d\x63\x63\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\x93\x93\xff\xff\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xff\xff\x83\x83\x29\x29\x00\x00\x24\x24\x38\x38\x81\x81\xff\xff" - "\x87\x87\x33\x33\x21\x21\x09\x09\x19\x19\x39\x39\x83\x83\xff\xff" - "\xcf\xcf\xf7\xf7\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\x99\x99\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\x93\x93\xff\xff\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x39\x39\x39\x39\x83\x83\xf3\xf3\xf3\xf3\xff\xff" - "\x3f\x3f\x07\x07\x33\x33\x39\x39\x03\x03\x3f\x3f\x3f\x3f\x3f\x3f" - "\xff\xff\x87\x87\x33\x33\x23\x23\x39\x39\x39\x39\x23\x23\x3f\x3f" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x30\x30\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x38\x38\x6c\x6c\x60\x60\xf8\xf8\x60\x60\x60\x60\xfe\xfe\x00\x00" - "\x00\x00\xc6\xc6\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\xc6\xc6\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x3e\x3e\x0c\x0c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00" - "\x78\x78\xc0\xc0\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x06\x06\x3c\x3c" - "\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\x99\x99\xa1\xa1\xa1\xa1\x99\x99\x42\x42\x3c\x3c" - "\x00\x00\x7e\x7e\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\x36\x36\x6c\x6c\xd8\xd8\x6c\x6c\x36\x36\x00\x00\x00\x00" - "\x7c\x7c\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\xb9\xb9\xa5\xa5\xb9\xb9\xa5\xa5\x42\x42\x3c\x3c" - "\x7c\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x38\x38\x6c\x6c\x6c\x6c\x38\x38\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x10\x7c\x7c\x10\x10\x00\x00\x7c\x7c\x00\x00\x00\x00" - "\x70\x70\x18\x18\x30\x30\x60\x60\x78\x78\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x30\x30\x18\x18\x70\x70\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0" - "\x00\x00\x7e\x7e\xf4\xf4\x74\x74\x14\x14\x14\x14\x14\x14\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x30\x30\x70\x70\x30\x30\x30\x30\x78\x78\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\xd8\xd8\x6c\x6c\x36\x36\x6c\x6c\xd8\xd8\x00\x00\x00\x00" - "\x60\x60\xe6\xe6\x6c\x6c\x7a\x7a\x36\x36\x6f\x6f\xcf\xcf\x03\x03" - "\x60\x60\xe6\xe6\x6c\x6c\x78\x78\x3e\x3e\x63\x63\xce\xce\x1f\x1f" - "\xe0\xe0\x36\x36\x6c\x6c\x3a\x3a\xf6\xf6\x6f\x6f\xcf\xcf\x03\x03" - "\x30\x30\x00\x00\x30\x30\x3c\x3c\x06\x06\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x78\x78\xcc\xcc\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x3f\x3f\x6c\x6c\xcf\xcf\xfc\xfc\xcc\xcc\xcc\xcc\xcf\xcf\x00\x00" - "\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x30\x30\x08\x08\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x18\x18\x20\x20\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x18\x18\x66\x66\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x6c\x6c\x00\x00\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x30\x30\x08\x08\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xe6\xe6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\x72\x72\x9c\x9c\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x7c\x7c\xd6\xd6\xff\xff\xdb\xdb\xc7\xc7\x7e\x7e\x00\x00" - "\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x0c\x0c\x00\x00" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0" - "\x00\x00\x78\x78\xcc\xcc\xdc\xdc\xc6\xc6\xc6\xc6\xdc\xdc\xc0\xc0" - "\x30\x30\x08\x08\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x72\x72\x9c\x9c\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x1b\x1b\x7f\x7f\xd8\xd8\xd8\xd8\x7f\x7f\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x30\x30\x08\x08\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0c\x0c\x16\x16\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x72\x72\x9c\x9c\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x66\x66\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x7e\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\xc0\xc0\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - , NULL, "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x00\x18\x00" - "\x6c\x6c\x24\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x10\x7c\xd0\x7c\x16\x16\x7c\x10" - "\x60\x96\x7c\x18\x30\x6c\xd2\x0c" - "\x70\xd8\x70\xf6\xdc\xd8\x7c\x06" - "\x18\x18\x08\x10\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x6c\x38\xfe\x38\x6c\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x18\x18\x08\x10" - "\x00\x00\x00\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x06\x0c\x18\x30\x60\xc0\x00" - "\x00\x78\xcc\xde\xf6\xe6\x7c\x00" - "\x18\x18\x38\x18\x18\x18\x7e\x00" - "\x7c\x06\x3c\x60\xc0\xc0\xfe\x00" - "\x3c\x06\x1c\x06\x46\xc6\x7c\x00" - "\x18\x18\x30\x6c\xcc\xfe\x0c\x00" - "\xf8\xc0\xfc\x06\x46\xcc\x78\x00" - "\x70\xc0\xfc\xc6\xc6\xcc\x78\x00" - "\xfe\x06\x0c\x18\x18\x18\x18\x00" - "\x78\xcc\x7c\xc6\xc6\xcc\x78\x00" - "\x78\xcc\xc6\xc6\x7e\x06\x1c\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x08\x10" - "\x00\x18\x30\x60\x30\x18\x00\x00" - "\x00\x00\x7c\x00\x7c\x00\x00\x00" - "\x00\x30\x18\x0c\x18\x30\x00\x00" - "\x7c\xc6\x06\x3c\x30\x00\x30\x00" - "\x38\x6c\xde\xf6\xde\xc0\x66\x3c" - "\x78\xcc\xc6\xfe\xc6\xc6\xc6\x00" - "\xf8\xcc\xfc\xc6\xc6\xcc\xf8\x00" - "\x78\xcc\xc0\xc0\xc0\xc6\x7c\x00" - "\xf8\xcc\xc6\xc6\xc6\xc6\xfc\x00" - "\xfe\xc0\xfc\xc0\xc0\xc0\xfe\x00" - "\xfe\xc0\xfc\xc0\xc0\xc0\xc0\x00" - "\x38\x60\xc0\xce\xc6\xc6\x7e\x06" - "\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00" - "\x7e\x18\x18\x18\x18\x18\x7e\x00" - "\x0e\x06\x06\x06\xc6\xc6\x7c\x00" - "\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xfe\x00" - "\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x78\xcc\xc6\xc6\xc6\xc6\x7c\x00" - "\xf8\xcc\xc6\xc6\xfc\xc0\xc0\x00" - "\x78\xcc\xc6\xc6\xc6\xd6\x7c\x0c" - "\xf8\xcc\xc6\xc6\xfc\xd8\xcc\x06" - "\x78\xc0\x7c\x06\x46\xc6\x7c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xc6\xc6\xc6\x6c\x6c\x38\x38\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x6c\x38\x38\x6c\xc6\xc6\x00" - "\xc6\xc6\xc6\x7c\x0c\x0c\x0c\x00" - "\xfe\x0c\x18\x30\x60\xc0\xfe\x00" - "\x38\x30\x30\x30\x30\x30\x38\x00" - "\x00\xc0\x60\x30\x18\x0c\x06\x00" - "\x38\x18\x18\x18\x18\x18\x38\x00" - "\x10\x38\x6c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe" - "\x18\x18\x10\x08\x00\x00\x00\x00" - "\x00\x3c\x06\x7e\xc6\xc6\x7e\x00" - "\xc0\xf8\xcc\xc6\xc6\xc6\xfc\x00" - "\x00\x78\xcc\xc0\xc0\xc6\x7c\x00" - "\x06\x3e\x66\xc6\xc6\xc6\x7e\x00" - "\x00\x78\xcc\xfc\xc0\xc6\x7c\x00" - "\x38\x6c\x60\x78\x60\x60\x60\x60" - "\x00\x7e\xc6\xc6\xc6\x7e\x06\x7c" - "\xc0\xf8\xcc\xc6\xc6\xc6\xc6\x00" - "\x18\x00\x38\x18\x18\x18\x7e\x00" - "\x0c\x00\x1c\x0c\x0c\x0c\x4c\x38" - "\xc0\xcc\xd8\xf0\xd8\xcc\xc6\x00" - "\x38\x18\x18\x18\x18\x18\x7e\x00" - "\x00\xc4\xee\xfe\xd6\xc6\xc6\x00" - "\x00\xf8\xcc\xc6\xc6\xc6\xc6\x00" - "\x00\x78\xcc\xc6\xc6\xc6\x7c\x00" - "\x00\xf8\xcc\xc6\xc6\xc6\xfc\xc0" - "\x00\x3e\x66\xc6\xc6\xc6\x7e\x06" - "\x00\xfc\xc6\xc0\xc0\xc0\xc0\x00" - "\x00\x78\xc0\x7c\x06\xc6\x7c\x00" - "\x30\x7c\x30\x30\x30\x32\x1c\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\x7e\x00" - "\x00\xc6\xc6\x6c\x6c\x38\x38\x00" - "\x00\xc6\xd6\xfe\x7c\x6c\x44\x00" - "\x00\xc6\x6c\x38\x38\x6c\xc6\x00" - "\x00\xc6\xc6\xc6\xc6\x7e\x06\x7c" - "\x00\xfe\x0c\x18\x30\x60\xfe\x00" - "\x0c\x18\x18\x30\x18\x18\x0c\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x30\x18\x18\x0c\x18\x18\x30\x00" - "\x72\x9c\x00\x00\x00\x00\x00\x00" - "\x38\x70\xe0\xc1\x83\x07\x0e\x1c" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x00\x18\x18\x18\x18\x18\x00" - "\x30\x78\xcc\xc0\xc0\xc6\x7c\x30" - "\x38\x6c\x60\xf8\x60\x60\xfe\x00" - "\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00" - "\xc6\xc6\xc6\x7c\x0c\x3e\x0c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\x78\xc0\x7c\xc6\xc6\x7c\x06\x3c" - "\x6c\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x42\x99\xa1\xa1\x99\x42\x3c" - "\x00\x7e\xc6\xc6\x7e\x00\x7c\x00" - "\x00\x36\x6c\xd8\x6c\x36\x00\x00" - "\x7c\x0c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x00\x00\x00\x00" - "\x3c\x42\xb9\xa5\xb9\xa5\x42\x3c" - "\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x10\x7c\x10\x00\x7c\x00\x00" - "\x70\x18\x30\x60\x78\x00\x00\x00" - "\x70\x18\x30\x18\x70\x00\x00\x00" - "\x18\x30\x60\x00\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xfc\xc0" - "\x00\x7e\xf4\x74\x14\x14\x14\x00" - "\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x30" - "\x30\x70\x30\x30\x78\x00\x00\x00" - "\x00\x7c\xc6\xc6\x7c\x00\x7c\x00" - "\x00\xd8\x6c\x36\x6c\xd8\x00\x00" - "\x60\xe6\x6c\x7a\x36\x6f\xcf\x03" - "\x60\xe6\x6c\x78\x3e\x63\xce\x1f" - "\xe0\x36\x6c\x3a\xf6\x6f\xcf\x03" - "\x30\x00\x30\x3c\x06\xc6\x7c\x00" - "\x30\x08\x78\xcc\xfe\xc6\xc6\x00" - "\x18\x20\x78\xcc\xfe\xc6\xc6\x00" - "\x30\xcc\x78\xcc\xfe\xc6\xc6\x00" - "\x72\x9c\x78\xcc\xfe\xc6\xc6\x00" - "\x6c\x00\x78\xcc\xfe\xc6\xc6\x00" - "\x78\xcc\x78\xcc\xfe\xc6\xc6\x00" - "\x3f\x6c\xcf\xfc\xcc\xcc\xcf\x00" - "\x78\xcc\xc0\xc0\xc0\xc6\x7c\x30" - "\x30\x08\xfe\xc0\xfc\xc0\xfe\x00" - "\x18\x20\xfe\xc0\xfc\xc0\xfe\x00" - "\x18\x66\xfe\xc0\xfc\xc0\xfe\x00" - "\x6c\x00\xfe\xc0\xfc\xc0\xfe\x00" - "\x30\x08\x7e\x18\x18\x18\x7e\x00" - "\x18\x20\x7e\x18\x18\x18\x7e\x00" - "\x18\x66\x7e\x18\x18\x18\x7e\x00" - "\x6c\x00\x7e\x18\x18\x18\x7e\x00" - "\xf8\xcc\xc6\xe6\xc6\xc6\xfc\x00" - "\x72\x9c\xe6\xf6\xde\xce\xc6\x00" - "\x30\x08\x78\xcc\xc6\xc6\x7c\x00" - "\x18\x20\x78\xcc\xc6\xc6\x7c\x00" - "\x30\xcc\x78\xcc\xc6\xc6\x7c\x00" - "\x72\x9c\x78\xcc\xc6\xc6\x7c\x00" - "\x6c\x00\x78\xcc\xc6\xc6\x7c\x00" - "\x00\x7c\xd6\xff\xdb\xc7\x7e\x00" - "\x78\xcc\xde\xf6\xe6\xc6\x7c\x00" - "\x30\x08\xc6\xc6\xc6\xc6\x7c\x00" - "\x18\x20\xc6\xc6\xc6\xc6\x7c\x00" - "\x18\x66\xc6\xc6\xc6\xc6\x7c\x00" - "\x6c\x00\xc6\xc6\xc6\xc6\x7c\x00" - "\x18\x20\xc6\xc6\x7c\x0c\x0c\x00" - "\xc0\xf8\xcc\xc6\xfc\xc0\xc0\xc0" - "\x00\x78\xcc\xdc\xc6\xc6\xdc\xc0" - "\x30\x08\x3c\x06\x7e\xc6\x7e\x00" - "\x18\x20\x3c\x06\x7e\xc6\x7e\x00" - "\x18\x66\x3c\x06\x7e\xc6\x7e\x00" - "\x72\x9c\x3c\x06\x7e\xc6\x7e\x00" - "\x6c\x00\x3c\x06\x7e\xc6\x7e\x00" - "\x3c\x66\x3c\x06\x7e\xc6\x7e\x00" - "\x00\x7e\x1b\x7f\xd8\xd8\x7f\x00" - "\x00\x78\xcc\xc0\xc0\xc6\x7c\x30" - "\x30\x08\x78\xfc\xc0\xc6\x7c\x00" - "\x18\x20\x78\xfc\xc0\xc6\x7c\x00" - "\x30\xcc\x78\xfc\xc0\xc6\x7c\x00" - "\x6c\x00\x78\xfc\xc0\xc6\x7c\x00" - "\x30\x08\x38\x18\x18\x18\x7e\x00" - "\x18\x20\x38\x18\x18\x18\x7e\x00" - "\x18\x66\x38\x18\x18\x18\x7e\x00" - "\x6c\x00\x38\x18\x18\x18\x7e\x00" - "\x0c\x16\x3e\x66\xc6\xc6\x7e\x00" - "\x72\x9c\xf8\xcc\xc6\xc6\xc6\x00" - "\x30\x08\x78\xcc\xc6\xc6\x7c\x00" - "\x18\x20\x78\xcc\xc6\xc6\x7c\x00" - "\x18\x66\x78\xcc\xc6\xc6\x7c\x00" - "\x72\x9c\x78\xcc\xc6\xc6\x7c\x00" - "\x6c\x00\x78\xcc\xc6\xc6\x7c\x00" - "\x00\x18\x00\x7e\x00\x18\x00\x00" - "\x00\x78\xcc\xde\xf6\xe6\x7c\x00" - "\x30\x08\xc6\xc6\xc6\xc6\x7e\x00" - "\x18\x20\xc6\xc6\xc6\xc6\x7e\x00" - "\x18\x66\xc6\xc6\xc6\xc6\x7e\x00" - "\x6c\x00\xc6\xc6\xc6\xc6\x7e\x00" - "\x18\x20\xc6\xc6\xc6\x7e\x06\x7c" - "\xc0\xc0\xf8\xcc\xc6\xfc\xc0\xc0" - "\x6c\x00\xc6\xc6\xc6\x7e\x06\x7c" - , "MicroKnight (Amiga)", CIOLIB_ISO_8859_1} - ,{ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x83\x83\x39\x39\x21\x21\x29\x29\x21\x21\x3f\x3f\x87\x87\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x81\x81\x99\x99\x99\x99\x99\x99\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x99\x99\x99\x99\x83\x83\xff\xff" - "\xe1\xe1\xcf\xcf\x9f\x9f\x9f\x9f\x9f\x9f\xcf\xcf\xe1\xe1\xff\xff" - "\x87\x87\x93\x93\x99\x99\x99\x99\x99\x99\x93\x93\x87\x87\xff\xff" - "\x81\x81\x9f\x9f\x9f\x9f\x87\x87\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\x81\x81\x9f\x9f\x9f\x9f\x87\x87\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xc3\xc3\x99\x99\x9f\x9f\x91\x91\x99\x99\x99\x99\xc1\xc1\xff\xff" - "\x99\x99\x99\x99\x99\x99\x81\x81\x99\x99\x99\x99\x99\x99\xff\xff" - "\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\x99\x99\xc3\xc3\xff\xff" - "\x9c\x9c\x99\x99\x93\x93\x87\x87\x93\x93\x99\x99\x9c\x9c\xff\xff" - "\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\x9c\x9c\x88\x88\x80\x80\x94\x94\x9c\x9c\x9c\x9c\x9c\x9c\xff\xff" - "\x9c\x9c\x8c\x8c\x84\x84\x90\x90\x98\x98\x9c\x9c\x9c\x9c\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\x91\x91\xc0\xc0\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x93\x93\x99\x99\x99\x99\xff\xff" - "\xc3\xc3\x99\x99\x8f\x8f\xc3\xc3\xf1\xf1\x99\x99\xc3\xc3\xff\xff" - "\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x99\x99\x99\x99\x99\x99\x99\x99\x99\x81\xc3\xc3\xe7\xe7\xff\xff" - "\x9c\x9c\x9c\x9c\x9c\x9c\x94\x94\x80\x80\x88\x88\x9c\x9c\xff\xff" - "\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xc3\xc3\x99\x99\x3c\x3c\xff\xff" - "\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\x80\x80\xf9\xf9\xf3\xf3\xe7\xe7\xcf\xcf\x9f\x9f\x80\x80\xff\xff" - "\xc3\xc3\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xc3\xc3\xff\xff" - "\x3f\x3f\x9f\x9f\xcf\xcf\xe7\xe7\xf3\xf3\xf9\xf9\xfc\xfc\xff\xff" - "\xc3\xc3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xc3\xc3\xff\xff" - "\xf7\xf7\xe3\xe3\xc9\xc9\x9c\x9c\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x6c\x6c\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x00\x00\x66\x66\xac\xac\xd8\xd8\x36\x36\x6a\x6a\xcc\xcc\x00\x00" - "\x38\x38\x6c\x6c\x68\x68\x76\x76\xdc\xdc\xce\xce\x7b\x7b\x00\x00" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x3c\x3c\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x38\x38\x78\x78\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcc\xfe\xfe\x0c\x0c\x0c\x0c\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x1c\x1c\x30\x30\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x06\x06\x06\x06\x0c\x0c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x0c\x0c\x38\x38\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x06\x06\x18\x18\x60\x60\x18\x18\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x60\x60\x18\x18\x06\x06\x18\x18\x60\x60\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - "\x7c\x7c\xc6\xc6\xde\xde\xd6\xd6\xde\xde\xc0\xc0\x78\x78\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x60\x60\x30\x30\x1e\x1e\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\xc6\xc6\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x78\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xdc\x7e\x7e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x6c\x6c\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x70\x70\x3c\x3c\x0e\x0e\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x3c\x3c\x18\x18\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\xc3\xc3\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\xfe\xfe\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x00\x00" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x10\x10\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x1c\x1c\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x3c\x3c" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x78\x78" - "\x60\x60\x60\x60\x66\x66\x6c\x6c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x00\x00\xec\xec\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x30\x30\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\x6c\x6c\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x0e\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x70\x70\x18\x18\x18\x18\x0e\x0e\x18\x18\x18\x18\x70\x70\x00\x00" - "\x72\x72\x9c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0f\x0f\x3c\x3c\xf0\xf0\xc3\xc3\x0f\x0f\x3c\x3c\xf0\xf0\x00\x00" - "\xcf\xcf\xe7\xe7\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\x8e\x8e\x71\x71\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\x99\x99\xff\xff\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe7\xe7\xdb\xdb\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe0\xe0\xc3\xc3\xc3\xc3\x90\x90\x83\x83\x33\x33\x30\x30\xff\xff" - "\xe1\xe1\xcf\xcf\x9f\x9f\x9f\x9f\xcf\xcf\xe1\xe1\xf3\xf3\xe7\xe7" - "\xcf\xcf\xe7\xe7\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xf3\xf3\xe7\xe7\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xe7\xe7\x99\x99\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\x99\x99\xff\xff\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xcf\xcf\xe7\xe7\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\x99\x99\xff\xff\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\x87\x87\x93\x93\x99\x99\x09\x09\x99\x99\x93\x93\x87\x87\xff\xff" - "\x8e\x8e\x31\x31\x19\x19\x09\x09\x21\x21\x31\x31\x39\x39\xff\xff" - "\xcf\xcf\xe7\xe7\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x8e\x8e\x71\x71\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x3c\x3c\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\x39\x39\x93\x93\xc7\xc7\x93\x93\x39\x39\xff\xff\xff\xff" - "\xc0\xc0\x99\x99\x91\x91\x81\x81\x89\x89\x99\x99\x03\x03\xff\xff" - "\xcf\xcf\xe7\xe7\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xe7\xe7\xdb\xdb\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x99\x99\xff\xff\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf9\xf9\xf7\xf7\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xff\xff" - "\x3f\x3f\x3f\x3f\x03\x03\x39\x39\x03\x03\x3f\x3f\x3f\x3f\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x93\x93\x99\x99\x99\x99\x93\x93\x9f\x9f" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x80" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x0c\x0c\x3e\x3e\x6c\x6c\x3e\x3e\x0c\x0c\x00\x00\x00\x00" - "\x1c\x1c\x36\x36\x30\x30\x78\x78\x30\x30\x30\x30\x7e\x7e\x00\x00" - "\x42\x42\x3c\x3c\x66\x66\x3c\x3c\x42\x42\x00\x00\x00\x00\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x60\x60\x3c\x3c\x66\x66\x3c\x3c\x06\x06\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x7e\x81\x81\x9d\x9d\xb1\xb1\x9d\x9d\x81\x81\x7e\x7e\x00\x00" - "\x1c\x1c\x24\x24\x44\x44\x3c\x3c\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\x00\x00\x33\x33\x66\x66\xcc\xcc\x66\x66\x33\x33\x00\x00\x00\x00" - "\x3e\x3e\x06\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x7e\x81\x81\xb9\xb9\xa5\xa5\xb9\xb9\xa5\xa5\x81\x81\x7e\x7e" - "\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x7e\x7e\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x30\x30\x7c\x7c\x00\x00\x00\x00\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x0c\x0c\x78\x78\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x7f\x7f\x60\x60" - "\x3e\x3e\x7a\x7a\x7a\x7a\x3a\x3a\x0a\x0a\x0a\x0a\x0a\x0a\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x30\x30\x70\x70\x30\x30\x30\x30\x30\x30\x00\x00\x00\x00\x00\x00" - "\x38\x38\x44\x44\x44\x44\x38\x38\x00\x00\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\x66\x66\x33\x33\x66\x66\xcc\xcc\x00\x00\x00\x00" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x32\x32\x66\x66\xcf\xcf\x02\x02" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x3e\x3e\x62\x62\xc4\xc4\x0e\x0e" - "\xc0\xc0\x23\x23\x66\x66\x2c\x2c\xd9\xd9\x33\x33\x67\x67\x01\x01" - "\x18\x18\x00\x00\x18\x18\x30\x30\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x1f\x1f\x3c\x3c\x3c\x3c\x6f\x6f\x7c\x7c\xcc\xcc\xcf\xcf\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x30\x30\x1e\x1e\x0c\x0c\x18\x18" - "\x30\x30\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x66\x66\x00\x00\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\xf6\xf6\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x71\x71\xce\xce\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\xc3\xc3\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x3f\x3f\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\xfc\xfc\x00\x00" - "\x30\x30\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x24\x24\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x08\x08\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\xc0\xc0\xc0\xc0\xfc\xfc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x6c\x6c\x66\x66\x66\x66\x6c\x6c\x60\x60" - "\x30\x30\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x1b\x1b\x7f\x7f\xd8\xd8\x77\x77\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x18\x18" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x60\x60\xfc\xfc\x18\x18\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x00\x00" - "\x30\x30\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x7e\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x02\x02\x7c\x7c\xce\xce\xd6\xd6\xe6\xe6\x7c\x7c\x80\x80" - "\x30\x30\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00\x00" - "\x18\x3e\x60\x60\x3c\x06\x06\x7c\x18\x00\x00\x00\x00\x00" - "\x00\xc0\xc6\xcc\x18\x30\x66\xc6\x06\x00\x00\x00\x00\x00" - "\x38\x6c\x6c\x68\x76\xdc\xcc\xcc\x76\x00\x00\x00\x00\x00" - "\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00\x00" - "\x00\x66\x66\x3c\xff\x3c\x66\x66\x00\x00\x00\x00\x00\x00" - "\x00\x18\x18\x18\x7e\x18\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x03\x06\x04\x0c\x18\x30\x20\x60\xc0\x00\x00\x00\x00" - "\x3c\x66\x66\x76\x7e\x6e\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x18\x38\x38\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x06\x0c\x18\x30\x66\x7e\x00\x00\x00\x00\x00" - "\x3c\x66\x06\x06\x1c\x06\x06\x66\x3c\x00\x00\x00\x00\x00" - "\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00\x00\x00" - "\x7e\x60\x60\x7c\x06\x06\x06\x66\x3c\x00\x00\x00\x00\x00" - "\x1c\x30\x60\x60\x7c\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x7e\x66\x06\x06\x0c\x18\x18\x18\x18\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x66\x3c\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x66\x3e\x06\x06\x0c\x38\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x18\x18\x18\x30\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x06\x06\x0c\x18\x00\x18\x18\x00\x00\x00\x00\x00" - "\x7c\xc6\xc6\xde\xde\xde\xc0\xc0\x78\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x66\x66\x7e\xc3\xc3\xc3\x00\x00\x00\x00\x00" - "\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00\x00\x00" - "\x3c\x66\xc0\xc0\xc0\xc0\xc0\x66\x3c\x00\x00\x00\x00\x00" - "\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00\x00" - "\xfe\x66\x60\x60\x78\x60\x60\x66\xfe\x00\x00\x00\x00\x00" - "\xfe\x66\x60\x60\x78\x60\x60\x60\xf0\x00\x00\x00\x00\x00" - "\x3c\x66\xc0\xc0\xce\xc6\xc6\x66\x3e\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\x7e\x66\x66\x66\x66\x00\x00\x00\x00\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x0e\x06\x06\x06\x06\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\xe6\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00\x00\x00" - "\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00\x00" - "\x82\x82\xc6\xc6\xee\xfe\xd6\xd6\xc6\x00\x00\x00\x00\x00" - "\x86\xc6\xe6\xf6\xfe\xde\xce\xc6\xc2\x00\x00\x00\x00\x00" - "\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00\x00" - "\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00\x00\x00" - "\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x3c\x06\x03\x00\x00\x00" - "\xfc\x66\x66\x66\x7c\x78\x6c\x66\xf3\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x30\x18\x0c\x06\x66\x3c\x00\x00\x00\x00\x00" - "\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00\x00" - "\xc3\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x00\x00\x00\x00\x00" - "\xc6\xc6\xd6\xd6\xfe\xee\xee\xc6\xc6\x00\x00\x00\x00\x00" - "\xc3\xc3\x66\x3c\x18\x3c\x66\xc3\xc3\x00\x00\x00\x00\x00" - "\xc3\xc3\xc3\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\xfe\xc6\x86\x0c\x18\x30\x62\xc6\xfe\x00\x00\x00\x00\x00" - "\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00\x00" - "\x00\xc0\x60\x20\x30\x18\x0c\x04\x06\x03\x00\x00\x00\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00" - "\x18\x18\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\xe0\x60\x60\x6c\x76\x66\x66\x66\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3c\x66\x60\x60\x66\x3c\x00\x00\x00\x00\x00" - "\x0e\x06\x06\x36\x6e\x66\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3c\x66\x66\x7e\x60\x3c\x00\x00\x00\x00\x00" - "\x1c\x36\x30\x30\x78\x30\x30\x30\x78\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3b\x66\x66\x66\x3c\xc6\xc6\x7c\x00\x00\x00" - "\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00\x00\x00" - "\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x06\x06\x00\x06\x06\x06\x06\x06\x06\x66\x3c\x00\x00\x00" - "\xe0\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00\x00\x00" - "\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x00\x00\x00\xcc\xee\xfe\xd6\xd6\xc6\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x3d\x66\x66\x66\x3e\x06\x06\x07\x00\x00\x00" - "\x00\x00\x00\xec\x76\x66\x60\x60\xf0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3e\x70\x38\x1c\x0e\x7c\x00\x00\x00\x00\x00" - "\x08\x18\x18\x3e\x18\x18\x18\x1a\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\xc6\xd6\xd6\xd6\x6c\x6c\x00\x00\x00\x00\x00" - "\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x30\xe0\x00\x00\x00" - "\x00\x00\x00\x7e\x4c\x18\x30\x62\x7e\x00\x00\x00\x00\x00" - "\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00\x00\x00" - "\x62\xba\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xcc\x33\xcc\x33\xcc\x33\xcc\x33\xcc\x33\xcc\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\x0c\x0c\x3e\x6c\x6c\x6c\x3e\x0c\x0c\x00\x00\x00\x00\x00" - "\x1c\x36\x30\x30\x78\x30\x30\x30\x7e\x00\x00\x00\x00\x00" - "\x66\x66\x3c\x66\x66\x66\x3c\x66\x66\x00\x00\x00\x00\x00" - "\x66\x66\x66\x3c\x18\x7e\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00" - "\x3c\x60\x60\x3c\x66\x66\x66\x3c\x06\x06\x3c\x00\x00\x00" - "\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\x81\x9d\xb1\xb1\xb1\x9d\x81\x7e\x00\x00\x00\x00" - "\x3c\xcc\xcc\x76\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x33\x66\xcc\x66\x33\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x06\x06\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xb1\xb9\xb9\xb1\xa9\xa5\x81\x7e\x00\x00\x00\x00" - "\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x7e\x18\x18\x18\x00\x7e\x00\x00\x00\x00\x00" - "\x78\x0c\x0c\x18\x30\x60\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x78\x0c\x0c\x38\x0c\x0c\x78\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x6e\x7a\x60\x60\x00\x00\x00\x00" - "\x7e\xf4\xf4\xf4\x74\x14\x14\x14\x14\x14\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x18\x00\x00\x00" - "\x18\x38\x38\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x66\x3c\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\x66\x33\x66\xcc\x00\x00\x00\x00\x00\x00\x00" - "\x40\xc6\x4c\x58\x72\x66\xce\x02\x02\x00\x00\x00\x00\x00" - "\x20\x63\x26\x2c\x3b\x31\x62\xc4\x0f\x00\x00\x00\x00\x00" - "\xc0\x63\xc6\x6c\xd9\x33\x67\xc1\x01\x00\x00\x00\x00\x00" - "\x18\x18\x00\x18\x30\x60\x60\x66\x3c\x00\x00\x00\x00\x00" - "\x60\x30\x08\x38\x6c\xc6\xfe\xc6\xc6\x00\x00\x00\x00\x00" - "\x0c\x18\x20\x38\x6c\xc6\xfe\xc6\xc6\x00\x00\x00\x00\x00" - "\x30\x48\x84\x38\x6c\xc6\xfe\xc6\xc6\x00\x00\x00\x00\x00" - "\x72\x9c\x00\x38\x6c\xc6\xfe\xc6\xc6\x00\x00\x00\x00\x00" - "\xc6\xc6\x10\x38\x6c\xc6\xfe\xc6\xc6\x00\x00\x00\x00\x00" - "\x38\x6c\x38\x6c\x6c\xfe\xc6\xc6\xc6\x00\x00\x00\x00\x00" - "\x1f\x3c\x3c\x6c\x6f\xfc\xcc\xcc\xcf\x00\x00\x00\x00\x00" - "\x3c\x66\xc0\xc0\xc0\xc0\xc0\x66\x3c\x18\x30\x00\x00\x00" - "\x60\x18\xfe\x60\x60\x7c\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x18\x60\xfe\x60\x60\x7c\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x18\x24\xfe\x60\x60\x7c\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x66\x00\xfe\x60\x60\x7c\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x30\x0c\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x0c\x30\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x18\x24\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x66\x00\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\xf8\x6c\x66\x66\xf6\x66\x66\x6c\xf8\x00\x00\x00\x00\x00" - "\x71\x8e\xc6\xe6\xf6\xde\xce\xc6\xc2\x00\x00\x00\x00\x00" - "\x30\x0c\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00\x00\x00" - "\x0c\x30\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00\x00\x00" - "\x18\x24\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00\x00\x00" - "\x71\x8e\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00\x00\x00" - "\x66\x00\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00\x00\x00" - "\x00\x00\x63\x36\x1c\x1c\x36\x63\x00\x00\x00\x00\x00\x00" - "\x3c\x66\xc7\xcf\xdb\xf3\xe3\x66\x3c\x00\x00\x00\x00\x00" - "\x60\x30\x08\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00\x00" - "\x06\x0c\x10\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00\x00" - "\x18\x24\x00\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00\x00" - "\x66\x66\x00\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00\x00" - "\x06\x18\xc3\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\xf0\x60\x7e\x63\x63\x63\x7e\x60\x60\x60\xf0\x00\x00\x00" - "\x7c\x66\x66\x66\x6c\x66\x66\x66\x6c\x60\x60\x00\x00\x00" - "\x60\x30\x08\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x06\x0c\x10\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x18\x24\x42\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x71\x8e\x00\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x66\x66\x00\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x1b\x7f\xd8\xd8\x77\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3c\x66\x60\x60\x66\x3c\x08\x30\x00\x00\x00" - "\x60\x30\x08\x3c\x66\x66\x7e\x60\x3c\x00\x00\x00\x00\x00" - "\x06\x0c\x10\x3c\x66\x66\x7e\x60\x3c\x00\x00\x00\x00\x00" - "\x18\x24\x42\x3c\x66\x66\x7e\x60\x3c\x00\x00\x00\x00\x00" - "\x66\x66\x00\x3c\x66\x66\x7e\x60\x3c\x00\x00\x00\x00\x00" - "\x60\x30\x08\x38\x18\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x0c\x18\x20\x70\x30\x30\x30\x30\x78\x00\x00\x00\x00\x00" - "\x18\x24\x42\x1c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00\x00\x00" - "\x66\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x6c\x30\xd8\x0c\x7e\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x71\x8e\x00\x7c\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00" - "\x60\x30\x08\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x06\x0c\x10\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x18\x24\x42\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x71\x8e\x00\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x66\x66\x00\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xce\xde\xf6\xe6\x7c\x00\x00\x00\x00\x00" - "\x60\x30\x08\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00\x00" - "\x0c\x18\x20\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00\x00" - "\x30\x48\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00\x00" - "\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00\x00" - "\x06\x0c\x10\x66\x66\x66\x66\x3c\x18\x18\x70\x00\x00\x00" - "\xf0\x60\x60\x7c\x66\x66\x66\x7c\x60\x60\xf0\x00\x00\x00" - "\x66\x66\x00\x66\x66\x66\x66\x3c\x18\x18\x70\x00\x00\x00" - , NULL, "Topaz (Amiga)", CIOLIB_ISO_8859_1} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} -}; -#endif diff --git a/ciolib/ansi_cio.c b/ciolib/ansi_cio.c deleted file mode 100644 index 83d4b5c..0000000 --- a/ciolib/ansi_cio.c +++ /dev/null @@ -1,1036 +0,0 @@ -/* $Id: ansi_cio.c,v 1.86 2020/04/13 18:36:21 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <fcntl.h> -#include <stdarg.h> -#include <stdlib.h> /* malloc */ - -#include <genwrap.h> -#include <threadwrap.h> -#include <semwrap.h> - -#ifdef __unix__ - #include <termios.h> - struct termios tio_default; /* Initial term settings */ -#endif - -#ifdef _WIN32 - #ifndef ENABLE_VIRTUAL_TERMINAL_INPUT - #define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 - #endif - #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING - #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 - #endif -#endif - - -#include "ciolib.h" -#include "ansi_cio.h" - -int CIOLIB_ANSI_TIMEOUT=500; -int (*ciolib_ansi_readbyte_cb)(void)=ansi_readbyte_cb; -int (*ciolib_ansi_writebyte_cb)(const unsigned char ch)=ansi_writebyte_cb; -int (*ciolib_ansi_initio_cb)(void)=ansi_initio_cb; -int (*ciolib_ansi_writestr_cb)(const unsigned char *str, size_t len)=ansi_writestr_cb; - -static sem_t got_key; -static sem_t got_input; -static sem_t used_input; -static sem_t goahead; -static sem_t need_key; -static BOOL sent_ga=FALSE; -static int ansix=1; -static int ansiy=1; - -static int ansi_got_row=0; -static int doorway_enabled=0; - -const int ansi_colours[8]={0,4,2,6,1,5,3,7}; -static WORD ansi_inch; -static int ansi_raw_inch; -static WORD *ansivmem; -static int force_move=1; - -/* Control sequence table definitions. */ -typedef struct -{ - char *pszSequence; - int chExtendedKey; -} tODKeySequence; - -#define ANSI_KEY_UP 72<<8 -#define ANSI_KEY_DOWN 80<<8 -#define ANSI_KEY_RIGHT 0x4d<<8 -#define ANSI_KEY_LEFT 0x4b<<8 -#define ANSI_KEY_HOME 0x47<<8 -#define ANSI_KEY_END 0x4f<<8 -#define ANSI_KEY_F1 0x3b<<8 -#define ANSI_KEY_F2 0x3c<<8 -#define ANSI_KEY_F3 0x3d<<8 -#define ANSI_KEY_F4 0x3e<<8 -#define ANSI_KEY_F5 0x3f<<8 -#define ANSI_KEY_F6 0x40<<8 -#define ANSI_KEY_F7 0x41<<8 -#define ANSI_KEY_F8 0x42<<8 -#define ANSI_KEY_F9 0x43<<8 -#define ANSI_KEY_F10 0x44<<8 -#define ANSI_KEY_PGUP 0x49<<8 -#define ANSI_KEY_PGDN 0x51<<8 -#define ANSI_KEY_INSERT 0x52<<8 -#define ANSI_KEY_DELETE 0x53<<8 -#define ANSI_KEY_F11 0x85<<8 -#define ANSI_KEY_F12 0x86<<8 - -static tODKeySequence ODaKeySequences[] = -{ - /* VT-52 control sequences. */ - {"\033A", ANSI_KEY_UP}, - {"\033B", ANSI_KEY_DOWN}, - {"\033C", ANSI_KEY_RIGHT}, - {"\033D", ANSI_KEY_LEFT}, - {"\033H", ANSI_KEY_HOME}, - {"\033K", ANSI_KEY_END}, - {"\033P", ANSI_KEY_F1}, - {"\033Q", ANSI_KEY_F2}, - {"\033?w", ANSI_KEY_F3}, - {"\033?x", ANSI_KEY_F4}, - {"\033?t", ANSI_KEY_F5}, - {"\033?u", ANSI_KEY_F6}, - {"\033?q", ANSI_KEY_F7}, - {"\033?r", ANSI_KEY_F8}, - {"\033?p", ANSI_KEY_F9}, - - /* Control sequences common to VT-100/VT-102/VT-220/VT-320/ANSI. */ - {"\033[A", ANSI_KEY_UP}, - {"\033[B", ANSI_KEY_DOWN}, - {"\033[C", ANSI_KEY_RIGHT}, - {"\033[D", ANSI_KEY_LEFT}, - {"\033[M", ANSI_KEY_PGUP}, - {"\033[H\x1b[2J", ANSI_KEY_PGDN}, - {"\033[H", ANSI_KEY_HOME}, - {"\033[K", ANSI_KEY_END}, - {"\033OP", ANSI_KEY_F1}, - {"\033OQ", ANSI_KEY_F2}, - {"\033OR", ANSI_KEY_F3}, - {"\033OS", ANSI_KEY_F4}, - - /* VT-220/VT-320 specific control sequences. */ - {"\033[1~", ANSI_KEY_HOME}, /* Windows XP terminal.exe. Is actually FIND */ - {"\033[2~", ANSI_KEY_INSERT}, - {"\033[3~", ANSI_KEY_DELETE}, - {"\033[4~", ANSI_KEY_END}, /* Windows XP terminal.exe. Is actually SELECT */ - {"\033[5~", ANSI_KEY_PGUP}, - {"\033[6~", ANSI_KEY_PGDN}, - {"\033[17~", ANSI_KEY_F6}, - {"\033[18~", ANSI_KEY_F7}, - {"\033[19~", ANSI_KEY_F8}, - {"\033[20~", ANSI_KEY_F9}, - {"\033[21~", ANSI_KEY_F10}, - {"\033[23~", ANSI_KEY_F11}, - {"\033[24~", ANSI_KEY_F12}, - - /* XTerm specific control sequences */ - {"\033[15~", ANSI_KEY_F5}, - - /* Old, deprecated XTerm specific control sequences */ - {"\033[11~", ANSI_KEY_F1}, - {"\033[12~", ANSI_KEY_F2}, - {"\033[13~", ANSI_KEY_F3}, - {"\033[14~", ANSI_KEY_F4}, - - /* ANSI-specific control sequences. */ - {"\033[L", ANSI_KEY_HOME}, - {"\033Ow", ANSI_KEY_F3}, - {"\033Ox", ANSI_KEY_F4}, - {"\033Ot", ANSI_KEY_F5}, - {"\033Ou", ANSI_KEY_F6}, - {"\033Oq", ANSI_KEY_F7}, - {"\033Or", ANSI_KEY_F8}, - {"\033Op", ANSI_KEY_F9}, - - /* ECMA 048-specific control sequences. */ - {"\033[V", ANSI_KEY_PGUP}, - {"\033[U", ANSI_KEY_PGDN}, - {"\033[@", ANSI_KEY_INSERT}, - - - /* PROCOMM-specific control sequences (non-keypad alternatives). */ - {"\033OA", ANSI_KEY_UP}, - {"\033OB", ANSI_KEY_DOWN}, - {"\033OC", ANSI_KEY_RIGHT}, - {"\033OD", ANSI_KEY_LEFT}, - {"\033OH", ANSI_KEY_HOME}, - {"\033OK", ANSI_KEY_END}, - - /* Terminator */ - {"",0} -}; - -#ifdef NEEDS_CFMAKERAW -static void -cfmakeraw(struct termios *t) -{ - t->c_iflag &= ~(IMAXBEL|IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); - t->c_oflag &= ~OPOST; - t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); - t->c_cflag &= ~(CSIZE|PARENB); - t->c_cflag |= CS8; -} -#endif - -/* Do NOT call this to output to the last column of the last row. */ -/* ONLY call this for chars which will move the cursor */ -static void ansi_sendch(char ch) -{ - if(!ch) - ch=' '; - ansix++; - if(ansix>cio_textinfo.screenwidth) { - /* Column 80 sux0rz */ - force_move=1; - ansix=1; - ansiy++; - if(ansiy>cio_textinfo.screenheight) { - ansix=cio_textinfo.screenwidth; - ansiy=cio_textinfo.screenheight; - } - } - if(doorway_enabled && ch < ' ') - ciolib_ansi_writebyte_cb(0); - ciolib_ansi_writebyte_cb((unsigned char)ch); - /* We sent a control char... better make the next movement explicit */ - if(ch<' ' && ch > 0) { - if(doorway_enabled) { - /* In doorway mode, some chars may want to force movement... */ - } - else - force_move=1; - } -} - -static void ansi_sendstr(const char *str,int len) -{ - if(len==-1) - len=strlen(str); - if(len) - ciolib_ansi_writestr_cb((unsigned char *)str, (size_t)len); -} - -static void ansi_gotoxy_abs(int x, int y) -{ - char str[16]; - - str[0]=0; - if(x < 1 - || x > cio_textinfo.screenwidth - || y < 1 - || y > cio_textinfo.screenheight) - return; - - /* ToDo optimizations: use tabs for horizontal movement to tabstops */ - - /* Movement forced... always send position code */ - if(force_move) { - sprintf(str,"\033[%d;%dH",y,x); - ansi_sendstr(str,-1); - force_move=0; - ansiy=y; - ansix=x; - return; - } - - /* Moving to col 1 (and not already there)... use \r */ - if(x==1 && ansix>1) { - ansi_sendstr("\r",1); - ansix=1; - } - - /* Do we even NEED to move? */ - if(x==ansix && y==ansiy) - return; - - /* If we're already on the correct column */ - if(x==ansix) { - /* Do we need to move up? */ - if(y<ansiy) { - if(y==ansiy-1) - /* Only up one */ - strcpy(str,"\033[A"); - else - sprintf(str,"\033[%dA",ansiy-y); - ansi_sendstr(str,-1); - ansiy=y; - return; - } - - /* We must have to move down then. */ - /* Only one, use a newline */ - if(y-ansiy < 4) - ansi_sendstr("\n\n\n",y-ansiy); - else { - sprintf(str,"\033[%dB",y-ansiy); - ansi_sendstr(str,-1); - } - ansiy=y; - return; - } - - /* Ok, we need to change the column then... is the row right though? */ - if(y==ansiy) { - /* Do we need to move left then? */ - if(x<ansix) { - if(x==ansix-1) - strcpy(str,"\033[D"); - else - sprintf(str,"\033[%dD",ansix-x); - ansi_sendstr(str,-1); - ansix=x; - return; - } - - /* Must need to move right then */ -#if 1 - /* Check if we can use spaces */ - if(x-ansix < 5) { - int i,j; - j=1; - /* If all the intervening cells are spaces with the current background, we're good */ - for(i=0; i<x-ansix; i++) { - if((ansivmem[(y-1)*cio_textinfo.screenwidth+ansix-1+i] & 0xff) != ' '/* && (ansivmem[(ansiy-1)*cio_textinfo.screenwidth+ansix-1+i]) & 0xff != 0*/) { - j=0; - break; - } - if((ansivmem[(y-1)*cio_textinfo.screenwidth+ansix-1+i] & 0x7000) != ((cio_textinfo.attribute<<8) & 0x7000)) { - j=0; - break; - } - } - if(j) { - ansi_sendstr(" ",x-ansix); - ansix=x; - return; - } - } -#endif - if(x==ansix+1) - strcpy(str,"\033[C"); - else - sprintf(str,"\033[%dC",x-ansix); - ansi_sendstr(str,-1); - ansix=x; - return; - } - - /* Changing the row and the column... better use a fill movement then. */ - sprintf(str,"\033[%d;%dH",y,x); - ansi_sendstr(str,-1); - ansiy=y; - ansix=x; - return; -} - -void ansi_gotoxy(int x, int y) -{ - ansi_gotoxy_abs(x+cio_textinfo.winleft-1,y+cio_textinfo.wintop-1); - cio_textinfo.curx=x; - cio_textinfo.cury=y; -} - -int ansi_puttext(int sx, int sy, int ex, int ey, void* buf) -{ - int x,y; - int cx,cy,i,j; - unsigned char *out; - WORD sch; - struct text_info ti; - int attrib; - unsigned char *fill = (unsigned char*)buf; - - gettextinfo(&ti); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > ti.screenwidth - || sy > ti.screenheight - || sx > ex - || sy > ey - || ex > ti.screenwidth - || ey > ti.screenheight - || fill==NULL) - return(0); - - /* Check if this actually does anything */ - /* TODO: This assumes a little-endian system! Ack! */ - if(sx==1 && sy==1 && ex==ti.screenwidth && ey==ti.screenheight - && memcmp(buf,ansivmem,ti.screenwidth*ti.screenheight*2)==0) - return(1); - - out=fill; - attrib=ti.attribute; - - i=0; /* Did a nasty. */ - - /* Check if this is a nasty screen clear... */ - j=0; /* We can clearscreen */ - if(!i && sx==1 && sy==1 && ex==ti.screenwidth && ey==ti.screenheight && (*out==' ' || *out==0)) { - j=1; /* We can clearscreen */ - for(cy=sy-1;cy<ey;cy++) { - for(cx=sx-1;cx<ex;cx++) { - if(out[(cy*ti.screenwidth+cx)*2]!=*out - || out[(cy*ti.screenwidth+cx)*2+1]!=*(out+1)) { - j=0; - cx=ex; - cy=ey; - } - } - } - } - if(j) { - textattr(*(out+1)); - /* Many terminals make ESC[2J home the cursor */ - ansi_sendstr("\033[2J\033[1;1H",-1); - ansix=1; - ansiy=1; - memcpy(ansivmem,out,ti.screenwidth*ti.screenheight*2); - i=1; - } -#if 0 - /* Check if this is a scroll */ - if((!i) && sx==1 && sy==1 && ex==ti.screenwidth && ey==ti.screenheight-1 - && memcmp(buf,ansivmem,ti.screenwidth*(ti.screenheight-1)*2)==0) { - /* We need to get to the bottom line... */ - if(ansiy < ti.screenheight) { - if(ansiy > ti.screenheight-4) { - ansi_sendstr("\n\n\n\n\n",ti.screenheight-ansiy-2); - } - else { - sprintf(str,"\033[%dB",ti.screenheight-ansiy-2); - ansi_sendstr(str,-1); - } - } - ansi_sendstr("\n",1); - memcpy(ansivmem,buf,ti.screenwidth*(ti.screenheight-1)*2); - for(x=0;x<ti.screenwidth;x++) - ansivmem[(ti.screenheight-1)*ti.screenwidth+x]=(ti.attribute<<8)|' '; - i=1; - } -#endif -#if 1 - /* Check if this *includes* a scroll */ - if((!i) && sx==1 && sy==1 && ex==ti.screenwidth && ey==ti.screenheight - && memcmp(buf,ansivmem+ti.screenwidth,ti.screenwidth*(ti.screenheight-1)*2)==0) { - /* We need to get to the bottom line... */ - if(ansiy < ti.screenheight) { - if(ansiy > ti.screenheight-4) { - ansi_sendstr("\n\n\n\n\n",ti.screenheight-ansiy-2); - } - else { - char str[6]; - sprintf(str,"\033[%dB",ti.screenheight-ansiy-2); - ansi_sendstr(str,-1); - } - } - ansi_sendstr("\n",1); - memcpy(ansivmem,buf,ti.screenwidth*(ti.screenheight-1)*2); - for(x=0;x<ti.screenwidth;x++) - ansivmem[(ti.screenheight-1)*ti.screenwidth+x]=(ti.attribute<<8)|' '; - out += ti.screenwidth*(ti.screenheight-1)*2; - sy=ti.screenheight; - } -#endif - if(!i) { - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - /* - * Check if we can use clear2eol now... this means the rest of the - * chars on the line are the same attr, and are all spaces or NULLs - * Also, if there's less than four chars left, it's not worth it. - */ - - i=0; /* number of differing chars from screen */ - j=0; /* Can use clrtoeol? */ - for(cx=x; cx<ti.screenwidth; cx++) { - /* First, make sure that the rest are spaces or NULLs */ - if(out[(cx-x)*2] != ' ' && out[(cx-x)*2] != 0) - break; - /* Next, make sure that the attribute is the same */ - if(out[(cx-x)*2+1] != out[1]) - break; - /* Finally, if this isn't what's on screen, increment i */ - if((ansivmem[y*cio_textinfo.screenwidth+cx] & 0xff) != 0 && (ansivmem[y*cio_textinfo.screenwidth+cx] & 0xff) != ' ') - i++; - else if(ansivmem[y*cio_textinfo.screenwidth+cx] >> 8 != out[(cx-x)*2+1]) - i++; - } - if(cx==ti.screenwidth) - j=1; - - if(j && i>3) { - ansi_gotoxy_abs(x+1,y+1); - textattr(*(out+1)); - ansi_sendstr("\033[K",-1); - for(cx=x; cx<ex; cx++) { - ansivmem[y*cio_textinfo.screenwidth+cx]=*(out++); - ansivmem[y*cio_textinfo.screenwidth+cx]|=(*(out++))<<8; - } - break; - } - sch=*(out++); - if(sch==27 && doorway_enabled==0) - sch=' '; - if(sch==0) - sch=' '; - sch |= (*(out++))<<8; - if(ansivmem[y*cio_textinfo.screenwidth+x]==sch) - continue; - ansivmem[y*cio_textinfo.screenwidth+x]=sch; - ansi_gotoxy_abs(x+1,y+1); - if(y>=cio_textinfo.screenheight-1 && x>=cio_textinfo.screenwidth-1) - continue; - if(attrib!=sch>>8) { - textattr(sch>>8); - attrib=sch>>8; - } - ansi_sendch((char)(sch&0xff)); - } - } - } - - if(!puttext_can_move) - gotoxy(ti.curx,ti.cury); - if(attrib!=ti.attribute) - textattr(ti.attribute); - return(1); -} - -int ansi_gettext(int sx, int sy, int ex, int ey, void* buf) -{ - int x,y; - unsigned char *out; - WORD sch; - struct text_info ti; - unsigned char *fill = (unsigned char*)buf; - - gettextinfo(&ti); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > ti.screenwidth - || sy > ti.screenheight - || sx > ex - || sy > ey - || ex > ti.screenwidth - || ey > ti.screenheight - || fill==NULL) - return(0); - - out=fill; - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - sch=ansivmem[y*cio_textinfo.screenwidth+x]; - *(out++)=sch & 0xff; - *(out++)=sch >> 8; - } - } - return(1); -} - -void ansi_textattr(int attr) -{ - char str[16]; - int fg,ofg; - int bg,obg; - int bl,obl; - int br,obr; - int oa; - - str[0]=0; - if(cio_textinfo.attribute==attr) - return; - - bl=attr&0x80; - bg=(attr>>4)&0x7; - fg=attr&0x07; - br=attr&0x08; - - oa=cio_textinfo.attribute; - obl=oa&0x80; - obg=(oa>>4)&0x7; - ofg=oa&0x07; - obr=oa&0x08; - - cio_textinfo.attribute=attr; - - strcpy(str,"\033["); - if(obl!=bl) { - if(!bl) -#if 0 - strcat(str,"25;"); -#else - { - strcat(str,"0;"); - ofg=7; - obg=0; - obr=0; - } -#endif - else - strcat(str,"5;"); - } - if(br!=obr) { - if(br) - strcat(str,"1;"); - else -#if 0 - strcat(str,"22;"); -#else - { - strcat(str,"0;"); - if(bl) - strcat(str,"5;"); - ofg=7; - obg=0; - } -#endif - } - if(fg!=ofg) - sprintf(str+strlen(str),"3%d;",ansi_colours[fg]); - if(bg!=obg) - sprintf(str+strlen(str),"4%d;",ansi_colours[bg]); - str[strlen(str)-1]='m'; - ansi_sendstr(str,-1); - cio_textinfo.attribute=attr; -} - -#if defined(__BORLANDC__) - #pragma argsused -#endif -static void ansi_keyparse(void *par) -{ - int gotesc=0; - int gotnull=0; - char seq[64]; - int ch; - int i; - char *p; - int timeout=0; - int timedout=0; - int unknown=0; - - SetThreadName("ANSI Keyparse"); - seq[0]=0; - for(;;) { - if(ansi_got_row) - sem_wait(&goahead); - if(timedout || unknown) { - for(p=seq;*p;p++) { - ansi_inch=*p; - sem_post(&got_input); - sem_wait(&used_input); - sem_wait(&goahead); - } - gotesc=0; - timeout=0; - seq[0]=0; - } - if(!timedout) - sem_post(&need_key); - timedout=0; - unknown=0; - if(timeout) { - if(sem_trywait_block(&got_key,timeout)) { - timedout=1; - sem_post(&goahead); - continue; - } - } - else - sem_wait(&got_key); - - ch=ansi_raw_inch; - if(ch==-2) { - ansi_inch=0x0100; - sem_post(&got_input); - /* Two-byte code, need to post twice times and wait for one to - be received */ - sem_wait(&used_input); - sem_wait(&goahead); - sem_post(&got_input); - sem_wait(&used_input); - } - if(gotnull==2) { - // 0xe0 enhanced keyboard key... translate to 0x00 key for now. - - ansi_inch=ch<<8; // (ch<<8)|0xe0; - sem_post(&got_input); - /* Two-byte code, need to post twice times and wait for one to - be received */ - sem_wait(&used_input); - sem_wait(&goahead); - sem_post(&got_input); - sem_wait(&used_input); - gotnull=0; - continue; - } - if(gotnull==1) { - if(ch==0xe0) { - gotnull=2; - // Need another key... keep looping. - sem_post(&goahead); - continue; - } - ansi_inch=ch<<8; - sem_post(&got_input); - /* Two-byte code, need to post twice and wait for one to - be received */ - sem_wait(&used_input); - sem_wait(&goahead); - sem_post(&got_input); - sem_wait(&used_input); - gotnull=0; - continue; - } - - switch(gotesc) { - case 1: /* Escape Sequence */ - timeout=CIOLIB_ANSI_TIMEOUT; - seq[strlen(seq)+1]=0; - seq[strlen(seq)]=ch; - if(strlen(seq)>=sizeof(seq)-2) { - gotesc=0; - break; - } - if((ch<'0' || ch>'9') /* End of ESC sequence */ - && ch!=';' - && ch!='?' - && (strlen(seq)==2?ch != '[':1) - && (strlen(seq)==2?ch != 'O':1)) { - unknown=1; - gotesc=0; - timeout=0; - for(i=0;ODaKeySequences[i].pszSequence[0];i++) { - if(!strcmp(seq,ODaKeySequences[i].pszSequence)) { - ansi_inch=ODaKeySequences[i].chExtendedKey; - sem_post(&got_input); - /* Two-byte code, need to post twice and wait for one to - be received */ - sem_wait(&used_input); - sem_wait(&goahead); - sem_post(&got_input); - sem_wait(&used_input); - unknown=0; - seq[0]=0; - break; - } - } - /* ANSI position report? */ - if(ch=='R') { - if(strspn(seq,"\033[0123456789;R")==strlen(seq)) { - p=seq+2; - i=strtol(p,&p,10); - if(i>cio_textinfo.screenheight) { - cio_textinfo.screenheight=i; - if(*p==';') { - i=strtol(p+1, NULL, 10); - if(i>cio_textinfo.screenwidth) - cio_textinfo.screenwidth=i; - } - ansi_got_row=cio_textinfo.screenheight;; - } - } - unknown=0; - } - if(unknown) { - sem_post(&goahead); - continue; - } - } - else { - /* Need more keys... keep looping */ - sem_post(&goahead); - } - break; - default: - if(ch==27) { - seq[0]=27; - seq[1]=0; - gotesc=1; - timeout=CIOLIB_ANSI_TIMEOUT; - /* Need more keys... keep going... */ - sem_post(&goahead); - break; - } - if(ch==10) { - /* The \n that goes with the prev \r (hopefully) */ - /* Eat it and keep chuggin' */ - sem_post(&goahead); - break; - } - if(doorway_enabled && ch==0) { - /* Got a NULL. ASSume this is a doorway mode char */ - gotnull=1; - sem_post(&goahead); - break; - } - ansi_inch=ch; - sem_post(&got_input); - sem_wait(&used_input); - break; - } - } -} - -#if defined(__BORLANDC__) - #pragma argsused -#endif -static void ansi_keythread(void *params) -{ - int sval=1; - - SetThreadName("ANSI Key"); - _beginthread(ansi_keyparse,1024,NULL); - - for(;;) { - sem_wait(&need_key); - /* If you already have a key, don't get another */ - sem_getvalue(&got_key,&sval); - if(!sval) { - ansi_raw_inch=ciolib_ansi_readbyte_cb(); - if(ansi_raw_inch >= 0 || ansi_raw_inch==-2) - sem_post(&got_key); - else - SLEEP(1); - } - else - SLEEP(1); - } -} - -int ansi_kbhit(void) -{ - int sval=1; - - if(!sent_ga) { - sem_post(&goahead); - sent_ga=TRUE; - } - sem_getvalue(&got_input,&sval); - return(sval); -} - -void ansi_setcursortype(int type) -{ - switch(type) { - case _NOCURSOR: - case _SOLIDCURSOR: - default: - break; - } -} - -int ansi_getch(void) -{ - int ch; - - if(!sent_ga) { - sem_post(&goahead); - sent_ga=TRUE; - } - sem_wait(&got_input); - ch=ansi_inch&0xff; - ansi_inch=ansi_inch>>8; - sem_post(&used_input); - sent_ga=FALSE; - return(ch); -} - -void ansi_beep(void) -{ - ansi_sendstr("\7",1); -} - -#if defined(__BORLANDC__) - #pragma argsused -#endif -void ansi_textmode(int mode) -{ - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; - cio_textinfo.attribute=7; - cio_textinfo.normattr=7; - cio_textinfo.currmode=COLOR_MODE; - cio_textinfo.curx=1; - cio_textinfo.cury=1; - ansix=1; - ansiy=1; -} - -#ifdef __unix__ -void ansi_fixterm(void) -{ - tcsetattr(STDIN_FILENO,TCSANOW,&tio_default); -} -#endif - -#ifndef ENABLE_EXTENDED_FLAGS -#define ENABLE_INSERT_MODE 0x0020 -#define ENABLE_QUICK_EDIT_MODE 0x0040 -#define ENABLE_EXTENDED_FLAGS 0x0080 -#define ENABLE_AUTO_POSITION 0x0100 -#endif - -/* - * Returns -1 if no character read or -2 on abort - */ -int ansi_readbyte_cb(void) -{ - unsigned char ch; - - if(fread(&ch,1,1,stdin)!=1) - return(-1); - return(ch); -} - -int ansi_writebyte_cb(const unsigned char ch) -{ - return(fwrite(&ch,1,1,stdout)); -} - -int ansi_writestr_cb(const unsigned char *str, size_t len) -{ - return(fwrite(str,len,1,stdout)); -} - -int ansi_initio_cb(void) -{ -#ifdef _WIN32 - DWORD conmode = 0; - if(isatty(fileno(stdin))) { - if(!SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), ENABLE_VIRTUAL_TERMINAL_INPUT)) - return(0); - - GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &conmode); - if(!SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), conmode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) - return(0); - } - setmode(fileno(stdout),_O_BINARY); - setmode(fileno(stdin),_O_BINARY); - setvbuf(stdout, NULL, _IONBF, 0); -#else - struct termios tio_raw; - - if (isatty(STDIN_FILENO)) { - tcgetattr(STDIN_FILENO,&tio_default); - tio_raw = tio_default; - cfmakeraw(&tio_raw); - tcsetattr(STDIN_FILENO,TCSANOW,&tio_raw); - setvbuf(stdout, NULL, _IONBF, 0); - atexit(ansi_fixterm); - } -#endif - return(0); -} - -#if defined(__BORLANDC__) - #pragma argsused -#endif -int ansi_initciolib(long inmode) -{ - int i; - char *init="\033[s\033[99B\033[99B\033[99B_\033[99C\033[99C\033[99C_\033[6n\033[u\033[0m_\033[2J\033[H"; - time_t start; - - cio_api.options = 0; - - ansi_textmode(1); - cio_textinfo.screenheight=24; - cio_textinfo.screenwidth=80; - ciolib_ansi_initio_cb(); - - sem_init(&got_key,0,0); - sem_init(&got_input,0,0); - sem_init(&used_input,0,0); - sem_init(&goahead,0,0); - sem_init(&need_key,0,0); - - ansi_sendstr(init,-1); - _beginthread(ansi_keythread,1024,NULL); - start=time(NULL); - while(time(NULL)-start < 5 && !ansi_got_row) - SLEEP(1); - if(!ansi_got_row) { - cio_textinfo.screenheight=24; - cio_textinfo.screenwidth=80; - ansi_got_row=24; - } - ansivmem=(WORD *)malloc(cio_textinfo.screenheight*cio_textinfo.screenwidth*sizeof(WORD)); - for(i=0;i<cio_textinfo.screenheight*cio_textinfo.screenwidth;i++) - ansivmem[i]=0x0720; - /* drain all the semaphores */ - sem_reset(&got_key); - sem_reset(&got_input); - sem_reset(&used_input); - sem_reset(&goahead); - sem_reset(&need_key); - return(1); -} - -void ansi_suspend(void) -{ -#if defined _MSC_VER - // Prevents the wait for a key press when exit() is called and the stdin stream is flushed - _unlock_file(stdin); -#endif -} - -CIOLIBEXPORT void ansi_ciolib_setdoorway(int enable) -{ - if(cio_api.mode!=CIOLIB_MODE_ANSI) - return; - switch(enable) { - case 0: - ansi_sendstr("\033[=255l",7); - doorway_enabled=0; - break; - default: - ansi_sendstr("\033[=255h",7); - doorway_enabled=1; - break; - } -} diff --git a/ciolib/ansi_cio.h b/ciolib/ansi_cio.h deleted file mode 100644 index 1a65253..0000000 --- a/ciolib/ansi_cio.h +++ /dev/null @@ -1,77 +0,0 @@ -/* $Id: ansi_cio.h,v 1.11 2018/07/24 01:10:58 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" - -#ifdef __cplusplus -extern "C" { -#endif -extern int CIOLIB_ANSI_TIMEOUT; -extern int (*ciolib_ansi_readbyte_cb)(void); -extern int (*ciolib_ansi_writebyte_cb)(const unsigned char ch); -extern int (*ciolib_ansi_initio_cb)(void); -extern int (*ciolib_ansi_writestr_cb)(const unsigned char *str, size_t len); - -int ansi_readbyte_cb(void); -int ansi_writebyte_cb(const unsigned char ch); -int ansi_initio_cb(void); -int ansi_writestr_cb(const unsigned char *str, size_t len); - -int ansi_puttext(int sx, int sy, int ex, int ey, void *fill); -int ansi_gettext(int sx, int sy, int ex, int ey, void *fill); -void ansi_textattr(int); -int ansi_kbhit(void); -void ansi_delay(long msec); -int ansi_wherey(void); -int ansi_wherex(void); -int ansi_putch(int ch); -void ansi_gotoxy(int x, int y); -int ansi_initciolib(long inmode); -void ansi_gettextinfo(struct text_info *info); -void ansi_setcursortype(int type); -int ansi_getch(void); -int ansi_getche(void); -void ansi_beep(void); -void ansi_textmode(int mode); -void ansi_suspend(void); -#ifdef __cplusplus -} -#endif - diff --git a/ciolib/bitmap_con.c b/ciolib/bitmap_con.c deleted file mode 100644 index 06fabef..0000000 --- a/ciolib/bitmap_con.c +++ /dev/null @@ -1,1785 +0,0 @@ -/* $Id: bitmap_con.c,v 1.148 2020/06/27 00:04:44 deuce Exp $ */ - -#include <stdarg.h> -#include <stdio.h> /* NULL */ -#include <stdlib.h> -#include <string.h> - -#include "threadwrap.h" -#include "semwrap.h" -#include "gen_defs.h" -#include "genwrap.h" -#include "dirwrap.h" -#include "xpbeep.h" -#include "scale.h" - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#include "vidmodes.h" -#include "bitmap_con.h" - -static uint32_t palette[65536]; - -#if 0 - -static int dbg_pthread_mutex_lock(pthread_mutex_t *lptr, unsigned line) -{ - int ret = pthread_mutex_lock(lptr); - - if (ret) - fprintf(stderr, "pthread_mutex_lock() returned %d at %u\n", ret, line); - return ret; -} - -static int dbg_pthread_mutex_unlock(pthread_mutex_t *lptr, unsigned line) -{ - int ret = pthread_mutex_unlock(lptr); - - if (ret) - fprintf(stderr, "pthread_mutex_lock() returned %d at %u\n", ret, line); - return ret; -} - -static int dbg_pthread_mutex_trylock(pthread_mutex_t *lptr, unsigned line) -{ - int ret = pthread_mutex_trylock(lptr); - - if (ret) - fprintf(stderr, "pthread_mutex_lock() returned %d at %u\n", ret, line); - return ret; -} - -#define pthread_mutex_lock(a) dbg_pthread_mutex_lock(a, __LINE__) -#define pthread_mutex_unlock(a) dbg_pthread_mutex_unlock(a, __LINE__) -#define pthread_mutex_trylock(a) dbg_pthread_trymutex_lock(a, __LINE__) - -#endif - -/* Structs */ - -struct bitmap_screen { - uint32_t *screen; - int screenwidth; - int screenheight; - pthread_mutex_t screenlock; - int update_pixels; - struct rectlist *rect; -}; - -struct bitmap_callbacks { - void (*drawrect) (struct rectlist *data); - void (*flush) (void); - pthread_mutex_t lock; - unsigned rects; -}; - -/* Static globals */ - -static int default_font=-99; -static int current_font[4]={-99, -99, -99, -99}; -static int bitmap_initialized=0; -static struct bitmap_screen screena; -static struct bitmap_screen screenb; -struct video_stats vstat; -static struct bitmap_callbacks callbacks; -static unsigned char *font[4]; -static int force_redraws=0; -static int force_cursor=0; -struct rectlist *free_rects; -pthread_mutex_t free_rect_lock; - -/* The read lock must be held here. */ -#define PIXEL_OFFSET(screen, x, y) ( (y)*(screen).screenwidth+(x) ) - -/* Exported globals */ - -pthread_mutex_t vstatlock; -pthread_mutex_t blinker_lock; - -/* Forward declarations */ - -static int bitmap_loadfont_locked(const char *filename); -static void set_vmem_cell(struct vstat_vmem *vmem_ptr, size_t pos, uint16_t cell, uint32_t fg, uint32_t bg); -static int bitmap_attr2palette_locked(uint8_t attr, uint32_t *fgp, uint32_t *bgp); -static void cb_drawrect(struct rectlist *data); -static void request_redraw_locked(void); -static void request_redraw(void); -static void memset_u32(void *buf, uint32_t u, size_t len); -static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos); -static void cb_flush(void); -static int check_redraw(void); -static void blinker_thread(void *data); -static __inline void both_screens(struct bitmap_screen** current, struct bitmap_screen** noncurrent); -static int update_from_vmem(int force); -static int bitmap_vmem_puttext_locked(int sx, int sy, int ex, int ey, struct vmem_cell *fill); -static uint32_t color_value(uint32_t col); -void bitmap_drv_free_rect(struct rectlist *rect); - -/**************************************************************/ -/* These functions get called from the driver and ciolib only */ -/**************************************************************/ - -static int bitmap_loadfont_locked(const char *filename) -{ - static char current_filename[MAX_PATH]; - unsigned int fontsize; - int fdw; - int fw; - int fh; - int i; - FILE *fontfile=NULL; - - if(!bitmap_initialized) - return(0); - if(current_font[0]==-99 || current_font[0]>(sizeof(conio_fontdata)/sizeof(struct conio_font_data_struct)-2)) { - for(i=0; conio_fontdata[i].desc != NULL; i++) { - if(!strcmp(conio_fontdata[i].desc, "Codepage 437 English")) { - current_font[0]=i; - break; - } - } - if(conio_fontdata[i].desc==NULL) - current_font[0]=0; - } - if(current_font[0]==-1) - filename=current_filename; - else if(conio_fontdata[current_font[0]].desc==NULL) - return(0); - - for (i=1; i<sizeof(current_font)/sizeof(current_font[0]); i++) { - if(current_font[i] == -1) - ; - else if (current_font[i] < 0) - current_font[i]=current_font[0]; - else if(conio_fontdata[current_font[i]].desc==NULL) - current_font[i]=current_font[0]; - } - - fh=vstat.charheight; - fdw = vstat.charwidth - (vstat.flags & VIDMODES_FLAG_EXPAND) ? 1 : 0; - fw = fdw / 8 + (fdw % 8 ? 1 : 0); - - fontsize=fw*fh*256*sizeof(unsigned char); - - for (i=0; i<sizeof(font)/sizeof(font[0]); i++) { - if(font[i]) - FREE_AND_NULL(font[i]); - if((font[i]=(unsigned char *)malloc(fontsize))==NULL) - goto error_return; - } - - if(filename != NULL) { - if(flength(filename)!=fontsize) - goto error_return; - if((fontfile=fopen(filename,"rb"))==NULL) - goto error_return; - if(fread(font[0], 1, fontsize, fontfile)!=fontsize) - goto error_return; - fclose(fontfile); - fontfile=NULL; - current_font[0]=-1; - if(filename != current_filename) - SAFECOPY(current_filename,filename); - for (i=1; i<sizeof(font)/sizeof(font[0]); i++) { - if (current_font[i]==-1) - memcpy(font[i], font[0], fontsize); - } - } - for (i=0; i<sizeof(font)/sizeof(font[0]); i++) { - if (current_font[i] < 0) - continue; - switch(fdw) { - case 8: - switch(vstat.charheight) { - case 8: - if(conio_fontdata[current_font[i]].eight_by_eight==NULL) { - if (i==0) - goto error_return; - else - FREE_AND_NULL(font[i]); - } - else - memcpy(font[i], conio_fontdata[current_font[i]].eight_by_eight, fontsize); - break; - case 14: - if(conio_fontdata[current_font[i]].eight_by_fourteen==NULL) { - if (i==0) - goto error_return; - else - FREE_AND_NULL(font[i]); - } - else - memcpy(font[i], conio_fontdata[current_font[i]].eight_by_fourteen, fontsize); - break; - case 16: - if(conio_fontdata[current_font[i]].eight_by_sixteen==NULL) { - if (i==0) - goto error_return; - else - FREE_AND_NULL(font[i]); - } - else - memcpy(font[i], conio_fontdata[current_font[i]].eight_by_sixteen, fontsize); - break; - default: - goto error_return; - } - break; - default: - goto error_return; - } - } - - return(1); - -error_return: - for (i=0; i<sizeof(font)/sizeof(font[0]); i++) - FREE_AND_NULL(font[i]); - if(fontfile) - fclose(fontfile); - return(0); -} - -/***************************************************/ -/* These functions get called from the driver only */ -/***************************************************/ - -/***********************************************/ -/* These functions get called from ciolib only */ -/***********************************************/ - -static int bitmap_vmem_puttext_locked(int sx, int sy, int ex, int ey, struct vmem_cell *fill) -{ - int x,y; - struct vstat_vmem *vmem_ptr; - - if(!bitmap_initialized) - return(0); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cio_textinfo.screenwidth - || sy > cio_textinfo.screenheight - || sx > ex - || sy > ey - || ex > cio_textinfo.screenwidth - || ey > cio_textinfo.screenheight - || fill==NULL) - return(0); - - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - memcpy(&vmem_ptr->vmem[y*cio_textinfo.screenwidth+x], fill++, sizeof(*fill)); - bitmap_draw_one_char(x+1, y+1); - } - } - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - return(1); -} - -static void -set_vmem_cell(struct vstat_vmem *vmem_ptr, size_t pos, uint16_t cell, uint32_t fg, uint32_t bg) -{ - int altfont; - int font; - - bitmap_attr2palette_locked(cell>>8, fg == 0xffffff ? &fg : NULL, bg == 0xffffff ? &bg : NULL); - - altfont = (cell>>11 & 0x01) | ((cell>>14) & 0x02); - if (!vstat.bright_altcharset) - altfont &= ~0x01; - if (!vstat.blink_altcharset) - altfont &= ~0x02; - font=current_font[altfont]; - if (font == -99) - font = default_font; - if (font < 0 || font > 255) - font = 0; - - vmem_ptr->vmem[pos].legacy_attr = cell >> 8; - vmem_ptr->vmem[pos].ch = cell & 0xff; - vmem_ptr->vmem[pos].fg = fg; - vmem_ptr->vmem[pos].bg = bg; - vmem_ptr->vmem[pos].font = font; -} - -static int bitmap_attr2palette_locked(uint8_t attr, uint32_t *fgp, uint32_t *bgp) -{ - uint32_t fg = attr & 0x0f; - uint32_t bg = (attr >> 4) & 0x0f; - - if(!vstat.bright_background) - bg &= 0x07; - if(vstat.no_bright) - fg &= 0x07; - - if (fgp) - *fgp = vstat.palette[fg]; - if (bgp) - *bgp = vstat.palette[bg]; - - return 1; -} - -/**********************************************************************/ -/* These functions get called from ciolib and the blinker thread only */ -/**********************************************************************/ - -static int -cursor_visible_locked(void) -{ - if (!vstat.curs_visible) - return 0; - if (vstat.curs_start > vstat.curs_end) - return 0; - if (vstat.curs_blinks) { - if (vstat.curs_blink) - return 1; - return 0; - } - return 1; -} - -static void cb_drawrect(struct rectlist *data) -{ - int x, y; - uint32_t *pixel; - uint32_t cv; - - if (data == NULL) - return; - /* - * Draw the cursor if it's visible - * 1) It's located at vstat.curs_col/vstat.curs_row. - * 2) The size is defined by vstat.curs_start and vstat.curs_end... - * the are both rows from the top of the cell. - * If vstat.curs_start > vstat.curs_end, the cursor is not shown. - * 3) If vstat.curs_visible is false, the cursor is not shown. - * 4) If vstat.curs_blinks is false, the cursor does not blink. - * 5) When blinking, the cursor is shown when vstat.blink is true. - */ - pthread_mutex_lock(&vstatlock); - if (cursor_visible_locked()) { - cv = color_value(ciolib_fg); - for (y = vstat.curs_start; y <= vstat.curs_end; y++) { - pixel = &data->data[((vstat.curs_row - 1) * vstat.charheight + y) * data->rect.width + (vstat.curs_col - 1) * vstat.charwidth]; - for (x = 0; x < vstat.charwidth; x++) { - *(pixel++) = cv; - } - } - } - pthread_mutex_unlock(&vstatlock); - pthread_mutex_lock(&callbacks.lock); - callbacks.drawrect(data); - callbacks.rects++; - pthread_mutex_unlock(&callbacks.lock); -} - -static void request_redraw_locked(void) -{ - force_redraws = 1; -} - -static void request_redraw(void) -{ - pthread_mutex_lock(&vstatlock); - request_redraw_locked(); - pthread_mutex_unlock(&vstatlock); -} - -/* - * Called with the screen lock held - */ -static struct rectlist *alloc_full_rect(struct bitmap_screen *screen) -{ - struct rectlist * ret; - - pthread_mutex_lock(&free_rect_lock); - while (free_rects) { - if (free_rects->rect.width == screen->screenwidth && free_rects->rect.height == screen->screenheight) { - ret = free_rects; - free_rects = free_rects->next; - ret->next = NULL; - ret->rect.x = ret->rect.y = 0; - pthread_mutex_unlock(&free_rect_lock); - return ret; - } - else { - free(free_rects->data); - ret = free_rects->next; - free(free_rects); - free_rects = ret; - } - } - pthread_mutex_unlock(&free_rect_lock); - - ret = malloc(sizeof(struct rectlist)); - ret->next = NULL; - ret->rect.x = 0; - ret->rect.y = 0; - ret->rect.width = screen->screenwidth; - ret->rect.height = screen->screenheight; - ret->data = malloc(ret->rect.width * ret->rect.height * sizeof(ret->data[0])); - if (ret->data == NULL) - FREE_AND_NULL(ret); - return ret; -} - -static uint32_t color_value(uint32_t col) -{ - if (col & 0x80000000) - return col & 0xffffff; - if ((col & 0xffffff) < sizeof(palette) / sizeof(palette[0])) - return palette[col & 0xffffff] & 0xffffff; - fprintf(stderr, "Invalid colour value: %08x\n", col); - return 0; -} - -static struct rectlist *get_full_rectangle_locked(struct bitmap_screen *screen) -{ - struct rectlist *rect; - - // TODO: Some sort of caching here would make things faster...? - if(callbacks.drawrect) { - rect = alloc_full_rect(screen); - if (!rect) - return rect; - memcpy(rect->data, screen->rect->data, sizeof(*rect->data) * screen->screenwidth * screen->screenheight); - return rect; - } - return NULL; -} - -static void memset_u32(void *buf, uint32_t u, size_t len) -{ - size_t i; - char *cbuf = buf; - - for (i = 0; i < len; i++) { - memcpy(cbuf, &u, sizeof(uint32_t)); - cbuf += sizeof(uint32_t); - } -} - -/* - * vstatlock needs to be held. - */ -static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) -{ - uint32_t fg; - uint32_t bg; - int fdw; - int xoffset=(xpos-1)*vstat.charwidth; - int yoffset=(ypos-1)*vstat.charheight; - int x; - int fdx; - uint8_t fb = 0; - int y; - int fontoffset; - int pixeloffset; - unsigned char *this_font; - WORD sch; - struct vstat_vmem *vmem_ptr; - BOOL draw_fg = TRUE; - - if(!bitmap_initialized) { - return(-1); - } - - vmem_ptr = vstat.vmem; - - if(!vmem_ptr) { - return(-1); - } - - sch=vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].legacy_attr << 8 | vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].ch; - fg = vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].fg; - bg = vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].bg; - - if (vstat.forced_font) { - this_font = vstat.forced_font; - } - else { - if (current_font[0] == -1) - this_font = font[0]; - else { - switch (vstat.charheight) { - case 8: - this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].font].eight_by_eight; - break; - case 14: - this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].font].eight_by_fourteen; - break; - case 16: - this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].font].eight_by_sixteen; - break; - default: - return(-1); - } - } - } - if (this_font == NULL) - this_font = font[0]; - fdw = vstat.charwidth - (vstat.flags & VIDMODES_FLAG_EXPAND) ? 1 : 0; - fontoffset=(sch & 0xff) * (vstat.charheight * ((fdw + 7) / 8)); - - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - - if ((xoffset + vstat.charwidth > screena.screenwidth) || (yoffset + vstat.charheight > screena.screenheight) || - (xoffset + vstat.charwidth > screenb.screenwidth) || (yoffset + vstat.charheight > screenb.screenheight)) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - return(-1); - } - - if((!screena.screen) || (!screenb.screen)) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - return(-1); - } - - draw_fg = ((!(sch & 0x8000)) || vstat.no_blink); - pixeloffset = PIXEL_OFFSET(screena, xoffset, yoffset); - for(y=0; y<vstat.charheight; y++) { - for(x=0; x<vstat.charwidth; x++) { - fdx = x; - fb = this_font[fontoffset]; - if ((x & 0x07) == 7) - fontoffset++; - if (vstat.flags & VIDMODES_FLAG_EXPAND) { - if (x == vstat.charwidth - 1) { - fontoffset--; - fdx--; - if (!(vstat.flags & VIDMODES_FLAG_LINE_GRAPHICS_EXPAND)) { - fb = 0; - } - else if ((sch & 0xff) >= 0xC0 && (sch & 0xff) <= 0xDF) { - fb = this_font[fontoffset]; - } - else - fb = 0; - - } - } - - if(fb & (0x80 >> (fdx & 7)) && draw_fg) { - if (screena.screen[pixeloffset] != fg) { - screena.update_pixels = 1; - screena.screen[pixeloffset] = fg; - screena.rect->data[pixeloffset] = color_value(fg); - } - } - else { - if (screena.screen[pixeloffset] != bg) { - screena.update_pixels = 1; - screena.screen[pixeloffset] = bg; - screena.rect->data[pixeloffset] = color_value(bg); - } - } - - if(fb & (0x80 >> (fdx & 7))) { - if (screenb.screen[pixeloffset] != fg) { - screenb.update_pixels = 1; - screenb.screen[pixeloffset] = fg; - screenb.rect->data[pixeloffset] = color_value(fg); - } - } - else { - if (screenb.screen[pixeloffset] != bg) { - screenb.update_pixels = 1; - screenb.screen[pixeloffset]=bg; - screenb.rect->data[pixeloffset] = color_value(bg); - } - } - pixeloffset++; - } - if (x & 0x07) - fontoffset++; - pixeloffset += screena.screenwidth - vstat.charwidth; - } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - - return(0); -} - -/***********************************************************/ -/* These functions get called from the blinker thread only */ -/***********************************************************/ - -static void cb_flush(void) -{ - pthread_mutex_lock(&callbacks.lock); - if (callbacks.rects) { - callbacks.flush(); - callbacks.rects = 0; - } - pthread_mutex_unlock(&callbacks.lock); -} - -static int check_redraw(void) -{ - int ret; - - pthread_mutex_lock(&vstatlock); - ret = force_redraws; - force_redraws = 0; - pthread_mutex_unlock(&vstatlock); - return ret; -} - -/* Blinker Thread */ -static void blinker_thread(void *data) -{ - void *rect; - int count=0; - int curs_changed; - int blink_changed; - struct bitmap_screen *screen; - struct bitmap_screen *ncscreen; - - SetThreadName("Blinker"); - while(1) { - curs_changed = 0; - blink_changed = 0; - do { - SLEEP(10); - both_screens(&screen, &ncscreen); - } while (screen->screen == NULL); - count++; - if (count==25) { - pthread_mutex_lock(&vstatlock); - curs_changed = cursor_visible_locked(); - if(vstat.curs_blink) - vstat.curs_blink=FALSE; - else - vstat.curs_blink=TRUE; - curs_changed = (curs_changed != cursor_visible_locked()); - pthread_mutex_unlock(&vstatlock); - } - if(count==50) { - pthread_mutex_lock(&vstatlock); - if(vstat.blink) - vstat.blink=FALSE; - else - vstat.blink=TRUE; - blink_changed = 1; - curs_changed = cursor_visible_locked(); - if(vstat.curs_blink) - vstat.curs_blink=FALSE; - else - vstat.curs_blink=TRUE; - curs_changed = (curs_changed != cursor_visible_locked()); - count=0; - pthread_mutex_unlock(&vstatlock); - } - /* Lock out ciolib while we handle shit */ - pthread_mutex_lock(&blinker_lock); - if (check_redraw()) { - if (update_from_vmem(TRUE)) - request_redraw(); - } - else { - if (count==0) - if (update_from_vmem(FALSE)) - request_redraw(); - } - pthread_mutex_lock(&screen->screenlock); - // TODO: Maybe we can optimize the blink_changed forced update? - if (screen->update_pixels || curs_changed || blink_changed) { - // If the other screen is update_pixels == 2, clear it. - pthread_mutex_lock(&ncscreen->screenlock); - if (ncscreen->update_pixels == 2) - ncscreen->update_pixels = 0; - pthread_mutex_unlock(&ncscreen->screenlock); - rect = get_full_rectangle_locked(screen); - screen->update_pixels = 0; - pthread_mutex_unlock(&screen->screenlock); - cb_drawrect(rect); - } - else { - if (force_cursor) { - rect = get_full_rectangle_locked(screen); - } - pthread_mutex_unlock(&screen->screenlock); - if (force_cursor) { - cb_drawrect(rect); - force_cursor = 0; - } - } - cb_flush(); - pthread_mutex_unlock(&blinker_lock); - } -} - -static __inline struct bitmap_screen *noncurrent_screen_locked(void) -{ - if (vstat.blink) - return &screenb; - return &screena; -} - -static __inline struct bitmap_screen *current_screen_locked(void) -{ - if (vstat.blink) - return &screena; - return(&screenb); -} - -static __inline void both_screens(struct bitmap_screen** current, struct bitmap_screen** noncurrent) -{ - pthread_mutex_lock(&vstatlock); - *current = current_screen_locked(); - *noncurrent = noncurrent_screen_locked(); - pthread_mutex_unlock(&vstatlock); -} - -/* - * Updates any changed cells... blinking, modified flags, and the cursor - * Is also used (with force = TRUE) to completely redraw the screen from - * vmem (such as in the case of a font load). - */ -static int update_from_vmem(int force) -{ - static struct video_stats vs; - struct vstat_vmem *vmem_ptr; - int x,y,width,height; - unsigned int pos; - - int bright_attr_changed=0; - int blink_attr_changed=0; - - if(!bitmap_initialized) - return(-1); - - width=cio_textinfo.screenwidth; - height=cio_textinfo.screenheight; - - pthread_mutex_lock(&vstatlock); - - if (vstat.vmem == NULL) { - pthread_mutex_unlock(&vstatlock); - return -1; - } - - if(vstat.vmem->vmem == NULL) { - pthread_mutex_unlock(&vstatlock); - return -1; - } - - /* If we change window size, redraw everything */ - if(vs.cols!=vstat.cols || vs.rows != vstat.rows) { - /* Force a full redraw */ - width=vstat.cols; - height=vstat.rows; - force=1; - } - - /* Did the meaning of the blink bit change? */ - if (vstat.bright_background != vs.bright_background || - vstat.no_blink != vs.no_blink || - vstat.blink_altcharset != vs.blink_altcharset) - blink_attr_changed = 1; - - /* Did the meaning of the bright bit change? */ - if (vstat.no_bright != vs.no_bright || - vstat.bright_altcharset != vs.bright_altcharset) - bright_attr_changed = 1; - - /* Get vmem pointer */ - vmem_ptr = get_vmem(&vstat); - - /* - * Now we go through each character seeing if it's changed (or force is set) - * We combine updates into rectangles by lines... - * - * First, in the same line, we build this_rect. - * At the end of the line, if this_rect is the same width as the screen, - * we add it to last_rect. - */ - - for(y=0;y<height;y++) { - pos=y*vstat.cols; - for(x=0;x<width;x++) { - /* Last this char been updated? */ - if(force /* Forced */ - || ((vstat.vmem->vmem[pos].legacy_attr & 0x80) && blink_attr_changed) - || ((vstat.vmem->vmem[pos].legacy_attr & 0x08) && bright_attr_changed)) /* Bright char */ - { - bitmap_draw_one_char(x+1,y+1); - } - pos++; - } - } - release_vmem(vmem_ptr); - - pthread_mutex_unlock(&vstatlock); - - vs = vstat; - - return(0); -} - -/*************************************/ - -/**********************/ -/* Called from ciolib */ -/**********************/ -int bitmap_puttext(int sx, int sy, int ex, int ey, void *fill) -{ - int x, y; - int ret = 1; - uint16_t *buf = fill; - struct vstat_vmem *vmem_ptr; - - pthread_mutex_lock(&blinker_lock); - - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - set_vmem_cell(vmem_ptr, y*cio_textinfo.screenwidth+x, *(buf++), 0x00ffffff, 0x00ffffff); - bitmap_draw_one_char(x+1, y+1); - } - } - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return ret; -} - -int bitmap_vmem_puttext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) -{ - int ret; - - if(!bitmap_initialized) - return(0); - - pthread_mutex_lock(&blinker_lock); - ret = bitmap_vmem_puttext_locked(sx, sy, ex, ey, fill); - pthread_mutex_unlock(&blinker_lock); - - return ret; -} - -int bitmap_vmem_gettext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) -{ - int x,y; - struct vstat_vmem *vmem_ptr; - - if(!bitmap_initialized) - return(0); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > ex - || sy > ey - || ex > cio_textinfo.screenwidth - || ey > cio_textinfo.screenheight - || fill==NULL) { - return(0); - } - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) - memcpy(fill++, &vmem_ptr->vmem[y*cio_textinfo.screenwidth+x], sizeof(*fill)); - } - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return(1); -} - -void bitmap_gotoxy(int x, int y) -{ - if(!bitmap_initialized) - return; - /* Move cursor location */ - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if (vstat.curs_col != x + cio_textinfo.winleft - 1 || vstat.curs_row != y + cio_textinfo.wintop - 1) { - cio_textinfo.curx=x; - cio_textinfo.cury=y; - vstat.curs_col = x + cio_textinfo.winleft - 1; - vstat.curs_row = y + cio_textinfo.wintop - 1; - if (cursor_visible_locked()) - force_cursor = 1; - } - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -void bitmap_setcursortype(int type) -{ - if(!bitmap_initialized) - return; - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - switch(type) { - case _NOCURSOR: - vstat.curs_start=0xff; - vstat.curs_end=0; - break; - case _SOLIDCURSOR: - vstat.curs_start=0; - vstat.curs_end=vstat.charheight-1; - force_cursor = 1; - break; - default: - vstat.curs_start = vstat.default_curs_start; - vstat.curs_end = vstat.default_curs_end; - force_cursor = 1; - break; - } - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -int bitmap_setfont(int font, int force, int font_num) -{ - int changemode=0; - int newmode=-1; - struct text_info ti; - struct vmem_cell *old; - int ow,oh; - int row,col; - struct vmem_cell *new; - int attr; - struct vmem_cell *pold; - struct vmem_cell *pnew; - - if(!bitmap_initialized) - return(0); - if(font < 0 || font>(sizeof(conio_fontdata)/sizeof(struct conio_font_data_struct)-2)) - return(0); - - if(conio_fontdata[font].eight_by_sixteen!=NULL) - newmode=C80; - else if(conio_fontdata[font].eight_by_fourteen!=NULL) - newmode=C80X28; - else if(conio_fontdata[font].eight_by_eight!=NULL) - newmode=C80X50; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - switch(vstat.charheight) { - case 8: - if(conio_fontdata[font].eight_by_eight==NULL) { - if(!force) - goto error_return; - else - changemode=1; - } - break; - case 14: - if(conio_fontdata[font].eight_by_fourteen==NULL) { - if(!force) - goto error_return; - else - changemode=1; - } - break; - case 16: - if(conio_fontdata[font].eight_by_sixteen==NULL) { - if(!force) - goto error_return; - else - changemode=1; - } - break; - } - if(changemode && (newmode==-1 || font_num > 1)) - goto error_return; - switch(font_num) { - case 0: - default_font=font; - /* Fall-through */ - case 1: - current_font[0]=font; - break; - case 2: - case 3: - case 4: - current_font[font_num-1]=font; - break; - } - - if(changemode) { - gettextinfo(&ti); - - attr=ti.attribute; - ow=ti.screenwidth; - oh=ti.screenheight; - - old=malloc(ow*oh*sizeof(*old)); - if(old) { - bitmap_vmem_gettext(1,1,ow,oh,old); - textmode(newmode); - new=malloc(ti.screenwidth*ti.screenheight*sizeof(*new)); - if(!new) { - free(old); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return 0; - } - pold=old; - pnew=new; - for(row=0; row<ti.screenheight; row++) { - for(col=0; col<ti.screenwidth; col++) { - if(row < oh) { - if(col < ow) { - memcpy(new, old, sizeof(*old)); - new->font = font; - new++; - old++; - } - else { - new->ch=' '; - new->legacy_attr=attr; - new->font = font; - new->fg = ciolib_fg; - new->bg = ciolib_bg; - new++; - } - } - else { - new->ch=' '; - new->legacy_attr=attr; - new->font = font; - new->fg = ciolib_fg; - new->bg = ciolib_bg; - new++; - } - } - if(row < oh) { - for(;col<ow;col++) - old++; - } - } - bitmap_vmem_puttext(1,1,ti.screenwidth,ti.screenheight,pnew); - free(pnew); - free(pold); - } - else { - FREE_AND_NULL(old); - } - } - bitmap_loadfont_locked(NULL); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return(1); - -error_return: - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return(0); -} - -int bitmap_getfont(int font_num) -{ - int ret; - - pthread_mutex_lock(&blinker_lock); - if (font_num == 0) - ret = default_font; - else if (font_num > 4) - ret = -1; - else - ret = current_font[font_num - 1]; - pthread_mutex_unlock(&blinker_lock); - - return ret; -} - -int bitmap_loadfont(const char *filename) -{ - int ret; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - ret = bitmap_loadfont_locked(filename); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return ret; -} - -int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy) -{ - int direction=1; - int cy; - int destoffset; - int sourcepos; - int width=ex-x+1; - int height=ey-y+1; - struct vstat_vmem *vmem_ptr; - int32_t sdestoffset; - size_t ssourcepos; - int32_t screeny; - - if( x<1 - || y<1 - || ex<1 - || ey<1 - || tox<1 - || toy<1 - || x>cio_textinfo.screenwidth - || ex>cio_textinfo.screenwidth - || tox>cio_textinfo.screenwidth - || y>cio_textinfo.screenheight - || ey>cio_textinfo.screenheight - || toy>cio_textinfo.screenheight) { - return(0); - } - - if(toy > y) - direction=-1; - - pthread_mutex_lock(&blinker_lock); - if (direction == -1) { - sourcepos=(y+height-2)*cio_textinfo.screenwidth+(x-1); - destoffset=(((toy+height-2)*cio_textinfo.screenwidth+(tox-1))-sourcepos); - } - else { - sourcepos=(y-1)*cio_textinfo.screenwidth+(x-1); - destoffset=(((toy-1)*cio_textinfo.screenwidth+(tox-1))-sourcepos); - } - - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(cy=0; cy<height; cy++) { - memmove(&(vmem_ptr->vmem[sourcepos+destoffset]), &(vmem_ptr->vmem[sourcepos]), sizeof(vmem_ptr->vmem[0])*width); - sourcepos += direction * cio_textinfo.screenwidth; - } - - if (direction == -1) { - ssourcepos=((y + height - 1) * vstat.charheight - 1) * vstat.scrnwidth + (x - 1) * vstat.charwidth; - sdestoffset=((((toy + height - 1) * vstat.charheight - 1) * vstat.scrnwidth + (tox - 1) * vstat.charwidth) - ssourcepos); - } - else { - ssourcepos=(y - 1) * vstat.scrnwidth * vstat.charheight + (x - 1) * vstat.charwidth; - sdestoffset=(((toy - 1) * vstat.scrnwidth * vstat.charheight + (tox - 1) * vstat.charwidth) - ssourcepos); - } - - pthread_mutex_lock(&screena.screenlock); - for(screeny=0; screeny < height*vstat.charheight; screeny++) { - memmove(&(screena.screen[ssourcepos+sdestoffset]), &(screena.screen[ssourcepos]), sizeof(screena.screen[0])*width*vstat.charwidth); - memmove(&(screena.rect->data[ssourcepos+sdestoffset]), &(screena.rect->data[ssourcepos]), sizeof(screena.screen[0])*width*vstat.charwidth); - ssourcepos += direction * vstat.scrnwidth; - } - screena.update_pixels = 1; - pthread_mutex_unlock(&screena.screenlock); - - if (direction == -1) { - ssourcepos=((y+height-1) *vstat.charheight-1)*vstat.scrnwidth + (x-1) *vstat.charwidth; - sdestoffset=((((toy+height-1)*vstat.charheight-1)*vstat.scrnwidth + (tox-1)*vstat.charwidth)-ssourcepos); - } - else { - ssourcepos=(y-1) *vstat.scrnwidth*vstat.charheight + (x-1) *vstat.charwidth; - sdestoffset=(((toy-1)*vstat.scrnwidth*vstat.charheight + (tox-1)*vstat.charwidth)-ssourcepos); - } - - pthread_mutex_lock(&screenb.screenlock); - for(screeny=0; screeny < height*vstat.charheight; screeny++) { - memmove(&(screenb.screen[ssourcepos+sdestoffset]), &(screenb.screen[ssourcepos]), sizeof(screenb.screen[0])*width*vstat.charwidth); - memmove(&(screenb.rect->data[ssourcepos+sdestoffset]), &(screenb.rect->data[ssourcepos]), sizeof(screenb.screen[0])*width*vstat.charwidth); - ssourcepos += direction * vstat.scrnwidth; - } - screenb.update_pixels = 1; - pthread_mutex_unlock(&screenb.screenlock); - - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - - return(1); -} - -void bitmap_clreol(void) -{ - int pos,x; - WORD fill=(cio_textinfo.attribute<<8)|' '; - struct vstat_vmem *vmem_ptr; - int row; - - pthread_mutex_lock(&blinker_lock); - row = cio_textinfo.cury + cio_textinfo.wintop - 1; - pos=(row - 1)*cio_textinfo.screenwidth; - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(x=cio_textinfo.curx+cio_textinfo.winleft-2; x<cio_textinfo.winright; x++) { - set_vmem_cell(vmem_ptr, pos+x, fill, ciolib_fg, ciolib_bg); - bitmap_draw_one_char(x+1, row); - } - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -void bitmap_clrscr(void) -{ - int x,y; - WORD fill=(cio_textinfo.attribute<<8)|' '; - struct vstat_vmem *vmem_ptr; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(y = cio_textinfo.wintop-1; y < cio_textinfo.winbottom && y < vstat.rows; y++) { - for(x=cio_textinfo.winleft-1; x<cio_textinfo.winright && x < vstat.cols; x++) { - set_vmem_cell(vmem_ptr, y*cio_textinfo.screenwidth+x, fill, ciolib_fg, ciolib_bg); - bitmap_draw_one_char(x+1, y+1); - } - } - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -void bitmap_getcustomcursor(int *s, int *e, int *r, int *b, int *v) -{ - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if(s) - *s=vstat.curs_start; - if(e) - *e=vstat.curs_end; - if(r) - *r=vstat.charheight; - if(b) - *b=vstat.curs_blinks; - if(v) - *v=vstat.curs_visible; - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -void bitmap_setcustomcursor(int s, int e, int r, int b, int v) -{ - double ratio; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if(r==0) - ratio=0; - else - ratio=vstat.charheight/r; - if(s>=0) - vstat.curs_start=s*ratio; - if(e>=0) - vstat.curs_end=e*ratio; - if(b>=0) - vstat.curs_blinks=b; - if(v>=0) - vstat.curs_visible=v; - force_cursor = 1; - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -int bitmap_getvideoflags(void) -{ - int flags=0; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if(vstat.bright_background) - flags |= CIOLIB_VIDEO_BGBRIGHT; - if(vstat.no_bright) - flags |= CIOLIB_VIDEO_NOBRIGHT; - if(vstat.bright_altcharset) - flags |= CIOLIB_VIDEO_ALTCHARS; - if(vstat.no_blink) - flags |= CIOLIB_VIDEO_NOBLINK; - if(vstat.blink_altcharset) - flags |= CIOLIB_VIDEO_BLINKALTCHARS; - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return(flags); -} - -void bitmap_setvideoflags(int flags) -{ - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if(flags & CIOLIB_VIDEO_BGBRIGHT) - vstat.bright_background=1; - else - vstat.bright_background=0; - - if(flags & CIOLIB_VIDEO_NOBRIGHT) - vstat.no_bright=1; - else - vstat.no_bright=0; - - if(flags & CIOLIB_VIDEO_ALTCHARS) - vstat.bright_altcharset=1; - else - vstat.bright_altcharset=0; - - if(flags & CIOLIB_VIDEO_NOBLINK) - vstat.no_blink=1; - else - vstat.no_blink=0; - - if(flags & CIOLIB_VIDEO_BLINKALTCHARS) - vstat.blink_altcharset=1; - else - vstat.blink_altcharset=0; - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -int bitmap_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp) -{ - int ret; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - ret = bitmap_attr2palette_locked(attr, fgp, bgp); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - - return ret; -} - -int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour) -{ - pthread_mutex_lock(&blinker_lock); - - pthread_mutex_lock(&screena.screenlock); - if (x < screena.screenwidth && y < screena.screenheight) { - if (screena.screen[PIXEL_OFFSET(screena, x, y)] != colour) { - screena.screen[PIXEL_OFFSET(screena, x, y)]=colour; - screena.update_pixels = 1; - screena.rect->data[PIXEL_OFFSET(screena, x, y)]=color_value(colour); - } - } - pthread_mutex_unlock(&screena.screenlock); - - pthread_mutex_lock(&screenb.screenlock); - if (x < screenb.screenwidth && y < screenb.screenheight) { - if (screenb.screen[PIXEL_OFFSET(screenb, x, y)] != colour) { - screenb.screen[PIXEL_OFFSET(screenb, x, y)]=colour; - screenb.update_pixels = 1; - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)]=color_value(colour); - } - } - pthread_mutex_unlock(&screenb.screenlock); - - pthread_mutex_unlock(&blinker_lock); - - return 1; -} - -int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask) -{ - uint32_t x, y; - uint32_t width,height; - char *m = mask; - int mask_bit; - size_t mask_byte; - size_t pos; - - if (pixels == NULL) - return 0; - - if (sx > ex || sy > ey) - return 0; - - width = ex - sx + 1; - height = ey - sy + 1; - - if (width + x_off > pixels->width) - return 0; - - if (height + y_off > pixels->height) - return 0; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - if (ex > screena.screenwidth || ey > screena.screenheight) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&blinker_lock); - return 0; - } - - for (y = sy; y <= ey; y++) { - pos = pixels->width*(y-sy+y_off)+x_off; - if (mask == NULL) { - for (x = sx; x <= ex; x++) { - screena.screen[PIXEL_OFFSET(screena, x, y)] = pixels->pixels[pos]; - screena.rect->data[PIXEL_OFFSET(screena, x, y)] = color_value(pixels->pixels[pos]); - if (pixels->pixelsb) { - screenb.screen[PIXEL_OFFSET(screenb, x, y)] = pixels->pixelsb[pos]; - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = color_value(pixels->pixelsb[pos]); - } - else { - screenb.screen[PIXEL_OFFSET(screenb, x, y)] = pixels->pixels[pos]; - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = color_value(pixels->pixels[pos]); - } - pos++; - } - } - else { - for (x = sx; x <= ex; x++) { - mask_byte = pos / 8; - mask_bit = pos % 8; - mask_bit = 0x80 >> mask_bit; - if (m[mask_byte] & mask_bit) { - screena.screen[PIXEL_OFFSET(screena, x, y)] = pixels->pixels[pos]; - screena.rect->data[PIXEL_OFFSET(screena, x, y)] = color_value(pixels->pixels[pos]); - if (pixels->pixelsb) { - screenb.screen[PIXEL_OFFSET(screenb, x, y)] = pixels->pixelsb[pos]; - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = color_value(pixels->pixelsb[pos]); - } - else { - screenb.screen[PIXEL_OFFSET(screenb, x, y)] = pixels->pixels[pos]; - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = color_value(pixels->pixels[pos]); - } - } - pos++; - } - } - } - screena.update_pixels = 1; - screenb.update_pixels = 1; - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&blinker_lock); - - return 1; -} - -// TODO: Do we ever need to force anymore? -struct ciolib_pixels *bitmap_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force) -{ - struct ciolib_pixels *pixels; - uint32_t width,height; - size_t y; - - if (sx > ex || sy > ey) - return NULL; - - width = ex - sx + 1; - height = ey - sy + 1; - - pixels = malloc(sizeof(*pixels)); - if (pixels == NULL) - return NULL; - - pixels->width = width; - pixels->height = height; - - pixels->pixels = malloc(sizeof(pixels->pixels[0])*(width)*(height)); - if (pixels->pixels == NULL) { - free(pixels); - return NULL; - } - - pixels->pixelsb = malloc(sizeof(pixels->pixelsb[0])*(width)*(height)); - if (pixels->pixelsb == NULL) { - free(pixels->pixels); - free(pixels); - return NULL; - } - - pthread_mutex_lock(&blinker_lock); - update_from_vmem(force); - pthread_mutex_lock(&vstatlock); - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - if (ex >= screena.screenwidth || ey >= screena.screenheight || - ex >= screenb.screenwidth || ey >= screenb.screenheight) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - free(pixels->pixelsb); - free(pixels->pixels); - free(pixels); - return NULL; - } - - for (y = sy; y <= ey; y++) { - memcpy(&pixels->pixels[width*(y-sy)], &screena.screen[PIXEL_OFFSET(screena, sx, y)], width * sizeof(pixels->pixels[0])); - memcpy(&pixels->pixelsb[width*(y-sy)], &screenb.screen[PIXEL_OFFSET(screenb, sx, y)], width * sizeof(pixels->pixelsb[0])); - } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - - return pixels; -} - -int bitmap_get_modepalette(uint32_t p[16]) -{ - pthread_mutex_lock(&vstatlock); - memcpy(p, vstat.palette, sizeof(vstat.palette)); - pthread_mutex_unlock(&vstatlock); - return 1; -} - -int bitmap_set_modepalette(uint32_t p[16]) -{ - pthread_mutex_lock(&vstatlock); - memcpy(vstat.palette, p, sizeof(vstat.palette)); - pthread_mutex_unlock(&vstatlock); - return 1; -} - -uint32_t bitmap_map_rgb(uint16_t r, uint16_t g, uint16_t b) -{ - return (0xff << 24) | ((r & 0xff00) << 8) | ((g & 0xff00)) | (b >> 8); -} - -void bitmap_replace_font(uint8_t id, char *name, void *data, size_t size) -{ - pthread_mutex_lock(&blinker_lock); - - if (id < CONIO_FIRST_FREE_FONT) { - free(name); - free(data); - pthread_mutex_unlock(&blinker_lock); - return; - } - - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - switch (size) { - case 4096: - FREE_AND_NULL(conio_fontdata[id].eight_by_sixteen); - conio_fontdata[id].eight_by_sixteen=data; - FREE_AND_NULL(conio_fontdata[id].desc); - conio_fontdata[id].desc=name; - break; - case 3584: - FREE_AND_NULL(conio_fontdata[id].eight_by_fourteen); - conio_fontdata[id].eight_by_fourteen=data; - FREE_AND_NULL(conio_fontdata[id].desc); - conio_fontdata[id].desc=name; - break; - case 2048: - FREE_AND_NULL(conio_fontdata[id].eight_by_eight); - conio_fontdata[id].eight_by_eight=data; - FREE_AND_NULL(conio_fontdata[id].desc); - conio_fontdata[id].desc=name; - break; - default: - free(name); - free(data); - } - screena.update_pixels = 1; - screenb.update_pixels = 1; - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&blinker_lock); -} - -int bitmap_setpalette(uint32_t index, uint16_t r, uint16_t g, uint16_t b) -{ - if (index > 65535) - return 0; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - palette[index] = (0xff << 24) | ((r>>8) << 16) | ((g>>8) << 8) | (b>>8); - screena.update_pixels = 1; - screenb.update_pixels = 1; - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&blinker_lock); - return 1; -} - -// Called with vstatlock -static int init_screen(struct bitmap_screen *screen, int *width, int *height) -{ - uint32_t *newscreen; - - pthread_mutex_lock(&screen->screenlock); - screen->screenwidth = vstat.scrnwidth; - if (width) - *width = screen->screenwidth; - screen->screenheight = vstat.scrnheight; - if (height) - *height = screen->screenheight; - newscreen = realloc(screen->screen, screen->screenwidth * screen->screenheight * sizeof(screen->screen[0])); - - if (!newscreen) { - pthread_mutex_unlock(&screen->screenlock); - return(-1); - } - screen->screen = newscreen; - memset_u32(screen->screen, vstat.palette[0], screen->screenwidth * screen->screenheight); - screen->update_pixels = 1; - bitmap_drv_free_rect(screen->rect); - screen->rect = alloc_full_rect(screen); - if (screen->rect == NULL) { - pthread_mutex_unlock(&screen->screenlock); - return(-1); - } - memset_u32(screen->rect->data, color_value(vstat.palette[0]), screen->rect->rect.width * screen->rect->rect.height); - pthread_mutex_unlock(&screen->screenlock); - return(0); -} - -/***********************/ -/* Called from drivers */ -/***********************/ - -/* - * This function is intended to be called from the driver. - * as a result, it cannot block waiting for driver status - * - * Must be called with vstatlock held. - * Care MUST be taken to avoid deadlocks... - * This is where the vmode bits used by the driver are modified... - * the driver must be aware of this. - * This is where the driver should grab vstatlock, then it should copy - * out after this and only grab that lock again briefly to update - * vstat.scaling. - */ -int bitmap_drv_init_mode(int mode, int *width, int *height) -{ - int i; - - if(!bitmap_initialized) - return(-1); - - if(load_vmode(&vstat, mode)) { - // TODO: WTF? - //pthread_mutex_unlock(&blinker_lock); - return(-1); - } - - /* Initialize video memory with black background, white foreground */ - for (i = 0; i < vstat.cols*vstat.rows; ++i) { - vstat.vmem->vmem[i].ch = 0; - vstat.vmem->vmem[i].legacy_attr = vstat.currattr; - vstat.vmem->vmem[i].font = default_font; - bitmap_attr2palette_locked(vstat.currattr, &vstat.vmem->vmem[i].fg, &vstat.vmem->vmem[i].bg); - } - - if (init_screen(&screena, width, height)) - return -1; - if (init_screen(&screenb, width, height)) - return -1; - for (i=0; i<sizeof(current_font)/sizeof(current_font[0]); i++) - current_font[i]=default_font; - bitmap_loadfont_locked(NULL); - - cio_textinfo.attribute=vstat.currattr; - cio_textinfo.normattr=vstat.currattr; - cio_textinfo.currmode=mode; - - if (vstat.rows > 0xff) - cio_textinfo.screenheight = 0xff; - else - cio_textinfo.screenheight = vstat.rows; - - if (vstat.cols > 0xff) - cio_textinfo.screenwidth = 0xff; - else - cio_textinfo.screenwidth = vstat.cols; - - cio_textinfo.curx=1; - cio_textinfo.cury=1; - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; - - return(0); -} - -/* - * MUST be called only once and before any other bitmap functions - */ -int bitmap_drv_init(void (*drawrect_cb) (struct rectlist *data) - ,void (*flush_cb) (void)) -{ - int i; - - if(bitmap_initialized) - return(-1); - cio_api.options |= CONIO_OPT_LOADABLE_FONTS | CONIO_OPT_BLINK_ALT_FONT - | CONIO_OPT_BOLD_ALT_FONT | CONIO_OPT_BRIGHT_BACKGROUND - | CONIO_OPT_SET_PIXEL | CONIO_OPT_CUSTOM_CURSOR - | CONIO_OPT_FONT_SELECT | CONIO_OPT_EXTENDED_PALETTE | CONIO_OPT_PALETTE_SETTING - | CONIO_OPT_BLOCKY_SCALING; - pthread_mutex_init(&blinker_lock, NULL); - pthread_mutex_init(&callbacks.lock, NULL); - pthread_mutex_init(&vstatlock, NULL); - pthread_mutex_init(&screena.screenlock, NULL); - pthread_mutex_init(&screenb.screenlock, NULL); - pthread_mutex_init(&free_rect_lock, NULL); - pthread_mutex_lock(&vstatlock); - init_r2y(); - vstat.vmem=NULL; - vstat.flags = VIDMODES_FLAG_PALETTE_VMEM; - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - for (i = 0; i < sizeof(dac_default)/sizeof(struct dac_colors); i++) { - palette[i] = (0xff << 24) | (dac_default[i].red << 16) | (dac_default[i].green << 8) | dac_default[i].blue; - } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&vstatlock); - - callbacks.drawrect=drawrect_cb; - callbacks.flush=flush_cb; - callbacks.rects = 0; - bitmap_initialized=1; - _beginthread(blinker_thread,0,NULL); - - return(0); -} - -void bitmap_drv_request_pixels(void) -{ - pthread_mutex_lock(&screena.screenlock); - if (screena.update_pixels == 0) - screena.update_pixels = 2; - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - if (screenb.update_pixels == 0) - screenb.update_pixels = 2; - pthread_mutex_unlock(&screenb.screenlock); -} - -void bitmap_drv_request_some_pixels(int x, int y, int width, int height) -{ - /* TODO: Some sort of queue here? */ - bitmap_drv_request_pixels(); -} - -void bitmap_drv_free_rect(struct rectlist *rect) -{ - if (rect == NULL) - return; - pthread_mutex_lock(&free_rect_lock); - rect->next = free_rects; - free_rects = rect; - pthread_mutex_unlock(&free_rect_lock); -} diff --git a/ciolib/bitmap_con.h b/ciolib/bitmap_con.h deleted file mode 100644 index e687983..0000000 --- a/ciolib/bitmap_con.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef BITMAP_CON_H -#define BITMAP_CON_H - -#include "vidmodes.h" -#include "threadwrap.h" - -struct rectangle { - int x; - int y; - int width; - int height; -}; - -struct rectlist { - struct rectangle rect; - uint32_t *data; - struct rectlist *next; -}; - -extern struct video_stats vstat; -extern pthread_mutex_t vstatlock; -extern pthread_mutex_t blinker_lock; - -#ifndef BITMAP_CIOLIB_DRIVER -/* Called from ciolib */ -int bitmap_puttext(int sx, int sy, int ex, int ey, void *fill); -int bitmap_vmem_puttext(int sx, int sy, int ex, int ey, struct vmem_cell *fill); -int bitmap_vmem_gettext(int sx, int sy, int ex, int ey, struct vmem_cell *fill); -void bitmap_gotoxy(int x, int y); -void bitmap_setcursortype(int type); -int bitmap_setfont(int font, int force, int font_no); -int bitmap_getfont(int fnum); -int bitmap_loadfont(const char *filename); -int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy); -void bitmap_clreol(void); -void bitmap_clrscr(void); -void bitmap_getcustomcursor(int *s, int *e, int *r, int *b, int *v); -void bitmap_setcustomcursor(int s, int e, int r, int b, int v); -int bitmap_getvideoflags(void); -void bitmap_setvideoflags(int flags); -int bitmap_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp); -int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour); -int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *, void *mask); -struct ciolib_pixels *bitmap_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force); -int bitmap_get_modepalette(uint32_t p[16]); -int bitmap_set_modepalette(uint32_t p[16]); -uint32_t bitmap_map_rgb(uint16_t r, uint16_t g, uint16_t b); -void bitmap_replace_font(uint8_t id, char *name, void *data, size_t size); -int bitmap_setpalette(uint32_t index, uint16_t r, uint16_t g, uint16_t b); -#endif - -#ifdef BITMAP_CIOLIB_DRIVER -/* Called from drivers */ -int bitmap_drv_init_mode(int mode, int *width, int *height); -int bitmap_drv_init(void (*drawrect_cb) (struct rectlist *data) - ,void (*flush) (void)); -void bitmap_drv_request_pixels(void); -void bitmap_drv_request_some_pixels(int x, int y, int width, int height); -void bitmap_drv_free_rect(struct rectlist *rect); -#endif - -#endif diff --git a/ciolib/ciolib.c b/ciolib/ciolib.c deleted file mode 100644 index 7742eb2..0000000 --- a/ciolib/ciolib.c +++ /dev/null @@ -1,1942 +0,0 @@ -/* $Id: ciolib.c,v 1.204 2020/07/18 18:15:28 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* Icon file! */ -#ifdef __BORLANDC__ -#pragma resource "ciolib.res" /* DO NOT REMOVE THE EXTRA \r! */ -#endif - -#include <stdarg.h> -#include <stdlib.h> /* alloca */ -#include <stdio.h> -#if defined(_WIN32) - #include <malloc.h> /* alloca() on Win32 */ -#endif - -#include <threadwrap.h> -#include <genwrap.h> -#include <xpbeep.h> - -#define CIOLIB_NO_MACROS -#include "ciolib.h" - -#if defined(WITH_SDL) - #include "sdl_con.h" - #include "sdlfuncs.h" -#endif -#ifdef _WIN32 - #include "win32cio.h" -#else - #ifndef NO_X - #include "x_cio.h" - #endif - #include "curs_cio.h" - #undef getch -#endif - -#include "bitmap_con.h" -#include "ansi_cio.h" -#include "syncicon64.h" - -CIOLIBEXPORT cioapi_t cio_api; - -static const int tabs[]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145}; -static int ungotch; -struct text_info cio_textinfo; -uint32_t ciolib_fg; -uint32_t ciolib_bg; -static int lastmode=C80; -CIOLIBEXPORT int _wscroll=1; -CIOLIBEXPORT int directvideo=0; -CIOLIBEXPORT int hold_update=0; -CIOLIBEXPORT int puttext_can_move=0; -CIOLIBEXPORT int ciolib_reaper=TRUE; -CIOLIBEXPORT char *ciolib_appname=NULL; -CIOLIBEXPORT int ciolib_initial_window_height = -1; -CIOLIBEXPORT int ciolib_initial_window_width = -1; -static int initialized=0; - -CIOLIBEXPORT int ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy); -CIOLIBEXPORT char * ciolib_cgets(char *str); -CIOLIBEXPORT int ciolib_cscanf (char *format , ...); -CIOLIBEXPORT int ciolib_kbhit(void); -CIOLIBEXPORT int ciolib_getch(void); -CIOLIBEXPORT int ciolib_getche(void); -CIOLIBEXPORT int ciolib_ungetch(int ch); -CIOLIBEXPORT void ciolib_gettextinfo(struct text_info *info); -CIOLIBEXPORT int ciolib_wherex(void); -CIOLIBEXPORT int ciolib_wherey(void); -CIOLIBEXPORT void ciolib_wscroll(void); -CIOLIBEXPORT void ciolib_gotoxy(int x, int y); -CIOLIBEXPORT void ciolib_clreol(void); -CIOLIBEXPORT void ciolib_clrscr(void); -CIOLIBEXPORT int ciolib_cputs(const char *str); -CIOLIBEXPORT int ciolib_cprintf(const char *fmat, ...); -CIOLIBEXPORT void ciolib_textbackground(int colour); -CIOLIBEXPORT void ciolib_textcolor(int colour); -CIOLIBEXPORT void ciolib_highvideo(void); -CIOLIBEXPORT void ciolib_lowvideo(void); -CIOLIBEXPORT void ciolib_normvideo(void); -CIOLIBEXPORT int ciolib_puttext(int a,int b,int c,int d,void *e); -CIOLIBEXPORT int ciolib_vmem_puttext(int a,int b,int c,int d,struct vmem_cell *e); -CIOLIBEXPORT int ciolib_gettext(int a,int b,int c,int d,void *e); -CIOLIBEXPORT int ciolib_vmem_gettext(int a,int b,int c,int d,struct vmem_cell *e); -CIOLIBEXPORT void ciolib_textattr(int a); -CIOLIBEXPORT void ciolib_delay(long a); -CIOLIBEXPORT int ciolib_putch(int a); -CIOLIBEXPORT void ciolib_setcursortype(int a); -CIOLIBEXPORT void ciolib_textmode(int mode); -CIOLIBEXPORT void ciolib_window(int sx, int sy, int ex, int ey); -CIOLIBEXPORT void ciolib_delline(void); -CIOLIBEXPORT void ciolib_insline(void); -CIOLIBEXPORT char * ciolib_getpass(const char *prompt); -CIOLIBEXPORT void ciolib_copytext(const char *text, size_t buflen); -CIOLIBEXPORT char * ciolib_getcliptext(void); -CIOLIBEXPORT int ciolib_get_window_info(int *width, int *height, int *xpos, int *ypos); -CIOLIBEXPORT void ciolib_setscaling(int new_value); -CIOLIBEXPORT int ciolib_getscaling(void); -CIOLIBEXPORT int ciolib_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b); -CIOLIBEXPORT int ciolib_attr2palette(uint8_t attr, uint32_t *fg, uint32_t *bg); -CIOLIBEXPORT int ciolib_setpixel(uint32_t x, uint32_t y, uint32_t colour); -CIOLIBEXPORT struct ciolib_pixels * ciolib_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force); -CIOLIBEXPORT int ciolib_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask); -CIOLIBEXPORT void ciolib_freepixels(struct ciolib_pixels *pixels); -CIOLIBEXPORT struct ciolib_screen * ciolib_savescreen(void); -CIOLIBEXPORT void ciolib_freescreen(struct ciolib_screen *); -CIOLIBEXPORT int ciolib_restorescreen(struct ciolib_screen *scrn); -CIOLIBEXPORT void ciolib_setcolour(uint32_t fg, uint32_t bg); -CIOLIBEXPORT int ciolib_get_modepalette(uint32_t p[16]); -CIOLIBEXPORT int ciolib_set_modepalette(uint32_t p[16]); -CIOLIBEXPORT void ciolib_set_vmem(struct vmem_cell *cell, uint8_t ch, uint8_t attr, uint8_t font); -CIOLIBEXPORT void ciolib_set_vmem_attr(struct vmem_cell *cell, uint8_t attr); -CIOLIBEXPORT void ciolib_setwinsize(int width, int height); -CIOLIBEXPORT void ciolib_setwinposition(int x, int y); -CIOLIBEXPORT enum ciolib_codepage ciolib_getcodepage(void); - -#if defined(WITH_SDL) -int sdl_video_initialized = 0; -#endif - -#define CIOLIB_INIT() { if(initialized != 1) initciolib(CIOLIB_MODE_AUTO); } - -#if defined(WITH_SDL) -static int try_sdl_init(int mode) -{ - if(!sdl_initciolib(mode)) { - cio_api.mouse=1; - cio_api.puttext=bitmap_puttext; - cio_api.vmem_puttext=bitmap_vmem_puttext; - cio_api.vmem_gettext=bitmap_vmem_gettext; - cio_api.gotoxy=bitmap_gotoxy; - cio_api.setcursortype=bitmap_setcursortype; - cio_api.setfont=bitmap_setfont; - cio_api.getfont=bitmap_getfont; - cio_api.loadfont=bitmap_loadfont; - cio_api.movetext=bitmap_movetext; - cio_api.clreol=bitmap_clreol; - cio_api.clrscr=bitmap_clrscr; - cio_api.getcustomcursor=bitmap_getcustomcursor; - cio_api.setcustomcursor=bitmap_setcustomcursor; - cio_api.getvideoflags=bitmap_getvideoflags; - cio_api.setvideoflags=bitmap_setvideoflags; - - cio_api.kbhit=sdl_kbhit; - cio_api.getch=sdl_getch; - cio_api.textmode=sdl_textmode; - cio_api.showmouse=sdl_showmouse; - cio_api.hidemouse=sdl_hidemouse; - cio_api.setname=sdl_setname; - cio_api.seticon=sdl_seticon; - cio_api.settitle=sdl_settitle; - cio_api.copytext=sdl_copytext; - cio_api.getcliptext=sdl_getcliptext; - cio_api.get_window_info=sdl_get_window_info; - cio_api.setwinsize=sdl_setwinsize; - cio_api.setwinposition=sdl_setwinposition; - cio_api.setpalette=bitmap_setpalette; - cio_api.attr2palette=bitmap_attr2palette; - cio_api.setpixel=bitmap_setpixel; - cio_api.getpixels=bitmap_getpixels; - cio_api.setpixels=bitmap_setpixels; - cio_api.get_modepalette=bitmap_get_modepalette; - cio_api.set_modepalette=bitmap_set_modepalette; - cio_api.map_rgb = bitmap_map_rgb; - cio_api.replace_font = bitmap_replace_font; - cio_api.beep = sdl_beep; - cio_api.mousepointer=sdl_mousepointer; - return(1); - } - return(0); -} -#endif - -#ifndef NO_X -static int try_x_init(int mode) -{ -#if defined(WITH_SDL) - if (sdl_video_initialized) { - sdl.QuitSubSystem(SDL_INIT_VIDEO); - } -#endif - - if(!x_init()) { - cio_api.mode=CIOLIB_MODE_X; - cio_api.mouse=1; - cio_api.puttext=bitmap_puttext; - cio_api.vmem_puttext=bitmap_vmem_puttext; - cio_api.vmem_gettext=bitmap_vmem_gettext; - cio_api.gotoxy=bitmap_gotoxy; - cio_api.setcursortype=bitmap_setcursortype; - cio_api.setfont=bitmap_setfont; - cio_api.getfont=bitmap_getfont; - cio_api.loadfont=bitmap_loadfont; - cio_api.beep=x_beep; - cio_api.movetext=bitmap_movetext; - cio_api.clreol=bitmap_clreol; - cio_api.clrscr=bitmap_clrscr; - cio_api.getcustomcursor=bitmap_getcustomcursor; - cio_api.setcustomcursor=bitmap_setcustomcursor; - cio_api.getvideoflags=bitmap_getvideoflags; - cio_api.setvideoflags=bitmap_setvideoflags; - - cio_api.kbhit=x_kbhit; - cio_api.getch=x_getch; - cio_api.textmode=x_textmode; - cio_api.setname=x_setname; - cio_api.settitle=x_settitle; - cio_api.copytext=x_copytext; - cio_api.getcliptext=x_getcliptext; - cio_api.get_window_info=x_get_window_info; - cio_api.setscaling=x_setscaling; - cio_api.getscaling=x_getscaling; - cio_api.seticon=x_seticon; - cio_api.setpalette=bitmap_setpalette; - cio_api.attr2palette=bitmap_attr2palette; - cio_api.setpixel=bitmap_setpixel; - cio_api.getpixels=bitmap_getpixels; - cio_api.setpixels=bitmap_setpixels; - cio_api.get_modepalette=bitmap_get_modepalette; - cio_api.set_modepalette=bitmap_set_modepalette; - cio_api.map_rgb = bitmap_map_rgb; - cio_api.replace_font = bitmap_replace_font; - cio_api.mousepointer=x_mousepointer; - return(1); - } - return(0); -} -#endif - -#ifndef _WIN32 -static int try_curses_init(int mode) -{ -#if defined(WITH_SDL) - if (sdl_video_initialized) { - sdl.QuitSubSystem(SDL_INIT_VIDEO); - } -#endif - - if(curs_initciolib(mode)) { - if(mode==CIOLIB_MODE_AUTO) - mode=CIOLIB_MODE_CURSES; - cio_api.mode=mode; - cio_api.puttext=curs_puttext; - cio_api.vmem_puttext=curs_vmem_puttext; - cio_api.vmem_gettext=curs_vmem_gettext; - cio_api.textattr=curs_textattr; - cio_api.kbhit=curs_kbhit; - cio_api.gotoxy=curs_gotoxy; - cio_api.setcursortype=curs_setcursortype; - cio_api.getch=curs_getch; - cio_api.textmode=curs_textmode; - cio_api.showmouse=curs_showmouse; - cio_api.hidemouse=curs_hidemouse; - cio_api.suspend=curs_suspend; - cio_api.resume=curs_resume; - cio_api.beep=curs_beep; - cio_api.setvideoflags=curs_setvideoflags; - cio_api.getvideoflags=curs_getvideoflags; -#if defined(NCURSES_VERSION_MAJOR) || defined (__NetBSD__) - cio_api.escdelay=&ESCDELAY; -#endif - cio_api.setfont = curs_setfont; - cio_api.getfont = curs_getfont; - cio_api.setpalette = curs_setpalette; - cio_api.get_modepalette = curs_get_modepalette; - cio_api.set_modepalette = curs_set_modepalette; - cio_api.attr2palette = curs_attr2palette; - return(1); - } - return(0); -} -#endif - -static int try_ansi_init(int mode) -{ -#if defined(WITH_SDL) - if (sdl_video_initialized) { - sdl.QuitSubSystem(SDL_INIT_VIDEO); - } -#endif - - if(ansi_initciolib(mode)) { - cio_api.mode=CIOLIB_MODE_ANSI; - cio_api.mouse=0; - cio_api.puttext=ansi_puttext; - cio_api.gettext=ansi_gettext; - cio_api.textattr=ansi_textattr; - cio_api.kbhit=ansi_kbhit; - cio_api.gotoxy=ansi_gotoxy; - cio_api.setcursortype=ansi_setcursortype; - cio_api.getch=ansi_getch; - cio_api.textmode=ansi_textmode; - cio_api.escdelay=&CIOLIB_ANSI_TIMEOUT; - cio_api.beep=ansi_beep; - cio_api.suspend=ansi_suspend; - return(1); - } - return(0); -} - -#ifdef _WIN32 -#if defined(__BORLANDC__) - #pragma argsused -#endif -static int try_conio_init(int mode) -{ -#if defined(WITH_SDL) - if (sdl_video_initialized) { - sdl.QuitSubSystem(SDL_INIT_VIDEO); - } -#endif - - /* This should test for something or other */ - if(win32_initciolib(mode)) { - if(mode==CIOLIB_MODE_AUTO) - cio_api.mode=CIOLIB_MODE_CONIO; - else - cio_api.mode=mode; /* CIOLIB_MODE_CONIO or CIOLIB_MODE_CONIO_FULLSCREEN */ - cio_api.mouse=1; - cio_api.puttext=win32_puttext; - cio_api.gettext=win32_gettext; - cio_api.kbhit=win32_kbhit; - cio_api.gotoxy=win32_gotoxy; - cio_api.setcursortype=win32_setcursortype; - cio_api.getch=win32_getch; - cio_api.textmode=win32_textmode; - cio_api.showmouse=win32_showmouse; - cio_api.hidemouse=win32_hidemouse; - cio_api.setname=win32_settitle; - cio_api.settitle=win32_settitle; - cio_api.copytext=win32_copytext; - cio_api.getcliptext=win32_getcliptext; - cio_api.suspend=win32_suspend; - cio_api.resume=win32_resume; - cio_api.getcustomcursor=win32_getcustomcursor; - cio_api.setcustomcursor=win32_setcustomcursor; - cio_api.getvideoflags=win32_getvideoflags; - cio_api.setpalette=win32_setpalette; - return(1); - } - return(0); -} -#endif - -/* Optional */ -CIOLIBEXPORT void suspendciolib(void) -{ - ciolib_clrscr(); - if(cio_api.suspend != NULL) - cio_api.suspend(); - initialized=-1; -} - -CIOLIBEXPORT int initciolib(int mode) -{ - switch(initialized) { - case 1: - return(0); - case -1: - initialized=1; - if(cio_api.resume != NULL) - cio_api.resume(); - ciolib_clrscr(); - return(0); - } - - memset(&cio_api,0,sizeof(cio_api)); - - switch(mode) { - case CIOLIB_MODE_AUTO: -#ifndef NO_X - if(!try_x_init(mode)) -#endif -#if defined(WITH_SDL) - if(!try_sdl_init(CIOLIB_MODE_SDL)) -#endif -#ifdef _WIN32 - if(!try_conio_init(mode)) -#else - if(!try_curses_init(mode)) -#endif - try_ansi_init(mode); - break; -#ifdef _WIN32 - case CIOLIB_MODE_CONIO: - case CIOLIB_MODE_CONIO_FULLSCREEN: - try_conio_init(mode); - break; -#else - case CIOLIB_MODE_CURSES: - case CIOLIB_MODE_CURSES_IBM: - case CIOLIB_MODE_CURSES_ASCII: - try_curses_init(mode); - break; - - case CIOLIB_MODE_X: -#ifndef NO_X - try_x_init(mode); -#endif - break; -#endif - case CIOLIB_MODE_ANSI: - try_ansi_init(mode); - break; - -#if defined(WITH_SDL) - case CIOLIB_MODE_SDL: - case CIOLIB_MODE_SDL_FULLSCREEN: - try_sdl_init(mode); - break; -#endif - } - if(cio_api.mode==CIOLIB_MODE_AUTO) { - fprintf(stderr,"CIOLIB initialization failed!\n"); - return(-1); - } - - initialized=1; - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; - - /* Default C64 is Lt Blue on Dark Blue (As per Every picture ever) */ - switch(cio_textinfo.currmode) { - case C64_40X25: - cio_textinfo.normattr=0x6e; - break; - case C128_40X25: - cio_textinfo.normattr=0xbd; - break; - default: - cio_textinfo.normattr=LIGHTGRAY; - break; - } - ciolib_seticon(syncicon64, SYNCICON64_WIDTH); - ciolib_textattr(cio_textinfo.normattr); - - _beginthread(ciolib_mouse_thread,0,NULL); - return(0); -} - -/* **MUST** be implemented */ -/* - * Returns non-zero if a key is hit - */ -CIOLIBEXPORT int ciolib_kbhit(void) -{ - CIOLIB_INIT(); - if(ungotch) - return(1); - return(cio_api.kbhit()); -} - -/* **MUST** be implemented */ -CIOLIBEXPORT int ciolib_getch(void) -{ - int ch; - - CIOLIB_INIT(); - - if(ungotch) { - ch=ungotch; - ungotch=0; - return(ch); - } - return(cio_api.getch()); -} - -/* Optional */ -CIOLIBEXPORT int ciolib_getche(void) -{ - int ch; - - CIOLIB_INIT(); - - if(ungotch) { - ch=ungotch; - ungotch=0; - ciolib_putch(ch); - return(ch); - } - if(cio_api.getche) - return(cio_api.getche()); - else { - while(1) { - ch=ciolib_getch(); - if(ch != 0 && ch != 0xe0) { - ciolib_putch(ch); - return(ch); - } - /* Eat extended chars - except ESC which is an abort */ - if(ciolib_getch()==1) - return(EOF); - } - } -} - -/* Optional */ -/* - * On success, returns ch, on error, returns EOF - */ -CIOLIBEXPORT int ciolib_ungetch(int ch) -{ - CIOLIB_INIT(); - - if(ungotch) - return(EOF); - if(cio_api.ungetch) - return(cio_api.ungetch(ch)); - ungotch=ch; - return(ch); -} - -/* Optional */ -/* - * Returns non-zero on success - */ -CIOLIBEXPORT int ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy) -{ - int width; - int height; - void *buf; - - CIOLIB_INIT(); - - if(cio_api.movetext != NULL) - return(cio_api.movetext(sx, sy, ex, ey, dx, dy)); - - width=ex-sx; - height=ey-sy; - if (cio_api.vmem_gettext) { - buf=malloc((width+1)*(height+1)*sizeof(struct vmem_cell)); - if (buf == NULL) - return 0; - if(!ciolib_vmem_gettext(sx,sy,ex,ey,buf)) - goto fail; - if(!ciolib_vmem_puttext(dx,dy,dx+width,dy+height,buf)) - goto fail; - } - else { - buf=malloc((width+1)*(height+1)*2); - if (buf == NULL) - return 0; - if(!ciolib_gettext(sx,sy,ex,ey,buf)) - goto fail; - if(!ciolib_puttext(dx,dy,dx+width,dy+height,buf)) - goto fail; - } - - return(1); - -fail: - free(buf); - return 0; -} - -/* Optional */ -/* - * Returns &str[2] - * Cannot fail - */ -CIOLIBEXPORT char * ciolib_cgets(char *str) -{ - int maxlen; - int len=0; - int ch; - - CIOLIB_INIT(); - - if(cio_api.cgets) - return(cio_api.cgets(str)); - - maxlen=*(unsigned char *)str; - while((ch=ciolib_getch())!='\n' && ch !='\r') { - switch(ch) { - case 0: /* Skip extended keys */ - case 0xe0: /* Skip extended keys */ - if(ciolib_getche()==1) - goto early_return; - break; - case '\b': - if(len==0) { - ciolib_putch(7); - break; - } - ciolib_putch('\b'); - len--; - break; - default: - ciolib_putch(ch); - str[(len++)+2]=ch; - if(len==maxlen) { - str[len+2]=0; - *((unsigned char *)(str+1))=(unsigned char)len; - ciolib_putch('\r'); - ciolib_putch('\n'); - return(&str[2]); - } - break; - } - } -early_return: - str[len+2]=0; - *((unsigned char *)(str+1))=(unsigned char)len; - ciolib_putch('\r'); - ciolib_putch('\n'); - return(&str[2]); -} - -#if defined(_MSC_VER) && (_MSC_VER < 1800) /* Use lame vsscanf() implementation */ -/* This is a way to do _vsscanf without using fancy stack tricks or using the - * "_input" method provided by Microsoft, which is no longer exported as of .NET. - * The function has a limit of 25 arguments (or less if you run out of stack space), - * but how many arguments do you need? - */ -/* From "krabsheva" - http://www.codeguru.com/Cpp/Cpp/string/comments.php/c5631/?thread=1051 */ -int vsscanf( const char *buffer, const char *format, va_list arg_ptr ) -{ - int i, ret; - void *arg_arr[25]; - - /* Do exception handling in case we go too far // */ - __try - { - for ( i = 0; i < 25; i++ ) - arg_arr[i] = va_arg( arg_ptr, void * ); - } - __except( EXCEPTION_EXECUTE_HANDLER ) - { - } - - /* This is lame, but the extra arguments won't be used by sscanf */ - ret = sscanf( buffer, format, arg_arr[0], arg_arr[1], arg_arr[2], arg_arr[3], - arg_arr[4], arg_arr[5], arg_arr[6], arg_arr[7], arg_arr[8], arg_arr[9], - arg_arr[10], arg_arr[11], arg_arr[12], arg_arr[13], arg_arr[14], - arg_arr[15], arg_arr[16], arg_arr[17], arg_arr[18], arg_arr[19], - arg_arr[20], arg_arr[21], arg_arr[22], arg_arr[23], arg_arr[24] ); - - return ret; -} -#endif - -/* Can't be overridden */ -/* Returns the number of fields converted */ -CIOLIBEXPORT int ciolib_cscanf (char *format , ...) -{ - char str[255]; - va_list argptr; - int ret; - - CIOLIB_INIT(); - - str[0]=-1; - va_start(argptr,format); - ret=vsscanf(ciolib_cgets(str),format,argptr); - va_end(argptr); - return(ret); -} - -/* Optional */ -/* So dumb */ -CIOLIBEXPORT char * ciolib_getpass(const char *prompt) -{ - static char pass[9]; - int len=0; - int ch; - - CIOLIB_INIT(); - - if(cio_api.getpass) - return(cio_api.getpass(prompt)); - - ciolib_cputs(prompt); - while((ch=ciolib_getch())!='\n') { - switch(ch) { - case 0: /* Skip extended keys */ - case 0xe0: /* Skip extended keys */ - if(ciolib_getch()==1) - goto early_return; - break; - case '\r': /* Skip \r (ToDo: Should this be treeated as a \n? */ - break; - case '\b': - if(len==0) { - ciolib_putch(7); - break; - } - len--; - break; - default: - if(len==8) - ciolib_putch(7); - else - pass[len++]=ch; - break; - } - } -early_return: - pass[len]=0; - return(pass); -} - -/* TODO: Hackery here... must fix */ -/* Optional */ -CIOLIBEXPORT void ciolib_gettextinfo(struct text_info *info) -{ - CIOLIB_INIT() - - if(cio_api.gettextinfo) - cio_api.gettextinfo(&cio_textinfo); - - if(info!=&cio_textinfo) - *info=cio_textinfo; -} - -/* Optional */ -/* Not part of Borland conio? */ -CIOLIBEXPORT void ciolib_wscroll(void) -{ - int os; - - CIOLIB_INIT(); - - if(cio_api.wscroll!=NULL) { - cio_api.wscroll(); - return; - } - if(!_wscroll) - return; - ciolib_movetext(cio_textinfo.winleft - ,cio_textinfo.wintop+1 - ,cio_textinfo.winright - ,cio_textinfo.winbottom - ,cio_textinfo.winleft - ,cio_textinfo.wintop); - ciolib_gotoxy(1,cio_textinfo.winbottom-cio_textinfo.wintop+1); - os=_wscroll; - _wscroll=0; - /* ciolib_cprintf("%*s",ti.winright-ti.winleft+1,""); */ - ciolib_clreol(); - _wscroll=os; - ciolib_gotoxy(cio_textinfo.curx,cio_textinfo.cury); -} - -/* Optional */ -/* Cannot fail */ -CIOLIBEXPORT int ciolib_wherex(void) -{ - int x; - - CIOLIB_INIT(); - - if(cio_api.wherex) { - /* TODO: This is old hackery... beware */ - x=cio_api.wherex(); - x=x-cio_textinfo.winleft+1; - } - else - x=cio_textinfo.curx; - return(x); -} - -/* Optional */ -/* Cannot fail */ -CIOLIBEXPORT int ciolib_wherey(void) -{ - int y; - - CIOLIB_INIT(); - - if(cio_api.wherey) { - /* TODO: This is old hackery... beware */ - y=cio_api.wherey(); - y=y-cio_textinfo.wintop+1; - } - else - y=cio_textinfo.cury; - return(y); -} - -/* **MUST** be implemented */ -CIOLIBEXPORT void ciolib_gotoxy(int x, int y) -{ - CIOLIB_INIT(); - - if( x < 1 - || x > cio_textinfo.winright-cio_textinfo.winleft+1 - || y < 1 - || y > cio_textinfo.winbottom-cio_textinfo.wintop+1) - return; - cio_api.gotoxy(x,y); -} - -/* **MUST** be implemented */ -CIOLIBEXPORT void ciolib_textmode(int mode) -{ - CIOLIB_INIT(); - - if(mode==LASTMODE) { - cio_api.textmode(lastmode); - lastmode=cio_textinfo.currmode; - } - else { - if(mode==64) - mode=C80X50; - if(mode==_ORIGMODE) - mode=C80; - lastmode=cio_textinfo.currmode; - cio_api.textmode(mode); - } - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; - - switch(cio_textinfo.currmode) { - case C64_40X25: - cio_textinfo.normattr=0x6e; - break; - case C128_40X25: - cio_textinfo.normattr=0xbd; - break; - default: - cio_textinfo.normattr=LIGHTGRAY; - break; - } - ciolib_textattr(cio_textinfo.normattr); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_window(int sx, int sy, int ex, int ey) -{ - CIOLIB_INIT(); - - if(cio_api.window) - cio_api.window(sx,sy,ex,ey); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cio_textinfo.screenwidth - || sy > cio_textinfo.screenheight - || sx > ex - || sy > ey - || ex > cio_textinfo.screenwidth - || ey > cio_textinfo.screenheight) { - return; - } - cio_textinfo.winleft=sx; - cio_textinfo.wintop=sy; - cio_textinfo.winright=ex; - cio_textinfo.winbottom=ey; - ciolib_gotoxy(1,1); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_clreol(void) -{ - struct vmem_cell *buf; - int i; - int width,height; - - CIOLIB_INIT(); - - if(cio_api.clreol) { - cio_api.clreol(); - return; - } - - width=cio_textinfo.winright-cio_textinfo.winleft+1-cio_textinfo.curx+1; - height=1; - buf=malloc(width*height*sizeof(*buf)); - if (!buf) - return; - for(i=0;i<width*height;i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cio_textinfo.attribute; - buf[i].fg = ciolib_fg; - buf[i].bg = ciolib_bg; - buf[i].font = ciolib_attrfont(cio_textinfo.attribute); - } - ciolib_vmem_puttext( - cio_textinfo.curx+cio_textinfo.winleft-1, - cio_textinfo.cury+cio_textinfo.wintop-1, - cio_textinfo.winright, - cio_textinfo.cury+cio_textinfo.wintop-1, - buf); - free(buf); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_clrscr(void) -{ - struct vmem_cell *buf; - int i; - int width,height; - int old_ptcm=puttext_can_move; - - CIOLIB_INIT(); - if(cio_api.clrscr) { - cio_api.clrscr(); - return; - } - - width=cio_textinfo.winright-cio_textinfo.winleft+1; - height=cio_textinfo.winbottom-cio_textinfo.wintop+1; - buf=malloc(width*height*sizeof(*buf)); - if(!buf) - return; - for(i=0;i<width*height;i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cio_textinfo.attribute; - buf[i].fg = ciolib_fg; - buf[i].bg = ciolib_bg; - buf[i].font = ciolib_attrfont(cio_textinfo.attribute); - } - puttext_can_move=1; - ciolib_vmem_puttext(cio_textinfo.winleft,cio_textinfo.wintop,cio_textinfo.winright,cio_textinfo.winbottom,buf); - ciolib_gotoxy(1,1); - puttext_can_move=old_ptcm; - - free(buf); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_delline(void) -{ - CIOLIB_INIT(); - - if(cio_api.delline) { - cio_api.delline(); - return; - } - ciolib_movetext(cio_textinfo.winleft - ,cio_textinfo.cury+1 - ,cio_textinfo.winright - ,cio_textinfo.winbottom - ,cio_textinfo.winleft - ,cio_textinfo.cury); - ciolib_gotoxy(1,cio_textinfo.winbottom-cio_textinfo.wintop+1); - ciolib_clreol(); - ciolib_gotoxy(cio_textinfo.curx,cio_textinfo.cury); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_insline(void) -{ - CIOLIB_INIT(); - - if(cio_api.insline) { - cio_api.insline(); - return; - } - ciolib_movetext(cio_textinfo.winleft,cio_textinfo.cury,cio_textinfo.winright,cio_textinfo.winbottom,cio_textinfo.winleft,cio_textinfo.cury+1); - ciolib_gotoxy(1,cio_textinfo.cury); - ciolib_clreol(); - ciolib_gotoxy(cio_textinfo.curx,cio_textinfo.cury); -} - -/* Not overridable due to varargs */ -/* Returns the number of characters or EOF on error */ -CIOLIBEXPORT int ciolib_cprintf(const char *fmat, ...) -{ - va_list argptr; - int ret; -#if defined(_MSC_VER) || defined(__MSVCRT__) /* Can't figure out a way to allocate a "big enough" buffer for Win32. */ - char str[16384]; -#else - char *str; -#ifndef HAVE_VASPRINTF - va_list argptr2; -#endif -#endif - - CIOLIB_INIT(); - - va_start(argptr,fmat); - -#ifdef HAVE_VASPRINTF - ret=vasprintf(&str, fmat, argptr); - if(ret>=0) - ciolib_cputs(str); - else - ret=EOF; - free(str); - va_end(argptr); -#else - -#if defined(_MSC_VER) || defined(__MSVCRT__) - ret=_vsnprintf(str,sizeof(str)-1,fmat,argptr); -#else - -#ifdef __BORLANDC__ - argptr2=argptr; -#else - va_copy(argptr2, argptr); -#endif - ret=vsnprintf(NULL,0,fmat,argptr); - if(ret<0) - return(EOF); - str=(char *)alloca(ret+1); - if(str==NULL) - return(EOF); - ret=vsprintf(str,fmat,argptr2); -#endif - va_end(argptr); -#if !(defined(_MSC_VER) || defined(__MSVCRT__)) - va_end(argptr2); -#endif - if(ret>=0) - ciolib_cputs(str); - else - ret=EOF; - -#endif - - return(ret); -} - -/* Optional */ -/* The Borland version does not translate \n into \r\n... this does. - * Returns last character printed (!) - */ -CIOLIBEXPORT int ciolib_cputs(const char *str) -{ - int pos; - int ret=0; - int olddmc; - - CIOLIB_INIT(); - - if(cio_api.cputs) - return(cio_api.cputs(str)); - - olddmc=hold_update; - hold_update=1; - for(pos=0;str[pos];pos++) - { - ret=str[pos]; - if(str[pos]=='\n') - ciolib_putch('\r'); - ciolib_putch(str[pos]); - } - hold_update=olddmc; - ciolib_gotoxy(ciolib_wherex(),ciolib_wherey()); - return(ret); -} - -/* Optional... and overriding is silly */ -CIOLIBEXPORT void ciolib_textbackground(int colour) -{ - unsigned char attr; - unsigned char col; - - CIOLIB_INIT(); - - if(cio_api.textbackground) { - cio_api.textbackground(colour); - return; - } - - attr=cio_textinfo.attribute; - attr&=143; - col=(colour & 0x07); - attr|=(col<<4); - ciolib_textattr(attr); -} - -/* Optional... and overriding is silly */ -CIOLIBEXPORT void ciolib_textcolor(int colour) -{ - unsigned char attr; - unsigned char col; - - CIOLIB_INIT(); - - if(cio_api.textcolor) { - cio_api.textcolor(colour); - return; - } - - attr=cio_textinfo.attribute; - attr&=240; - col=colour&0x0f; - attr|=col; - ciolib_textattr(attr); -} - -/* Optional... and overriding is silly */ -CIOLIBEXPORT void ciolib_highvideo(void) -{ - int attr; - - CIOLIB_INIT(); - - if(cio_api.highvideo) { - cio_api.highvideo(); - return; - } - - attr=cio_textinfo.attribute; - attr |= 8; - ciolib_textattr(attr); -} - -/* Optional... and overriding is silly */ -CIOLIBEXPORT void ciolib_lowvideo(void) -{ - int attr; - - CIOLIB_INIT(); - - if(cio_api.lowvideo) { - cio_api.lowvideo(); - return; - } - - attr=cio_textinfo.attribute; - attr &= 0xf7; - ciolib_textattr(attr); -} - -/* Optional... and overriding is silly */ -CIOLIBEXPORT void ciolib_normvideo(void) -{ - CIOLIB_INIT(); - - if(cio_api.normvideo) { - cio_api.normvideo(); - return; - } - ciolib_textattr(cio_textinfo.normattr); -} - -/* **MUST** be implemented */ -/* - * Non-zero on success - */ -CIOLIBEXPORT int ciolib_puttext(int a,int b,int c,int d,void *e) -{ - char *buf=e; - int ret; - CIOLIB_INIT(); - - ret = cio_api.puttext(a,b,c,d,(void *)buf); - if (buf != e) - free(buf); - return ret; -} - -/* **MUST** be implemented */ -/* 1 on success, 0 on failure */ -CIOLIBEXPORT int ciolib_gettext(int a,int b,int c,int d,void *e) -{ - char *ch; - int i; - int ret; - struct vmem_cell *buf; - CIOLIB_INIT(); - - if (cio_api.gettext == NULL) { - buf = malloc((c-a+1)*(d-b+1)*sizeof(*buf)); - if (buf == NULL) - return 0; - ch = e; - ret = cio_api.vmem_gettext(a,b,c,d,buf); - for (i=0; i<(c-a+1)*(d-b+1); i++) { - *(ch++)=buf[i].ch; - *(ch++)=buf[i].legacy_attr; - } - free(buf); - } - else - ret = cio_api.gettext(a,b,c,d,e); - return ret; -} - -/* Optional */ -/* 1 on success, 0 on failure */ -CIOLIBEXPORT int ciolib_vmem_gettext(int a,int b,int c,int d,struct vmem_cell *e) -{ - int ret; - uint16_t *buf; - int i; - CIOLIB_INIT(); - - if (cio_api.vmem_gettext == NULL) { - buf = malloc((c-a+1)*(d-b+1)*sizeof(*buf)); - if (buf == NULL) - return 0; - ret = ciolib_gettext(a, b, c, d, buf); - if (ret) { - for (i=0; i<(c-a+1)*(d-b+1); i++) { - memset(&e[i], 0, sizeof(e[0])); - e[i].ch = buf[i] & 0xff; - e[i].legacy_attr = buf[i] >> 8; - } - } - free(buf); - return ret; - } - return cio_api.vmem_gettext(a,b,c,d,e); -} - -/* Optional */ -/* Non-zero on success */ -CIOLIBEXPORT int ciolib_vmem_puttext(int a,int b,int c,int d,struct vmem_cell *e) -{ - int i; - int ret; - uint16_t *buf; - CIOLIB_INIT(); - - if (cio_api.vmem_puttext == NULL) { - buf = malloc((c-a+1)*(d-b+1)*sizeof(*buf)); - if (buf == NULL) - return 0; - for (i=0; i<(c-a+1)*(d-b+1); i++) - buf[i] = (e[i].legacy_attr << 8) | (e[i].ch); - ret = ciolib_puttext(a, b, c, d, buf); - free(buf); - return ret; - } - return cio_api.vmem_puttext(a,b,c,d,e); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_textattr(int a) -{ - CIOLIB_INIT(); - - if(cio_api.textattr) { - cio_api.textattr(a); - return; - } - - cio_textinfo.attribute=a; - ciolib_attr2palette(a, &ciolib_fg, &ciolib_bg); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_delay(long a) -{ - CIOLIB_INIT(); - - if(cio_api.delay) { - cio_api.delay(a); - return; - } - SLEEP(a); -} - -/* Optional */ -/* Returns ch on success, EOF on error */ -CIOLIBEXPORT int ciolib_putch(int ch) -{ - unsigned char a1=ch; - struct vmem_cell buf[1]; - int i; - int old_puttext_can_move=puttext_can_move; - - CIOLIB_INIT(); - - if(cio_api.putch) - return(cio_api.putch(a1)); - - puttext_can_move=1; - - buf[0].ch=a1; - buf[0].legacy_attr=cio_textinfo.attribute; - buf[0].fg = ciolib_fg; - buf[0].bg = ciolib_bg; - buf[0].font = ciolib_attrfont(cio_textinfo.attribute); - - switch(a1) { - case '\r': - ciolib_gotoxy(1,cio_textinfo.cury); - break; - case '\n': - if(cio_textinfo.cury==cio_textinfo.winbottom-cio_textinfo.wintop+1) - ciolib_wscroll(); - else - ciolib_gotoxy(cio_textinfo.curx, cio_textinfo.cury+1); - break; - case '\b': - if(cio_textinfo.curx>1) { - ciolib_gotoxy(cio_textinfo.curx-1,cio_textinfo.cury); - buf[0].ch=' '; - ciolib_vmem_puttext(cio_textinfo.curx+cio_textinfo.winleft-1 - ,cio_textinfo.cury+cio_textinfo.wintop-1 - ,cio_textinfo.curx+cio_textinfo.winleft-1 - ,cio_textinfo.cury+cio_textinfo.wintop-1 - ,buf); - } - break; - case 7: /* Bell */ - ciolib_beep(); - break; - case '\t': - for(i=0;i<(sizeof(tabs)/sizeof(int));i++) { - if(tabs[i]>cio_textinfo.curx) { - buf[0].ch=' '; - while(cio_textinfo.curx<tabs[i]) { - ciolib_vmem_puttext(cio_textinfo.curx+cio_textinfo.winleft-1 - ,cio_textinfo.cury+cio_textinfo.wintop-1 - ,cio_textinfo.curx+cio_textinfo.winleft-1 - ,cio_textinfo.cury+cio_textinfo.wintop-1 - ,buf); - ciolib_gotoxy(cio_textinfo.curx+1,cio_textinfo.cury); - if(cio_textinfo.curx==cio_textinfo.screenwidth) - break; - } - break; - } - } - if(cio_textinfo.curx==cio_textinfo.screenwidth) { - ciolib_gotoxy(1,cio_textinfo.cury); - if(cio_textinfo.cury==cio_textinfo.winbottom-cio_textinfo.wintop+1) - ciolib_wscroll(); - else - ciolib_gotoxy(cio_textinfo.curx, cio_textinfo.cury+1); - } - break; - default: - if(cio_textinfo.cury==cio_textinfo.winbottom-cio_textinfo.wintop+1 - && cio_textinfo.curx==cio_textinfo.winright-cio_textinfo.winleft+1) { - ciolib_vmem_puttext(ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,buf); - ciolib_wscroll(); - ciolib_gotoxy(1, cio_textinfo.winbottom-cio_textinfo.wintop+1); - } - else { - if(cio_textinfo.curx==cio_textinfo.winright-cio_textinfo.winleft+1) { - ciolib_vmem_puttext(ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,buf); - ciolib_gotoxy(1,cio_textinfo.cury+1); - } - else { - ciolib_vmem_puttext(ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,buf); - ciolib_gotoxy(cio_textinfo.curx+1, cio_textinfo.cury); - } - } - break; - } - - puttext_can_move=old_puttext_can_move; - - return(a1); - -} - -/* **MUST** be implemented */ -CIOLIBEXPORT void ciolib_setcursortype(int a) -{ - CIOLIB_INIT(); - - cio_api.setcursortype(a); -} - -/* Optional */ -/* Return Non-zero on success */ -CIOLIBEXPORT int ciolib_showmouse(void) { - CIOLIB_INIT(); - - if(cio_api.showmouse!=NULL) - return(cio_api.showmouse()); - return(0); -} - -/* Optional */ -/* Return Non-zero on success */ -CIOLIBEXPORT int ciolib_hidemouse(void) { - CIOLIB_INIT(); - - if(cio_api.hidemouse!=NULL) - return(cio_api.hidemouse()); - return(0); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setname(const char *name) { - CIOLIB_INIT(); - - if(cio_api.setname!=NULL) - cio_api.setname(name); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_seticon(const void *icon, unsigned long size) { - CIOLIB_INIT(); - - if(cio_api.seticon!=NULL) - cio_api.seticon(icon,size); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_settitle(const char *title) { - CIOLIB_INIT(); - - if(cio_api.settitle!=NULL) - cio_api.settitle(title); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_copytext(const char *text, size_t buflen) -{ - CIOLIB_INIT(); - - if(cio_api.copytext!=NULL) - cio_api.copytext(text,buflen); -} - -/* Optional */ -/* Returns NULL on error */ -CIOLIBEXPORT char * ciolib_getcliptext(void) -{ - CIOLIB_INIT(); - - if(cio_api.getcliptext!=NULL) - return(cio_api.getcliptext()); - else - return(NULL); -} - -/* Optional */ -/* Return Non-zero on success */ -CIOLIBEXPORT int ciolib_setfont(int font, int force, int font_num) -{ - CIOLIB_INIT(); - - if(cio_api.setfont!=NULL) - return(cio_api.setfont(font,force,font_num)); - else - return(0); -} - -/* Optional */ -/* Return -1 if not implemented */ -CIOLIBEXPORT int ciolib_getfont(int font_num) -{ - CIOLIB_INIT(); - - if(cio_api.getfont!=NULL) - return(cio_api.getfont(font_num)); - else - return(-1); -} - -/* Optional */ -/* Return Non-zero on success */ -CIOLIBEXPORT int ciolib_loadfont(const char *filename) -{ - CIOLIB_INIT(); - - if(cio_api.loadfont!=NULL) - return(cio_api.loadfont(filename)); - else - return(0); -} - -/* Optional */ -/* Return Non-zero on success */ -CIOLIBEXPORT int ciolib_get_window_info(int *width, int *height, int *xpos, int *ypos) -{ - CIOLIB_INIT(); - - if(cio_api.get_window_info!=NULL) - return(cio_api.get_window_info(width,height,xpos,ypos)); - else { - if(width) - *width=-1; - if(height) - *height=-1; - if(xpos) - *xpos=-1; - if(ypos) - *ypos=-1; - } - return(0); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_beep(void) -{ - CIOLIB_INIT(); - - if(cio_api.beep) - cio_api.beep(); - else - BEEP(440,100); - return; -} - -/* Optional */ -CIOLIBEXPORT void ciolib_getcustomcursor(int *start, int *end, int *range, int *blink, int *visible) -{ - CIOLIB_INIT(); - - if(cio_api.getcustomcursor) - cio_api.getcustomcursor(start,end,range,blink,visible); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setcustomcursor(int start, int end, int range, int blink, int visible) -{ - CIOLIB_INIT(); - - if(cio_api.setcustomcursor) - cio_api.setcustomcursor(start,end,range,blink,visible); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setvideoflags(int flags) -{ - CIOLIB_INIT(); - - if(cio_api.setvideoflags) - cio_api.setvideoflags(flags); -} - -/* Optional */ -CIOLIBEXPORT int ciolib_getvideoflags(void) -{ - CIOLIB_INIT(); - - if(cio_api.getvideoflags) - return(cio_api.getvideoflags()); - return(0); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setscaling(int new_value) -{ - CIOLIB_INIT(); - - if(cio_api.setscaling) - cio_api.setscaling(new_value); -} - -/* Optional */ -/* Returns zero on error */ -CIOLIBEXPORT int ciolib_getscaling(void) -{ - CIOLIB_INIT(); - - if(cio_api.getscaling) - return(cio_api.getscaling()); - return(1); -} - -/* Optional */ -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b) -{ - CIOLIB_INIT(); - - if(cio_api.setpalette) - return(cio_api.setpalette(entry, r, g, b)); - return(0); -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_attr2palette(uint8_t attr, uint32_t *fg, uint32_t *bg) -{ - CIOLIB_INIT(); - - if (cio_api.attr2palette) - return cio_api.attr2palette(attr, fg, bg); - /* - * TODO: If we want to be able to cross screens, we need some - * mapping for non-plaette aware things. - */ - return 0; -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_setpixel(uint32_t x, uint32_t y, uint32_t colour) -{ - CIOLIB_INIT(); - - if (cio_api.setpixel) - return cio_api.setpixel(x, y, colour); - return 0; -} - -/* Returns NULL on failure */ -CIOLIBEXPORT struct ciolib_pixels * ciolib_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force) -{ - CIOLIB_INIT(); - - if (cio_api.getpixels) - return cio_api.getpixels(sx, sy, ex, ey, force); - return NULL; -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask) -{ - CIOLIB_INIT(); - - if (cio_api.setpixels) - return cio_api.setpixels(sx, sy, ex, ey, x_off, y_off, pixels, mask); - return 0; -} - -CIOLIBEXPORT void ciolib_freepixels(struct ciolib_pixels *pixels) -{ - if (pixels == NULL) - return; - - FREE_AND_NULL(pixels->pixels); - FREE_AND_NULL(pixels->pixelsb); - FREE_AND_NULL(pixels); -} - -/* Returns NULL on failure */ -CIOLIBEXPORT struct ciolib_screen * ciolib_savescreen(void) -{ - struct ciolib_screen *ret; - int vmode; - int i; - - CIOLIB_INIT(); - - ret = malloc(sizeof(*ret)); - if (ret == NULL) - return NULL; - - ciolib_gettextinfo(&ret->text_info); - vmode = find_vmode(ret->text_info.currmode); - ret->vmem = malloc(ret->text_info.screenwidth * ret->text_info.screenheight * sizeof(struct vmem_cell)); - if (ret->vmem == NULL) { - free(ret); - return NULL; - } - - if (vmode != -1) { - ret->pixels = ciolib_getpixels(0, 0, vparams[vmode].charwidth * vparams[vmode].cols - 1, vparams[vmode].charheight * vparams[vmode].rows - 1, TRUE); - } - ciolib_vmem_gettext(1, 1, ret->text_info.screenwidth, ret->text_info.screenheight, ret->vmem); - ret->fg_colour = ciolib_fg; - ret->bg_colour = ciolib_bg; - for (i=0; i<5; i++) - ret->fonts[i] = ciolib_getfont(i); - ret->flags = ciolib_getvideoflags(); - ciolib_get_modepalette(ret->palette); - - return ret; -} - -CIOLIBEXPORT void ciolib_freescreen(struct ciolib_screen *scrn) -{ - if (scrn == NULL) - return; - - ciolib_freepixels(scrn->pixels); - FREE_AND_NULL(scrn->vmem); - free(scrn); -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_restorescreen(struct ciolib_screen *scrn) -{ - struct text_info ti; - int vmode; - int i; - - CIOLIB_INIT(); - - ciolib_gettextinfo(&ti); - - if (ti.currmode != scrn->text_info.currmode) - ciolib_textmode(scrn->text_info.currmode); - ciolib_set_modepalette(scrn->palette); - ciolib_vmem_puttext(1, 1, scrn->text_info.screenwidth, scrn->text_info.screenheight, scrn->vmem); - ciolib_textcolor(scrn->text_info.attribute); - ciolib_window(scrn->text_info.winleft, scrn->text_info.wintop, scrn->text_info.winright, scrn->text_info.winbottom); - vmode = find_vmode(scrn->text_info.currmode); - if (vmode != -1 && scrn->pixels != NULL) - ciolib_setpixels(0, 0, vparams[vmode].charwidth * vparams[vmode].cols - 1, vparams[vmode].charheight * vparams[vmode].rows - 1, 0, 0, scrn->pixels, NULL); - for (i=0; i<5; i++) - ciolib_setfont(scrn->fonts[i], FALSE, i); - ciolib_setvideoflags(scrn->flags); - ciolib_setcolour(scrn->fg_colour, scrn->bg_colour); - ciolib_gotoxy(scrn->text_info.curx, scrn->text_info.cury); - return 1; -} - -CIOLIBEXPORT void ciolib_setcolour(uint32_t fg, uint32_t bg) -{ - ciolib_fg = fg; - ciolib_bg = bg; -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_get_modepalette(uint32_t p[16]) -{ - CIOLIB_INIT(); - - if (cio_api.get_modepalette) - return cio_api.get_modepalette(p); - return 0; -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_set_modepalette(uint32_t p[16]) -{ - CIOLIB_INIT(); - - if (cio_api.set_modepalette) - return cio_api.set_modepalette(p); - return 0; -} - -/* Returns non-zero on success */ -CIOLIBEXPORT uint32_t ciolib_map_rgb(uint16_t r, uint16_t g, uint16_t b) -{ - CIOLIB_INIT(); - - if (cio_api.map_rgb) - return cio_api.map_rgb(r,g,b); - return 0; -} - -CIOLIBEXPORT void ciolib_replace_font(uint8_t id, char *name, void *data, size_t size) -{ - CIOLIB_INIT(); - - if (cio_api.replace_font) { - cio_api.replace_font(id, name, data, size); - return; - } - free(name); - free(data); -} - -CIOLIBEXPORT int ciolib_attrfont(uint8_t attr) -{ - int flags; - int font = 0; - CIOLIB_INIT(); - - flags = ciolib_getvideoflags(); - if ((flags & CIOLIB_VIDEO_ALTCHARS) && (attr & 0x08)) - font |= 1; - if ((flags & CIOLIB_VIDEO_BLINKALTCHARS) && (attr & 0x80)) - font |= 2; - return ciolib_getfont(font+1); -} - -/* Returns non-zero if fontnum is supported in this mode */ -CIOLIBEXPORT int ciolib_checkfont(int fontnum) -{ - int vmode; - struct text_info ti; - - CIOLIB_INIT(); - - if (fontnum < 0 || fontnum > 255) - return 0; - - // Font 0 is always supported. - if (fontnum == 0) - return 1; - - ciolib_gettextinfo(&ti); - vmode = find_vmode(ti.currmode); - - if (cio_api.checkfont != NULL) - return cio_api.checkfont(fontnum); - if (vmode == -1) - return 0; - - if (cio_api.options & CONIO_OPT_FONT_SELECT) { - switch (vparams[vmode].charheight) { - case 8: - if (conio_fontdata[fontnum].eight_by_eight) - return 1; - return 0; - case 14: - if (conio_fontdata[fontnum].eight_by_fourteen) - return 1; - return 0; - case 16: - if (conio_fontdata[fontnum].eight_by_sixteen) - return 1; - return 0; - default: - return 0; - } - } - return 0; - -} - -CIOLIBEXPORT void -ciolib_set_vmem(struct vmem_cell *cell, uint8_t ch, uint8_t attr, uint8_t font) -{ - CIOLIB_INIT(); - - if (cell == NULL) - return; - cell->ch = ch; - cell->font = font; - ciolib_set_vmem_attr(cell, attr); -} - -CIOLIBEXPORT void -ciolib_set_vmem_attr(struct vmem_cell *cell, uint8_t attr) -{ - CIOLIB_INIT(); - - if (cell == NULL) - return; - cell->legacy_attr = attr; - ciolib_attr2palette(attr, &cell->fg, &cell->bg); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setwinsize(int w, int h) -{ - CIOLIB_INIT(); - - if(cio_api.setwinsize) - cio_api.setwinsize(w, h); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setwinposition(int x, int y) -{ - CIOLIB_INIT(); - - if(cio_api.setwinposition) - cio_api.setwinposition(x, y); -} - -CIOLIBEXPORT enum ciolib_codepage ciolib_getcodepage(void) -{ - int font = ciolib_getfont(1); - - if (font < 0) - return CIOLIB_CP437; - if (font >= sizeof(conio_fontdata) / sizeof(conio_fontdata[0])) - return CIOLIB_CP437; - return conio_fontdata[font].cp; -} - -#if defined(__DARWIN__) -#ifdef main -#undef main -#endif - -sem_t startsdl_sem; -sem_t main_sem; -int initsdl_ret = -1; - -struct main_args { - int argc; - char **argv; - int ret; - int no_sdl; -}; - -int CIOLIB_main(int, char **); -void main_stub(void *argptr) -{ - struct main_args *args = (struct main_args *)argptr; - args->ret = CIOLIB_main(args->argc, args->argv); - args->no_sdl = 1; - sem_post(&startsdl_sem); - sem_post(&main_sem); - exit_sdl_con(); -} - -int main(int argc, char **argv) -{ - struct main_args ma = {argc, argv, -1, 0}; - sem_init(&startsdl_sem, 0, 0); - sem_init(&main_sem, 0, 0); - initsdl_ret = init_sdl_video(); - _beginthread(main_stub, 0, &ma); - if (!ma.no_sdl) { - if (initsdl_ret != -1) { - sem_wait(&startsdl_sem); - sdl_video_event_thread(NULL); - } - } - sem_wait(&main_sem); - return ma.ret; -} -#endif - -/* Returns non-zero on success */ -CIOLIBEXPORT uint32_t ciolib_mousepointer(enum ciolib_mouse_ptr type) -{ - CIOLIB_INIT(); - - if (cio_api.mousepointer) - return cio_api.mousepointer(type); - return 0; -} diff --git a/ciolib/ciolib.h b/ciolib/ciolib.h deleted file mode 100644 index ba56dfd..0000000 --- a/ciolib/ciolib.h +++ /dev/null @@ -1,707 +0,0 @@ -/* $Id: ciolib.h,v 1.125 2020/06/27 00:04:44 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _CIOLIB_H_ -#define _CIOLIB_H_ - -#include <string.h> /* size_t */ -#if defined(__DARWIN__) -#include <semwrap.h> -#endif -#include "gen_defs.h" -#include "utf8_codepages.h" - -#ifdef CIOLIBEXPORT - #undef CIOLIBEXPORT -#endif - -#ifdef _WIN32 - #if defined(CIOLIB_IMPORTS) || defined(CIOLIB_EXPORTS) - #if defined(CIOLIB_IMPORTS) - #define CIOLIBEXPORT __declspec( dllimport ) - #define CIOLIBEXPORTVAR __declspec( dllimport ) - #else - #define CIOLIBEXPORT __declspec( dllexport ) - #define CIOLIBEXPORTVAR __declspec( dllexport ) - #endif - #else /* self-contained executable */ - #define CIOLIBEXPORT - #define CIOLIBEXPORTVAR extern - #endif -#elif defined __unix__ - #define CIOLIBEXPORT - #define CIOLIBEXPORTVAR extern -#else - #define CIOLIBEXPORT - #define CIOLIBEXPORTVAR extern -#endif - -enum { - CIOLIB_MODE_AUTO - ,CIOLIB_MODE_CURSES - ,CIOLIB_MODE_CURSES_IBM - ,CIOLIB_MODE_CURSES_ASCII - ,CIOLIB_MODE_ANSI - ,CIOLIB_MODE_X - ,CIOLIB_MODE_CONIO - ,CIOLIB_MODE_CONIO_FULLSCREEN - ,CIOLIB_MODE_SDL - ,CIOLIB_MODE_SDL_FULLSCREEN -}; - -enum ciolib_mouse_ptr { - CIOLIB_MOUSEPTR_ARROW - ,CIOLIB_MOUSEPTR_BAR -}; - -#if defined(_WIN32) /* presumably, Win32 */ - - #include <io.h> /* isatty */ - -#endif - -#ifndef __COLORS -#define __COLORS - -enum { - BLACK - ,BLUE - ,GREEN - ,CYAN - ,RED - ,MAGENTA - ,BROWN - ,LIGHTGRAY - ,DARKGRAY - ,LIGHTBLUE - ,LIGHTGREEN - ,LIGHTCYAN - ,LIGHTRED - ,LIGHTMAGENTA - ,YELLOW - ,WHITE -}; - -#endif /* __COLORS */ - -#ifndef BLINK -#define BLINK 128 -#endif - -#define CIOLIB_VIDEO_ALTCHARS (1<<0) // Attribute bit 3 selects alternate char set -#define CIOLIB_VIDEO_NOBRIGHT (1<<1) // Attribute bit 3 does not increase intensity -#define CIOLIB_VIDEO_BGBRIGHT (1<<2) // Attribute bit 7 selects high intensity background, not blink -#define CIOLIB_VIDEO_BLINKALTCHARS (1<<3) // Attribute bit 7 selects alternate char set -#define CIOLIB_VIDEO_NOBLINK (1<<4) // Attribute bit 7 has no effect -#define CIOLIB_VIDEO_EXPAND (1<<5) // Use an extra blank column between characters from the font -#define CIOLIB_VIDEO_LINE_GRAPHICS_EXPAND (1<<6) // Per VGA, when using CIOLIB_VIDEO_EXPAND, repeat the last column for chars 0xC0 - 0xDF inclusive - -enum text_modes -{ - /* DOS-compatible modes */ - - LASTMODE = -1, - BW40 = 0, - C40, - BW80, - C80, - MONO = 7, - - /* New Color modes */ - - C40X14 = 8, - C40X21, - C40X28, - C40X43, - C40X50, - C40X60, - - C80X14, - C80X21, - C80X28, - C80X30, - C80X43, - C80X50, - C80X60, - - /* New Black & White modes */ - - BW40X14, - BW40X21, - BW40X28, - BW40X43, - BW40X50, - BW40X60, - - BW80X14, - BW80X21, - BW80X28, - BW80X43, - BW80X50, - BW80X60, - - /* New Monochrome modes */ - - MONO14, /* Invalid VGA mode */ - MONO21, - MONO28, - MONO43, - MONO50, - MONO60, // 38 - - /* New modes we've added 'cause they're cool */ - - ST132X37_16_9, - ST132X52_5_4, - - /* New modes we've added 'cause they're stupid */ - VGA80X25, - - /* New modes we've added because DigitalMan bitched for DAYS! */ - LCD80X25, - - /* Cruft... */ - - C4350 = C80X50, /* this is actually "64" in the "real" conio */ - - _ORIGMODE = 65, /* original mode at program startup */ - - EGA80X25, /* 80x25 in 640x350 screen */ - C64_40X25 = 147, /* Commodore 64 40x25 colour mode */ - C128_40X25, /* Commodore 128 40x25 colour mode */ - C128_80X25, /* Commodore 128 40x25 colour mode */ - ATARI_40X24, /* Atari 800 40x24 colour text mode */ - ATARI_80X25, /* Atari 800 XEP80 80x25 mono text mode */ - - /* VESA Modes */ - VESA_132X21 = 235, - VESA_132X25 = 231, - VESA_132X28 = 228, - VESA_132X30 = 226, - VESA_132X34 = 222, - VESA_132X43 = 213, - VESA_132X50 = 206, - VESA_132X60 = 196, - - /* Custom Mode */ - CIOLIB_MODE_CUSTOM = 255, // Last mode... if it's over 255, text_info can't hold it. -}; - -#define COLOR_MODE C80 - -enum -{ - _NOCURSOR, - _SOLIDCURSOR, - _NORMALCURSOR -}; - -struct text_info { - unsigned char winleft; /* left window coordinate */ - unsigned char wintop; /* top window coordinate */ - unsigned char winright; /* right window coordinate */ - unsigned char winbottom; /* bottom window coordinate */ - unsigned char attribute; /* text attribute */ - unsigned char normattr; /* normal attribute */ - unsigned char currmode; /* current video mode: - BW40, BW80, C40, C80, or C4350 */ - unsigned char screenheight; /* text screen's height */ - unsigned char screenwidth; /* text screen's width */ - unsigned char curx; /* x-coordinate in current window */ - unsigned char cury; /* y-coordinate in current window */ -}; - -CIOLIBEXPORTVAR struct text_info cio_textinfo; -CIOLIBEXPORTVAR uint32_t ciolib_fg; -CIOLIBEXPORTVAR uint32_t ciolib_bg; - -struct mouse_event { - int event; - int bstate; - int kbsm; - int startx; - int starty; - int endx; - int endy; - int startx_res; - int starty_res; - int endx_res; - int endy_res; -}; - -struct conio_font_data_struct { - char *eight_by_sixteen; - char *eight_by_fourteen; - char *eight_by_eight; - char *desc; - enum ciolib_codepage cp; -}; - -CIOLIBEXPORTVAR struct conio_font_data_struct conio_fontdata[257]; - -struct ciolib_pixels { - uint32_t *pixels; - uint32_t *pixelsb; - uint32_t width; - uint32_t height; -}; - -struct vmem_cell { - uint8_t legacy_attr; - uint8_t ch; - uint8_t font; - uint32_t fg; // RGB 00RRGGBB High bit indicates palette colour - uint32_t bg; // RGB 00RRGGBB High bit indicates palette colour -}; - -struct ciolib_screen { - uint32_t fg_colour; - uint32_t bg_colour; - int flags; - int fonts[5]; - struct ciolib_pixels *pixels; - struct vmem_cell *vmem; - struct text_info text_info; - uint32_t palette[16]; -}; - -#define CONIO_FIRST_FREE_FONT 43 - -typedef struct { - int mode; - int mouse; - uint64_t options; -#define CONIO_OPT_LOADABLE_FONTS 1 -#define CONIO_OPT_BLINK_ALT_FONT 2 -#define CONIO_OPT_BOLD_ALT_FONT 4 -#define CONIO_OPT_BRIGHT_BACKGROUND 8 -#define CONIO_OPT_PALETTE_SETTING 16 -#define CONIO_OPT_SET_PIXEL 32 -#define CONIO_OPT_CUSTOM_CURSOR 64 -#define CONIO_OPT_FONT_SELECT 128 -#define CONIO_OPT_SET_TITLE 256 -#define CONIO_OPT_SET_NAME 512 -#define CONIO_OPT_SET_ICON 1024 -#define CONIO_OPT_EXTENDED_PALETTE 2048 -#define CONIO_OPT_BLOCKY_SCALING 4096 - void (*clreol) (void); - int (*puttext) (int,int,int,int,void *); - int (*vmem_puttext) (int,int,int,int,struct vmem_cell *); - int (*gettext) (int,int,int,int,void *); - int (*vmem_gettext) (int,int,int,int,struct vmem_cell *); - void (*textattr) (int); - int (*kbhit) (void); - void (*delay) (long); - int (*wherex) (void); - int (*wherey) (void); - int (*putch) (int); - void (*gotoxy) (int,int); - void (*clrscr) (void); - void (*gettextinfo) (struct text_info *); - void (*setcursortype)(int); - int (*getch) (void); - int (*getche) (void); - void (*beep) (void); - void (*highvideo) (void); - void (*lowvideo) (void); - void (*normvideo) (void); - void (*textmode) (int); - int (*ungetch) (int); - int (*movetext) (int,int,int,int,int,int); - char *(*cgets) (char *); - int (*cscanf) (char *,...); - char *(*getpass) (const char *); - void (*wscroll) (void); - void (*window) (int,int,int,int); - void (*delline) (void); - void (*insline) (void); - int (*cprintf) (const char *,...); - int (*cputs) (const char *); - void (*textbackground) (int); - void (*textcolor) (int); - int (*getmouse) (struct mouse_event *mevent); - int (*ungetmouse) (struct mouse_event *mevent); - int (*hidemouse) (void); - int (*showmouse) (void); - int (*mousepointer) (enum ciolib_mouse_ptr); - void (*settitle) (const char *); - void (*setname) (const char *); - void (*seticon) (const void *, unsigned long); - void (*copytext) (const char *, size_t); - char *(*getcliptext) (void); - void (*suspend) (void); - void (*resume) (void); - int (*setfont) (int font, int force, int font_num); - int (*getfont) (int font_num); - int (*loadfont) (const char *filename); - int (*get_window_info) (int* width, int* height, int* xpos, int* ypos); - void (*getcustomcursor) (int *startline, int *endline, int *range, int *blink, int *visible); - void (*setcustomcursor) (int startline, int endline, int range, int blink, int visible); - void (*setvideoflags) (int flags); - int (*getvideoflags) (void); - void (*setscaling) (int new_value); - int (*getscaling) (void); - int *escdelay; - int (*setpalette) (uint32_t entry, uint16_t r, uint16_t g, uint16_t b); - int (*attr2palette) (uint8_t attr, uint32_t *fg, uint32_t *bg); - int (*setpixel) (uint32_t x, uint32_t y, uint32_t colour); - struct ciolib_pixels *(*getpixels)(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force); - int (*setpixels)(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask); - int (*get_modepalette)(uint32_t[16]); - int (*set_modepalette)(uint32_t[16]); - uint32_t (*map_rgb)(uint16_t r, uint16_t g, uint16_t b); - void (*replace_font)(uint8_t id, char *name, void *data, size_t size); - int (*checkfont)(int font_num); - void (*setwinsize) (int width, int height); - void (*setwinposition) (int x, int y); -} cioapi_t; - -CIOLIBEXPORTVAR cioapi_t cio_api; -CIOLIBEXPORTVAR int _wscroll; -CIOLIBEXPORTVAR int directvideo; -CIOLIBEXPORTVAR int hold_update; -CIOLIBEXPORTVAR int puttext_can_move; -CIOLIBEXPORTVAR int ciolib_reaper; -CIOLIBEXPORTVAR char *ciolib_appname; -CIOLIBEXPORTVAR int ciolib_initial_window_height; -CIOLIBEXPORTVAR int ciolib_initial_window_width; - -#define _conio_kbhit() kbhit() - -#ifdef __cplusplus -extern "C" { -#endif -CIOLIBEXPORT int initciolib(int mode); -CIOLIBEXPORT void suspendciolib(void); - -CIOLIBEXPORT int ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy); -CIOLIBEXPORT char * ciolib_cgets(char *str); -CIOLIBEXPORT int ciolib_cscanf (char *format , ...); -CIOLIBEXPORT int ciolib_kbhit(void); -CIOLIBEXPORT int ciolib_getch(void); -CIOLIBEXPORT int ciolib_getche(void); -CIOLIBEXPORT int ciolib_ungetch(int ch); -CIOLIBEXPORT void ciolib_gettextinfo(struct text_info *info); -CIOLIBEXPORT int ciolib_wherex(void); -CIOLIBEXPORT int ciolib_wherey(void); -CIOLIBEXPORT void ciolib_wscroll(void); -CIOLIBEXPORT void ciolib_gotoxy(int x, int y); -CIOLIBEXPORT void ciolib_clreol(void); -CIOLIBEXPORT void ciolib_clrscr(void); -CIOLIBEXPORT int ciolib_cputs(const char *str); -CIOLIBEXPORT int ciolib_cprintf(const char *fmat, ...); -CIOLIBEXPORT void ciolib_textbackground(int colour); -CIOLIBEXPORT void ciolib_textcolor(int colour); -CIOLIBEXPORT void ciolib_highvideo(void); -CIOLIBEXPORT void ciolib_lowvideo(void); -CIOLIBEXPORT void ciolib_normvideo(void); -CIOLIBEXPORT int ciolib_puttext(int a,int b,int c,int d,void *e); -CIOLIBEXPORT int ciolib_vmem_puttext(int a,int b,int c,int d,struct vmem_cell *e); -CIOLIBEXPORT int ciolib_gettext(int a,int b,int c,int d,void *e); -CIOLIBEXPORT int ciolib_vmem_gettext(int a,int b,int c,int d,struct vmem_cell *e); -CIOLIBEXPORT void ciolib_textattr(int a); -CIOLIBEXPORT void ciolib_delay(long a); -CIOLIBEXPORT int ciolib_putch(int a); -CIOLIBEXPORT void ciolib_setcursortype(int a); -CIOLIBEXPORT void ciolib_textmode(int mode); -CIOLIBEXPORT void ciolib_window(int sx, int sy, int ex, int ey); -CIOLIBEXPORT void ciolib_delline(void); -CIOLIBEXPORT void ciolib_insline(void); -CIOLIBEXPORT char * ciolib_getpass(const char *prompt); -CIOLIBEXPORT void ciolib_settitle(const char *title); -CIOLIBEXPORT void ciolib_setname(const char *title); -CIOLIBEXPORT void ciolib_seticon(const void *icon,unsigned long size); -CIOLIBEXPORT int ciolib_showmouse(void); -CIOLIBEXPORT int ciolib_hidemouse(void); -CIOLIBEXPORT int ciolib_mousepointeer(enum ciolib_mouse_ptr); -CIOLIBEXPORT void ciolib_copytext(const char *text, size_t buflen); -CIOLIBEXPORT char * ciolib_getcliptext(void); -CIOLIBEXPORT int ciolib_setfont(int font, int force, int font_num); -CIOLIBEXPORT int ciolib_getfont(int font_num); -CIOLIBEXPORT int ciolib_loadfont(const char *filename); -CIOLIBEXPORT int ciolib_get_window_info(int *width, int *height, int *xpos, int *ypos); -CIOLIBEXPORT void ciolib_beep(void); -CIOLIBEXPORT void ciolib_getcustomcursor(int *startline, int *endline, int *range, int *blink, int *visible); -CIOLIBEXPORT void ciolib_setcustomcursor(int startline, int endline, int range, int blink, int visible); -CIOLIBEXPORT void ciolib_setvideoflags(int flags); -CIOLIBEXPORT int ciolib_getvideoflags(void); -CIOLIBEXPORT void ciolib_setscaling(int flags); -CIOLIBEXPORT int ciolib_getscaling(void); -CIOLIBEXPORT int ciolib_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b); -CIOLIBEXPORT int ciolib_attr2palette(uint8_t attr, uint32_t *fg, uint32_t *bg); -CIOLIBEXPORT int ciolib_setpixel(uint32_t x, uint32_t y, uint32_t colour); -CIOLIBEXPORT struct ciolib_pixels * ciolib_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force); -CIOLIBEXPORT int ciolib_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask); -CIOLIBEXPORT void ciolib_freepixels(struct ciolib_pixels *pixels); -CIOLIBEXPORT struct ciolib_screen * ciolib_savescreen(void); -CIOLIBEXPORT void ciolib_freescreen(struct ciolib_screen *); -CIOLIBEXPORT int ciolib_restorescreen(struct ciolib_screen *scrn); -CIOLIBEXPORT void ciolib_setcolour(uint32_t fg, uint32_t bg); -CIOLIBEXPORT int ciolib_get_modepalette(uint32_t[16]); -CIOLIBEXPORT int ciolib_set_modepalette(uint32_t[16]); -CIOLIBEXPORT uint32_t ciolib_map_rgb(uint16_t r, uint16_t g, uint16_t b); -CIOLIBEXPORT void ciolib_replace_font(uint8_t id, char *name, void *data, size_t size); -CIOLIBEXPORT int ciolib_attrfont(uint8_t attr); -CIOLIBEXPORT int ciolib_checkfont(int font_num); -CIOLIBEXPORT void ciolib_set_vmem(struct vmem_cell *cell, uint8_t ch, uint8_t attr, uint8_t font); -CIOLIBEXPORT void ciolib_set_vmem_attr(struct vmem_cell *cell, uint8_t attr); -CIOLIBEXPORT void ciolib_setwinsize(int width, int height); -CIOLIBEXPORT void ciolib_setwinposition(int x, int y); -CIOLIBEXPORT enum ciolib_codepage ciolib_getcodepage(void); - -/* DoorWay specific stuff that's only applicable to ANSI mode. */ -CIOLIBEXPORT void ansi_ciolib_setdoorway(int enable); -#ifdef __cplusplus -} -#endif - -#ifndef CIOLIB_NO_MACROS - #define cscanf ciolib_cscanf - #define cprintf ciolib_cprintf - - #define movetext(a,b,c,d,e,f) ciolib_movetext(a,b,c,d,e,f) - #define cgets(a) ciolib_cgets(a) - #define kbhit() ciolib_kbhit() - #define getch() ciolib_getch() - #define getche() ciolib_getche() - #define ungetch(a) ciolib_ungetch(a) - #define gettextinfo(a) ciolib_gettextinfo(a) - #define wherex() ciolib_wherex() - #define wherey() ciolib_wherey() - #define wscroll() ciolib_wscroll() - #define gotoxy(a,b) ciolib_gotoxy(a,b) - #define clreol() ciolib_clreol() - #define clrscr() ciolib_clrscr() - #define cputs(a) ciolib_cputs(a) - #define textbackground(a) ciolib_textbackground(a) - #define textcolor(a) ciolib_textcolor(a) - #define highvideo() ciolib_highvideo() - #define lowvideo() ciolib_lowvideo() - #define normvideo() ciolib_normvideo() - #define puttext(a,b,c,d,e) ciolib_puttext(a,b,c,d,e) - #define vmem_puttext(a,b,c,d,e) ciolib_vmem_puttext(a,b,c,d,e) - #define gettext(a,b,c,d,e) ciolib_gettext(a,b,c,d,e) - #define vmem_gettext(a,b,c,d,e) ciolib_vmem_gettext(a,b,c,d,e) - #define textattr(a) ciolib_textattr(a) - #define delay(a) ciolib_delay(a) - #define putch(a) ciolib_putch(a) - #define _setcursortype(a) ciolib_setcursortype(a) - #define textmode(a) ciolib_textmode(a) - #define window(a,b,c,d) ciolib_window(a,b,c,d) - #define delline() ciolib_delline() - #define insline() ciolib_insline() - #define getpass(a) ciolib_getpass(a) - #define getmouse(a) ciolib_getmouse(a) - #define ungetmouse(a) ciolib_ungetmouse(a) - #define hidemouse() ciolib_hidemouse() - #define showmouse() ciolib_showmouse() - #define mousepointer(a) ciolib_mousepointer(a) - #define setname(a) ciolib_setname(a) - #define seticon(a,b) ciolib_seticon(a,b) - #define settitle(a) ciolib_settitle(a) - #define copytext(a,b) ciolib_copytext(a,b) - #define getcliptext() ciolib_getcliptext() - #define setfont(a,b,c) ciolib_setfont(a,b,c) - #define getfont(a) ciolib_getfont(a) - #define loadfont(a) ciolib_loadfont(a) - #define get_window_info(a,b,c,d) ciolib_get_window_info(a,b,c,d) - #define beep() ciolib_beep() - #define getcustomcursor(a,b,c,d,e) ciolib_getcustomcursor(a,b,c,d,e) - #define setcustomcursor(a,b,c,d,e) ciolib_setcustomcursor(a,b,c,d,e) - #define setvideoflags(a) ciolib_setvideoflags(a) - #define getvideoflags() ciolib_getvideoflags() - #define setscaling(a) ciolib_setscaling(a) - #define getscaling() ciolib_getscaling() - #define setpalette(e,r,g,b) ciolib_setpalette(e,r,g,b) - #define attr2palette(a,b,c) ciolib_attr2palette(a,b,c) - #define setpixel(a,b,c) ciolib_setpixel(a,b,c) - #define getpixels(a,b,c,d, e) ciolib_getpixels(a,b,c,d, e) - #define setpixels(a,b,c,d,e,f,g,h) ciolib_setpixels(a,b,c,d,e,f,g,h) - #define freepixels(a) ciolib_freepixels(a) - #define savescreen() ciolib_savescreen() - #define freescreen(a) ciolib_freescreen(a) - #define restorescreen(a) ciolib_restorescreen(a) - #define setcolour(a,b) ciolib_setcolour(a,b) - #define get_modepalette(a) ciolib_get_modepalette(a) - #define set_modepalette(a) ciolib_set_modepalette(a) - #define map_rgb(a,b,c) ciolib_map_rgb(a,b,c) - #define replace_font(a,b,c,d) ciolib_replace_font(a,b,c,d) - #define attrfont(a) ciolib_attrfont(a) - #define checkfont(a) ciolib_checkfont(a) - #define set_vmem(a, b, c, d) ciolib_set_vmem(a, b, c, d) - #define set_vmem_attr(a, b) ciolib_set_vmem_attr(a, b) - #define setwinsize(a,b) ciolib_setwinsize(a,b) - #define setwinposition(a,b) ciolib_setwinposition(a,b) - #define getcodepage() ciolib_getcodepage() -#endif - -#ifdef WITH_SDL - #include <gen_defs.h> - #include <SDL.h> - -#if defined(_WIN32) || defined(__DARWIN__) - #ifdef main - #undef main - #endif - #define main CIOLIB_main -#endif - -#if defined(__DARWIN__) - extern sem_t main_sem; - extern sem_t startsdl_sem; - extern int initsdl_ret; -#endif -#endif - -#define CIOLIB_BUTTON_1 1 -#define CIOLIB_BUTTON_2 2 -#define CIOLIB_BUTTON_3 4 -#define CIOLIB_BUTTON_4 8 -#define CIOLIB_BUTTON_5 16 - -#define CIOLIB_BUTTON(x) (1<<(x-1)) - -enum { - CIOLIB_MOUSE_MOVE /* 0 */ - ,CIOLIB_BUTTON_1_PRESS - ,CIOLIB_BUTTON_1_RELEASE - ,CIOLIB_BUTTON_1_CLICK - ,CIOLIB_BUTTON_1_DBL_CLICK - ,CIOLIB_BUTTON_1_TRPL_CLICK - ,CIOLIB_BUTTON_1_QUAD_CLICK - ,CIOLIB_BUTTON_1_DRAG_START - ,CIOLIB_BUTTON_1_DRAG_MOVE - ,CIOLIB_BUTTON_1_DRAG_END - ,CIOLIB_BUTTON_2_PRESS /* 10 */ - ,CIOLIB_BUTTON_2_RELEASE - ,CIOLIB_BUTTON_2_CLICK - ,CIOLIB_BUTTON_2_DBL_CLICK - ,CIOLIB_BUTTON_2_TRPL_CLICK - ,CIOLIB_BUTTON_2_QUAD_CLICK - ,CIOLIB_BUTTON_2_DRAG_START - ,CIOLIB_BUTTON_2_DRAG_MOVE - ,CIOLIB_BUTTON_2_DRAG_END - ,CIOLIB_BUTTON_3_PRESS - ,CIOLIB_BUTTON_3_RELEASE /* 20 */ - ,CIOLIB_BUTTON_3_CLICK - ,CIOLIB_BUTTON_3_DBL_CLICK - ,CIOLIB_BUTTON_3_TRPL_CLICK - ,CIOLIB_BUTTON_3_QUAD_CLICK - ,CIOLIB_BUTTON_3_DRAG_START - ,CIOLIB_BUTTON_3_DRAG_MOVE - ,CIOLIB_BUTTON_3_DRAG_END - ,CIOLIB_BUTTON_4_PRESS - ,CIOLIB_BUTTON_4_RELEASE - ,CIOLIB_BUTTON_4_CLICK /* 30 */ - ,CIOLIB_BUTTON_4_DBL_CLICK - ,CIOLIB_BUTTON_4_TRPL_CLICK - ,CIOLIB_BUTTON_4_QUAD_CLICK - ,CIOLIB_BUTTON_4_DRAG_START - ,CIOLIB_BUTTON_4_DRAG_MOVE - ,CIOLIB_BUTTON_4_DRAG_END - ,CIOLIB_BUTTON_5_PRESS - ,CIOLIB_BUTTON_5_RELEASE - ,CIOLIB_BUTTON_5_CLICK - ,CIOLIB_BUTTON_5_DBL_CLICK /* 40 */ - ,CIOLIB_BUTTON_5_TRPL_CLICK - ,CIOLIB_BUTTON_5_QUAD_CLICK - ,CIOLIB_BUTTON_5_DRAG_START - ,CIOLIB_BUTTON_5_DRAG_MOVE - ,CIOLIB_BUTTON_5_DRAG_END /* 45 */ -}; - -#define CIOLIB_BUTTON_PRESS(x) ((x-1)*9+1) -#define CIOLIB_BUTTON_RELEASE(x) ((x-1)*9+2) -#define CIOLIB_BUTTON_CLICK(x) ((x-1)*9+3) -#define CIOLIB_BUTTON_DBL_CLICK(x) ((x-1)*9+4) -#define CIOLIB_BUTTON_TRPL_CLICK(x) ((x-1)*9+5) -#define CIOLIB_BUTTON_QUAD_CLICK(x) ((x-1)*9+6) -#define CIOLIB_BUTTON_DRAG_START(x) ((x-1)*9+7) -#define CIOLIB_BUTTON_DRAG_MOVE(x) ((x-1)*9+8) -#define CIOLIB_BUTTON_DRAG_END(x) ((x-1)*9+9) - -#define CIOLIB_BUTTON_NUMBER(x) ((x+8)/9) - -#define CIOLIB_BUTTON_BASE(x) (x!=CIOLIB_MOUSE_MOVE?x-9*(CIOLIB_BUTTON_NUMBER(x)-1):CIOLIB_MOUSE_MOVE) - -extern int ciolib_mouse_initialized; - -#ifdef __cplusplus -extern "C" { -#endif -CIOLIBEXPORT void ciomouse_gotevent(int event, int x, int y, int x_res, int y_res); -CIOLIBEXPORT int mouse_trywait(void); -CIOLIBEXPORT int mouse_wait(void); -CIOLIBEXPORT int mouse_pending(void); -CIOLIBEXPORT int ciolib_getmouse(struct mouse_event *mevent); -CIOLIBEXPORT int ciolib_ungetmouse(struct mouse_event *mevent); -CIOLIBEXPORT void ciolib_mouse_thread(void *data); -CIOLIBEXPORT uint64_t ciomouse_setevents(uint64_t events); -CIOLIBEXPORT uint64_t ciomouse_addevents(uint64_t events); -CIOLIBEXPORT uint64_t ciomouse_delevents(uint64_t events); -CIOLIBEXPORT uint64_t ciomouse_addevent(uint64_t event); -CIOLIBEXPORT uint64_t ciomouse_delevent(uint64_t event); -CIOLIBEXPORT uint32_t ciolib_mousepointer(enum ciolib_mouse_ptr type); -CIOLIBEXPORT void mousestate(int *x, int *y, uint8_t *buttons); -CIOLIBEXPORT void mousestate_res(int *x_res, int *y_res, uint8_t *buttons); -#ifdef __cplusplus -} -#endif - -#define CIO_KEY_HOME (0x47 << 8) -#define CIO_KEY_UP (0x48 << 8) -#define CIO_KEY_END (0x4f << 8) -#define CIO_KEY_DOWN (0x50 << 8) -#define CIO_KEY_F(x) ((x<11)?((0x3a+x) << 8):((0x7a+x) << 8)) -#define CIO_KEY_IC (0x52 << 8) -#define CIO_KEY_DC (0x53 << 8) -#define CIO_KEY_SHIFT_IC (0x05 << 8) /* Shift-Insert */ -#define CIO_KEY_SHIFT_DC (0x07 << 8) /* Shift-Delete */ -#define CIO_KEY_CTRL_IC (0x04 << 8) /* Ctrl-Insert */ -#define CIO_KEY_CTRL_DC (0x06 << 8) /* Ctrl-Delete */ -#define CIO_KEY_ALT_IC (0xA2 << 8) /* Alt-Insert */ -#define CIO_KEY_ALT_DC (0xA3 << 8) /* Alt-Delete */ -#define CIO_KEY_LEFT (0x4b << 8) -#define CIO_KEY_RIGHT (0x4d << 8) -#define CIO_KEY_PPAGE (0x49 << 8) -#define CIO_KEY_NPAGE (0x51 << 8) -#define CIO_KEY_SHIFT_F(x)((x<11)?((0x53 + x) << 8):((0x7c + x) << 8)) -#define CIO_KEY_CTRL_F(x) ((x<11)?((0x5d + x) << 8):((0x7e + x) << 8)) -#define CIO_KEY_ALT_F(x) ((x<11)?((0x67 + x) << 8):((0x80 + x) << 8)) -#define CIO_KEY_BACKTAB (0x0f << 8) - -#define CIO_KEY_MOUSE 0x7dE0 // This is the right mouse on Schneider/Amstrad PC1512 PC keyboards "F-14" -#define CIO_KEY_QUIT 0x7eE0 // "F-15" -#define CIO_KEY_ABORTED 0x01E0 // ESC key by scancode - -#endif /* Do not add anything after this line */ diff --git a/ciolib/ciolib.rc b/ciolib/ciolib.rc deleted file mode 100644 index 015d875..0000000 --- a/ciolib/ciolib.rc +++ /dev/null @@ -1,5 +0,0 @@ -/* ========================================================================= */ -/* Icons. */ -/* ========================================================================= */ - -1 ICON "syncicon64.ico" diff --git a/ciolib/conv2vid.pl b/ciolib/conv2vid.pl deleted file mode 100755 index abe7555..0000000 --- a/ciolib/conv2vid.pl +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/perl - -use MIME::Decoder; - -my @fontfiles=glob("/usr/share/syscons/fonts/*.fnt"); -$decoder = new MIME::Decoder 'x-uuencode' or die "unsupported"; - -my $fonts=0; - -open COUT, "> allfonts.c"; -print COUT "#include <stdio.h> /* NULL */\n\n"; -print COUT "#include \"allfonts.h\"\n\n"; -my $started; -my %fontdata; -foreach my $fontfile (@fontfiles) { - my $width,$height; - my $decoded=`uudecode -o /dev/stdout $fontfile`; - my $bytes=length($decoded); - my $fname=$fontfile; - $fname =~ s/\.fnt$//; - $fname =~ s/^.*\///; - $fname =~ s/-/_/g; - if($fname =~ /([0-9]+)x([0-9]+)/) { - $width=$1; - $height=$2; - } - - my $lines=0; - $started=0; - $fontdata{$fname}="\""; - while(length($decoded)) { - my $ch=substr($decoded,0,1); - $decoded=substr($decoded,1); - $fontdata{$fname}.='\x'.unpack("H2",$ch); - $lines++; - if($height && !($lines % $height)) { - if(length($decoded)) { - $fontdata{$fname}.="\"\n\t\t\""; - } - } - } - $fontdata{$fname}.="\"\n\t"; - $fonts++; -} - -open IN, "< /usr/share/syscons/fonts/INDEX.fonts"; -my %fonts; -my %fontsizes; -while (<IN>) { - next if(/^\s*#/); - chomp; - my ($filename, $lang, $desc) = split(/:/); - next unless ($lang eq 'en'); - next if ($filename !~ /\.fnt$/); - $filename =~ s/\..*?$//; - $filename =~ s/-/_/g; - $filename =~ s/_(8x[0-9]*)$//; - if($1 eq '8x16') { - $fontsizes{$filename} |=1; - } - elsif($1 eq '8x14') { - $fontsizes{$filename} |=2; - } - elsif($1 eq '8x8') { - $fontsizes{$filename} |=4; - } - else { - print STDERR "Unknown font size: $1\n"; - } - $desc =~ s/"/\\"/g; - $desc =~ s/\s+8x[0-9]*//g; - $desc =~ s/,\s*$//g; - $fonts{$filename}=$desc; -} -close IN; -my $arraysize=(scalar keys %fonts)+1; -print COUT "struct conio_font_data_struct conio_fontdata[".$arraysize."] = {\n"; -$started=0; -foreach my $font (keys %fonts) { - if($started) { - print COUT "\t,{"; - } - else { - print COUT "\t {"; - $started=1; - } - if($fontsizes{$font} & 1) { - print COUT $fontdata{"$font\_8x16"}; - print COUT ", "; - } - else { - print COUT "NULL, "; - } - if($fontsizes{$font} & 2) { - print COUT $fontdata{"$font\_8x14"}; - print COUT ", "; - } - else { - print COUT "NULL, "; - } - if($fontsizes{$font} & 4) { - print COUT $fontdata{"$font\_8x8"}; - print COUT ", "; - } - else { - print COUT "NULL, "; - } - print COUT "\"$fonts{$font}\"}\n"; -} -print COUT "\t,{NULL, NULL, NULL, NULL}\n"; -print COUT "};\n"; - -close COUT; - -open HOUT,"> allfonts.h"; -print HOUT <<ENDOFHEADER; -#ifndef _ALLFONTS_H_ -#define _ALLFONTS_H_ - -struct conio_font_data_struct { - char *eight_by_sixteen; - char *eight_by_fourteen; - char *eight_by_eight; - char *desc; -}; - -extern struct conio_font_data_struct conio_fontdata[$arraysize]; - -#endif -ENDOFHEADER diff --git a/ciolib/cterm.c b/ciolib/cterm.c deleted file mode 100644 index 66b7782..0000000 --- a/ciolib/cterm.c +++ /dev/null @@ -1,5609 +0,0 @@ -/* $Id: cterm.c,v 1.313 2020/06/27 00:04:45 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* - * Coordinate systems in use here... text is 1-based. - * "pixel" the ciolib screen in pixels. sixel commands happen here. - * "screen" the ciolib screen... gettext/puttext/movetext and mouse - * are in this space. - * "absterm" position inside the full terminal area. These coordinates - * are used when origin mode is off. - * "term" The scrolling region. These coordinates are used when origin - * mode is on. - * "curr" Either absterm or term depending on the state of origin mode - * This is what's sent to and received from the remote, and - * matches the CTerm window. - */ - -#include <ctype.h> -#include <stdlib.h> -#include <string.h> -#if defined(_WIN32) - #include <malloc.h> /* alloca() on Win32 */ - #include <xpprintf.h> /* asprintf() on Win32 */ -#endif - -#include <genwrap.h> -#include <xpbeep.h> -#include <link_list.h> -#ifdef __unix__ - #include <xpsem.h> -#endif -#include <threadwrap.h> -#if !(defined __BORLANDC__ || defined _MSC_VER) - #include <stdbool.h> -#else - #define bool int - enum { false, true }; -#endif - - -#include "ciolib.h" - -#include "cterm.h" -#include "vidmodes.h" -#include "base64.h" -#include <crc16.h> - -#define BUFSIZE 2048 - -const int cterm_tabs[]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145}; - -const char *octave="C#D#EF#G#A#B"; - -/* Characters allowed in music strings... if one that is NOT in here is - * found, CTerm leaves music capture mode and tosses the buffer away */ -const char *musicchars="aAbBcCdDeEfFgGlLmMnNoOpPsStT0123456789.-+#<> "; -const uint note_frequency[]={ /* Hz*1000 */ -/* Octave 0 (Note 1) */ - 65406 - ,69296 - ,73416 - ,77782 - ,82407 - ,87307 - ,92499 - ,97999 - ,103820 - ,110000 - ,116540 - ,123470 -/* Octave 1 */ - ,130810 - ,138590 - ,146830 - ,155560 - ,164810 - ,174610 - ,185000 - ,196000 - ,207650 - ,220000 - ,233080 - ,246940 -/* Octave 2 */ - ,261620 - ,277180 - ,293660 - ,311130 - ,329630 - ,349230 - ,369990 - ,392000 - ,415300 - ,440000 - ,466160 - ,493880 -/* Octave 3 */ - ,523250 - ,554370 - ,587330 - ,622250 - ,659260 - ,698460 - ,739990 - ,783990 - ,830610 - ,880000 - ,932330 - ,987770 -/* Octave 4 */ - ,1046500 - ,1108700 - ,1174700 - ,1244500 - ,1318500 - ,1396900 - ,1480000 - ,1568000 - ,1661200 - ,1760000 - ,1864600 - ,1975500 -/* Octave 5 */ - ,2093000 - ,2217500 - ,2349300 - ,2489000 - ,2637000 - ,2793800 - ,2959900 - ,3136000 - ,3322400 - ,3520000 - ,3729300 - ,3951100 -/* Octave 6 */ - ,4186000 - ,4435000 - ,4698600 - ,4978000 - ,5274000 - ,5587000 - ,5920000 - ,6272000 - ,6644000 - ,7040000 - ,7458600 - ,7902200 -}; - -struct note_params { - int notenum; - int notelen; - int dotted; - int tempo; - int noteshape; - int foreground; -}; - -#ifdef CTERM_WITHOUT_CONIO - #define GOTOXY(x,y) cterm->ciolib_gotoxy(cterm, x, y) - #define WHEREX() cterm->ciolib_wherex(cterm) - #define WHEREY() cterm->ciolib_wherey(cterm) - #define GETTEXT(a,b,c,d,e) cterm->ciolib_gettext(cterm, a,b,c,d,e) - #define GETTEXTINFO(a) cterm->ciolib_gettextinfo(cterm,a) - #define TEXTATTR(a) cterm->ciolib_textattr(cterm,a) - #define SETCURSORTYPE(a) cterm->ciolib_setcursortype(cterm,a) - #define MOVETEXT(a,b,c,d,e,f) cterm->ciolib_movetext(cterm,a,b,c,d,e,f) - #define CLREOL() cterm->ciolib_clreol(cterm) - #define CLRSCR() cterm->ciolib_clrscr(cterm) - #define SETVIDEOFLAGS(a) cterm->ciolib_setvideoflags(cterm,a) - #define GETVIDEOFLAGS() cterm->ciolib_getvideoflags(cterm) - #define PUTCH(a) cterm->ciolib_putch(cterm,a) - #define PUTTEXT(a,b,c,d,e) cterm->ciolib_puttext(cterm,a,b,c,d,e) - #define WINDOW(a,b,c,d) cterm->ciolib_window(cterm,a,b,c,d) - #define CPUTS(a) cterm->ciolib_cputs(cterm,a) - #define SETFONT(a,b,c) cterm->ciolib_setfont(cterm,a,b,c) -#else - #define GOTOXY(x,y) cterm->ciolib_gotoxy(x, y) - #define WHEREX() cterm->ciolib_wherex() - #define WHEREY() cterm->ciolib_wherey() - #define GETTEXT(a,b,c,d,e) cterm->ciolib_gettext(a,b,c,d,e) - #define GETTEXTINFO(a) cterm->ciolib_gettextinfo(a) - #define TEXTATTR(a) cterm->ciolib_textattr(a) - #define SETCURSORTYPE(a) cterm->ciolib_setcursortype(a) - #define MOVETEXT(a,b,c,d,e,f) cterm->ciolib_movetext(a,b,c,d,e,f) - #define CLREOL() cterm->ciolib_clreol() - #define CLRSCR() cterm->ciolib_clrscr() - #define SETVIDEOFLAGS(a) cterm->ciolib_setvideoflags(a) - #define GETVIDEOFLAGS() cterm->ciolib_getvideoflags() - #define PUTCH(a) cterm->ciolib_putch(a) - #define PUTTEXT(a,b,c,d,e) cterm->ciolib_puttext(a,b,c,d,e) - #define WINDOW(a,b,c,d) cterm->ciolib_window(a,b,c,d) - #define CPUTS(a) cterm->ciolib_cputs(a) - #define SETFONT(a,b,c) cterm->ciolib_setfont(a,b,c) -#endif - -static void ctputs(struct cterminal *cterm, char *buf); -static void cterm_reset(struct cterminal *cterm); - -#ifdef CTERM_WITHOUT_CONIO -/***************************************************************/ -/* These funcions are used when conio is not */ -/* They are mostly copied from either ciolib.c or bitmap_con.c */ -/***************************************************************/ -#define BD ((struct buffer_data *)cterm->extra) -#define CTERM_INIT() while(BD==NULL) ciolib_init(cterm) - -struct buffer_data { - unsigned char x; - unsigned char y; - unsigned char winleft; /* left window coordinate */ - unsigned char wintop; /* top window coordinate */ - unsigned char winright; /* right window coordinate */ - unsigned char winbottom; /* bottom window coordinate */ - unsigned char attr; /* text attribute */ - unsigned char currmode; /* current video mode */ - unsigned char cursor; - unsigned char *vmem; - int vflags; -}; - -static void ciolib_init(struct cterminal *cterm) -{ - BD=malloc(sizeof(struct buffer_data)); - if(!BD) - return - BD->x=1; - BD->y=1; - BD->winleft=1; - BD->wintop=1; - BD->winright=cterm->width; - BD->winbottom=cterm->height; - BD->attr=7; - BD->currmode=C80; // TODO: Adjust based on size... - BD->cursor=_NORMALCURSOR; - BD->vmem=malloc(2*cterm->height*cterm->width); - if(BD->vmem==NULL) { - free(BD) - return; - } - BD->vflags=0; -} - -static void ciolib_gotoxy(struct cterminal *cterm,int x,int y) -{ - CTERM_INIT(); - - if(x < 1 - || x > BD->winright-BD->winleft+1 - || y < 1 - || y > BD->winbottom-BD->wintop+1) - return; - - BD->x=x; - BD->y=y; -} - -static int ciolib_wherex(struct cterminal *cterm) -{ - CTERM_INIT(); - return BD->x -} - -static int ciolib_wherey(struct cterminal *cterm) -{ - CTERM_INIT(); - return BD->y -} - -static int ciolib_gettext(struct cterminal *cterm,int sx, int sy, int ex, int ey, void *fill) -{ - int x,y; - unsigned char *out; - WORD sch; - - CTERM_INIT(); - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > ex - || sy > ey - || ex > cterm->width - || ey > cterm->height - || fill==NULL) - return(0); - - out=fill; - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - sch=BD->vmem[y*cio_textinfo.screenwidth+x]; - *(out++)=sch & 0xff; - *(out++)=sch >> 8; - } - } - return(1); -} - -static void ciolib_gettextinfo(struct cterminal *cterm,struct text_info *ti) -{ - CTERM_INIT(); - ti->winleft=>BD->winleft; - ti->wintop=BD->wintop; - ti->winright=BD->winright; - ti->winbottom=BD->winbottom; - ti->attribute=BD->attr; - ti->normattr=7; - ti->currmode=BD->currmode; - if (cterm->height > 0xff) - ti->screenheight = 0xff; - else - ti->screenheight = cterm->height; - if (cterm->width > 0xff) - ti->screenwidth = 0xff; - else - ti->screenwidth = cterm->width; - ti->curx=BD->x; - ti->cury=BD->y; -} - -static void ciolib_textattr(struct cterminal *cterm,int attr) -{ - CTERM_INIT(); - BD->attr=attr; -} - -static void ciolib_setcursortype(struct cterminal *cterm,int cursor) -{ - CTERM_INIT(); - BD->cursor=cursor; -} - -static int ciolib_movetext(struct cterminal *cterm, int x, int y, int ex, int ey, int tox, int toy) -{ - int direction=1; - int cy; - int sy; - int destoffset; - int sourcepos; - int width=ex-x+1; - int height=ey-y+1; - - CTERM_INIT(); - if( x<1 - || y<1 - || ex<1 - || ey<1 - || tox<1 - || toy<1 - || x>cterm->width - || ex>cterm->width - || tox>cterm->width - || y>cterm->height - || ey>cterm->height - || toy>cterm->height) - return(0); - - if(toy > y) - direction=-1; - - sourcepos=(y-1)*cterm->width+(x-1); - destoffset=(((toy-1)*cterm->width+(tox-1))-sourcepos); - - for(cy=(direction==-1?(height-1):0); cy<height && cy>=0; cy+=direction) { - sourcepos=((y-1)+cy)*cio_textinfo.screenwidth+(x-1); - memmove(&(BD->vmem[sourcepos+destoffset]), &(BD->vmem[sourcepos]), sizeof(BD->vmem[0])*width); - } - return(1); -} - -static void conio_clreol(struct cterminal *cterm) -{ - int pos,x; - WORD fill=(BD->attr<<8)|space; - - CTERM_INIT(); - pos=(BD->y+BD->wintop-2)*cterm->width; - for(x=BD->x+BD->winleft-2; x<BD->right; x++) - BD->vmem[pos+x]=fill; -} - -static void ciolib_clrscr(struct cterminal *cterm) -{ - int x,y; - WORD fill=(BD->attr<<8)|space; - - CTERM_INIT(); - for(y=cio_textinfo.wintop-1; y<cio_textinfo.winbottom; y++) { - for(x=BD->winleft-1; x<BD->winright; x++) - BD->vmem[y*cterm->width+x]=fill; - } -} - -static void ciolib_setvideoflags(struct cterminal *cterm, int flags) -{ - CTERM_INIT(); - BD->vflags=flags; -} - -static int ciolib_getvideoflags(struct cterminal *cterm) -{ - CTERM_INIT(); - return BD->vflags; -} - -static void ciolib_wscroll(struct cterminal *cterm) -{ - int os; - - CTERM_INIT(); - MOVETEXT(BD->winleft - ,BD->wintop+1 - ,BD->winright - ,BD->winbottom - ,BD->winleft - ,BD->wintop); - GOTOXY(cterm, 1,BD->winbottom-BD->wintop+1); - os=_wscroll; - _wscroll=0; - CLREOL(cterm); - _wscroll=os; - GOTOXY(cterm, BD->x,BD->y); -} - -static int ciolib_putch(struct cterminal *cterm,int a) -{ - unsigned char a1=a; - unsigned char buf[2]; - int i; - - CTERM_INIT(); - buf[0]=a1; - buf[1]=BD->attr; - - switch(a1) { - case '\r': - GOTOXY(1,cio_textinfo.cury); - break; - case '\n': - if(BD->y==BD->winbottom-BD->wintop+1) - ciolib_wscroll(cterm); - else - GOTOXY(BD->x, BD->y+1); - break; - case '\b': - if(BD->x>1) { - GOTOXY(BD->x-1,BD->y); - buf[0]=' '; - PUTTEXT(BD->x+BD->winleft-1 - ,BD->y+BD->wintop-1 - ,BD->x+BD->winleft-1 - ,BD->y+BD->wintop-1 - ,buf); - } - break; - case 7: /* Bell */ - break; - case '\t': - for(i = 0; i < cterm->tab_count;i++) { - if(cterm->tabs[i] > BD->x) { - buf[0]=' '; - while(BD->x < cterm->tabs[i]) { - PUTTEXT(BD->x+BD->winleft-1 - ,BD->y+BD->wintop-1 - ,BD->x+BD->winleft-1 - ,BD->y+BD->wintop-1 - ,buf); - GOTOXY(BD->x+1,BD->y); - if(BD->x==cterm->width) - break; - } - break; - } - } - if(BD->x==cterm->width) { - GOTOXY(1,BD->y); - if(BD->y==BD->winbottom-BD->wintop+1) - ciolib_wscroll(cterm); - else - GOTOXY(BD->x, BD->y+1); - } - break; - default: - if(BD->y==BD->winbottom-BD->wintop+1 - && BD->x==BD->winright-BD->winleft+1) { - PUTTEXT(WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,buf); - ciolib_wscroll(cterm); - GOTOXY(1, BD->winbottom-BD->wintop+1); - } - else { - if(BD->x==BD->winright-BD->winleft+1) { - PUTTEXT(WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,buf); - GOTOXY(1,BD->y+1); - } - else { - PUTTEXT(WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,buf); - GOTOXY(BD->x+1, BD->y); - } - } - break; - } - - return(a1); -} - -static int ciolib_puttext(struct cterminal *cterm,int sx, int sy, int ex, int ey, void *fill) -{ - int x,y; - unsigned char *out; - WORD sch; - - CTERM_INIT(); - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cterm->width - || sy > cterm->height - || sx > ex - || sy > ey - || ex > cterm->width - || ey > cterm->height - || fill==NULL) - return(0); - - out=fill; - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - sch=*(out++); - sch |= (*(out++))<<8; - BD->vmem[y*cterm->width+x]=sch; - } - } - return(1); -} - -static void ciolib_window(struct cterminal *cterm,int sx, int sy, int ex, int ey) -{ - CTERM_INIT(); - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cterm->width - || sy > cterm->height - || sx > ex - || sy > ey - || ex > cterm->width - || ey > cterm->height) - return; - BD->winleft=sx; - BD->wintop=sy; - BD->winright=ex; - BD->winbottom=ey; - GOTOXY(1,1); -} - -static int ciolib_cputs(struct cterminal *cterm, const char *str) -{ - int pos; - int ret=0; - int olddmc; - - CTERM_INIT(); - for(pos=0;str[pos];pos++) - { - ret=str[pos]; - if(str[pos]=='\n') - PUTCH('\r'); - PUTCH(str[pos]); - } - GOTOXY(WHEREX(),WHEREY()); - return(ret); -} - -static int ciolib_setfont(struct cterminal *,int font, int force, int font_num) -{ - CTERM_INIT(); - return -1; -} -#endif - -enum cterm_coordinates { - CTERM_COORD_SCREEN, - CTERM_COORD_ABSTERM, - CTERM_COORD_TERM, - CTERM_COORD_CURR, -}; - -#define SCR_MINX 1 -#define ABS_MINX 1 -#define TERM_MINX 1 -#define CURR_MINX 1 - -#if 0 -static int -scr_maxx(struct cterminal *cterm) -{ - struct text_info ti; - - GETTEXTINFO(&ti); - return ti.screenwidth; -} -#endif -//#define SCR_MAXX coord_maxx(cterm, CTERM_COORD_SCREEN) -#define ABS_MAXX cterm->width -#define TERM_MAXX (cterm->right_margin - cterm->left_margin + 1) -#define CURR_MAXX ((cterm->extattr & CTERM_EXTATTR_ORIGINMODE) ? TERM_MAXX : ABS_MAXX) - -#define SCR_MINY 1 -#define ABS_MINY 1 -#define TERM_MINY 1 -#define CURR_MINY 1 - - -#if 0 -static int -scr_maxy(struct cterminal *cterm, enum cterm_coordinates coord) -{ - struct text_info ti; - - GETTEXTINFO(&ti); - return ti.screenheight; -} -#endif -//#define SCR_MAXY scr_maxy(cterm) -#define ABS_MAXY cterm->height -#define TERM_MAXY (cterm->bottom_margin - cterm->top_margin + 1) -#define CURR_MAXY ((cterm->extattr & CTERM_EXTATTR_ORIGINMODE) ? TERM_MAXY : ABS_MAXY) - -static void -coord_conv_xy(struct cterminal *cterm, enum cterm_coordinates from_coord, - enum cterm_coordinates to_coord, int *x, int *y) -{ - if (from_coord == to_coord) - return; - - if (x) { - if (from_coord == CTERM_COORD_CURR) { - if (cterm->extattr & CTERM_EXTATTR_ORIGINMODE) - from_coord = CTERM_COORD_TERM; - else - from_coord = CTERM_COORD_ABSTERM; - } - switch(from_coord) { - case CTERM_COORD_SCREEN: - break; - case CTERM_COORD_TERM: - *x += cterm->left_margin - 1; - // Fall-through - case CTERM_COORD_ABSTERM: - *x += cterm->x - 1; - break; - case CTERM_COORD_CURR: - // Silence warnings - break; - } - if (to_coord == CTERM_COORD_CURR) { - if (cterm->extattr & CTERM_EXTATTR_ORIGINMODE) - to_coord = CTERM_COORD_TERM; - else - to_coord = CTERM_COORD_ABSTERM; - } - switch(to_coord) { - case CTERM_COORD_SCREEN: - break; - case CTERM_COORD_TERM: - *x -= cterm->left_margin - 1; - // Fall-through - case CTERM_COORD_ABSTERM: - *x -= cterm->x - 1; - break; - case CTERM_COORD_CURR: - // Silence warnings - break; - } - } - if (y) { - if (from_coord == CTERM_COORD_CURR) { - if (cterm->extattr & CTERM_EXTATTR_ORIGINMODE) - from_coord = CTERM_COORD_TERM; - else - from_coord = CTERM_COORD_ABSTERM; - } - switch(from_coord) { - case CTERM_COORD_SCREEN: - break; - case CTERM_COORD_TERM: - *y += cterm->top_margin - 1; - // Fall-through - case CTERM_COORD_ABSTERM: - *y += cterm->y - 1; - break; - case CTERM_COORD_CURR: - // Silence warnings - break; - } - if (to_coord == CTERM_COORD_CURR) { - if (cterm->extattr & CTERM_EXTATTR_ORIGINMODE) - to_coord = CTERM_COORD_TERM; - else - to_coord = CTERM_COORD_ABSTERM; - } - switch(to_coord) { - case CTERM_COORD_SCREEN: - break; - case CTERM_COORD_TERM: - *y -= cterm->top_margin - 1; - // Fall-through - case CTERM_COORD_ABSTERM: - *y -= cterm->y - 1; - break; - case CTERM_COORD_CURR: - // Silence warnings - break; - } - } -} - -static void -coord_get_xy(struct cterminal *cterm, enum cterm_coordinates coord, int *x, int *y) -{ - if (x) - *x = WHEREX(); - if (y) - *y = WHEREY(); - - coord_conv_xy(cterm, CTERM_COORD_CURR, coord, x, y); -} -#define SCR_XY(x,y) coord_get_xy(cterm, CTERM_COORD_SCREEN, x, y) -#define ABS_XY(x,y) coord_get_xy(cterm, CTERM_COORD_ABSTERM, x, y) -#define TERM_XY(x,y) coord_get_xy(cterm, CTERM_COORD_TERM, x, y) -#define CURR_XY(x,y) coord_get_xy(cterm, CTERM_COORD_CURR, x, y) -void -setwindow(struct cterminal *cterm) -{ - int col, row, max_col, max_row; - - col = CURR_MINX; - row = CURR_MINY; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &col, &row); - max_col = CURR_MAXX; - max_row = CURR_MAXY; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &max_col, &max_row); - WINDOW(col, row, max_col, max_row); -} - -void -cterm_gotoxy(struct cterminal *cterm, int x, int y) -{ - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &x, &y); - GOTOXY(x, y); - ABS_XY(&cterm->xpos, &cterm->ypos); -} - -static void -insert_tabstop(struct cterminal *cterm, int pos) -{ - int i; - int *new_stops; - - for (i = 0; i < cterm->tab_count && cterm->tabs[i] < pos; i++); - if (cterm->tabs[i] == pos) - return; - - new_stops = realloc(cterm->tabs, (cterm->tab_count + 1) * sizeof(cterm->tabs[0])); - if (new_stops == NULL) - return; - cterm->tabs = new_stops; - if (i < cterm->tab_count) - memmove(&cterm->tabs[i + 1], &cterm->tabs[i], (cterm->tab_count - i) * sizeof(cterm->tabs[0])); - cterm->tabs[i] = pos; - cterm->tab_count++; -} - -static void -delete_tabstop(struct cterminal *cterm, int pos) -{ - int i; - - for (i = 0; i < cterm->tab_count && cterm->tabs[i] <= pos; i++) { - if (cterm->tabs[i] == pos) { - memmove(&cterm->tabs[i], &cterm->tabs[i+1], (cterm->tab_count - i - 1) * sizeof(cterm->tabs[0])); - cterm->tab_count--; - return; - } - } - return; -} - -static void tone_or_beep(double freq, int duration, int device_open) -{ - if(device_open) - xptone(freq,duration,WAVE_SHAPE_SINE_SAW_HARM); - else - xpbeep(freq,duration); -} - -static void playnote_thread(void *args) -{ - /* Tempo is quarter notes per minute */ - int duration; - int pauselen; - struct note_params *note; - int device_open=FALSE; - struct cterminal *cterm=(struct cterminal *)args; - - - SetThreadName("PlayNote"); - cterm->playnote_thread_running=TRUE; - while(1) { - if(device_open) { - if(!listSemTryWaitBlock(&cterm->notes,5000)) { - xptone_close(); - listSemWait(&cterm->notes); - } - } - else - listSemWait(&cterm->notes); - note=listShiftNode(&cterm->notes); - if(note==NULL) - break; - device_open=xptone_open(); - if(note->dotted) - duration=360000/note->tempo; - else - duration=240000/note->tempo; - duration/=note->notelen; - switch(note->noteshape) { - case CTERM_MUSIC_STACATTO: - pauselen=duration/4; - break; - case CTERM_MUSIC_LEGATO: - pauselen=0; - break; - case CTERM_MUSIC_NORMAL: - default: - pauselen=duration/8; - break; - } - duration-=pauselen; - if(note->notenum < 72 && note->notenum >= 0) - tone_or_beep(((double)note_frequency[note->notenum])/1000,duration,device_open); - else - tone_or_beep(0,duration,device_open); - if(pauselen) - tone_or_beep(0,pauselen,device_open); - if(note->foreground) - sem_post(&cterm->note_completed_sem); - free(note); - } - if (device_open) - xptone_close(); - sem_post(&cterm->playnote_thread_terminated); - cterm->playnote_thread_running=FALSE; -} - -static void play_music(struct cterminal *cterm) -{ - int i; - char *p; - char *out; - int offset; - char note; - int notelen; - char numbuf[10]; - int dotted; - int notenum; - struct note_params *np; - int fore_count; - - if(cterm->quiet) { - cterm->music=0; - cterm->musicbuf[0]=0; - return; - } - p=cterm->musicbuf; - fore_count=0; - if(cterm->music==1) { - switch(toupper(*p)) { - case 'F': - cterm->musicfore=TRUE; - p++; - break; - case 'B': - cterm->musicfore=FALSE; - p++; - break; - case 'N': - if(!isdigit(*(p+1))) { - cterm->noteshape=CTERM_MUSIC_NORMAL; - p++; - } - break; - case 'L': - cterm->noteshape=CTERM_MUSIC_LEGATO; - p++; - break; - case 'S': - cterm->noteshape=CTERM_MUSIC_STACATTO; - p++; - break; - } - } - for(;*p;p++) { - notenum=0; - offset=0; - switch(toupper(*p)) { - case 'M': - p++; - switch(toupper(*p)) { - case 'F': - cterm->musicfore=TRUE; - break; - case 'B': - cterm->musicfore=FALSE; - break; - case 'N': - cterm->noteshape=CTERM_MUSIC_NORMAL; - break; - case 'L': - cterm->noteshape=CTERM_MUSIC_LEGATO; - break; - case 'S': - cterm->noteshape=CTERM_MUSIC_STACATTO; - break; - default: - p--; - } - break; - case 'T': /* Tempo */ - out=numbuf; - while(isdigit(*(p+1))) - *(out++)=*(++p); - *out=0; - cterm->tempo=strtoul(numbuf,NULL,10); - if(cterm->tempo>255) - cterm->tempo=255; - if(cterm->tempo<32) - cterm->tempo=32; - break; - case 'O': /* Octave */ - out=numbuf; - while(isdigit(*(p+1))) - *(out++)=*(++p); - *out=0; - cterm->octave=strtoul(numbuf,NULL,10); - if(cterm->octave>6) - cterm->octave=6; - break; - case 'L': - out=numbuf; - while(isdigit(*(p+1))) - *(out++)=*(++p); - *out=0; - cterm->notelen=strtoul(numbuf,NULL,10); - if(cterm->notelen<1) - cterm->notelen=1; - if(cterm->notelen>64) - cterm->notelen=64; - break; - case 'N': /* Note by number */ - if(isdigit(*(p+1))) { - out=numbuf; - while(isdigit(*(p+1))) { - *(out++)=*(p+1); - p++; - } - *out=0; - notenum=strtoul(numbuf,NULL,10); - } - if(notenum==0) { - notenum=-1; - offset=1; - } - /* Fall-through */ - case 'A': /* Notes in current octave by letter */ - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'P': - note=toupper(*p); - notelen=cterm->notelen; - dotted=0; - i=1; - while(i) { - i=0; - if(*(p+1)=='+' || *(p+1)=='#') { /* SHARP */ - offset+=1; - p++; - i=1; - } - if(*(p+1)=='-') { /* FLAT */ - offset-=1; - p++; - i=1; - } - if(*(p+1)=='.') { /* Dotted note (1.5*notelen) */ - dotted=1; - p++; - i=1; - } - if(isdigit(*(p+1))) { - out=numbuf; - while(isdigit(*(p+1))) { - *(out++)=*(p+1); - p++; - } - *out=0; - notelen=strtoul(numbuf,NULL,10); - i=1; - } - } - if(note=='P') { - notenum=-1; - offset=0; - } - if(notenum==0) { - out=strchr(octave,note); - if(out==NULL) { - notenum=-1; - offset=1; - } - else { - notenum=cterm->octave*12+1; - notenum+=(out-octave); - } - } - notenum+=offset; - np=(struct note_params *)malloc(sizeof(struct note_params)); - if(np!=NULL) { - np->notenum=notenum; - np->notelen=notelen; - np->dotted=dotted; - np->tempo=cterm->tempo; - np->noteshape=cterm->noteshape; - np->foreground=cterm->musicfore; - listPushNode(&cterm->notes, np); - if(cterm->musicfore) - fore_count++; - } - break; - case '<': /* Down one octave */ - cterm->octave--; - if(cterm->octave<0) - cterm->octave=0; - break; - case '>': /* Up one octave */ - cterm->octave++; - if(cterm->octave>6) - cterm->octave=6; - break; - } - } - cterm->music=0; - cterm->musicbuf[0]=0; - while(fore_count) { - sem_wait(&cterm->note_completed_sem); - fore_count--; - } - xptone_complete(); -} - -void -cterm_clreol(struct cterminal *cterm) -{ - int x, y; - int rm; - struct vmem_cell *buf; - int i; - int width; - - CURR_XY(&x, &y); - rm = CURR_MAXX; - - width = rm - x + 1; - if (width < 1) - return; - buf = malloc(width * sizeof(*buf)); - if (!buf) - return; - for (i = 0; i < width; i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cterm->attr; - buf[i].fg = cterm->fg_color; - buf[i].bg = cterm->bg_color; - buf[i].font = ciolib_attrfont(cterm->attr); - } - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &x, &y); - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &rm, NULL); - vmem_puttext(x, y, rm, y, buf); - free(buf); -} - -void -cterm_clrblk(struct cterminal *cterm, int sx, int sy, int ex, int ey) -{ - int i; - struct vmem_cell *buf; - int chars = (ex - sx + 1) * (ey - sy + 1); - - buf = malloc(chars * sizeof(*buf)); - if (!buf) - return; - for (i = 0; i < chars ; i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cterm->attr; - buf[i].fg = cterm->fg_color; - buf[i].bg = cterm->bg_color; - buf[i].font = ciolib_attrfont(cterm->attr); - } - vmem_puttext(sx, sy, ex, ey, buf); - free(buf); -} - -static void -scrolldown(struct cterminal *cterm) -{ - int minx = TERM_MINX; - int miny = TERM_MINY; - int maxx = TERM_MAXX; - int maxy = TERM_MAXY; - int x,y; - - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &minx, &miny); - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &maxx, &maxy); - MOVETEXT(minx, miny, maxx, maxy - 1, minx, miny + 1); - CURR_XY(&x, &y); - cterm_clrblk(cterm, minx, miny, minx + TERM_MAXX - 1, miny); - GOTOXY(x, y); -} - -void -cterm_scrollup(struct cterminal *cterm) -{ - int minx = TERM_MINX; - int miny = TERM_MINY; - int maxx = TERM_MAXX; - int maxy = TERM_MAXY; - int x,y; - int getw; - - cterm->backpos++; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &minx, &miny); - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &maxx, &maxy); - if(cterm->scrollback!=NULL) { - if(cterm->backpos>cterm->backlines) { - memmove(cterm->scrollback, cterm->scrollback + cterm->backwidth, cterm->backwidth * sizeof(*cterm->scrollback) * (cterm->backlines - 1)); - cterm->backpos--; - } - getw = cterm->backwidth; - if (getw > cterm->width) - getw = cterm->width; - if (getw < cterm->backwidth) { - memset(cterm->scrollback + (cterm->backpos - 1) * cterm->backwidth, 0, sizeof(*cterm->scrollback) * cterm->backwidth); - } - vmem_gettext(cterm->x, miny, cterm->x + getw - 1, miny, cterm->scrollback + (cterm->backpos - 1) * cterm->backwidth); - } - MOVETEXT(minx, miny + 1, maxx, maxy, minx, miny); - CURR_XY(&x, &y); - cterm_clrblk(cterm, minx, maxy, minx + TERM_MAXX - 1, maxy); - GOTOXY(x, y); -} - -static void -cond_scrollup(struct cterminal *cterm) -{ - int x, y; - - TERM_XY(&x, &y); - if (x >= TERM_MINX && x <= TERM_MAXX && - y >= TERM_MINY && y <= TERM_MAXY) - cterm_scrollup(cterm); -} - -static void -dellines(struct cterminal * cterm, int lines) -{ - int i; - int minx = TERM_MINX; - int miny = TERM_MINY; - int maxx = TERM_MAXX; - int maxy = TERM_MAXY; - int sx,sy; - int x,y; - - if(lines<1) - return; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &minx, &miny); - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &maxx, &maxy); - TERM_XY(&x, &y); - // Can't delete lines outside of window - if (x < TERM_MINX || x > TERM_MAXX || y < TERM_MINY || y > TERM_MAXY) - return; - SCR_XY(&sx, &sy); - MOVETEXT(minx, sy + lines, maxx, maxy, minx, sy); - for(i = TERM_MAXY - lines; i <= TERM_MAXY; i++) { - cterm_gotoxy(cterm, TERM_MINX, i); - cterm_clreol(cterm); - } - cterm_gotoxy(cterm, x, y); -} - -static void -clear2bol(struct cterminal * cterm) -{ - struct vmem_cell *buf; - int i; - int x, y; - int minx = CURR_MINX; - - CURR_XY(&x, &y); - buf = malloc(x * sizeof(*buf)); - for(i = 0; i < x; i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cterm->attr; - buf[i].fg = cterm->fg_color; - buf[i].bg = cterm->bg_color; - buf[i].font = ciolib_attrfont(cterm->attr); - } - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &x, &y); - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &minx, NULL); - vmem_puttext(minx, y, x, y, buf); - free(buf); -} - -void -cterm_clearscreen(struct cterminal *cterm, char attr) -{ - int getw; - - if(!cterm->started) - cterm_start(cterm); - - if(cterm->scrollback!=NULL) { - cterm->backpos+=cterm->height; - if(cterm->backpos>cterm->backlines) { - memmove(cterm->scrollback, cterm->scrollback + cterm->backwidth * (cterm->backpos - cterm->backlines), cterm->backwidth * sizeof(*cterm->scrollback) * (cterm->backlines - (cterm->backpos - cterm->backlines))); - cterm->backpos=cterm->backlines; - } - getw = cterm->backwidth; - if (getw > cterm->width) - getw = cterm->width; - if (getw < cterm->backwidth) { - memset(cterm->scrollback + (cterm->backpos - cterm->height) * cterm->backwidth, 0, sizeof(*cterm->scrollback) * cterm->backwidth * cterm->height); - } - vmem_gettext(cterm->x, cterm->y, cterm->x + getw - 1, cterm->y + cterm->height - 1, - cterm->scrollback + (cterm->backpos - cterm->height) * cterm->backwidth); - } - CLRSCR(); - GOTOXY(CURR_MINX, CURR_MINY); -} - -/* - * Parses an ESC sequence and returns it broken down - */ - -struct esc_seq { - char c1_byte; // Character after the ESC. If '[', ctrl_func and param_str will be non-NULL. - // For nF sequences (ESC I...I F), this will be NUL and ctrl_func will be - // non-NULL - char final_byte; // Final Byte (or NUL if c1 function); - char *ctrl_func; // Intermediate Bytes and Final Byte as NULL-terminated string. - char *param_str; // The parameter bytes - int param_count; // The number of parameters, or -1 if parameters were not parsed. - str_list_t param; // The parameters as strings - uint64_t *param_int; // The parameter bytes parsed as integers UINT64_MAX for default value. -}; - -struct sub_params { - int param_count; // The number of parameters, or -1 if parameters were not parsed. - uint64_t *param_int; // The parameter bytes parsed as integers UINT64_MAX for default value. -}; - -static bool parse_sub_parameters(struct sub_params *sub, struct esc_seq *seq, unsigned param) -{ - int i; - char *p; - - sub->param_count = 1; - sub->param_int = NULL; - - if (param >= seq->param_count) - return false; - for (p=seq->param[param]; *p; p++) - if (*p == ':') - sub->param_count++; - if (sub->param_count == 0) - return true; - sub->param_int = malloc(sub->param_count * sizeof(sub->param_int[0])); - if (sub->param_int == NULL) - return false; - p = seq->param[param]; - for (i=0; i<sub->param_count; i++) { - p++; - sub->param_int[i] = strtoull(p, &p, 10); - if (*p != ':' && *p != 0) { - free(seq->param_int); - return false; - } - } - return true; -} - -static void free_sub_parameters(struct sub_params *sub) -{ - FREE_AND_NULL(sub->param_int); -} - -static bool parse_parameters(struct esc_seq *seq) -{ - char *p; - char *dup; - char *start = NULL; - bool last_was_sc = false; - int i; - - if (seq == NULL) - return false; - if (seq->param_str == NULL) - return false; - - dup = strdup(seq->param_str); - if (dup == NULL) - return false; - p = dup; - - // First, skip past any private extension indicator... - if (*p >= 0x3c && *p <= 0x3f) - p++; - - seq->param_count = 0; - - seq->param = strListInit(); - - for (; *p; p++) { - /* Ensure it's a legal value */ - if (*p < 0x30 || *p > 0x3b) { - seq->param_count = -1; - strListFree(&seq->param); - seq->param = NULL; - free(dup); - return false; - } - /* Mark the start of the parameter */ - if (start == NULL) - start = p; - - if (*p == ';') { - /* End of parameter, add to string list */ - last_was_sc = true; - *p = 0; - while(*start == '0' && start[1]) - start++; - strListAppend(&seq->param, start, seq->param_count); - seq->param_count++; - start = NULL; - } - else - last_was_sc = false; - } - /* If the string ended with a semi-colon, there's a final zero-length parameter */ - if (last_was_sc) { - strListAppend(&seq->param, "", seq->param_count); - seq->param_count++; - } - else if (start) { - /* End of parameter, add to string list */ - *p = 0; - while(*start == '0' && start[1]) - start++; - strListAppend(&seq->param, start, seq->param_count); - seq->param_count++; - } - - seq->param_int = malloc(seq->param_count * sizeof(seq->param_int[0])); - if (seq->param_int == NULL) { - seq->param_count = -1; - strListFree(&seq->param); - seq->param = NULL; - free(dup); - return false; - } - - /* Now, parse all the integer values... */ - for (i=0; i<seq->param_count; i++) { - if (seq->param[i][0] == 0 || seq->param[i][0] == ':') { - seq->param_int[i] = UINT64_MAX; - continue; - } - seq->param_int[i] = strtoull(seq->param[i], NULL, 10); - if (seq->param_int[i] == ULLONG_MAX) { - seq->param_count = -1; - strListFree(&seq->param); - seq->param = NULL; - FREE_AND_NULL(seq->param_int); - free(dup); - return false; - } - } - - free(dup); - return true; -} - -static void seq_default(struct esc_seq *seq, int index, uint64_t val) -{ - char tmpnum[24]; - - // Params not parsed - if (seq->param_count == -1) - return; - - /* Do we need to add on to get defaults? */ - if (index >= seq->param_count) { - uint64_t *np; - - np = realloc(seq->param_int, (index + 1) * sizeof(seq->param_int[0])); - if (np == NULL) - return; - seq->param_int = np; - for (; seq->param_count <= index; seq->param_count++) { - if (seq->param_count == index) { - seq->param_int[index] = val; - sprintf(tmpnum, "%" PRIu64, val); - strListAppend(&seq->param, tmpnum, seq->param_count); - } - else { - seq->param_int[seq->param_count] = UINT64_MAX; - strListAppend(&seq->param, "", seq->param_count); - } - } - return; - } - if (seq->param_int[index] == UINT64_MAX) { - seq->param_int[index] = val; - sprintf(tmpnum, "%" PRIu64, val); - strListReplace(seq->param, index, tmpnum); - } -} - -static void free_sequence(struct esc_seq * seq) -{ - if (seq == NULL) - return; - if (seq->param) - strListFree(&seq->param); - FREE_AND_NULL(seq->param_int); - seq->param_count = -1; - FREE_AND_NULL(seq->param_str); - FREE_AND_NULL(seq->ctrl_func); - free(seq); -} - -/* - * Returns true if the sequence is legal so far - */ - -static enum { - SEQ_BROKEN, - SEQ_INCOMPLETE, - SEQ_COMPLETE -} legal_sequence(const char *seq, size_t max_len) -{ - size_t intermediate_len; - - if (seq == NULL) - return SEQ_BROKEN; - - if (seq[0] == 0) - goto incomplete; - - /* Check that it's part of C1 set, part of the Independent control functions, or an nF sequence type (ECMA 35)*/ - intermediate_len = strspn(&seq[0], " !\"#$%&'()*+,-./"); - if (seq[intermediate_len] == 0) - goto incomplete; - if (seq[intermediate_len] < 0x30 || seq[intermediate_len] > 0x7e) - return SEQ_BROKEN; - - /* Check if it's CSI */ - if (seq[0] == '[') { - size_t parameter_len; - - if (seq[1] >= '<' && seq[1] <= '?') - parameter_len = strspn(&seq[1], "0123456789:;<=>?"); - else - parameter_len = strspn(&seq[1], "0123456789:;"); - - if (seq[1+parameter_len] == 0) - goto incomplete; - - intermediate_len = strspn(&seq[1+parameter_len], " !\"#$%&'()*+,-./"); - if (seq[1+parameter_len+intermediate_len] == 0) - goto incomplete; - - if (seq[1+parameter_len+intermediate_len] < 0x40 || seq[1+parameter_len+intermediate_len] > 0x7e) - return SEQ_BROKEN; - } - return SEQ_COMPLETE; - -incomplete: - if (strlen(seq) >= max_len) - return SEQ_BROKEN; - return SEQ_INCOMPLETE; -} - -static struct esc_seq *parse_sequence(const char *seq) -{ - struct esc_seq *ret; - size_t intermediate_len; - - ret = calloc(1, sizeof(struct esc_seq)); - if (ret == NULL) - return ret; - ret->param_count = -1; - - /* Check that it's part of C1 set, part of the Independent control functions, or an nF sequence type (ECMA 35)*/ - intermediate_len = strspn(&seq[0], " !\"#$%&'()*+,-./"); - if (seq[intermediate_len] == 0) - goto fail; - - /* Validate C1 final byte */ - if (seq[intermediate_len] < 0x30 || seq[intermediate_len] > 0x7e) - goto fail; - - if (intermediate_len == 0) - ret->c1_byte = seq[intermediate_len]; - - /* Check if it's CSI */ - if (seq[0] == '[') { - size_t parameter_len; - - parameter_len = strspn(&seq[1], "0123456789:;<=>?"); - ret->param_str = malloc(parameter_len + 1); - if (!ret->param_str) - goto fail; - memcpy(ret->param_str, &seq[1], parameter_len); - ret->param_str[parameter_len] = 0; - - intermediate_len = strspn(&seq[1+parameter_len], " !\"#$%&'()*+,-./"); - if (seq[1+parameter_len+intermediate_len] < 0x40 || seq[1+parameter_len+intermediate_len] > 0x7e) - goto fail; - ret->ctrl_func = malloc(intermediate_len + 2); - if (!ret->ctrl_func) - goto fail; - memcpy(ret->ctrl_func, &seq[1+parameter_len], intermediate_len); - - ret->final_byte = ret->ctrl_func[intermediate_len] = seq[1+parameter_len+intermediate_len]; - /* Validate final byte */ - if (ret->final_byte < 0x40 || ret->final_byte > 0x7e) - goto fail; - - ret->ctrl_func[intermediate_len+1] = 0; - - /* - * Is this a private extension? - * If so, return now, the caller can parse the parameter sequence itself - * if the standard format is used. - */ - if (ret->param_str[0] >= 0x3c && ret->param_str[0] <= 0x3f) - return ret; - - if (!parse_parameters(ret)) - goto fail; - } - else { - ret->ctrl_func = malloc(intermediate_len + 2); - if (!ret->ctrl_func) - goto fail; - memcpy(ret->ctrl_func, seq, intermediate_len + 1); - ret->ctrl_func[intermediate_len + 1] = 0; - } - return ret; - -fail: - FREE_AND_NULL(ret->ctrl_func); - FREE_AND_NULL(ret->param_str); - free(ret); - return NULL; -} - -static void parse_sixel_string(struct cterminal *cterm, bool finish) -{ - char *p = cterm->strbuf; - char *end; - int i, j, k; - int vmode; - int pos; - struct text_info ti; - int palette_offset = 0; - - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) - palette_offset = 16; - - if (cterm->strbuflen == 0) { - if (finish) - goto all_done; - return; - } - - end = p+cterm->strbuflen-1; - - if ((*end < '?' || *end > '~') && !finish) - return; - - /* - * TODO: Sixel interaction with scrolling margins... - * This one is interesting because there is no real terminal - * which supported left/right margins *and* sixel graphics. - */ - while (p <= end) { - if (*p >= '?' && *p <= '~') { - unsigned data = *p - '?'; - - cterm->sx_pixels_sent = 1; - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - if (vmode == -1) - return; - if (cterm->sx_pixels == NULL) { - cterm->sx_pixels = malloc(sizeof(struct ciolib_pixels)); - cterm->sx_pixels->pixels = malloc(sizeof(cterm->sx_pixels->pixels[0]) * cterm->sx_iv * ti.screenwidth * vparams[vmode].charwidth * 6); - cterm->sx_pixels->pixelsb = NULL; - cterm->sx_pixels->width = ti.screenwidth * vparams[vmode].charwidth; - cterm->sx_pixels->height = cterm->sx_iv * 6; - cterm->sx_mask = malloc((cterm->sx_iv * 6 * ti.screenwidth * vparams[vmode].charwidth * 6 + 7)/8); - memset(cterm->sx_mask, 0, (cterm->sx_iv * 6 * ti.screenwidth * vparams[vmode].charwidth * 6 + 7)/8); - } - if (cterm->sx_x == cterm->sx_left && cterm->sx_height && cterm->sx_width && cterm->sx_first_pass) { - /* Fill in the background of the line */ - for (i = 0; i < (cterm->sx_height > 6 ? 6 : cterm->sx_height); i++) { - for (j = 0; j < cterm->sx_iv; j++) { - for (k = 0; k < cterm->sx_ih; k++) { - pos = i * cterm->sx_iv * cterm->sx_pixels->width + j * cterm->sx_pixels->width + cterm->sx_x + k; - cterm->sx_pixels->pixels[pos] = cterm->sx_bg; - cterm->sx_mask[pos/8] |= (0x80 >> (pos % 8)); - } - } - } - } - if (cterm->sx_x < ti.screenwidth * vparams[vmode].charwidth) { - for (i=0; i<6; i++) { - if (data & (1<<i)) { - for (j = 0; j < cterm->sx_iv; j++) { - for (k = 0; k < cterm->sx_ih; k++) { - pos = i * cterm->sx_iv * cterm->sx_pixels->width + j * cterm->sx_pixels->width + cterm->sx_x + k; - cterm->sx_pixels->pixels[pos] = cterm->sx_fg; - cterm->sx_mask[pos/8] |= (0x80 >> (pos % 8)); - } - } - } - else { - if (cterm->sx_first_pass && !cterm->sx_trans) { - for (j = 0; j < cterm->sx_iv; j++) { - for (k = 0; k < cterm->sx_ih; k++) { - pos = i * cterm->sx_iv * cterm->sx_pixels->width + j * cterm->sx_pixels->width + cterm->sx_x + k; - cterm->sx_pixels->pixels[pos] = cterm->sx_bg; - cterm->sx_mask[pos/8] |= (0x80 >> (pos % 8)); - } - } - } - else { - for (j = 0; j < cterm->sx_iv; j++) { - for (k = 0; k < cterm->sx_ih; k++) { - pos = i * cterm->sx_iv * cterm->sx_pixels->width + j * cterm->sx_pixels->width + cterm->sx_x + k; - if (cterm->sx_first_pass) - cterm->sx_mask[pos/8] &= ~(0x80 >> (pos % 8)); - } - } - } - } - } - if (cterm->sx_x > cterm->sx_row_max_x) - cterm->sx_row_max_x = cterm->sx_x; - } - - cterm->sx_x+=cterm->sx_ih; - if (cterm->sx_repeat) - cterm->sx_repeat--; - if (!cterm->sx_repeat) - p++; - } - else { - switch(*p) { - case '"': // Raster Attributes - if (!cterm->sx_pixels_sent) { - p++; - cterm->sx_iv = strtoul(p, &p, 10); - cterm->sx_height = cterm->sx_width = 0; - if (*p == ';') { - p++; - cterm->sx_ih = strtoul(p, &p, 10); - } - if (*p == ';') { - p++; - cterm->sx_width = strtoul(p, &p, 10); - } - if (*p == ';') { - p++; - cterm->sx_height = strtoul(p, &p, 10); - } - } - else - p++; - break; - case '!': // Repeat - p++; - if (!*p) - continue; - cterm->sx_repeat = strtoul(p, &p, 10); - break; - case '#': // Colour Introducer - p++; - if (!*p) - continue; - cterm->sx_fg = strtoul(p, &p, 10) + TOTAL_DAC_SIZE + palette_offset; - /* Do we want to redefine it while we're here? */ - if (*p == ';') { - unsigned long t,r,g,b; - - p++; - r=g=b=0; - t = strtoul(p, &p, 10); - if (*p == ';') { - p++; - r = strtoul(p, &p, 10); - } - if (*p == ';') { - p++; - g = strtoul(p, &p, 10); - } - if (*p == ';') { - p++; - b = strtoul(p, &p, 10); - } - if (t == 2) // Only support RGB - setpalette(cterm->sx_fg, UINT16_MAX*r/100, UINT16_MAX*g/100, UINT16_MAX*b/100); - } - break; - case '$': // Graphics Carriage Return - cterm->sx_x = cterm->sx_left; - cterm->sx_first_pass = 0; - p++; - break; - case '-': // Graphics New Line - { - int max_row = TERM_MAXY; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &max_row, NULL); - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - - if (vmode == -1) - return; - setpixels(cterm->sx_left, cterm->sx_y, cterm->sx_row_max_x, cterm->sx_y + 6 * cterm->sx_iv - 1, cterm->sx_left, 0, cterm->sx_pixels, cterm->sx_mask); - cterm->sx_row_max_x = 0; - - if ((!(cterm->extattr & CTERM_EXTATTR_SXSCROLL)) && (((cterm->sx_y + 6 * cterm->sx_iv) + 6*cterm->sx_iv - 1) >= (cterm->y + max_row - 1) * vparams[vmode].charheight)) { - p++; - break; - } - - cterm->sx_x = cterm->sx_left; - cterm->sx_y += 6*cterm->sx_iv; - if (cterm->sx_height) - cterm->sx_height -= cterm->sx_height > 6 ? 6 : cterm->sx_height; - while ((cterm->sx_y + 6 * cterm->sx_iv - 1) >= (cterm->y + max_row - 1) * vparams[vmode].charheight) { - cond_scrollup(cterm); - cterm->sx_y -= vparams[vmode].charheight; - } - cterm->sx_first_pass = 1; - p++; - } - break; - default: - p++; - } - } - } - cterm->strbuflen = 0; - if (finish) - goto all_done; - return; - -all_done: - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - - if (cterm->sx_row_max_x) { - setpixels(cterm->sx_left, cterm->sx_y, cterm->sx_row_max_x, cterm->sx_y + 6 * cterm->sx_iv - 1, cterm->sx_left, 0, cterm->sx_pixels, cterm->sx_mask); - } - - *cterm->hold_update=cterm->sx_hold_update; - - /* Finish off the background */ - cterm->sx_x = cterm->sx_left; - cterm->sx_y += 6 * cterm->sx_iv; - if (cterm->sx_height) - cterm->sx_height -= cterm->sx_height > 6 ? 6 : cterm->sx_height; - - if (cterm->sx_height && cterm->sx_width) { - struct ciolib_pixels px; - - px.pixels = malloc(sizeof(px.pixels[0])*cterm->sx_width*cterm->sx_height*cterm->sx_iv*cterm->sx_ih); - px.height = cterm->sx_height; - px.width = cterm->sx_width; - for (i = 0; i<cterm->sx_height*cterm->sx_iv; i++) { - for (j = 0; j < cterm->sx_width*cterm->sx_ih; j++) - px.pixels[i*cterm->sx_width*cterm->sx_ih + j] = cterm->sx_bg; - } - setpixels(cterm->sx_x, cterm->sx_y, cterm->sx_x + cterm->sx_width - 1, cterm->sx_y + cterm->sx_height - 1, 0, 0, &px, NULL); - free(px.pixels); - } - - if (cterm->extattr & CTERM_EXTATTR_SXSCROLL) { - if (vmode != -1) { - cterm->sx_x = cterm->sx_x / vparams[vmode].charwidth + 1; - cterm->sx_x -= (cterm->x - 1); - - cterm->sx_y = (cterm->sx_y - 1) / vparams[vmode].charheight + 1; - cterm->sx_y -= (cterm->y - 1); - - cterm_gotoxy(cterm, cterm->sx_x, cterm->sx_y); - } - } - else { - cterm_gotoxy(cterm, cterm->sx_start_x, cterm->sx_start_y); - } - cterm->cursor = cterm->sx_orig_cursor; - SETCURSORTYPE(cterm->cursor); - cterm->sixel = SIXEL_INACTIVE; - if (cterm->sx_pixels) - FREE_AND_NULL(cterm->sx_pixels->pixels); - FREE_AND_NULL(cterm->sx_pixels); - FREE_AND_NULL(cterm->sx_mask); -} - -static int -is_hex(char ch) -{ - if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) - return 1; - return 0; -} - -static int -get_hexstrlen(char *str, char *end) -{ - int ret = 0; - - for (;str <= end; str++) { - if (is_hex(*str)) { - if (str == end) - return -1; - if (!is_hex(*(str+1))) - return -1; - ret++; - str++; - } - else - return ret; - } - return ret; -} - -static int -nibble_val(char ch) -{ - if (ch >= '0' && ch <= '9') - return ch - '0'; - if (ch >= 'a' && ch <= 'f') - return (ch - 'a') + 10; - if (ch >= 'A' && ch <= 'F') - return (ch - 'A') + 10; - return -1; -} - -static void -get_hexstr(char *str, char *end, char *out) -{ - for (;str <= end; str++) { - if (is_hex(*str)) { - if (str == end) - return; - if (!is_hex(*(str+1))) - return; - *(out++) = nibble_val(*str) << 4 | nibble_val(*(str + 1)); - str++; - } - else - return; - } -} - -static void parse_macro_string(struct cterminal *cterm, bool finish) -{ - char *p = cterm->strbuf; - char *end; - int i; - - if (cterm->strbuflen == 0) { - if (finish) - goto all_done; - return; - } - - end = p+cterm->strbuflen-1; - - if (*end >= '\x08' && *end <= '\x0d') { - cterm->strbuflen--; - if (finish) - goto all_done; - return; - } - if (cterm->macro_encoding == MACRO_ENCODING_ASCII) { - if ((*end >= ' ' && *end <= '\x7e') || (*end >= '\xa0' && *end <= '\xff')) { - if (finish) - goto all_done; - return; - } - } - if (cterm->macro_encoding == MACRO_ENCODING_HEX && - (is_hex(*end) || (*end == '!') || (*end == ';'))) { - if (finish) - goto all_done; - return; - } - - cterm->macro = MACRO_INACTIVE; - return; - -all_done: - if (cterm->macro_del == MACRO_DELETE_ALL) { - for (i = 0; i < (sizeof(cterm->macros) / sizeof(cterm->macros[0])); i++) { - FREE_AND_NULL(cterm->macros[i]); - cterm->macro_lens[i] = 0; - } - } - else { - FREE_AND_NULL(cterm->macros[cterm->macro_num]); - cterm->macro_lens[cterm->macro_num] = 0; - } - if (cterm->strbuflen == 0) - return; - if (cterm->macro_encoding == MACRO_ENCODING_ASCII) { - cterm->macros[cterm->macro_num] = malloc(cterm->strbuflen + 1); - if (cterm->macros[cterm->macro_num]) { - cterm->macro_lens[cterm->macro_num] = cterm->strbuflen; - memcpy(cterm->macros[cterm->macro_num], cterm->strbuf, cterm->strbuflen); - cterm->macros[cterm->macro_num][cterm->strbuflen] = 0; - } - } - else { - // Hex string... - int plen; - unsigned long ul; - size_t mlen = 0; - char *out; - - // First, calculate the required length... - for (p = cterm->strbuf; p <= end;) { - if (*p == '!') { - if (p == end) - return; - p++; - if (p == end) - return; - if (*p == ';') - ul = 1; - else { - if (memchr(p, ';', cterm->strbuflen - (p - cterm->strbuf)) == NULL) - return; - ul = strtoul(p, &p, 10); - if (*p != ';') - return; - if (ul == ULONG_MAX) - return; - p++; - } - plen = get_hexstrlen(p, end); - p += plen * 2; - if (plen == -1) - return; - mlen += ul * plen; - if (p <= end) { - if (*p == ';') - p++; - else - return; - } - } - else { - plen = get_hexstrlen(p, end); - if (plen == -1) - return; - p += plen * 2; - mlen += plen; - } - } - cterm->macros[cterm->macro_num] = malloc(mlen + 1); - if (cterm->macros[cterm->macro_num] == NULL) - return; - cterm->macro_lens[cterm->macro_num] = mlen; - out = cterm->macros[cterm->macro_num]; - for (p = cterm->strbuf; p <= end;) { - if (*p == '!') { - p++; - if (*p == ';') - ul = 1; - else { - ul = strtoul(p, &p, 10); - p++; - } - plen = get_hexstrlen(p, end); - for (i = 0; i < ul; i++) { - get_hexstr(p, end, out); - out += plen; - } - p += plen * 2; - if (p <= end && *p == ';') - p++; - } - else { - plen = get_hexstrlen(p, end); - get_hexstr(p, end, out); - out += plen; - p += plen * 2; - } - } - } -} - -static void save_extended_colour_seq(struct cterminal *cterm, int fg, struct esc_seq *seq, int seqoff, int count) -{ - char **str = fg ? &cterm->fg_tc_str : &cterm->bg_tc_str; - - if (*str) - FREE_AND_NULL(*str); - - switch (count) { - case 1: - asprintf(str, "%s", seq->param[seqoff]); - break; - case 2: - asprintf(str, "%s;%s", seq->param[seqoff], seq->param[seqoff+1]); - break; - case 3: - asprintf(str, "%s;%s;%s", seq->param[seqoff], seq->param[seqoff+1], seq->param[seqoff+2]); - break; - case 5: - asprintf(str, "%s;%s;%s;%s;%s", seq->param[seqoff], seq->param[seqoff+1], seq->param[seqoff+2], seq->param[seqoff+3], seq->param[seqoff+4]); - break; - } -} - -static void parse_extended_colour(struct esc_seq *seq, int *i, struct cterminal *cterm, int fg) -{ - struct sub_params sub = {0}; - uint32_t nc; - uint32_t *co; - int palette_offset = 0; - - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) - palette_offset = 16; - - if (seq == NULL || cterm == NULL || i == NULL) - return; - if (fg) - FREE_AND_NULL(cterm->fg_tc_str); - else - FREE_AND_NULL(cterm->bg_tc_str); - co = fg ? (&cterm->fg_color) : (&cterm->bg_color); - if (*i>=seq->param_count) - return; - - if (seq->param[*i][2] == ':') { - // CSI 38 : 5 : X m variant - // CSI 38 : 2 : Z? : R : G : B m variant - - if (parse_sub_parameters(&sub, seq, *i)) { - if (sub.param_count == 3 && sub.param_int[1] == 5) { - *co = sub.param_int[2]; - save_extended_colour_seq(cterm, fg, seq, *i, 1); - } - else if (sub.param_int[1] == 2) { - if (sub.param_count == 5) { - nc = map_rgb(sub.param_int[2]<<8, sub.param_int[3]<<8, sub.param_int[4]<<8); - if (nc != UINT32_MAX) - *co = nc; - save_extended_colour_seq(cterm, fg, seq, *i, 1); - } - else if (sub.param_count > 5) { - nc = map_rgb(sub.param_int[3]<<8, sub.param_int[4]<<8, sub.param_int[5]<<8); - if (nc != UINT32_MAX) - *co = nc; - save_extended_colour_seq(cterm, fg, seq, *i, 1); - } - } - } - } - else if ((*i)+1 < seq->param_count && seq->param_int[(*i)+1] == 5 && seq->param[(*i)+1][1] == ':') { - // CSI 38 ; 5 : X m variant - if (parse_sub_parameters(&sub, seq, (*i)+1)) { - if (sub.param_count == 2) - *co = sub.param_int[1]; - save_extended_colour_seq(cterm, fg, seq, *i, 2); - (*i)++; - } - } - else if ((*i)+2 < seq->param_count && seq->param_int[(*i)+1] == 5) { - // CSI 38 ; 5 ; X m variant - *co = seq->param_int[(*i)+2] + palette_offset; - save_extended_colour_seq(cterm, fg, seq, *i, 3); - *i+=2; - } - else if ((*i)+1 < seq->param_count && seq->param_int[(*i)+1] == 2 && seq->param[(*i)+1][1] == ':') { - // CSI 38 ; 2 : Z? : R : G : B m variant - if (parse_sub_parameters(&sub, seq, (*i)+1)) { - nc = UINT32_MAX; - if (sub.param_count > 4) - nc = map_rgb(sub.param_int[2]<<8, sub.param_int[3]<<8, sub.param_int[4]<<8); - else if (sub.param_count == 4) - nc = map_rgb(sub.param_int[1]<<8, sub.param_int[2]<<8, sub.param_int[3]<<8); - if (nc != UINT32_MAX) - *co = nc; - save_extended_colour_seq(cterm, fg, seq, *i, 2); - *i += 1; - } - } - else if ((*i)+4 < seq->param_count && seq->param_int[(*i)+1] == 2) { - // CSI 38 ; 2 ; R ; G ; B m variant - nc = map_rgb(seq->param_int[(*i)+2]<<8, seq->param_int[(*i)+3]<<8, seq->param_int[(*i)+4]<<8); - if (nc != UINT32_MAX) - *co = nc; - save_extended_colour_seq(cterm, fg, seq, *i, 5); - *i += 4; - } - free_sub_parameters(&sub); -} - -static void -do_tab(struct cterminal *cterm) -{ - int i; - int cx, cy, ox; - int lm, rm, bm; - - rm = TERM_MAXX; - bm = TERM_MAXY; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &rm, &bm); - lm = TERM_MINX; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &lm, NULL); - - CURR_XY(&cx, &cy); - ox = cx; - for (i = 0; i < cterm->tab_count; i++) { - if (cterm->tabs[i] > cx) { - cx = cterm->tabs[i]; - break; - } - } - if ((ox > rm && cx > CURR_MAXX) || (ox <= rm && cx > rm) || i == cterm->tab_count) { - cx = lm; - if (cy == bm) { - cond_scrollup(cterm); - cy = bm; - } - else if(cy < CURR_MAXY) - cy++; - } - GOTOXY(cx, cy); -} - -static void -do_backtab(struct cterminal *cterm) -{ - int i; - int cx, cy, ox; - int lm; - - lm = TERM_MINX; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &lm, NULL); - - CURR_XY(&cx, &cy); - ox = cx; - for (i = cterm->tab_count - 1; i >= 0; i--) { - if (cterm->tabs[i] < cx) { - cx = cterm->tabs[i]; - break; - } - } - if (ox >= lm && cx < lm) - cx = lm; - GOTOXY(cx, cy); -} - -static void -adjust_currpos(struct cterminal *cterm, int xadj, int yadj, int scroll) -{ - int x, y; - int tx, ty; - - /* - * If we're inside the scrolling margins, we simply move inside - * them, and scrolling works. - */ - TERM_XY(&tx, &ty); - if (tx >= TERM_MINX && tx <= TERM_MAXX && - ty >= TERM_MINY && ty <= TERM_MAXY) { - if (xadj == INT_MIN) - tx = TERM_MINX; - else - tx += xadj; - if (yadj == INT_MIN) - ty = TERM_MINX; - else - ty += yadj; - if (scroll) { - while(ty > TERM_MAXY) { - cterm_scrollup(cterm); - ty--; - } - while(ty < TERM_MINY) { - scrolldown(cterm); - ty++; - } - } - else { - if (ty > TERM_MAXY) - ty = TERM_MAXY; - if (ty < TERM_MINY) - ty = TERM_MINY; - } - if (tx > TERM_MAXX) - tx = TERM_MAXX; - if (tx < TERM_MINX) - tx = TERM_MINX; - cterm_gotoxy(cterm, tx, ty); - return; - } - /* - * Outside of the scrolling margins, we can cross a margin - * into the scrolling region, but can't cross going out. - */ - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &tx, &ty); - x = tx; - y = ty; - if (xadj == INT_MIN) - tx = TERM_MINX; - else - tx += xadj; - if (yadj == INT_MIN) - ty = TERM_MINX; - else - ty += yadj; - if (x <= cterm->right_margin && tx > cterm->right_margin) - tx = cterm->right_margin; - if (y <= cterm->bottom_margin && ty > cterm->bottom_margin) - ty = cterm->bottom_margin; - if (tx < cterm->left_margin && x >= cterm->left_margin) - tx = cterm->left_margin; - if (ty < cterm->top_margin && y >= cterm->top_margin) - ty = cterm->top_margin; - GOTOXY(tx, ty); -} - -static int -skypix_color(struct cterminal *cterm, int color) -{ - if (!cterm->skypix) - return color; - switch(color) { - case BLACK: - return 0; - case RED: - return 3; - case GREEN: - return 4; - case BROWN: - return 6; - case BLUE: - return 1; - case MAGENTA: - return 7; - case CYAN: - return 5; - case LIGHTGRAY: - return 2; - case DARKGRAY: - return 8; - case LIGHTRED: - return 11; - case LIGHTGREEN: - return 12; - case YELLOW: - return 14; - case LIGHTBLUE: - return 9; - case LIGHTMAGENTA: - return 15; - case LIGHTCYAN: - return 13; - case WHITE: - return 10; - } - return color; -} - -static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *speed, char last) -{ - char *p; - char *p2; - char tmp[1024]; - int i,j,k,l; - int flags; - int row,col; - int row2,col2; - int max_row; - int max_col; - struct text_info ti; - struct esc_seq *seq; - uint32_t oldfg, oldbg; - bool updfg, updbg; - struct vmem_cell *vc; - int palette_offset = 0; - - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) - palette_offset = 16; - seq = parse_sequence(cterm->escbuf); - if (seq != NULL) { - switch(seq->c1_byte) { - case '[': - /* ANSI stuff */ - p=cterm->escbuf+strlen(cterm->escbuf)-1; - if(seq->param_str[0]>=60 && seq->param_str[0] <= 63) { /* Private extensions */ - switch(seq->final_byte) { - case 'M': - if(seq->param_str[0] == '=' && parse_parameters(seq)) { /* ANSI Music setup */ - seq_default(seq, 0, 0); - switch(seq->param_int[0]) { - case 0: /* Disable ANSI Music */ - cterm->music_enable=CTERM_MUSIC_SYNCTERM; - break; - case 1: /* BANSI (ESC[N) music only) */ - cterm->music_enable=CTERM_MUSIC_BANSI; - break; - case 2: /* ESC[M ANSI music */ - cterm->music_enable=CTERM_MUSIC_ENABLED; - break; - } - } - break; - case 'S': // XTerm graphics query - if (seq->param_str[0] == '?' && parse_parameters(seq)) { - if (seq->param_int[0] == 2 && seq->param_int[1] == 1) { - struct text_info ti; - int vmode; - - tmp[0] = 0; - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - if (vmode != -1) - sprintf(tmp, "\x1b[?2;0;%u;%uS", vparams[vmode].charwidth*cterm->width, vparams[vmode].charheight*cterm->height); - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - } - break; - case 'c': - /* SyncTERM Device Attributes */ - if (seq->param_str[0] == '<' && parse_parameters(seq)) { - seq_default(seq, 0, 0); - tmp[0] = 0; - for (i=0; i<seq->param_count; i++) { - switch (seq->param_int[i]) { - case 0: /* Advanced features */ - strcpy(tmp, "\x1b[<0"); - if (cio_api.options & CONIO_OPT_LOADABLE_FONTS) - strcat(tmp, ";1"); - if (cio_api.options & CONIO_OPT_BRIGHT_BACKGROUND) - strcat(tmp, ";2"); - if (cio_api.options & CONIO_OPT_PALETTE_SETTING) - strcat(tmp, ";3"); - if (cio_api.options & CONIO_OPT_SET_PIXEL) - strcat(tmp, ";4"); - if (cio_api.options & CONIO_OPT_FONT_SELECT) - strcat(tmp, ";5"); - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) - strcat(tmp, ";6"); - if (cio_api.mouse) - strcat(tmp, ";7"); - strcat(tmp, "c"); - } - } - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case 'h': - if (seq->param_str[0] == '?' && parse_parameters(seq)) { - attr2palette(cterm->attr, &oldfg, &oldbg); - updfg = (oldfg == cterm->fg_color); - updbg = (oldbg == cterm->bg_color); - for (i=0; i<seq->param_count; i++) { - switch(seq->param_int[i]) { - case 6: - cterm->extattr |= CTERM_EXTATTR_ORIGINMODE; - setwindow(cterm); - break; - case 7: - cterm->extattr |= CTERM_EXTATTR_AUTOWRAP; - break; - case 25: - cterm->cursor=_NORMALCURSOR; - SETCURSORTYPE(cterm->cursor); - break; - case 31: - flags = GETVIDEOFLAGS(); - flags |= CIOLIB_VIDEO_ALTCHARS; - SETVIDEOFLAGS(flags); - break; - case 32: - flags = GETVIDEOFLAGS(); - flags |= CIOLIB_VIDEO_NOBRIGHT; - SETVIDEOFLAGS(flags); - break; - case 33: - flags = GETVIDEOFLAGS(); - flags |= CIOLIB_VIDEO_BGBRIGHT; - SETVIDEOFLAGS(flags); - break; - case 34: - flags = GETVIDEOFLAGS(); - flags |= CIOLIB_VIDEO_BLINKALTCHARS; - SETVIDEOFLAGS(flags); - break; - case 35: - flags = GETVIDEOFLAGS(); - flags |= CIOLIB_VIDEO_NOBLINK; - SETVIDEOFLAGS(flags); - break; - case 69: - cterm->extattr |= CTERM_EXTATTR_DECLRMM; - break; - case 80: - cterm->extattr |= CTERM_EXTATTR_SXSCROLL; - break; - case 9: - case 1000: - case 1001: - case 1002: - case 1003: - case 1004: - case 1005: - case 1006: - case 1007: - case 1015: - if (cterm->mouse_state_change) - cterm->mouse_state_change(seq->param_int[i], 1, cterm->mouse_state_change_cbdata); - break; - } - } - if (updfg || updbg) { - attr2palette(cterm->attr, updfg ? &cterm->fg_color : NULL, updbg ? &cterm->bg_color : NULL); - if (updfg) - FREE_AND_NULL(cterm->fg_tc_str); - if (updbg) - FREE_AND_NULL(cterm->bg_tc_str); - } - } - else if(!strcmp(seq->param_str,"=255")) - cterm->doorway_mode=1; - break; - case 'l': - if (seq->param_str[0] == '?' && parse_parameters(seq)) { - attr2palette(cterm->attr, &oldfg, &oldbg); - updfg = (oldfg == cterm->fg_color); - updbg = (oldbg == cterm->bg_color); - for (i=0; i<seq->param_count; i++) { - switch(seq->param_int[i]) { - case 6: - cterm->extattr &= ~CTERM_EXTATTR_ORIGINMODE; - setwindow(cterm); - break; - case 7: - cterm->extattr &= ~(CTERM_EXTATTR_AUTOWRAP); - break; - case 25: - cterm->cursor=_NOCURSOR; - SETCURSORTYPE(cterm->cursor); - break; - case 31: - flags = GETVIDEOFLAGS(); - flags &= ~CIOLIB_VIDEO_ALTCHARS; - SETVIDEOFLAGS(flags); - break; - case 32: - flags = GETVIDEOFLAGS(); - flags &= ~CIOLIB_VIDEO_NOBRIGHT; - SETVIDEOFLAGS(flags); - break; - case 33: - flags = GETVIDEOFLAGS(); - flags &= ~CIOLIB_VIDEO_BGBRIGHT; - SETVIDEOFLAGS(flags); - break; - case 34: - flags = GETVIDEOFLAGS(); - flags &= ~CIOLIB_VIDEO_BLINKALTCHARS; - SETVIDEOFLAGS(flags); - break; - case 35: - flags = GETVIDEOFLAGS(); - flags &= ~CIOLIB_VIDEO_NOBLINK; - SETVIDEOFLAGS(flags); - break; - case 69: - cterm->extattr &= ~(CTERM_EXTATTR_DECLRMM); - break; - case 80: - cterm->extattr &= ~CTERM_EXTATTR_SXSCROLL; - break; - case 9: - case 1000: - case 1001: - case 1002: - case 1003: - case 1004: - case 1005: - case 1006: - case 1007: - case 1015: - if (cterm->mouse_state_change) - cterm->mouse_state_change(seq->param_int[i], 0, cterm->mouse_state_change_cbdata); - break; - } - } - if (updfg || updbg) { - attr2palette(cterm->attr, updfg ? &cterm->fg_color : NULL, updbg ? &cterm->bg_color : NULL); - if (updfg) - FREE_AND_NULL(cterm->fg_tc_str); - if (updbg) - FREE_AND_NULL(cterm->bg_tc_str); - } - } - else if(!strcmp(seq->param_str,"=255")) - cterm->doorway_mode=0; - break; - case 'n': /* Query (extended) state information */ - if (seq->param_str[0] == '=' && parse_parameters(seq)) { - int vidflags; - - if(retbuf == NULL) - break; - tmp[0] = 0; - if (seq->param_count > 1) - break; - seq_default(seq, 0, 1); - switch(seq->param_int[0]) { - case 1: - sprintf(tmp, "\x1b[=1;%u;%u;%u;%u;%u;%un" - ,CONIO_FIRST_FREE_FONT - ,(uint8_t)cterm->setfont_result - ,(uint8_t)cterm->altfont[0] - ,(uint8_t)cterm->altfont[1] - ,(uint8_t)cterm->altfont[2] - ,(uint8_t)cterm->altfont[3] - ); - break; - case 2: - vidflags = GETVIDEOFLAGS(); - strcpy(tmp, "\x1b[=2"); - if(cterm->extattr & CTERM_EXTATTR_ORIGINMODE) - strcat(tmp, ";6"); - if (cterm->extattr & CTERM_EXTATTR_AUTOWRAP) - strcat(tmp, ";7"); - if (cterm->mouse_state_query(9, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";9"); - if(cterm->cursor == _NORMALCURSOR) - strcat(tmp, ";25"); - if(vidflags & CIOLIB_VIDEO_ALTCHARS) - strcat(tmp, ";31"); - if(vidflags & CIOLIB_VIDEO_NOBRIGHT) - strcat(tmp, ";32"); - if(vidflags & CIOLIB_VIDEO_BGBRIGHT) - strcat(tmp, ";33"); - if(vidflags & CIOLIB_VIDEO_BLINKALTCHARS) - strcat(tmp, ";34"); - if(vidflags & CIOLIB_VIDEO_NOBLINK) - strcat(tmp, ";35"); - if (cterm->extattr & CTERM_EXTATTR_DECLRMM) - strcat(tmp, ";69"); - if (cterm->extattr & CTERM_EXTATTR_SXSCROLL) - strcat(tmp, ";80"); - if (cterm->mouse_state_query(1000, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1000"); - if (cterm->mouse_state_query(1001, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1001"); - if (cterm->mouse_state_query(1002, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1002"); - if (cterm->mouse_state_query(1003, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1003"); - if (cterm->mouse_state_query(1004, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1004"); - if (cterm->mouse_state_query(1005, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1005"); - if (cterm->mouse_state_query(1006, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1006"); - if (cterm->mouse_state_query(1007, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1007"); - if (cterm->mouse_state_query(1015, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1015"); - if (strlen(tmp) == 4) { // Nothing set - strcat(tmp, ";"); - } - strcat(tmp, "n"); - break; - case 3: /* Query font char dimensions */ - { - struct text_info ti; - int vmode; - - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - if (vmode != -1) - sprintf(tmp, "\x1b[=3;%u;%un", vparams[vmode].charheight, vparams[vmode].charwidth); - break; - } - } - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - else if (seq->param_str[0] == '?' && parse_parameters(seq)) { - if(retbuf == NULL) - break; - seq_default(seq, 0, 1); - tmp[0] = 0; - switch(seq->param_int[0]) { - case 62: /* Query macro space available */ - { - if (seq->param_count > 1) - break; - // Just fake it as int16_max - strcpy(tmp, "\x1b[32767*{"); - break; - } - case 63: /* Quero macro space "checksum" */ - { - uint16_t crc = 0; - if (seq->param_count > 2) - break; - seq_default(seq, 1, 1); - for (k = 0; k < (sizeof(cterm->macros) / sizeof(cterm->macros[0])); k++) { - if (cterm->macros[k]) { - for (i = 0; i <= cterm->macro_lens[k]; i++) - crc = ucrc16(cterm->macros[k][i], crc); - } - else - crc = ucrc16(0, crc); - } - *tmp = 0; - snprintf(tmp, sizeof(tmp), "\x1bP%u!~%04X\x1b\\", (unsigned)seq->param_int[1], crc); - break; - } - } - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case 's': - if (seq->param_str[0] == '?' && parse_parameters(seq)) { - GETTEXTINFO(&ti); - flags = GETVIDEOFLAGS(); - if(seq->param_count == 0) { - /* All the save stuff... */ - cterm->saved_mode_mask |= (CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS| - CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN|CTERM_SAVEMODE_SIXEL_SCROLL| - CTERM_SAVEMODE_MOUSE_X10|CTERM_SAVEMODE_MOUSE_NORMAL|CTERM_SAVEMODE_MOUSE_HIGHLIGHT| - CTERM_SAVEMODE_MOUSE_BUTTONTRACK|CTERM_SAVEMODE_MOUSE_ANY|CTERM_SAVEMODE_MOUSE_FOCUS| - CTERM_SAVEMODE_MOUSE_UTF8|CTERM_SAVEMODE_MOUSE_SGR|CTERM_SAVEMODE_MOUSE_ALTSCROLL|CTERM_SAVEMODE_MOUSE_URXVT|CTERM_SAVEMODE_DECLRMM); - cterm->saved_mode &= ~(cterm->saved_mode_mask); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_AUTOWRAP)?CTERM_SAVEMODE_AUTOWRAP:0; - cterm->saved_mode |= (cterm->cursor==_NORMALCURSOR)?CTERM_SAVEMODE_CURSOR:0; - cterm->saved_mode |= (flags & CIOLIB_VIDEO_ALTCHARS)?CTERM_SAVEMODE_ALTCHARS:0; - cterm->saved_mode |= (flags & CIOLIB_VIDEO_NOBRIGHT)?CTERM_SAVEMODE_NOBRIGHT:0; - cterm->saved_mode |= (flags & CIOLIB_VIDEO_BGBRIGHT)?CTERM_SAVEMODE_BGBRIGHT:0; - cterm->saved_mode |= (flags & CIOLIB_VIDEO_BLINKALTCHARS)?CTERM_SAVEMODE_BLINKALTCHARS:0; - cterm->saved_mode |= (flags & CIOLIB_VIDEO_NOBLINK)?CTERM_SAVEMODE_NOBLINK:0; - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_ORIGINMODE)?CTERM_SAVEMODE_ORIGIN:0; - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_SXSCROLL)?CTERM_SAVEMODE_SIXEL_SCROLL:0; - cterm->saved_mode |= (cterm->mouse_state_query(9, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_X10 : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1000, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_NORMAL : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1001, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_HIGHLIGHT : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1002, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_BUTTONTRACK : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1003, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_ANY : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1004, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_FOCUS : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1005, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_UTF8 : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1006, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_SGR : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1007, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_ALTSCROLL : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1015, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_URXVT : 0); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_DECLRMM) ? CTERM_SAVEMODE_DECLRMM : 0; - setwindow(cterm); - break; - } - else { - for (i=0; i<seq->param_count; i++) { - switch(seq->param_int[i]) { - case 6: - cterm->saved_mode_mask |= CTERM_SAVEMODE_ORIGIN; - cterm->saved_mode &= ~(CTERM_SAVEMODE_ORIGIN); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_ORIGINMODE)?CTERM_SAVEMODE_ORIGIN:0; - setwindow(cterm); - break; - case 7: - cterm->saved_mode_mask |= CTERM_SAVEMODE_AUTOWRAP; - cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_AUTOWRAP)?CTERM_SAVEMODE_AUTOWRAP:0; - break; - case 9: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_X10; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_X10); - cterm->saved_mode |= (cterm->mouse_state_query(9, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_X10 : 0); - break; - case 25: - cterm->saved_mode_mask |= CTERM_SAVEMODE_CURSOR; - cterm->saved_mode &= ~(CTERM_SAVEMODE_CURSOR); - cterm->saved_mode |= (cterm->cursor==_NORMALCURSOR)?CTERM_SAVEMODE_CURSOR:0; - break; - case 31: - cterm->saved_mode_mask |= CTERM_SAVEMODE_ALTCHARS; - cterm->saved_mode &= ~(CTERM_SAVEMODE_ALTCHARS); - cterm->saved_mode |= (flags & CIOLIB_VIDEO_ALTCHARS)?CTERM_SAVEMODE_ALTCHARS:0; - break; - case 32: - cterm->saved_mode_mask |= CTERM_SAVEMODE_NOBRIGHT; - cterm->saved_mode &= ~(CTERM_SAVEMODE_NOBRIGHT); - cterm->saved_mode |= (flags & CIOLIB_VIDEO_NOBRIGHT)?CTERM_SAVEMODE_NOBRIGHT:0; - break; - case 33: - cterm->saved_mode_mask |= CTERM_SAVEMODE_BGBRIGHT; - cterm->saved_mode &= ~(CTERM_SAVEMODE_BGBRIGHT); - cterm->saved_mode |= (flags & CIOLIB_VIDEO_BGBRIGHT)?CTERM_SAVEMODE_BGBRIGHT:0; - break; - case 34: - cterm->saved_mode_mask |= CTERM_SAVEMODE_BLINKALTCHARS; - cterm->saved_mode &= ~(CTERM_SAVEMODE_BLINKALTCHARS); - cterm->saved_mode |= (flags & CIOLIB_VIDEO_BLINKALTCHARS)?CTERM_SAVEMODE_BLINKALTCHARS:0; - break; - case 35: - cterm->saved_mode_mask |= CTERM_SAVEMODE_NOBLINK; - cterm->saved_mode &= ~(CTERM_SAVEMODE_NOBLINK); - cterm->saved_mode |= (flags & CIOLIB_VIDEO_NOBLINK)?CTERM_SAVEMODE_NOBLINK:0; - break; - case 69: - cterm->saved_mode_mask |= CTERM_SAVEMODE_DECLRMM; - cterm->saved_mode &= ~(CTERM_SAVEMODE_DECLRMM); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_DECLRMM) ? CTERM_SAVEMODE_DECLRMM : 0; - break; - case 80: - cterm->saved_mode_mask |= CTERM_SAVEMODE_SIXEL_SCROLL; - cterm->saved_mode &= ~(CTERM_SAVEMODE_SIXEL_SCROLL); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_SXSCROLL)?CTERM_SAVEMODE_SIXEL_SCROLL:0; - break; - case 1000: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_NORMAL; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_NORMAL); - cterm->saved_mode |= (cterm->mouse_state_query(1000, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_NORMAL : 0); - break; - case 1001: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_HIGHLIGHT; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_HIGHLIGHT); - cterm->saved_mode |= (cterm->mouse_state_query(1001, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_HIGHLIGHT : 0); - break; - case 1002: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_BUTTONTRACK; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_BUTTONTRACK); - cterm->saved_mode |= (cterm->mouse_state_query(1002, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_BUTTONTRACK : 0); - break; - case 1003: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_ANY; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_ANY); - cterm->saved_mode |= (cterm->mouse_state_query(1003, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_ANY : 0); - break; - case 1004: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_FOCUS; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_FOCUS); - cterm->saved_mode |= (cterm->mouse_state_query(1004, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_FOCUS : 0); - break; - case 1005: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_UTF8; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_UTF8); - cterm->saved_mode |= (cterm->mouse_state_query(1005, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_UTF8 : 0); - break; - case 1006: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_SGR; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_SGR); - cterm->saved_mode |= (cterm->mouse_state_query(1006, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_SGR : 0); - break; - case 1007: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_ALTSCROLL; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_ALTSCROLL); - cterm->saved_mode |= (cterm->mouse_state_query(1007, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_ALTSCROLL : 0); - break; - case 1015: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_URXVT; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_URXVT); - cterm->saved_mode |= (cterm->mouse_state_query(1015, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_URXVT : 0); - break; - } - } - } - } - break; - case 'u': - if (seq->param_str[0] == '?' && parse_parameters(seq)) { - GETTEXTINFO(&ti); - flags = GETVIDEOFLAGS(); - attr2palette(cterm->attr, &oldfg, &oldbg); - updfg = (oldfg == cterm->fg_color); - updbg = (oldbg == cterm->bg_color); - if(seq->param_count == 0) { - /* All the save stuff... */ - if(cterm->saved_mode_mask & CTERM_SAVEMODE_ORIGIN) { - if (cterm->saved_mode & CTERM_SAVEMODE_ORIGIN) - cterm->extattr |= CTERM_EXTATTR_ORIGINMODE; - else - cterm->extattr &= ~CTERM_EXTATTR_ORIGINMODE; - setwindow(cterm); - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_AUTOWRAP) { - if (cterm->saved_mode & CTERM_SAVEMODE_AUTOWRAP) - cterm->extattr |= CTERM_EXTATTR_AUTOWRAP; - else - cterm->extattr &= ~CTERM_EXTATTR_AUTOWRAP; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_SIXEL_SCROLL) { - if (cterm->saved_mode & CTERM_SAVEMODE_SIXEL_SCROLL) - cterm->extattr |= CTERM_EXTATTR_SXSCROLL; - else - cterm->extattr &= ~CTERM_EXTATTR_SXSCROLL; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_CURSOR) { - cterm->cursor = (cterm->saved_mode & CTERM_SAVEMODE_CURSOR) ? _NORMALCURSOR : _NOCURSOR; - SETCURSORTYPE(cterm->cursor); - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_ALTCHARS) { - if(cterm->saved_mode & CTERM_SAVEMODE_ALTCHARS) - flags |= CIOLIB_VIDEO_ALTCHARS; - else - flags &= ~CIOLIB_VIDEO_ALTCHARS; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_BLINKALTCHARS) { - if(cterm->saved_mode & CTERM_SAVEMODE_BLINKALTCHARS) - flags |= CIOLIB_VIDEO_BLINKALTCHARS; - else - flags &= ~CIOLIB_VIDEO_BLINKALTCHARS; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBRIGHT) { - if(cterm->saved_mode & CTERM_SAVEMODE_NOBRIGHT) - flags |= CIOLIB_VIDEO_NOBRIGHT; - else - flags &= ~CIOLIB_VIDEO_NOBRIGHT; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBLINK) { - if(cterm->saved_mode & CTERM_SAVEMODE_NOBLINK) - flags |= CIOLIB_VIDEO_NOBLINK; - else - flags &= ~CIOLIB_VIDEO_NOBLINK; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_BGBRIGHT) { - if(cterm->saved_mode & CTERM_SAVEMODE_BGBRIGHT) - flags |= CIOLIB_VIDEO_BGBRIGHT; - else - flags &= ~CIOLIB_VIDEO_BGBRIGHT; - } - SETVIDEOFLAGS(flags); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_X10) - cterm->mouse_state_change(9, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_X10, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_NORMAL) - cterm->mouse_state_change(1000, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_NORMAL, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_HIGHLIGHT) - cterm->mouse_state_change(1001, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_HIGHLIGHT, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_BUTTONTRACK) - cterm->mouse_state_change(1002, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_BUTTONTRACK, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_ANY) - cterm->mouse_state_change(1003, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_ANY, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_FOCUS) - cterm->mouse_state_change(1004, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_FOCUS, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_UTF8) - cterm->mouse_state_change(1005, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_UTF8, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_SGR) - cterm->mouse_state_change(1006, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_SGR, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_ALTSCROLL) - cterm->mouse_state_change(1007, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_ALTSCROLL, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_URXVT) - cterm->mouse_state_change(1015, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_URXVT, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_DECLRMM) { - if (cterm->saved_mode & CTERM_SAVEMODE_DECLRMM) - cterm->extattr |= CTERM_EXTATTR_DECLRMM; - else - cterm->extattr &= ~CTERM_EXTATTR_DECLRMM; - } - break; - } - else { - for (i=0; i<seq->param_count; i++) { - switch(seq->param_int[i]) { - case 6: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_ORIGIN) { - if (cterm->saved_mode & CTERM_SAVEMODE_ORIGIN) - cterm->extattr |= CTERM_EXTATTR_ORIGINMODE; - else - cterm->extattr &= ~CTERM_EXTATTR_ORIGINMODE; - } - setwindow(cterm); - break; - case 7: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_AUTOWRAP) { - if (cterm->saved_mode & CTERM_SAVEMODE_AUTOWRAP) - cterm->extattr |= CTERM_EXTATTR_AUTOWRAP; - else - cterm->extattr &= ~CTERM_EXTATTR_AUTOWRAP; - } - break; - case 9: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_X10) - cterm->mouse_state_change(9, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_X10, cterm->mouse_state_change_cbdata); - break; - case 25: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_CURSOR) { - cterm->cursor = (cterm->saved_mode & CTERM_SAVEMODE_CURSOR) ? _NORMALCURSOR : _NOCURSOR; - SETCURSORTYPE(cterm->cursor); - } - break; - case 31: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_ALTCHARS) { - if(cterm->saved_mode & CTERM_SAVEMODE_ALTCHARS) - flags |= CIOLIB_VIDEO_ALTCHARS; - else - flags &= ~CIOLIB_VIDEO_ALTCHARS; - SETVIDEOFLAGS(flags); - } - break; - case 32: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBRIGHT) { - if(cterm->saved_mode & CTERM_SAVEMODE_NOBRIGHT) - flags |= CIOLIB_VIDEO_NOBRIGHT; - else - flags &= ~CIOLIB_VIDEO_NOBRIGHT; - SETVIDEOFLAGS(flags); - } - break; - case 33: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_BGBRIGHT) { - if(cterm->saved_mode & CTERM_SAVEMODE_BGBRIGHT) - flags |= CIOLIB_VIDEO_BGBRIGHT; - else - flags &= ~CIOLIB_VIDEO_BGBRIGHT; - SETVIDEOFLAGS(flags); - } - break; - case 34: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_BLINKALTCHARS) { - if(cterm->saved_mode & CTERM_SAVEMODE_BLINKALTCHARS) - flags |= CIOLIB_VIDEO_BLINKALTCHARS; - else - flags &= ~CIOLIB_VIDEO_BLINKALTCHARS; - SETVIDEOFLAGS(flags); - } - break; - case 35: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBLINK) { - if(cterm->saved_mode & CTERM_SAVEMODE_NOBLINK) - flags |= CIOLIB_VIDEO_NOBLINK; - else - flags &= ~CIOLIB_VIDEO_NOBLINK; - SETVIDEOFLAGS(flags); - } - break; - case 69: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_DECLRMM) { - if (cterm->saved_mode & CTERM_SAVEMODE_DECLRMM) - cterm->extattr |= CTERM_EXTATTR_DECLRMM; - else - cterm->extattr &= ~CTERM_EXTATTR_DECLRMM; - } - break; - case 80: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_SIXEL_SCROLL) { - if (cterm->saved_mode & CTERM_SAVEMODE_SIXEL_SCROLL) - cterm->extattr |= CTERM_EXTATTR_SXSCROLL; - else - cterm->extattr &= ~CTERM_EXTATTR_SXSCROLL; - } - break; - case 1000: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_NORMAL) - cterm->mouse_state_change(1000, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_NORMAL, cterm->mouse_state_change_cbdata); - break; - case 1001: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_HIGHLIGHT) - cterm->mouse_state_change(1001, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_HIGHLIGHT, cterm->mouse_state_change_cbdata); - break; - case 1002: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_BUTTONTRACK) - cterm->mouse_state_change(1002, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_BUTTONTRACK, cterm->mouse_state_change_cbdata); - break; - case 1003: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_ANY) - cterm->mouse_state_change(1003, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_ANY, cterm->mouse_state_change_cbdata); - break; - case 1004: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_FOCUS) - cterm->mouse_state_change(1004, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_FOCUS, cterm->mouse_state_change_cbdata); - break; - case 1005: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_UTF8) - cterm->mouse_state_change(1005, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_UTF8, cterm->mouse_state_change_cbdata); - break; - case 1006: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_SGR) - cterm->mouse_state_change(1006, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_SGR, cterm->mouse_state_change_cbdata); - break; - case 1007: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_ALTSCROLL) - cterm->mouse_state_change(1007, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_ALTSCROLL, cterm->mouse_state_change_cbdata); - break; - case 1015: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_URXVT) - cterm->mouse_state_change(1015, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_URXVT, cterm->mouse_state_change_cbdata); - break; - } - } - } - if (updfg || updbg) { - attr2palette(cterm->attr, updfg ? &cterm->fg_color : NULL, updbg ? &cterm->bg_color : NULL); - if (updfg) - FREE_AND_NULL(cterm->fg_tc_str); - if (updbg) - FREE_AND_NULL(cterm->bg_tc_str); - } - } - break; - case '{': - if(seq->param_str[0] == '=' && parse_parameters(seq)) { /* Font loading */ - seq_default(seq, 0, 255); - seq_default(seq, 1, 0); - if(seq->param_int[0]>255) - break; - cterm->font_read=0; - cterm->font_slot=seq->param_int[0]; - switch(seq->param_int[1]) { - case 0: - cterm->font_size=4096; - break; - case 1: - cterm->font_size=3584; - break; - case 2: - cterm->font_size=2048; - break; - default: - cterm->font_size=0; - break; - } - } - break; - } - break; - } - else if (seq->ctrl_func[1]) { // Control Function with Intermediate Character - // Shift left - if (strcmp(seq->ctrl_func, " @") == 0) { - row = TERM_MINY; - col = TERM_MINX; - max_row = TERM_MAXY; - max_col = TERM_MAXX; - - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &col, &row); - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &max_col, &max_row); - seq_default(seq, 0, 1); - i = seq->param_int[0]; - if(i > TERM_MAXX) - i = TERM_MAXX; - MOVETEXT(col + i, row, max_col, max_row, col, row); - j = i * TERM_MAXY; - vc = malloc(j * sizeof(*vc)); - if (vc != NULL) { - for(k=0; k < j; k++) { - vc[k].ch=' '; - vc[k].legacy_attr=cterm->attr; - vc[k].fg=cterm->fg_color; - vc[k].bg=cterm->bg_color; - vc[k].font = ciolib_attrfont(cterm->attr); - } - vmem_puttext(max_col - i + 1, row, max_col, max_row, vc); - free(vc); - } - } - // Shift right - else if (strcmp(seq->ctrl_func, " A") == 0) { - row = TERM_MINY; - col = TERM_MINX; - max_row = TERM_MAXY; - max_col = TERM_MAXX; - - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &col, &row); - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &max_col, &max_row); - seq_default(seq, 0, 1); - i = seq->param_int[0]; - if(i > cterm->width) - i = cterm->width; - MOVETEXT(col, row, max_col - i, max_row, col + i, row); - j = i * TERM_MAXY; - vc = malloc(j * sizeof(*vc)); - if (vc != NULL) { - for(k=0; k < j; k++) { - vc[k].ch=' '; - vc[k].legacy_attr=cterm->attr; - vc[k].fg=cterm->fg_color; - vc[k].bg=cterm->bg_color; - vc[k].font = ciolib_attrfont(cterm->attr); - } - vmem_puttext(col, row, col + i - 1, max_row, vc); - free(vc); - } - } - // Font Select - else if (strcmp(seq->ctrl_func, " D") == 0) { - seq_default(seq, 0, 0); - seq_default(seq, 1, 0); - switch(seq->param_int[0]) { - case 0: /* Four fonts are currently supported */ - case 1: - case 2: - case 3: - /* For compatibility with ciolib.c v1.136-v1.164 */ - /* Feature introduced in CTerm v1.160, return value modified later */ - if (SETFONT(seq->param_int[1],FALSE,seq->param_int[0]+1) == 0) - cterm->setfont_result = 1; - else - cterm->setfont_result = 0; - if(cterm->setfont_result == 0) - cterm->altfont[seq->param_int[0]] = seq->param_int[1]; - break; - } - } - else if (strcmp(seq->ctrl_func, " d") == 0) { - if (seq->param_count > 0) { - delete_tabstop(cterm, seq->param_int[0]); - } - } - /* - * END OF STANDARD CONTROL FUNCTIONS - * AFTER THIS IS ALL PRIVATE EXTENSIONS - */ - // Tab report - else if (strcmp(seq->ctrl_func, "$w") == 0) { - seq_default(seq, 0, 0); - if (seq->param_int[0] == 2) { - strcpy(tmp, "\x1bP2$u"); - p2 = strchr(tmp, 0); - for (i = 0; i < cterm->tab_count && cterm->tabs[i] <= cterm->width; i++) { - if (i != 0) - *(p2++) = '/'; - p2 += sprintf(p2, "%d", cterm->tabs[i]); - } - strcat(p2, "\x1b\\"); - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - } - // Communication speed - else if (strcmp(seq->ctrl_func, "*r") == 0) { - /* - * Ps1 Comm Line Ps2 Communication Speed - * none, 0, 1 Host Transmit none, 0 Use default speed. - * 2 Host Receive 1 300 - * 3 Printer 2 600 - * 4 Modem Hi 3 1200 - * 5 Modem Lo 4 2400 - * 5 4800 - * 6 9600 - * 7 19200 - * 8 38400 - * 9 57600 - * 10 76800 - * 11 115200 - */ - int newspeed=-1; - - seq_default(seq, 0, 0); - seq_default(seq, 1, 0); - - if (seq->param_int[0] < 2) { - switch(seq->param_int[1]) { - case 0: - newspeed=0; - break; - case 1: - newspeed=300; - break; - case 2: - newspeed=600; - break; - case 3: - newspeed=1200; - break; - case 4: - newspeed=2400; - break; - case 5: - newspeed=4800; - break; - case 6: - newspeed=9600; - break; - case 7: - newspeed=19200; - break; - case 8: - newspeed=38400; - break; - case 9: - newspeed=57600; - break; - case 10: - newspeed=76800; - break; - case 11: - newspeed=115200; - break; - } - } - if(newspeed >= 0) - *speed = newspeed; - } - else if (strcmp(seq->ctrl_func, "*y") == 0) { - if (seq->param_count >= 6) { - if (seq->param_int[0] != UINT64_MAX && - seq->param_int[0] <= UINT16_MAX && - seq->param_int[1] == 1 && - seq->param_int[2] != UINT64_MAX && - seq->param_int[3] != UINT64_MAX && - seq->param_int[4] != UINT64_MAX && - seq->param_int[5] != UINT64_MAX) { - struct ciolib_pixels *pix; - uint16_t crc; - int good = 0; - int vmode; - gettextinfo(&ti); - vmode = find_vmode(ti.currmode); - if (vmode != -1 && - (seq->param_int[3] > 0 && seq->param_int[3] < vparams[vmode].charwidth*cterm->width) && - (seq->param_int[2] > 0 && seq->param_int[2] < vparams[vmode].charwidth*cterm->width) && - (seq->param_int[5] > 0 && seq->param_int[5] < vparams[vmode].charwidth*cterm->width) && - (seq->param_int[4] > 0 && seq->param_int[4] < vparams[vmode].charwidth*cterm->width) && - (seq->param_int[2] <= seq->param_int[4]) && - (seq->param_int[3] <= seq->param_int[5]) && - (pix = getpixels( - (seq->param_int[3] - 1 + cterm->x - 1)*vparams[vmode].charwidth, - (seq->param_int[2] - 1 + cterm->y - 1)*vparams[vmode].charheight, - (seq->param_int[5] + cterm->x - 1)*vparams[vmode].charwidth - 1, - (seq->param_int[4] + cterm->y - 1)*vparams[vmode].charheight - 1, true)) != NULL) { - crc = crc16((void *)pix->pixels, sizeof(pix->pixels[0])*pix->width*pix->height); - good = 1; - freepixels(pix); - } - else { - size_t sz = sizeof(struct vmem_cell) * (seq->param_int[2] - seq->param_int[4] + 1) * (seq->param_int[3] - seq->param_int[5] + 1); - struct vmem_cell *vm = malloc(sz); - if (vm != NULL) { - vmem_gettext(seq->param_int[3], seq->param_int[2], seq->param_int[5], seq->param_int[4], vm); - crc = crc16((void *)vm, sz); - good = 1; - } - } - if (good) { - *tmp = 0; - snprintf(tmp, sizeof(tmp), "\x1bP%u!~%04X\x1b\\", (unsigned)seq->param_int[0], crc); - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - } - } - } - else if (strcmp(seq->ctrl_func, "*z") == 0) { - if (seq->param_count > 0 && seq->param_int[0] <= 63) { - if (cterm->macros[seq->param_int[0]]) { - if ((cterm->in_macro & (1<<seq->param_int[0])) == 0) { - cterm->escbuf[0]=0; - cterm->sequence=0; - cterm->in_macro |= (1<<seq->param_int[0]); - cterm_write(cterm, cterm->macros[seq->param_int[0]], cterm->macro_lens[seq->param_int[0]], retbuf + strlen(retbuf), retsize - strlen(retbuf), speed); - cterm->in_macro &= ~(1<<seq->param_int[0]); - } - } - } - } - } - else { - switch(seq->final_byte) { - case '@': /* Insert Char */ - TERM_XY(&i, &j); - if (i < TERM_MINX || i > TERM_MAXX || j < TERM_MINY || j > TERM_MAXY) - break; - col = i; - row = j; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &col, &row); - max_col = TERM_MAXX; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &max_col, NULL); - seq_default(seq, 0, 1); - if(seq->param_int[0] < 1) - seq->param_int[0] = 1; - if(seq->param_int[0] > cterm->width - j) - seq->param_int[0] = cterm->width - j; - MOVETEXT(col, row, max_col - seq->param_int[0], row, col + seq->param_int[0], row); - for(l=0; l < seq->param_int[0]; l++) - PUTCH(' '); - cterm_gotoxy(cterm, i, j); - break; - case 'A': /* Cursor Up */ - case 'k': /* Line Position Backward */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, 0, 0 - seq->param_int[0], 0); - break; - case 'B': /* Cursor Down */ - case 'e': /* Line Position Forward */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, 0, seq->param_int[0], 0); - break; - case 'a': /* Character Position Forward */ - case 'C': /* Cursor Right */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, seq->param_int[0], 0, 0); - break; - case 'j': /* Character Position Backward */ - case 'D': /* Cursor Left */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, 0 - seq->param_int[0], 0, 0); - break; - case 'E': /* Cursor next line */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, INT_MIN, seq->param_int[0], 0); - break; - case 'F': /* Cursor preceding line */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, INT_MIN, 0 - seq->param_int[0], 0); - break; - case '`': - case 'G': /* Cursor Position Absolute */ - seq_default(seq, 0, 1); - CURR_XY(NULL, &row); - col = seq->param_int[0]; - if(col >= CURR_MINX && col <= CURR_MAXX) { - GOTOXY(col, row); - } - break; - case 'f': /* Character And Line Position */ - case 'H': /* Cursor Position */ - seq_default(seq, 0, 1); - seq_default(seq, 1, 1); - row=seq->param_int[0]; - col=seq->param_int[1]; - if (row < CURR_MINY) - row = CURR_MINY; - if(col < CURR_MINX) - col = CURR_MINX; - if(row > CURR_MAXY) - row = CURR_MAXY; - if(col > CURR_MAXX) - col = CURR_MAXX; - GOTOXY(col, row); - break; - case 'I': /* Cursor Forward Tabulation */ - case 'Y': /* Cursor Line Tabulation */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - for (i = 0; i < seq->param_int[0]; i++) - do_tab(cterm); - break; - case 'J': /* Erase In Page */ - seq_default(seq, 0, 0); - switch(seq->param_int[0]) { - case 0: - CLREOL(); - CURR_XY(&col, &row); - for (i = row + 1; i <= TERM_MAXY; i++) { - cterm_gotoxy(cterm, TERM_MINY, i); - CLREOL(); - } - GOTOXY(col, row); - break; - case 1: - clear2bol(cterm); - CURR_XY(&col, &row); - for (i = row - 1; i >= TERM_MINY; i--) { - cterm_gotoxy(cterm, TERM_MINX, i); - CLREOL(); - } - GOTOXY(col, row); - break; - case 2: - cterm_clearscreen(cterm, (char)cterm->attr); - GOTOXY(CURR_MINX, CURR_MINY); - break; - } - break; - case 'K': /* Erase In Line */ - seq_default(seq, 0, 0); - switch(seq->param_int[0]) { - case 0: - CLREOL(); - break; - case 1: - clear2bol(cterm); - break; - case 2: - CURR_XY(&col, &row); - cterm_gotoxy(cterm, CURR_MINX, row); - CLREOL(); - GOTOXY(col, row); - break; - } - break; - case 'L': /* Insert line */ - TERM_XY(&col, &row); - if(row < TERM_MINY || row > TERM_MAXY || col < TERM_MINX || col > TERM_MAXX) - break; - seq_default(seq, 0, 1); - i = seq->param_int[0]; - if(i > TERM_MAXY - row) - i = TERM_MAXY - row; - col2 = TERM_MINX; - row2 = row; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &col2, &row2); - max_col = TERM_MAXX; - max_row = TERM_MAXY; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &max_col, &max_row); - if(i) - MOVETEXT(col2, row2, max_col, max_row - i, col2, row2 + i); - for (j = 0; j < i; j++) { - cterm_gotoxy(cterm, TERM_MINX, row+j); - cterm_clreol(cterm); - } - cterm_gotoxy(cterm, col, row); - break; - case 'M': /* Delete Line (also ANSI music) */ - if(cterm->music_enable==CTERM_MUSIC_ENABLED) { - cterm->music=1; - } - else { - TERM_XY(&col, &row); - if(col >= TERM_MINX && col <= TERM_MAXX && row >= TERM_MINY && row <= TERM_MAXY) { - seq_default(seq, 0, 1); - i = seq->param_int[0]; - dellines(cterm, i); - } - } - break; - case 'N': /* Erase In Field (also ANSI Music) */ - /* BananANSI style... does NOT start with MF or MB */ - /* This still conflicts (ANSI erase field) */ - if(cterm->music_enable >= CTERM_MUSIC_BANSI) - cterm->music=2; - break; - case 'O': /* TODO? Erase In Area */ - break; - case 'P': /* Delete char */ - seq_default(seq, 0, 1); - TERM_XY(&col, &row); - if (col < TERM_MINX || col > TERM_MAXX || row < TERM_MINY || row > TERM_MAXY) - break; - i = seq->param_int[0]; - if(i > TERM_MAXX - col + 1) - i = TERM_MAXX - col + 1; - max_col = TERM_MAXX; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &max_col, NULL); - col2 = col; - row2 = row; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &col2, &row2); - MOVETEXT(col2 + i, row2, max_col, row2, col2, row2); - cterm_gotoxy(cterm, TERM_MAXX - i, row); - cterm_clreol(cterm); - cterm_gotoxy(cterm, col, row); - break; - case 'Q': /* TODO? Select Editing Extent */ - break; - case 'R': /* TODO? Active Position Report */ - break; - case 'S': /* Scroll Up */ - seq_default(seq, 0, 1); - for(j=0; j<seq->param_int[0]; j++) - cterm_scrollup(cterm); - break; - case 'T': /* Scroll Down */ - seq_default(seq, 0, 1); - for(j=0; j<seq->param_int[0]; j++) - scrolldown(cterm); - break; - case 'U': /* TODO? Next Page */ - break; - case 'V': /* TODO? Preceding Page */ - break; - case 'W': /* TODO? Cursor Tabulation Control */ - break; - case 'X': /* Erase Character */ - seq_default(seq, 0, 1); - i=seq->param_int[0]; - CURR_XY(&col, &row); - if(i > CURR_MAXX - col) - i=CURR_MAXX - col; - vc=malloc(i * sizeof(*vc)); - for(k=0; k < i; k++) { - vc[k].ch=' '; - vc[k].legacy_attr=cterm->attr; - vc[k].fg=cterm->fg_color; - vc[k].bg=cterm->bg_color; - vc[k].font = ciolib_attrfont(cterm->attr); - } - col2 = col; - row2 = row; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &col2, &row2); - max_col = CURR_MAXX; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &max_col, NULL); - vmem_puttext(col2, row2, col2 + i - 1, row2, vc); - free(vc); - break; - // for case 'Y': see case 'I': - case 'Z': /* Cursor Backward Tabulation */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - for (i = 0; i < seq->param_int[0]; i++) - do_backtab(cterm); - break; - case '[': /* TODO? Start Reversed String */ - break; - case '\\': /* TODO? Parallel Texts */ - break; - case ']': /* TODO? Start Directed String */ - break; - case '^': /* TODO? Select Implicit Movement Direction */ - break; - case '_': /* NOT DEFIFINED IN STANDARD */ - break; - // for case '`': see case 'G': - // for case 'a': see case 'C': - case 'b': /* Repeat */ - if (last != 0) { - seq_default(seq, 0, 1); - i = seq->param_int[0]; - if (i > 0) { - p2 = malloc(i+1); - if (p2) { - memset(p2, last, i); - p2[i] = 0; - ctputs(cterm, p2); - free(p2); - } - } - } - break; - case 'c': /* Device Attributes */ - seq_default(seq, 0, 0); - if(!seq->param_int[0]) { - if(retbuf!=NULL) { - if(strlen(retbuf) + strlen(cterm->DA) < retsize) - strcat(retbuf,cterm->DA); - } - } - break; - case 'd': /* Line Position Absolute */ - seq_default(seq, 0, 1); - CURR_XY(&col, NULL); - row = seq->param_int[0]; - if (row < CURR_MINY) - row = CURR_MINY; - if (row > CURR_MAXY) - row = CURR_MAXY; - GOTOXY(col, row); - break; - // for case 'e': see case 'B': - // for case 'f': see case 'H': - case 'g': /* Tabulation Clear */ - seq_default(seq, 0, 0); - switch(seq->param_int[0]) { - case 0: - delete_tabstop(cterm, WHEREX()); - break; - case 3: - cterm->tab_count = 0; - break; - } - break; - case 'h': /* TODO? Set Mode */ - break; - case 'i': /* ToDo? Media Copy (Printing) */ - break; - // for case 'j': see case 'D': - // for case 'k': see case 'A': - case 'l': /* TODO? Reset Mode */ - break; - case 'm': /* Select Graphic Rendition */ - seq_default(seq, 0, 0); - GETTEXTINFO(&ti); - flags = GETVIDEOFLAGS(); - for (i=0; i < seq->param_count; i++) { - switch(seq->param_int[i]) { - case 0: - cterm->attr=ti.normattr; - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 1: - if (!cterm->skypix) - cterm->attr|=8; - if (!(flags & CIOLIB_VIDEO_NOBRIGHT)) { - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - } - break; - case 2: - if (!cterm->skypix) - cterm->attr&=247; - if (!(flags & CIOLIB_VIDEO_NOBRIGHT)) { - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - } - break; - case 4: /* Underscore */ - break; - case 5: - case 6: - if (!cterm->skypix) - cterm->attr|=128; - if (flags & CIOLIB_VIDEO_BGBRIGHT) { - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - } - break; - case 7: - j=cterm->attr&112; - cterm->attr = (cterm->attr << 4) & 0x70; - cterm->attr |= j>>4; - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 8: - j=cterm->attr&112; - cterm->attr&=112; - cterm->attr |= j>>4; - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 22: - cterm->attr &= 0xf7; - if (!(flags & CIOLIB_VIDEO_NOBRIGHT)) { - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - } - break; - case 25: - cterm->attr &= 0x7f; - if (flags & CIOLIB_VIDEO_BGBRIGHT) { - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - } - break; - case 27: - i=cterm->attr&7; - j=cterm->attr&112; - cterm->attr &= 136; - cterm->attr |= j>>4; - cterm->attr |= i<<4; - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 30: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 0); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 31: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 4); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 32: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 2); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 33: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 6); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 34: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 1); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 35: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 5); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 36: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 3); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 38: - parse_extended_colour(seq, &i, cterm, 1); - break; - case 37: - case 39: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 7); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 49: - case 40: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 0) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 41: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 4) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 42: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 2) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 43: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 6) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 44: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 1) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 45: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 5) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 46: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 3) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 47: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 7) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 48: - parse_extended_colour(seq, &i, cterm, 0); - break; - } - } - TEXTATTR(cterm->attr); - setcolour(cterm->fg_color, cterm->bg_color); - break; - case 'n': /* Device Status Report */ - seq_default(seq, 0, 0); - switch(seq->param_int[0]) { - case 5: - if(retbuf!=NULL) { - strcpy(tmp,"\x1b[0n"); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf,tmp); - } - break; - case 6: - if(retbuf!=NULL) { - CURR_XY(&col, &row); - sprintf(tmp,"\x1b[%d;%dR",row,col); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf,tmp); - } - break; - case 255: - if (retbuf != NULL) { - sprintf(tmp, "\x1b[%d;%dR", CURR_MAXY, CURR_MAXX); - if (strlen(retbuf) + strlen(tmp) < retsize) { - strcat(retbuf, tmp); - } - } - break; - } - break; - case 'o': /* ToDo? Define Area Qualification */ - break; - /* - * END OF STANDARD CONTROL FUNCTIONS - * AFTER THIS IS ALL PRIVATE EXTENSIONS - */ - case 'p': /* ToDo? ANSI keyboard reassignment, pointer mode */ - break; - case 'q': /* ToDo? VT100 keyboard lights, cursor style, protection */ - break; - case 'r': /* Scrolling reigon */ - seq_default(seq, 0, 1); - seq_default(seq, 1, cterm->height); - row = seq->param_int[0]; - max_row = seq->param_int[1]; - if(row >= ABS_MINY && max_row > row && max_row <= ABS_MAXY) { - cterm->top_margin = row; - cterm->bottom_margin = max_row; - setwindow(cterm); - GOTOXY(CURR_MINX, CURR_MINY); - } - break; - case 's': - if (cterm->extattr & CTERM_EXTATTR_DECLRMM) { - seq_default(seq, 0, ABS_MINX); - seq_default(seq, 1, ABS_MAXX); - col = seq->param_int[0]; - if (col == 0) - col = cterm->left_margin; - max_col = seq->param_int[1]; - if (max_col == 0) - max_col = cterm->right_margin; - if(col >= ABS_MINX && max_col > col && max_col <= ABS_MAXX) { - cterm->left_margin = col; - cterm->right_margin = max_col; - setwindow(cterm); - GOTOXY(CURR_MINX, CURR_MINY); - } - } - else { - CURR_XY(&cterm->save_xpos, &cterm->save_ypos); - } - break; - case 't': - if (seq->param_count >= 4) { - uint32_t *c = NULL; - uint32_t nc; - - if (seq->param_int[0] == 0) - c = &cterm->bg_color; - else if (seq->param_int[0] == 1) - c = &cterm->fg_color; - if (c == NULL) - break; - nc = map_rgb(seq->param_int[1]<<8, seq->param_int[2]<<8, seq->param_int[3]<<8); - if (nc != UINT32_MAX) - *c = nc; - setcolour(cterm->fg_color, cterm->bg_color); - } - break; - case 'u': - if(cterm->save_ypos>0 && cterm->save_ypos<=cterm->height - && cterm->save_xpos>0 && cterm->save_xpos<=cterm->width) { - // TODO: What to do about the window when position is restored... - // Absolute position stored? Relative? - if(cterm->save_ypos < CURR_MINY || cterm->save_ypos > CURR_MAXY || cterm->save_xpos < CURR_MINX || cterm->save_xpos > CURR_MAXX) - break; - GOTOXY(cterm->save_xpos, cterm->save_ypos); - } - break; - case 'y': /* ToDo? VT100 Tests */ - break; - case 'z': /* ToDo? Reset */ - break; - case '|': /* SyncTERM ANSI Music */ - cterm->music=1; - break; - } - } - break; - case 'E': // Next Line - adjust_currpos(cterm, INT_MIN, 1, 1); - break; - case 'H': - insert_tabstop(cterm, WHEREX()); - break; - case 'M': // Previous line - adjust_currpos(cterm, 0, -1, 1); - break; - case 'P': // Device Control String - DCS - cterm->string = CTERM_STRING_DCS; - cterm->sixel = SIXEL_POSSIBLE; - cterm->macro = MACRO_POSSIBLE; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuf = malloc(1024); - cterm->strbufsize = 1024; - cterm->strbuflen = 0; - break; - case 'X': // Start Of String - SOS - cterm->string = CTERM_STRING_SOS; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuf = malloc(1024); - cterm->strbufsize = 1024; - cterm->strbuflen = 0; - break; - case 'c': - CLRSCR(); - cterm_reset(cterm); - cterm_gotoxy(cterm, CURR_MINX, CURR_MINY); - break; - case '\\': - if (cterm->strbuf) { - if (cterm->strbufsize == cterm->strbuflen-1) { - p = realloc(cterm->strbuf, cterm->strbufsize+1); - if (p == NULL) { - // SO CLOSE! - cterm->string = 0; - } - else { - cterm->strbuf = p; - cterm->strbufsize++; - } - } - cterm->strbuf[cterm->strbuflen] = 0; - switch (cterm->string) { - case CTERM_STRING_APC: - if (cterm->apc_handler) - cterm->apc_handler(cterm->strbuf, cterm->strbuflen, cterm->apc_handler_data); - break; - case CTERM_STRING_DCS: - if (cterm->sixel == SIXEL_STARTED) - parse_sixel_string(cterm, true); - else if (cterm->macro == MACRO_STARTED) - parse_macro_string(cterm, true); - else { - if (strncmp(cterm->strbuf, "CTerm:Font:", 11) == 0) { - cterm->font_slot = strtoul(cterm->strbuf+11, &p, 10); - if(cterm->font_slot < CONIO_FIRST_FREE_FONT) - break; - if (cterm->font_slot > 255) - break; - if (p && *p == ':') { - p++; - i = b64_decode(cterm->fontbuf, sizeof(cterm->fontbuf), p, 0); - p2 = malloc(i); - if (p2) { - memcpy(p2, cterm->fontbuf, i); - replace_font(cterm->font_slot, strdup("Remote Defined Font"), p2, i); - } - } - } - else if (strncmp(cterm->strbuf, "$q", 2) == 0) { - // DECRQSS - VT-420 - switch (cterm->strbuf[2]) { - case 'm': - if (cterm->strbuf[3] == 0) { - strcpy(tmp, "\x1bP1$r0"); - if (cterm->attr & 8) - strcat(tmp, ";1"); - if (cterm->attr & 128) - strcat(tmp, ";5"); - if (cterm->fg_tc_str == NULL) { - switch (cterm->attr & 7) { - case 0: - strcat(tmp, ";30"); - break; - case 1: - strcat(tmp, ";34"); - break; - case 2: - strcat(tmp, ";32"); - break; - case 3: - strcat(tmp, ";36"); - break; - case 4: - strcat(tmp, ";31"); - break; - case 5: - strcat(tmp, ";35"); - break; - case 6: - strcat(tmp, ";33"); - break; - } - } - if (cterm->bg_tc_str == NULL) { - switch ((cterm->attr >> 4) & 7) { - case 1: - strcat(tmp, ";44"); - break; - case 2: - strcat(tmp, ";42"); - break; - case 3: - strcat(tmp, ";46"); - break; - case 4: - strcat(tmp, ";41"); - break; - case 5: - strcat(tmp, ";45"); - break; - case 6: - strcat(tmp, ";43"); - break; - case 7: - strcat(tmp, ";47"); - break; - } - } - if (cterm->fg_tc_str) { - strcat(tmp, ";"); - strcat(tmp, cterm->fg_tc_str); - } - if (cterm->bg_tc_str) { - strcat(tmp, ";"); - strcat(tmp, cterm->bg_tc_str); - } - strcat(tmp, "m\x1b\\"); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case 'r': - if (cterm->strbuf[3] == 0) { - sprintf(tmp, "\x1bP1$r%d;%dr\x1b\\", cterm->top_margin, cterm->bottom_margin); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case 's': - if (cterm->strbuf[3] == 0) { - sprintf(tmp, "\x1bP1$r%d;%dr\x1b\\", cterm->left_margin, cterm->right_margin); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case 't': - if (cterm->strbuf[3] == 0) { - sprintf(tmp, "\x1bP1$r%dt\x1b\\", cterm->height); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case '$': - if (cterm->strbuf[3] == '|' && cterm->strbuf[4] == 0) { - sprintf(tmp, "\x1bP1$r%d$|\x1b\\", cterm->width); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case '*': - if (cterm->strbuf[3] == '|' && cterm->strbuf[4] == 0) { - sprintf(tmp, "\x1bP1$r%d$|\x1b\\", cterm->height); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - default: - if(retbuf!=NULL) { - strcpy(tmp,"\x1b[0n"); - // TODO: If the string is too long, this is likely terrible. - if (strlen(retbuf)+5 < retsize) - strcat(retbuf, "\x1bP0$r"); - if (strlen(retbuf)+strlen(&cterm->strbuf[2]) < retsize) - strcat(retbuf, &cterm->strbuf[2]); - if (strlen(retbuf)+2 < retsize) - strcat(retbuf, "\x1b_"); - } - } - } - } - cterm->sixel = SIXEL_INACTIVE; - break; - case CTERM_STRING_OSC: - /* Is this an xterm Change Color(s)? */ - if (cterm->strbuf[0] == '4' && cterm->strbuf[1] == ';') { - unsigned long index = ULONG_MAX; - char *seqlast; - - p2 = &cterm->strbuf[2]; - while ((p = strtok_r(p2, ";", &seqlast)) != NULL) { - p2=NULL; - if (index == ULONG_MAX) { - index = strtoull(p, NULL, 10); - if (index == ULONG_MAX || index > 13200) - break; - } - else { - - if (strncmp(p, "rgb:", 4)) - break; - char *p3; - char *p4; - char *collast; - uint16_t rgb[3]; - int ccount = 0; - bool broken=false; - - p4 = &p[4]; - while (ccount < 3 && (p3 = strtok_r(p4, "/", &collast))!=NULL) { - p4 = NULL; - unsigned long v; - v = strtoul(p3, NULL, 16); - if (v > UINT16_MAX) - break; - switch(strlen(p3)) { - case 1: // 4-bit colour - rgb[ccount] = v | (v<<4) | (v<<8) | (v<<12); - break; - case 2: // 8-bit colour - rgb[ccount] = v | (v<<8); - break; - case 3: // 12-bit colour - rgb[ccount] = (v & 0x0f) | (v<<4); - break; - case 4: - rgb[ccount] = v; - break; - default: - broken = true; - break; - } - ccount++; - } - if (ccount == 3 && !broken) - setpalette(index + palette_offset, rgb[0], rgb[1], rgb[2]); - index = ULONG_MAX; - } - } - } - else if (strncmp("104", cterm->strbuf, 3)==0) { - if (strlen(cterm->strbuf) == 3) { - // Reset all colours - for (i=0; i < sizeof(dac_default)/sizeof(struct dac_colors); i++) - setpalette(i + palette_offset, dac_default[i].red << 8 | dac_default[i].red, dac_default[i].green << 8 | dac_default[i].green, dac_default[i].blue << 8 | dac_default[i].blue); - } - else if(cterm->strbuf[3] == ';') { - char *seqlast; - unsigned long pi; - - p2 = &cterm->strbuf[4]; - while ((p = strtok_r(p2, ";", &seqlast)) != NULL) { - p2=NULL; - pi = strtoull(p, NULL, 10); - if (pi < sizeof(dac_default)/sizeof(struct dac_colors)) - setpalette(pi + palette_offset, dac_default[pi].red << 8 | dac_default[pi].red, dac_default[pi].green << 8 | dac_default[pi].green, dac_default[pi].blue << 8 | dac_default[pi].blue); - } - } - } - break; - } - } - FREE_AND_NULL(cterm->strbuf); - cterm->strbufsize = cterm->strbuflen = 0; - cterm->string = 0; - break; - case ']': // Operating System Command - OSC - cterm->string = CTERM_STRING_OSC; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuf = malloc(1024); - cterm->strbufsize = 1024; - cterm->strbuflen = 0; - break; - case '^': // Privacy Message - PM - cterm->string = CTERM_STRING_PM; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuf = malloc(1024); - cterm->strbufsize = 1024; - cterm->strbuflen = 0; - break; - case '_': // Application Program Command - APC - cterm->string = CTERM_STRING_APC; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuf = malloc(1024); - cterm->strbufsize = 1024; - cterm->strbuflen = 0; - break; - } - } - free_sequence(seq); - cterm->escbuf[0]=0; - cterm->sequence=0; -} - -static void -c64_set_reverse(struct cterminal *cterm, int on) -{ - if (on != cterm->c64reversemode) - cterm->c64reversemode = on; -} - -static uint8_t -c64_get_attr(struct cterminal *cterm) -{ - if (cterm->c64reversemode) - return (cterm->attr >> 4 | cterm->attr << 4); - return cterm->attr; -} - -static void -cterm_reset(struct cterminal *cterm) -{ - int i; - struct text_info ti; - - cterm->altfont[0] = cterm->altfont[1] = cterm->altfont[2] = cterm->altfont[3] = getfont(1); - cterm->top_margin=1; - cterm->bottom_margin=cterm->height; - cterm->left_margin=1; - cterm->right_margin=cterm->width; - cterm->save_xpos=0; - cterm->save_ypos=0; - cterm->escbuf[0]=0; - cterm->sequence=0; - cterm->string = 0; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = 0; - cterm->strbufsize = 0; - cterm->musicbuf[0] = 0; - cterm->music_enable=CTERM_MUSIC_BANSI; - cterm->music=0; - cterm->tempo=120; - cterm->octave=4; - cterm->notelen=4; - cterm->noteshape=CTERM_MUSIC_NORMAL; - cterm->musicfore=TRUE; - cterm->backpos=0; - cterm->xpos = TERM_MINX; - cterm->ypos = TERM_MINY; - cterm->cursor=_NORMALCURSOR; - cterm->extattr = CTERM_EXTATTR_AUTOWRAP | CTERM_EXTATTR_SXSCROLL; - FREE_AND_NULL(cterm->tabs); - cterm->tabs = malloc(sizeof(cterm_tabs)); - if (cterm->tabs) { - memcpy(cterm->tabs, cterm_tabs, sizeof(cterm_tabs)); - cterm->tab_count = sizeof(cterm_tabs) / sizeof(cterm_tabs[0]); - } - else - cterm->tab_count = 0; - cterm->setfont_result = CTERM_NO_SETFONT_REQUESTED; - cterm->saved_mode = 0; - cterm->saved_mode_mask = 0; - cterm->c64reversemode = 0; - gettextinfo(&ti); - switch (ti.currmode) { - case C64_40X25: - case C128_40X25: - case C128_80X25: - cterm->attr = 15; - break; - default: - cterm->attr = ti.normattr; - break; - } - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - cterm->doorway_mode = 0; - cterm->doorway_char = 0; - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - cterm->sixel = SIXEL_INACTIVE; - cterm->sx_iv = 0; - cterm->sx_ih = 0; - cterm->sx_trans = 0; - cterm->sx_repeat = 0; - cterm->sx_left = 0; - cterm->sx_x = 0; - cterm->sx_y = 0; - cterm->sx_bg = 0; - cterm->sx_fg = 0; - cterm->sx_pixels_sent = 0; - cterm->sx_first_pass = 0; - cterm->sx_hold_update = 0; - cterm->sx_start_x = 0; - cterm->sx_start_y = 0; - cterm->sx_row_max_x = 0; - FREE_AND_NULL(cterm->sx_pixels); - cterm->sx_width = 0; - cterm->sx_height = 0; - FREE_AND_NULL(cterm->sx_mask); - for (i = 0; i < (sizeof(cterm->macros) / sizeof(cterm->macros[0])); i++) { - FREE_AND_NULL(cterm->macros[i]); - cterm->macro_lens[i] = 0; - } - setwindow(cterm); - - /* Set up tabs for ATASCII */ - if(cterm->emulation == CTERM_EMULATION_ATASCII) { - for(i=0; i<cterm->tab_count; i++) - cterm->escbuf[cterm->tabs[i]]=1; - } - - /* Set up a shadow palette */ - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) { - for (i=0; i < sizeof(dac_default)/sizeof(struct dac_colors); i++) - setpalette(i + 16, dac_default[i].red << 8 | dac_default[i].red, dac_default[i].green << 8 | dac_default[i].green, dac_default[i].blue << 8 | dac_default[i].blue); - } - - /* Reset mouse state */ - if (cterm->mouse_state_change) { - cterm->mouse_state_change(9, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1000, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1001, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1002, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1003, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1004, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1005, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1006, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1007, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1015, 0, cterm->mouse_state_change_cbdata); - } -} - -struct cterminal* cterm_init(int height, int width, int xpos, int ypos, int backlines, int backcols, struct vmem_cell *scrollback, int emulation) -{ - char *revision="$Revision: 1.314 $"; - char *in; - char *out; - struct cterminal *cterm; - - if((cterm=calloc(1, sizeof(struct cterminal)))==NULL) - return cterm; - -#ifndef CTERM_WITHOUT_CONIO - cterm->ciolib_gotoxy=ciolib_gotoxy; - cterm->ciolib_wherex=ciolib_wherex; - cterm->ciolib_wherey=ciolib_wherey; - cterm->ciolib_vmem_gettext=ciolib_vmem_gettext; - cterm->ciolib_gettext=ciolib_gettext; - cterm->ciolib_gettextinfo=ciolib_gettextinfo; - cterm->ciolib_textattr=ciolib_textattr; - cterm->ciolib_setcursortype=ciolib_setcursortype; - cterm->ciolib_movetext=ciolib_movetext; - cterm->ciolib_clreol=ciolib_clreol; - cterm->ciolib_clrscr=ciolib_clrscr; - cterm->ciolib_setvideoflags=ciolib_setvideoflags; - cterm->ciolib_getvideoflags=ciolib_getvideoflags; - cterm->ciolib_setscaling=ciolib_setscaling; - cterm->ciolib_getscaling=ciolib_getscaling; - cterm->ciolib_putch=ciolib_putch; - cterm->ciolib_puttext=ciolib_puttext; - cterm->ciolib_window=ciolib_window; - cterm->ciolib_cputs=ciolib_cputs; - cterm->ciolib_setfont=ciolib_setfont; - cterm->_wscroll=&_wscroll; - cterm->puttext_can_move=&puttext_can_move; - cterm->hold_update=&hold_update; -#endif - - cterm->x=xpos; - cterm->y=ypos; - cterm->height=height; - cterm->width=width; - cterm->backlines=backlines; - cterm->backwidth = backcols; - cterm->scrollback=scrollback; - cterm->log=CTERM_LOG_NONE; - cterm->logfile=NULL; - cterm->emulation=emulation; - cterm_reset(cterm); - if(cterm->scrollback!=NULL) - memset(cterm->scrollback, 0, cterm->backwidth * cterm->backlines * sizeof(*cterm->scrollback)); - strcpy(cterm->DA,"\x1b[=67;84;101;114;109;"); - out=strchr(cterm->DA, 0); - if(out != NULL) { - for(in=revision; *in; in++) { - if(isdigit(*in)) - *(out++)=*in; - if(*in=='.') - *(out++)=';'; - } - *out=0; - } - strcat(cterm->DA,"c"); - /* Fire up note playing thread */ - if(!cterm->playnote_thread_running) { - listInit(&cterm->notes, LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); - sem_init(&cterm->note_completed_sem,0,0); - sem_init(&cterm->playnote_thread_terminated,0,0); - _beginthread(playnote_thread, 0, cterm); - } - - return cterm; -} - -void cterm_start(struct cterminal *cterm) -{ - struct text_info ti; - - if (!cterm->started) { - GETTEXTINFO(&ti); - switch (ti.currmode) { - case C64_40X25: - case C128_40X25: - case C128_80X25: - cterm->attr = 15; - break; - default: - cterm->attr = ti.normattr; - break; - } - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - cterm->fg_color += 16; - cterm->bg_color += 16; - TEXTATTR(cterm->attr); - ciolib_setcolour(cterm->fg_color, cterm->bg_color); - SETCURSORTYPE(cterm->cursor); - cterm->started=1; - setwindow(cterm); - cterm_clearscreen(cterm, cterm->attr); - cterm_gotoxy(cterm, 1, 1); - } -} - -static void -advance_char(struct cterminal *cterm, int *x, int *y, int move) -{ - int lm = cterm->left_margin; - int rm = cterm->right_margin; - int bm = cterm->bottom_margin; - - if((*x == rm || *x == CURR_MAXX) && (!(cterm->extattr & CTERM_EXTATTR_AUTOWRAP))) { - GOTOXY(*x, *y); - return; - } - else { - if(*y == bm && (*x == rm || *x == CURR_MAXX)) { - cond_scrollup(cterm); - move = 1; - *x = lm; - } - else { - if(*x == rm || *x == CURR_MAXX) { - *x=lm; - if (*y < CURR_MAXY) - (*y)++; - if (move) - GOTOXY(*x, *y); - } - else { - (*x)++; - } - } - } - if (move) - GOTOXY(*x, *y); -} - -static void -ctputs(struct cterminal *cterm, char *buf) -{ - char *outp; - char *p; - int oldscroll; - int cx, cy; - int lm, rm, bm; - - if (cterm->font_render) { - cterm->font_render(buf); - return; - } - - outp = buf; - oldscroll = *cterm->_wscroll; - *cterm->_wscroll = 0; - CURR_XY(&cx, &cy); - if (cterm->log == CTERM_LOG_ASCII && cterm->logfile != NULL) - fputs(buf, cterm->logfile); - lm = TERM_MINX; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &lm, NULL); - rm = TERM_MAXX; - bm = TERM_MAXY; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &rm, &bm); - for (p = buf; *p; p++) { - switch(*p) { - case '\r': - *p = 0; - CPUTS(outp); - outp = p + 1; - adjust_currpos(cterm, INT_MIN, 0, 0); - CURR_XY(&cx, &cy); - break; - case '\n': - *p = 0; - CPUTS(outp); - outp = p + 1; - adjust_currpos(cterm, 0, 1, 1); - CURR_XY(&cx, &cy); - break; - case '\b': - *p=0; - CPUTS(outp); - outp = p + 1; - adjust_currpos(cterm, -1, 0, 0); - CURR_XY(&cx, &cy); - break; - case 7: /* Bell */ - break; - case '\t': - *p=0; - CPUTS(outp); - outp=p+1; - do_tab(cterm); - CURR_XY(&cx, &cy); - break; - default: - if (cx == cterm->right_margin || cx == CURR_MAXX) { - char ch; - ch = *(p + 1); - *(p + 1) = 0; - CPUTS(outp); - *(p+1) = ch; - outp = p + 1; - } - advance_char(cterm, &cx, &cy, 0); - break; - } - } - CPUTS(outp); - *cterm->_wscroll=oldscroll; -} - -static void parse_sixel_intro(struct cterminal *cterm) -{ - size_t i; - - if (cterm->sixel != SIXEL_POSSIBLE) - return; - - i = strspn(cterm->strbuf, "0123456789;"); - - if (i >= cterm->strbuflen) - return; - - if (cterm->strbuf[i] == 'q') { - int ratio, hgrid; - int vmode; - struct text_info ti; - char *p; - - cterm->sixel = SIXEL_STARTED; - cterm->sx_repeat = 0; - cterm->sx_pixels_sent = 0; - cterm->sx_first_pass = 1; - cterm->sx_height = 0; - cterm->sx_width = 0; - cterm->sx_hold_update = *cterm->hold_update; - *cterm->hold_update = 0; - - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - if (vmode == -1) { - cterm->sixel = SIXEL_INACTIVE; - return; - } - attr2palette(ti.attribute, &cterm->sx_fg, &cterm->sx_bg); - if (cterm->extattr & CTERM_EXTATTR_SXSCROLL) { - TERM_XY(&cterm->sx_start_x, &cterm->sx_start_y); - cterm->sx_left = cterm->sx_x = (cterm->sx_start_x - 1) * vparams[vmode].charwidth; - cterm->sx_y = (cterm->sx_start_y - 1) * vparams[vmode].charheight; - } - else { - cterm->sx_x = cterm->sx_left = cterm->sx_y = 0; - TERM_XY(&cterm->sx_start_x, &cterm->sx_start_y); - } - cterm->sx_orig_cursor = cterm->cursor; - cterm->cursor = _NOCURSOR; - SETCURSORTYPE(cterm->cursor); - cterm_gotoxy(cterm, TERM_MINX, TERM_MINY); - *cterm->hold_update = 1; - cterm->sx_trans = hgrid = 0; - ratio = strtoul(cterm->strbuf, &p, 10); - if (*p == ';') { - p++; - cterm->sx_trans = strtoul(p, &p, 10); - } - if (*p == ';') { - p++; - hgrid = strtoul(p, &p, 10); - } - switch (ratio) { - default: - case 0: - case 1: - cterm->sx_iv = 2; - cterm->sx_ih = 1; - break; - case 2: - cterm->sx_iv = 5; - cterm->sx_ih = 1; - break; - case 3: - case 4: - cterm->sx_iv = 3; - cterm->sx_ih = 1; - break; - case 5: - case 6: - cterm->sx_iv = 2; - cterm->sx_ih = 1; - break; - case 7: - case 8: - case 9: - cterm->sx_iv = 1; - cterm->sx_ih = 1; - break; - } - cterm->strbuflen = 0; - } - else if (cterm->strbuf[i] != 'q') - cterm->sixel = SIXEL_INACTIVE; -} - -static void parse_macro_intro(struct cterminal *cterm) -{ - size_t i; - - if (cterm->macro != MACRO_POSSIBLE) - return; - - i = strspn(cterm->strbuf, "0123456789;"); - - if (i >= cterm->strbuflen) - return; - - if (cterm->strbuf[i] != '!') { - cterm->macro = MACRO_INACTIVE; - return; - } - i++; - if (i >= cterm->strbuflen) - return; - - if (cterm->strbuf[i] == 'z') { - char *p; - unsigned long res; - - // Parse parameters... - cterm->macro_num = -1; - cterm->macro_del = MACRO_DELETE_OLD; - cterm->macro_encoding = MACRO_ENCODING_ASCII; - res = strtoul(cterm->strbuf, &p, 10); - if (res != ULONG_MAX) - cterm->macro_num = res; - if (*p == ';') { - p++; - res = strtoul(p, &p, 10); - if (res != ULONG_MAX) - cterm->macro_del = res; - else - cterm->macro_del = -1; - } - if (*p == ';') { - p++; - res = strtoul(p, &p, 10); - if (res != ULONG_MAX) - cterm->macro_encoding = res; - else - cterm->macro_encoding = -1; - } - if (cterm->macro_num < 0 || cterm->macro_num > 63) - cterm->macro = MACRO_INACTIVE; - else if (cterm->macro_del < 0 || cterm->macro_del > 1) - cterm->macro = MACRO_INACTIVE; - else if (cterm->macro_encoding < 0 || cterm->macro_encoding > 1) - cterm->macro = MACRO_INACTIVE; - else { - cterm->macro = MACRO_STARTED; - cterm->strbuflen = 0; - } - } - else if (cterm->strbuf[i] != 'z') - cterm->macro = MACRO_INACTIVE; -} - -#define ustrlen(s) strlen((const char *)s) -#define uctputs(c, p) ctputs(c, (char *)p) -#define ustrcat(b, s) strcat((char *)b, (const char *)s) - -CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int buflen, char *retbuf, size_t retsize, int *speed) -{ - const unsigned char *buf = (unsigned char *)vbuf; - unsigned char ch[2]; - unsigned char prn[BUFSIZE]; - int i, j, k, x, y; - int sx, sy, ex, ey; - struct text_info ti; - int olddmc; - int oldptnm; - uint32_t palette[16]; - int mpalette; - struct vmem_cell tmpvc[1]; - int orig_fonts[4]; - char lastch = 0; - int palette_offset = 0; - - if(!cterm->started) - cterm_start(cterm); - - /* Now rejigger the current modes palette... */ - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) - palette_offset = 16; - mpalette = get_modepalette(palette); - if (mpalette) { - for (i=0; i < 16; i++) - palette[i] += palette_offset; - set_modepalette(palette); - } - - /* Deedle up the fonts */ - orig_fonts[0] = getfont(1); - orig_fonts[1] = getfont(2); - orig_fonts[2] = getfont(3); - orig_fonts[3] = getfont(4); - setfont(cterm->altfont[0], FALSE, 1); - setfont(cterm->altfont[1], FALSE, 2); - setfont(cterm->altfont[2], FALSE, 3); - setfont(cterm->altfont[3], FALSE, 4); - - oldptnm=*cterm->puttext_can_move; - *cterm->puttext_can_move=1; - olddmc=*cterm->hold_update; - *cterm->hold_update=1; - if(retbuf!=NULL) - retbuf[0]=0; - GETTEXTINFO(&ti); - setwindow(cterm); - x = cterm->xpos; - y = cterm->ypos; - coord_conv_xy(cterm, CTERM_COORD_ABSTERM, CTERM_COORD_CURR, &x, &y); - GOTOXY(x, y); - TEXTATTR(cterm->attr); - setcolour(cterm->fg_color, cterm->bg_color); - SETCURSORTYPE(cterm->cursor); - ch[1]=0; - if(buflen==-1) - buflen=ustrlen(buf); - switch(buflen) { - case 0: - break; - default: - if(cterm->log==CTERM_LOG_RAW && cterm->logfile != NULL) - fwrite(buf, buflen, 1, cterm->logfile); - prn[0]=0; - for(j=0;j<buflen;j++) { - if(ustrlen(prn) >= sizeof(prn)-sizeof(cterm->escbuf)) { - uctputs(cterm, prn); - prn[0]=0; - } - ch[0]=buf[j]; - if (cterm->string && !cterm->sequence) { - switch (cterm->string) { - case CTERM_STRING_DCS: - /* 0x08-0x0d, 0x20-0x7e */ - case CTERM_STRING_APC: - /* 0x08-0x0d, 0x20-0x7e */ - case CTERM_STRING_OSC: - /* 0x08-0x0d, 0x20-0x7e */ - case CTERM_STRING_PM: - /* 0x08-0x0d, 0x20-0x7e */ - if (ch[0] < 8 || (ch[0] > 0x0d && ch[0] < 0x20) || ch[0] > 0x7e) { - if (ch[0] == 27) { - uctputs(cterm, prn); - prn[0]=0; - cterm->sequence=1; - break; - } - else { - cterm->string = 0; - /* Just toss out the string and this char */ - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = cterm->strbufsize = 0; - cterm->sixel = SIXEL_INACTIVE; - } - } - else { - if (cterm->strbuf) { - cterm->strbuf[cterm->strbuflen++] = ch[0]; - if (cterm->strbuflen == cterm->strbufsize) { - char *p; - - cterm->strbufsize *= 2; - if (cterm->strbufsize > 1024 * 1024 * 512) { - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = cterm->strbufsize = 0; - } - else { - p = realloc(cterm->strbuf, cterm->strbufsize); - if (p == NULL) { - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = cterm->strbufsize = 0; - } - else - cterm->strbuf = p; - } - } - cterm->strbuf[cterm->strbuflen] = 0; - switch(cterm->sixel) { - case SIXEL_STARTED: - parse_sixel_string(cterm, false); - break; - case SIXEL_POSSIBLE: - parse_sixel_intro(cterm); - break; - } - switch(cterm->macro) { - case MACRO_STARTED: - parse_macro_string(cterm, false); - break; - case MACRO_POSSIBLE: - parse_macro_intro(cterm); - break; - } - } - } - break; - case CTERM_STRING_SOS: - /* Anything but SOS or ST (ESC X or ESC \) */ - if ((ch[0] == 'X' || ch[0] == '\\') && - cterm->strbuf && cterm->strbuflen && - cterm->strbuf[cterm->strbuflen-1] == '\x1b') { - cterm->strbuflen--; - cterm->string = 0; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = cterm->strbufsize = 0; - if (retbuf) { - cterm_write(cterm, "\x1b", 1, retbuf+strlen(retbuf), retsize-strlen(retbuf), speed); - cterm_write(cterm, &ch[0], 1, retbuf+strlen(retbuf), retsize-strlen(retbuf), speed); - } - } - else { - if (cterm->strbuf == NULL) { - cterm->string = 0; - cterm->strbuflen = cterm->strbufsize = 0; - } - else { - cterm->strbuf[cterm->strbuflen++] = ch[0]; - if (cterm->strbuflen == cterm->strbufsize) { - char *p; - - cterm->strbufsize *= 2; - if (cterm->strbufsize > 1024 * 1024 * 512) { - FREE_AND_NULL(cterm->strbuf); - cterm->string = 0; - cterm->strbuflen = cterm->strbufsize = 0; - } - else { - p = realloc(cterm->strbuf, cterm->strbufsize); - if (p == NULL) { - cterm->string = 0; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = cterm->strbufsize = 0; - } - else - cterm->strbuf = p; - } - } - cterm->strbuf[cterm->strbuflen] = 0; - } - } - break; - } - } - else if(cterm->font_size) { - cterm->fontbuf[cterm->font_read++]=ch[0]; - if(cterm->font_read == cterm->font_size) { -#ifndef CTERM_WITHOUT_CONIO - char *buf2; - - if((buf2=(char *)malloc(cterm->font_size))!=NULL) { - memcpy(buf2,cterm->fontbuf,cterm->font_size); - if(cterm->font_slot >= CONIO_FIRST_FREE_FONT && cterm->font_slot < 256) { - replace_font(cterm->font_slot, strdup("Remote Defined Font"), buf2, cterm->font_size); - } - else - FREE_AND_NULL(buf2); - } -#endif - cterm->font_size=0; - } - } - else if(cterm->sequence) { - ustrcat(cterm->escbuf,ch); - switch(legal_sequence(cterm->escbuf, sizeof(cterm->escbuf)-1)) { - case SEQ_BROKEN: - /* Broken sequence detected */ - ustrcat(prn,"\033"); - ustrcat(prn,cterm->escbuf); - cterm->escbuf[0]=0; - cterm->sequence=0; - if(ch[0]=='\033') { /* Broken sequence followed by a legal one! */ - if(prn[0]) /* Don't display the ESC */ - prn[ustrlen(prn)-1]=0; - uctputs(cterm, prn); - prn[0]=0; - cterm->sequence=1; - } - break; - case SEQ_INCOMPLETE: - break; - case SEQ_COMPLETE: - do_ansi(cterm, retbuf, retsize, speed, lastch); - lastch = 0; - break; - } - } - else if (cterm->music) { - if(ch[0]==14) { - *cterm->hold_update=0; - *cterm->puttext_can_move=0; - CURR_XY(&x, &y); - GOTOXY(x, y); - SETCURSORTYPE(cterm->cursor); - *cterm->hold_update=1; - *cterm->puttext_can_move=1; - play_music(cterm); - } - else { - if(strchr(musicchars,ch[0])!=NULL) - ustrcat(cterm->musicbuf,ch); - else { - /* Kill non-music strings */ - cterm->music=0; - cterm->musicbuf[0]=0; - } - } - } - else { - if(cterm->emulation == CTERM_EMULATION_ATASCII) { - if(cterm->attr==7) { - switch(buf[j]) { - case 27: /* ESC */ - cterm->attr=1; - break; - case 28: /* Up (TODO: Wraps??) */ - CURR_XY(&x, &y); - y--; - if(y < CURR_MINY) - y = CURR_MINY; - GOTOXY(x, y); - break; - case 29: /* Down (TODO: Wraps??) */ - CURR_XY(&x, &y); - y++; - if(y > CURR_MAXY) - y = CURR_MAXY; - GOTOXY(x, y); - break; - case 30: /* Left (TODO: Wraps around to same line?) */ - CURR_XY(&x, &y); - x--; - if(x < CURR_MINX) - y = CURR_MINX; - GOTOXY(x, y); - break; - case 31: /* Right (TODO: Wraps around to same line?) */ - CURR_XY(&x, &y); - x++; - if(x > CURR_MAXX) - y = CURR_MAXX; - GOTOXY(x, y); - break; - case 125: /* Clear Screen */ - cterm_clearscreen(cterm, cterm->attr); - break; - case 126: /* Backspace (TODO: Wraps around to previous line?) */ - /* DOES NOT delete char, merely erases */ - CURR_XY(&x, &y); - x--; - if (x < CURR_MINX) { - y--; - if (y < CURR_MINY) - break; - y = CURR_MAXY; - } - GOTOXY(x, y); - PUTCH(32); - GOTOXY(x, y); - break; - /* We abuse the ESC buffer for tab stops */ - case 127: /* Tab (Wraps around to next line) */ - CURR_XY(&x, &y); - for (k = x + 1; k <= CURR_MAXX; k++) { - if(cterm->escbuf[k]) { - x = k; - break; - } - } - if (k > CURR_MAXX) { - x = CURR_MINX; - y++; - if(y > CURR_MAXY) { - cond_scrollup(cterm); - y = CURR_MAXY; - } - } - GOTOXY(x, y); - break; - case 155: /* Return */ - adjust_currpos(cterm, INT_MIN, +1, 1); - break; - case 156: /* Delete Line */ - dellines(cterm, 1); - adjust_currpos(cterm, INT_MIN, 0, 0); - break; - case 157: /* Insert Line */ - CURR_XY(&x, &y); - if (y < CURR_MAXY) { - sx = CURR_MINX; - sy = y; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &sx, &sy); - ex = CURR_MAXX; - ey = CURR_MAXY; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &ex, &ey); - MOVETEXT(sx, sy, ex, ey - 1, sx, sy + 1); - } - GOTOXY(CURR_MINX, y); - cterm_clreol(cterm); - break; - case 158: /* Clear Tab */ - cterm->escbuf[WHEREX()]=0; - break; - case 159: /* Set Tab */ - cterm->escbuf[WHEREX()]=1; - break; - case 253: /* Beep */ - if(!cterm->quiet) { - #ifdef __unix__ - PUTCH(7); - #else - MessageBeep(MB_OK); - #endif - } - break; - case 254: /* Delete Char */ - CURR_XY(&x, &y); - if(x < CURR_MAXX) { - sx = x; - sy = y; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &sx, &sy); - ex = CURR_MAXX; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &ex, NULL); - MOVETEXT(sx + 1, sy, ex, sy, sx, sy); - } - GOTOXY(CURR_MAXX, k); - cterm_clreol(cterm); - GOTOXY(x, y); - break; - case 255: /* Insert Char */ - CURR_XY(&x, &y); - if(x < CURR_MAXX) { - sx = x; - sy = y; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &sx, &sy); - ex = CURR_MAXX; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &ex, NULL); - MOVETEXT(sx, sy, ex - 1, sy, sx + 1, sy); - } - PUTCH(32); - GOTOXY(x, y); - break; - default: - ch[0] = buf[j]; - ch[1] = cterm->attr; - SCR_XY(&sx, &sy); - PUTTEXT(sx, sy, sx, sy, ch); - ch[1]=0; - CURR_XY(&x, &y); - advance_char(cterm, &x, &y, 1); - break; - } - } - else { - switch(buf[j]) { - case 155: /* Return */ - adjust_currpos(cterm, INT_MIN, +1, 1); - break; - default: - /* Translate to screen codes */ - k=buf[j]; - if(k < 32) { - k +=64; - } - else if(k < 96) { - k -= 32; - } - else if(k < 128) { - /* No translation */ - } - else if(k < 160) { - k +=64; - } - else if(k < 224) { - k -= 32; - } - else if(k < 256) { - /* No translation */ - } - ch[0] = k; - ch[1] = cterm->attr; - SCR_XY(&sx, &sy); - PUTTEXT(sx, sy, sx, sy, ch); - ch[1]=0; - CURR_XY(&x, &y); - advance_char(cterm, &x, &y, 1); - break; - } - cterm->attr=7; - } - } - else if(cterm->emulation == CTERM_EMULATION_PETASCII) { - switch(buf[j]) { - case 5: /* White */ - case 28: /* Red */ - case 30: /* Green */ - case 31: /* Blue */ - case 129: /* Orange */ - case 144: /* Black */ - case 149: /* Brown */ - case 150: /* Light Red */ - case 151: /* Dark Gray */ - case 152: /* Grey */ - case 153: /* Light Green */ - case 154: /* Light Blue */ - case 155: /* Light Gray */ - case 156: /* Purple */ - case 158: /* Yellow */ - case 159: /* Cyan */ - cterm->attr &= 0xf0; - if (ti.currmode == C64_40X25 || ti.currmode == C128_40X25) { - switch(buf[j]) { - case 5: /* White/Bright White */ - cterm->attr |= 1; - break; - case 28: /* Red*/ - cterm->attr |= 2; - break; - case 30: /* Green */ - cterm->attr |= 5; - break; - case 31: /* Blue */ - cterm->attr |= 6; - break; - case 129: /* Orange/Magenta */ - cterm->attr |= 8; - break; - case 144: /* Black */ - cterm->attr |= 0; - break; - case 149: /* Brown */ - cterm->attr |= 9; - break; - case 150: /* Light Red/Bright Red */ - cterm->attr |= 10; - break; - case 151: /* Dark Gray/Cyan */ - cterm->attr |= 11; - break; - case 152: /* Grey/Bright Black */ - cterm->attr |= 12; - break; - case 153: /* Light Green/Bright Green */ - cterm->attr |= 13; - break; - case 154: /* Light Blue/Bright Blue */ - cterm->attr |= 14; - break; - case 155: /* Light Gray/White */ - cterm->attr |= 15; - break; - case 156: /* Purple/Bright Magenta */ - cterm->attr |= 4; - break; - case 158: /* Yellow/Bright Yellow */ - cterm->attr |= 7; - break; - case 159: /* Cyan/Bright Cyan */ - cterm->attr |= 3; - break; - } - } - else { - // C128 80-column - switch(buf[j]) { - case 5: /* White/Bright White */ - cterm->attr |= 15; - break; - case 28: /* Red*/ - cterm->attr |= 4; - break; - case 30: /* Green */ - cterm->attr |= 2; - break; - case 31: /* Blue */ - cterm->attr |= 1; - break; - case 129: /* Orange/Magenta */ - cterm->attr |= 5; - break; - case 144: /* Black */ - cterm->attr |= 0; - break; - case 149: /* Brown */ - cterm->attr |= 6; - break; - case 150: /* Light Red/Bright Red */ - cterm->attr |= 12; - break; - case 151: /* Dark Gray/Cyan */ - cterm->attr |= 3; - break; - case 152: /* Grey/Bright Black */ - cterm->attr |= 8; - break; - case 153: /* Light Green/Bright Green */ - cterm->attr |= 10; - break; - case 154: /* Light Blue/Bright Blue */ - cterm->attr |= 9; - break; - case 155: /* Light Gray/White */ - cterm->attr |= 7; - break; - case 156: /* Purple/Bright Magenta */ - cterm->attr |= 13; - break; - case 158: /* Yellow/Bright Yellow */ - cterm->attr |= 14; - break; - case 159: /* Cyan/Bright Cyan */ - cterm->attr |= 11; - break; - } - } - TEXTATTR(cterm->attr); - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - break; - - /* Movement */ - case 13: /* "\r\n" and disabled reverse. */ - c64_set_reverse(cterm, 0); - /* Fall-through */ - case 141: - adjust_currpos(cterm, INT_MIN, 0, 0); - /* Fall-through */ - case 17: - adjust_currpos(cterm, 0, 1, 1); - break; - case 147: - cterm_clearscreen(cterm, cterm->attr); - /* Fall through */ - case 19: - adjust_currpos(cterm, INT_MIN, INT_MIN, 0); - break; - case 20: /* Delete (Wrapping backspace) */ - CURR_XY(&x, &y); - if(x == CURR_MINX) { - if (y == CURR_MINY) - break; - x = CURR_MINX; - GOTOXY(x, k-1); - } - else - GOTOXY(--x, k); - if(x < CURR_MAXX) { - sx = x; - sy = y; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &sx, &sy); - ex = CURR_MAXX; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &ex, NULL); - MOVETEXT(sx + 1, sy, ex, sy, sx, sy); - } - GOTOXY(CURR_MAXX, y); - cterm_clreol(cterm); - GOTOXY(x, y); - break; - case 157: /* Cursor Left (wraps) */ - CURR_XY(&x, &y); - if (x == CURR_MINX) { - if(y > CURR_MINY) - GOTOXY(CURR_MAXX, y - 1); - } - else - GOTOXY(x - 1, y); - break; - case 29: /* Cursor Right (wraps) */ - CURR_XY(&x, &y); - if (x == CURR_MAXX) { - if (y == CURR_MAXY) { - cond_scrollup(cterm); - GOTOXY(CURR_MINX, y); - } - else - GOTOXY(CURR_MINX, y + 1); - } - else - GOTOXY(x + 1, y); - break; - case 145: /* Cursor Up (No scroll */ - adjust_currpos(cterm, 0, -1, 0); - break; - case 148: /* Insert TODO verify last column */ - /* CGTerm does nothing there... we */ - /* Erase under cursor. */ - CURR_XY(&x, &y); - if (x <= CURR_MAXX) { - sx = x; - sy = y; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &sx, &sy); - ex = CURR_MAXX; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &ex, NULL); - MOVETEXT(sx, sy, ex - 1, sy, sx + 1, sy); - } - PUTCH(' '); - GOTOXY(x, y); - break; - - /* Font change... whee! */ - case 14: /* Lower case font */ - if(ti.currmode == C64_40X25) { - SETFONT(33,FALSE,1); - cterm->altfont[0] = 33; - } - else { /* Assume C128 */ - SETFONT(35,FALSE,1); - cterm->altfont[0] = 35; - } - break; - case 142: /* Upper case font */ - if(ti.currmode == C64_40X25) { - SETFONT(32,FALSE,1); - cterm->altfont[0] = 32; - } - else { /* Assume C128 */ - SETFONT(34,FALSE,1); - cterm->altfont[0] = 34; - } - break; - case 18: /* Reverse mode on */ - c64_set_reverse(cterm, 1); - break; - case 146: /* Reverse mode off */ - c64_set_reverse(cterm, 0); - break; - - /* Extras */ - case 7: /* Beep */ - if(!cterm->quiet) { - #ifdef __unix__ - PUTCH(7); - #else - MessageBeep(MB_OK); - #endif - } - break; - // 0x0f - Flashing on (C128 80-column only) - // 0x8f - Flashing off (C128 80-column only) - // 0x02 - Flashing on (C128 80-column only) - // 0x82 - Flashing off (C128 80-column only) - default: - k=buf[j]; - if(k<32 || (k > 127 && k < 160)) { - break; - } - ch[0] = k; - ch[1] = c64_get_attr(cterm); - SCR_XY(&sx, &sy); - PUTTEXT(sx, sy, sx, sy, ch); - ch[1]=0; - CURR_XY(&x, &y); - advance_char(cterm, &x, &y, 1); - break; - } - } - else { /* ANSI-BBS */ - if(cterm->doorway_char) { - uctputs(cterm, prn); - tmpvc[0].ch = ch[0]; - tmpvc[0].legacy_attr=cterm->attr; - tmpvc[0].fg = cterm->fg_color; - tmpvc[0].bg = cterm->bg_color; - tmpvc[0].font = ciolib_attrfont(cterm->attr); - SCR_XY(&sx, &sy); - vmem_puttext(sx, sy, sx, sy, tmpvc); - ch[1]=0; - CURR_XY(&x, &y); - advance_char(cterm, &x, &y, 1); - cterm->doorway_char=0; - } - else { - switch(buf[j]) { - case 0: - lastch = 0; - if(cterm->doorway_mode) - cterm->doorway_char=1; - break; - case 7: /* Beep */ - lastch = 0; - uctputs(cterm, prn); - prn[0]=0; - if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL) - fputs("\x07", cterm->logfile); - if(!cterm->quiet) { - #ifdef __unix__ - PUTCH(7); - #else - MessageBeep(MB_OK); - #endif - } - break; - case 12: /* ^L - Clear screen */ - lastch = 0; - uctputs(cterm, prn); - prn[0]=0; - if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL) - fputs("\x0c", cterm->logfile); - cterm_clearscreen(cterm, (char)cterm->attr); - GOTOXY(CURR_MINX, CURR_MINY); - break; - case 27: /* ESC */ - uctputs(cterm, prn); - prn[0]=0; - cterm->sequence=1; - break; - default: - lastch = ch[0]; - ustrcat(prn,ch); - } - } - } - } - } - uctputs(cterm, prn); - prn[0]=0; - break; - } - ABS_XY(&cterm->xpos, &cterm->ypos); - - *cterm->hold_update=olddmc; - *cterm->puttext_can_move=oldptnm; - CURR_XY(&x, &y); - GOTOXY(x, y); - SETCURSORTYPE(cterm->cursor); - - /* Now rejigger the current modes palette... */ - if (mpalette) { - for (i=0; i < 16; i++) - palette[i] -= palette_offset; - set_modepalette(palette); - } - - /* De-doodle the fonts */ - setfont(orig_fonts[0], FALSE, 1); - setfont(orig_fonts[1], FALSE, 2); - setfont(orig_fonts[2], FALSE, 3); - setfont(orig_fonts[3], FALSE, 4); - - return(retbuf); -} - -int cterm_openlog(struct cterminal *cterm, char *logfile, int logtype) -{ - if(!cterm->started) - cterm_start(cterm); - - cterm->logfile=fopen(logfile, "ab"); - if(cterm->logfile==NULL) - return(0); - cterm->log=logtype; - return(1); -} - -void cterm_closelog(struct cterminal *cterm) -{ - if(!cterm->started) - cterm_start(cterm); - - if(cterm->logfile != NULL) - fclose(cterm->logfile); - cterm->logfile=NULL; - cterm->log=CTERM_LOG_NONE; -} - -FILE *dbg; -void cterm_end(struct cterminal *cterm, int free_fonts) -{ - int i; - - if(cterm) { - cterm_closelog(cterm); -#ifdef CTERM_WITHOUT_CONIO - FREE_AND_NULL(BD->vmem); - FREE_AND_NULL(BD); -#else - if (free_fonts) { - for(i=CONIO_FIRST_FREE_FONT; i < 256; i++) { - FREE_AND_NULL(conio_fontdata[i].eight_by_sixteen); - FREE_AND_NULL(conio_fontdata[i].eight_by_fourteen); - FREE_AND_NULL(conio_fontdata[i].eight_by_eight); - FREE_AND_NULL(conio_fontdata[i].desc); - } - } -#endif - if(cterm->playnote_thread_running) { - if(sem_trywait(&cterm->playnote_thread_terminated)==-1) { - listSemPost(&cterm->notes); - sem_wait(&cterm->playnote_thread_terminated); - } - sem_destroy(&cterm->playnote_thread_terminated); - sem_destroy(&cterm->note_completed_sem); - listFree(&cterm->notes); - } - - FREE_AND_NULL(cterm->strbuf); - FREE_AND_NULL(cterm->tabs); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - FREE_AND_NULL(cterm->sx_pixels); - FREE_AND_NULL(cterm->sx_mask); - for (i = 0; i < (sizeof(cterm->macros) / sizeof(cterm->macros[0])); i++) { - FREE_AND_NULL(cterm->macros[i]); - } - - free(cterm); - } -} diff --git a/ciolib/cterm.h b/ciolib/cterm.h deleted file mode 100644 index 3b1b7a1..0000000 --- a/ciolib/cterm.h +++ /dev/null @@ -1,292 +0,0 @@ -/* $Id: cterm.h,v 1.64 2020/06/27 00:04:45 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _CTERM_H_ -#define _CTERM_H_ - -#include <stdio.h> /* FILE* */ -#include <link_list.h> -#include <semwrap.h> -#include "ciolib.h" - -typedef enum { - CTERM_MUSIC_NORMAL - ,CTERM_MUSIC_LEGATO - ,CTERM_MUSIC_STACATTO -} cterm_noteshape_t; - -typedef enum { - CTERM_LOG_NONE - ,CTERM_LOG_ASCII - ,CTERM_LOG_RAW -} cterm_log_t; - -typedef enum { - CTERM_EMULATION_ANSI_BBS - ,CTERM_EMULATION_PETASCII - ,CTERM_EMULATION_ATASCII -} cterm_emulation_t; - -typedef enum { - CTERM_MUSIC_SYNCTERM, - CTERM_MUSIC_BANSI, - CTERM_MUSIC_ENABLED -} cterm_music_t; - -#define CTERM_LOG_MASK 0x7f -#define CTERM_LOG_PAUSED 0x80 - -#define CTERM_NO_SETFONT_REQUESTED 99 - -struct cterminal { - /* conio stuff */ - int x; // X position of the left side on the screen - int y; // Y position of the top pn the screen - int setfont_result; - int altfont[4]; // The font slots successfully assigned to the 4 alt-font styles/attributes - - /* emulation mode */ - cterm_emulation_t emulation; - int height; // Height of the terminal buffer - int width; // Width of the terminal buffer - int top_margin; - int bottom_margin; - int left_margin; - int right_margin; - int quiet; // No sounds are made - struct vmem_cell *scrollback; - int backlines; // Number of lines in scrollback - int backwidth; // Number of columns in scrollback - char DA[1024]; // Device Attributes -#define CTERM_SAVEMODE_AUTOWRAP 0x001 -#define CTERM_SAVEMODE_CURSOR 0x002 -#define CTERM_SAVEMODE_ALTCHARS 0x004 -#define CTERM_SAVEMODE_NOBRIGHT 0x008 -#define CTERM_SAVEMODE_BGBRIGHT 0x010 -#define CTERM_SAVEMODE_SIXEL_SCROLL 0x020 -#define CTERM_SAVEMODE_ORIGIN 0x040 -#define CTERM_SAVEMODE_BLINKALTCHARS 0x080 -#define CTERM_SAVEMODE_NOBLINK 0x100 -#define CTERM_SAVEMODE_MOUSE_X10 0x200 -#define CTERM_SAVEMODE_MOUSE_NORMAL 0x400 -#define CTERM_SAVEMODE_MOUSE_HIGHLIGHT 0x500 -#define CTERM_SAVEMODE_MOUSE_BUTTONTRACK 0x1000 -#define CTERM_SAVEMODE_MOUSE_ANY 0x2000 -#define CTERM_SAVEMODE_MOUSE_FOCUS 0x4000 -#define CTERM_SAVEMODE_MOUSE_UTF8 0x8000 -#define CTERM_SAVEMODE_MOUSE_SGR 0x10000 -#define CTERM_SAVEMODE_MOUSE_ALTSCROLL 0x20000 -#define CTERM_SAVEMODE_MOUSE_URXVT 0x40000 -#define CTERM_SAVEMODE_DECLRMM 0x80000 - int32_t saved_mode; - int32_t saved_mode_mask; - - /* emulation state */ - int started; // Indicates that conio functions are being called - int c64reversemode; // Commodore 64 reverse mode state - unsigned char attr; // Current attribute - uint32_t fg_color; - uint32_t bg_color; - unsigned int extattr; // Extended attributes -#define CTERM_EXTATTR_AUTOWRAP 0x0001 -#define CTERM_EXTATTR_ORIGINMODE 0x0002 -#define CTERM_EXTATTR_SXSCROLL 0x0004 -#define CTERM_EXTATTR_DECLRMM 0x0008 - int save_xpos; // Saved position (for later restore) - int save_ypos; - int sequence; // An escape sequence is being parsed - int string; -#define CTERM_STRING_APC 1 -#define CTERM_STRING_DCS 2 -#define CTERM_STRING_OSC 3 -#define CTERM_STRING_PM 4 -#define CTERM_STRING_SOS 5 - char *strbuf; - size_t strbuflen; - size_t strbufsize; - char escbuf[1024]; - cterm_music_t music_enable; // The remotely/locally controled music state - char musicbuf[1024]; - int music; // ANSI music is being parsed - int tempo; - int octave; - int notelen; - cterm_noteshape_t noteshape; - int musicfore; - int playnote_thread_running; - link_list_t notes; - sem_t playnote_thread_terminated; - sem_t note_completed_sem; - int backpos; - int xpos; - int ypos; - cterm_log_t log; - FILE* logfile; - char fontbuf[4097]; // Remote font - int font_read; // Current position in fontbuf - int font_slot; - int font_size; // Bytes - int doorway_mode; - int doorway_char; // Indicates next char is a "doorway" mode char - int cursor; // Current cursor mode (Normal or None) - char *fg_tc_str; - char *bg_tc_str; - int *tabs; - int tab_count; - - /* Sixel state */ - int sixel; // Sixel status -#define SIXEL_INACTIVE 0 -#define SIXEL_POSSIBLE 1 -#define SIXEL_STARTED 2 - int sx_iv; // Vertical size - int sx_ih; // Horizontal size - int sx_trans; // "Transparent" background - unsigned long sx_repeat; // Repeat count - unsigned sx_left; // Left margin (0-based pixel offset) - unsigned sx_x, sx_y; // Current position - uint32_t sx_fg, sx_bg; // Current colour set - int sx_pixels_sent; /* If any pixels have been sent... - Raster Attributes are ignore if this is true. */ - int sx_first_pass; // First pass through a line - int sx_hold_update; // hold_update value to restore on completion - int sx_start_x; // Starting X position - int sx_start_y; // Starting Y position - int sx_row_max_x; // Max right size of this sixel line - struct ciolib_pixels *sx_pixels; - unsigned long sx_width; // Width from raster attributes - unsigned long sx_height; // REMAINING heigh from raster attributes - uint8_t *sx_mask; - int sx_orig_cursor; // Original value of cterm->cursor - - /* APC Handler */ - void (*apc_handler)(char *strbuf, size_t strlen, void *cbdata); - void *apc_handler_data; - - /* Mouse state change callback */ - void (*mouse_state_change)(int parameter, int enable, void *cbdata); - void *mouse_state_change_cbdata; - int (*mouse_state_query)(int parameter, void *cbdata); - void *mouse_state_query_cbdata; - - /* Macros */ - char *macros[64]; - size_t macro_lens[64]; - uint64_t in_macro; - int macro; -#define MACRO_INACTIVE 0 -#define MACRO_POSSIBLE 1 -#define MACRO_STARTED 2 - int macro_num; - int macro_del; -#define MACRO_DELETE_OLD 0 -#define MACRO_DELETE_ALL 1 - int macro_encoding; -#define MACRO_ENCODING_ASCII 0 -#define MACRO_ENCODING_HEX 1 - - /* Alternate font renderer */ - void (*font_render)(char *str); - int skypix; - - /* conio function pointers */ -#ifdef CTERM_WITHOUT_CONIO - void (*ciolib_gotoxy) (struct cterminal *,int,int); - int (*ciolib_wherex) (struct cterminal *); - int (*ciolib_wherey) (struct cterminal *); - int (*ciolib_gettext) (struct cterminal *,int,int,int,int,void *); - void (*ciolib_gettextinfo) (struct cterminal *,struct text_info *); - void (*ciolib_textattr) (struct cterminal *,int); - void (*ciolib_setcursortype) (struct cterminal *,int); - int (*ciolib_movetext) (struct cterminal *,int,int,int,int,int,int); - void (*ciolib_clreol) (struct cterminal *); - void (*ciolib_clrscr) (struct cterminal *); - void (*ciolib_setvideoflags) (struct cterminal *,int flags); - int (*ciolib_getvideoflags) (struct cterminal *); - void (*ciolib_setscaling) (struct cterminal *,int new_value); - int (*ciolib_getscaling) (struct cterminal *); - int (*ciolib_putch) (struct cterminal *,int); - int (*ciolib_puttext) (struct cterminal *,int,int,int,int,void *); - void (*ciolib_window) (struct cterminal *,int,int,int,int); - int (*ciolib_cputs) (struct cterminal *,const char *); - int (*ciolib_setfont) (struct cterminal *,int font, int force, int font_num); -#else - void (*ciolib_gotoxy) (int,int); - int (*ciolib_wherex) (void); - int (*ciolib_wherey) (void); - int (*ciolib_gettext) (int,int,int,int,void *); - int (*ciolib_vmem_gettext) (int,int,int,int,struct vmem_cell *); - void (*ciolib_gettextinfo) (struct text_info *); - void (*ciolib_textattr) (int); - void (*ciolib_setcursortype) (int); - int (*ciolib_movetext) (int,int,int,int,int,int); - void (*ciolib_clreol) (void); - void (*ciolib_clrscr) (void); - void (*ciolib_setvideoflags) (int flags); - int (*ciolib_getvideoflags) (void); - void (*ciolib_setscaling) (int new_value); - int (*ciolib_getscaling) (void); - int (*ciolib_putch) (int); - int (*ciolib_puttext) (int,int,int,int,void *); - int (*ciolib_vmem_puttext) (int,int,int,int,struct vmem_cell *); - void (*ciolib_window) (int,int,int,int); - int (*ciolib_cputs) (const char *); - int (*ciolib_setfont) (int font, int force, int font_num); -#endif - int *_wscroll; - int *puttext_can_move; - int *hold_update; - void *extra; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -CIOLIBEXPORT struct cterminal* cterm_init(int height, int width, int xpos, int ypos, int backlines, int backcols, struct vmem_cell *scrollback, int emulation); -CIOLIBEXPORT char* cterm_write(struct cterminal *cterm, const void *buf, int buflen, char *retbuf, size_t retsize, int *speed); -CIOLIBEXPORT int cterm_openlog(struct cterminal *cterm, char *logfile, int logtype); -CIOLIBEXPORT void cterm_closelog(struct cterminal *cterm); -CIOLIBEXPORT void cterm_end(struct cterminal *cterm, int free_fonts); -CIOLIBEXPORT void cterm_clearscreen(struct cterminal *cterm, char attr); -CIOLIBEXPORT void cterm_start(struct cterminal *cterm); -void cterm_gotoxy(struct cterminal *cterm, int x, int y); -void setwindow(struct cterminal *cterm); -void cterm_clreol(struct cterminal *cterm); -void cterm_scrollup(struct cterminal *cterm); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/cterm.txt b/ciolib/cterm.txt deleted file mode 100644 index f045623..0000000 --- a/ciolib/cterm.txt +++ /dev/null @@ -1,1283 +0,0 @@ -$Id: cterm.txt,v 1.79 2020/04/28 19:39:13 deuce Exp $ - -CTerm terminal characteristics: ------------------------------- - -End of line behaviour (wrapping): -The cursor is moved to the first character of the next line -as soon as a character is written to the last column of the -current line, not on the next character. A tab will wrap -to the next line only if the current cursor position is the -last character on the line. - -I'm often asked why I don't use VT semantics for wrapping. -The primary reason is that the person asking almost certainly -doesn't know what the VT semantics are, they just want -SyncTERM to behave the same as some other terminal they like. - -Not only have the VT semantics never been properly -implemented in any terminal, they even varied between -different actual hardware VT terminals. Luckily, everything -is on the internet now, so you can see the details and results -here: https://github.com/mattiase/wraptest - -Control characters: - -0x00 - NUL: - In doorway mode, indicates that the next character is - a literal character. The IBM CP437 character will - be displayed. This allows ESC and other control - characters to be placed on the screen. - -0x07 - BEL: - Beep - -0x08 - BS: - Non-destructive backspace. Moves cursor position to - the previous column unless the current column is the - first, in which case no operation is performed. - -0x09 - HT: - Moves to the next horizontal tab stop. Does not overwrite - any characters in between. If there are no tab stops left - in the line, moves to the first position of the next line. - If the starting position is on the last line, will perform - a scroll, filling the new line at bottom with the current - attribute. - -0x0A - LF: - Move cursor position to same column of the next row. - If current row is the last row, scrolls the screen up - and fills the new row with the current attribute. - -0x0D - CR: - Move cursor position to column 1 of the current line - -Control Codes: --------------- - -Control codes are in the following format: -ESC {'0' (ZERO) to '~'} - Legal combinations which are not handled are silently dropped. - -ESC E Next Line (NEL) - Moves to the line home position of the next line. - (Same as CR LF) - -ESC H Set Tab (HTS) - Sets a tab stop at the current column - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -ESC M Reverse Line Feed (RI) - Move up one line - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -ESC P Device Control String (DCS) - Begins a string consisting of the characters 0x08 - 0x0d and - 0x20-0x7e, terminated by a String Terminator (ST) - Supported DCS string values: - "CTerm:Font:p1:<b64>" - Indicates the string is a loadable font. (CTerm 1.213) - - p1 is a font slot number, which must be higher than the last - default defined font (See CSI sp D for list of predefined - fonts). <b64> is the base64 encoded font data. Font size is - deduced from the size of the data. This replaces the now - deprecated CSI = Ps1 ; Ps2 { - - - [ p1 [ ; p2 ] ] q - Defaults: p1 = 0 p2 = 0 - Indicates the string is a sixel sequence. - - p1 selects the vertical height of a single pixel. This - may be overridden by the raster attributes command, and - is deprecated. Supported values - - Value Vertical Size - ----- ------------- - 0,1,5,6 2 pixels - 2 5 pixels - 3,4 3 pixels - 7,8,9 1 pixel - - p2 indicates if unset sixels should be set to the current - background colour. If p2 is 1, positions specified as 0 - remain at their current colour. - - Any additional parameters are ignored. - - The rest of the string is made up of sixel data characters and - sixel control functions. Sixel data characters are in the - rage of '?' (0x3f) to '~' (0x7e). Each sixel data character - represents six vertical pixels. The data is extracted by - subtracting 0x3f from the ASCII value of the character. - The least significant bit is the topmost pixel. - - Sixel Control Functions - ! Pn X - Graphics Repeat Introducer - The character X is repeated Pn times. - " p1 ; p2 [ ; p3 [ ; p4 ] ] - Raster Attributes - p1 indicates the vertical size in pixels of each - sixel. p2 indicates the horizontal size in pixels. - p3 and p4 define the height and width (in sixels) - respectively of a block to fill with the background - colour. This block may not extend past the current - bottom of the screen. If any pixel data characters - proceed this command, it is ignored. - # p1 - Colour Select - Selects the current foreground colour from the - sixel palette. - # p1 ; p2 ; p3 ; p4 ; p5 - Palette map - Defines sixel palette entry p1 and sets it as the - current foreground colour. p2 specifies the colour - space to define the colour in, the only supported - value is 2. p3, p4, and p5 specify the red, green, - and blue content as a percentage (0-100). - $ - Graphics Carriage Return - Returns the active position to the left border of - the same sixel row. Generally, one pass per colour - is used. In passes after the first one, sixels - with a value of zero are not overwritten with the - background colour. - - - Graphics New Line - Moves the active position to the left border of the - next sixel row. - - - $ q pt - Request Status String (DECRQSS) - - pt is the intermediate and/or final characters of a control - function to query the status of. The terminal will send a - response in the format - - DCS p1 $ r pt ST - - p1 is 1 if the terminal supports querying the control - function and 0 if it does not. - - pt is the characters in the control function except the CSI - characters. - - Currently supported values of p1: - - m Request SGR parameters - r Request top and bottom margins - s Request left and right margins - t Request height in lines - $| Request width in columns - *| Request height in lines - - - p1 [ ; p2 [ ; p3 ] ! z - Define Macro (DECDMAC) - Defaults: p2 = 0 p3 = 0 - - Sets a macro to be replayed using CSI Pn * z - - p1 is the macro number to set, and make be between 0 and - 63 inclusive. - - If p2 is zero, the macro numbered p1 will be deleted. If - p2 is one, all macros are deleted. - - If p3 is zero, the macro is defined using ASCII characters - (0x20 - 0x7e and 0xa0 - 0xff only) if p3 is one, the macro - is defined using hex pairs. - - When the macro is defined using hex pairs, a repeat - sequence may be included in the format of ! Pn ; D..D ; - Pn specifies the number of repeats (default of one instance) - D..D is the sequence of pairs to send Pn times. The - terminating ; may be left out if the sequence to be - repeated ends at the end of the string. - -ESC X Start Of String (SOS) - As the above strings, but may contain any characters except - a Start Of String sequence or a String Terminator sequence. - The string is currently ignored. - -ESC \ String Terminator (ST) - -ESC ] Operating System Command (OSC) - Begins a string consisting of the characters 0x08 - 0x0d and - 0x20-0x7e, terminated by a String Terminator (ST) - Supported OSC values: - 4;(pX;pY)... - Specifies one or more palette redefinitions. - pX is the palette index, and pY is the colour definition - Color format: - rgb:R/G/B - Where R, G, and B are a sequence of one to four - hex digits representing the value of the - red, green, and blue channels respectively. - - SOURCE: xterm - - 104 [ ; Ps ... ] - Resets palette entry to default. If the entire string - is "104", resets all colours. Otherwise, only each index - separated by a semicolon is reset. - - SOURCE: xterm - -ESC ^ Privacy Message (PM) - Begins a string consisting of the characters 0x08 - 0x0d and - 0x20-0x7e, terminated by a String Terminator (ST) - The string is currently ignored. - -ESC _ Application Program String (APS) - Begins a string consisting of the characters 0x08 - 0x0d and - 0x20-0x7e, terminated by a String Terminator (ST) - The string is currently ignored. - -ESC c Reset to Initial State (RIS) - Resets all the terminal settings, clears the screen, and homes - the cursor. - -Control Sequences: ------------------- - -Control sequences start with the Control Sequence Introducer which is -ESC [ CSI will be used to express this from now on. - -Control sequences are in the following format: -CSI {'0' (ZERO) to '?'}{SPACE to '/'}{'@' to '~'} - There may be multiple characters from the {'0' (ZERO) to '?'} - and {SPACE to '/'} before the terminating {'@' to '~'} character. - - Legal combinations not handled are silently dropped. - Illegal combinations are displayed. - -Sequence Parameters: - Parameters are expressed by the {'0' (ZERO) to '?'} character set. - Sequences which use parameters use decimal parameters separated by - a ';'. The use of a ':' from the set is reserved. - If the parameter string begins with '<', '=', '>', or '?' then - this is a non-standard extension to the ANSI spec. - - Pn Indicates a single numeric parameter - Pn1 ; Pn2 Two numeric parameters - Pn... Any number of numeric parameters - Ps Single selective parameter - Ps1 ; Ps1 Two selective parameters - Ps... Any numer of selective parameters - - If a default is defined, the parameter is optional - -CSI Pn @ (ICH) - Insert Character(s) - Defaults: Pn = 1 - Moves text from the current position to the right edge Pn characters - to the right, with rightmost characters going off-screen and the - resulting hole being filled with the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn SP @ (SL) - Scroll Left - Defaults: Pn = 1 - Shifts the contents of the screen left Pn columns(s) with - leftmost columns going off-screen and the resulting hole being - filled with the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn A (CUU) - Cursor Up - Defaults: Pn = 1 - Moves the cursor position up Pn lines from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn SP A (SR) - Scroll Right - Defaults: Pn = 1 - Shifts the contents of the screen right Pn columns(s) with - rightmost columns going off-screen and the resulting hole being - filled with the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn B (CUD) - Cursor Down - Defaults: Pn = 1 - Moves the cursor position down Pn lines from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn C (CUF) - Cursor Right - Defaults: Pn = 1 - Moves the cursor position right Pn columns from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn D (CUB) - Cursor Left - Defaults: Pn = 1 - Moves the cursor position left Pn columns from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Ps1 ; Ps2 sp D (FNT) - Font Selection - Defaults: Ps1 = 0 Ps2 = 0 - "sp" indicates a single space character. - Sets font Ps1 to be the one indicated by Ps2. Currently four fonts are - supported. Ps2 must be between 0 and 255. Not all output types support - font selection. Only X11 and SDL currently do. - Supported Ps1 values: - 0 - Default font - 1 - Font selected by the high intensity bit when CSI ? 31 h - is enabled - 2 - Font selected by the blink intensity bit when CSI ? 34 h - is enabled - 3 - Font selected by both the high intensity and blink bits - when both CSI ? 31 h and CSI ? 34 h are enabled - Currently included fonts are: - 0 - Codepage 437 English - 1 - Codepage 1251 Cyrillic, (swiss) - 2 - Russian koi8-r - 3 - ISO-8859-2 Central European - 4 - ISO-8859-4 Baltic wide (VGA 9bit mapped) - 5 - Codepage 866 (c) Russian - 6 - ISO-8859-9 Turkish - 7 - haik8 codepage (use only with armscii8 screenmap) - 8 - ISO-8859-8 Hebrew - 9 - Ukrainian font koi8-u - 10 - ISO-8859-15 West European, (thin) - 11 - ISO-8859-4 Baltic (VGA 9bit mapped) - 12 - Russian koi8-r (b) - 13 - ISO-8859-4 Baltic wide - 14 - ISO-8859-5 Cyrillic - 15 - ARMSCII-8 Character set - 16 - ISO-8859-15 West European - 17 - Codepage 850 Multilingual Latin I, (thin) - 18 - Codepage 850 Multilingual Latin I - 19 - Codepage 885 Norwegian, (thin) - 20 - Codepage 1251 Cyrillic - 21 - ISO-8859-7 Greek - 22 - Russian koi8-r (c) - 23 - ISO-8859-4 Baltic - 24 - ISO-8859-1 West European - 25 - Codepage 866 Russian - 26 - Codepage 437 English, (thin) - 27 - Codepage 866 (b) Russian - 28 - Codepage 885 Norwegian - 29 - Ukrainian font cp866u - 30 - ISO-8859-1 West European, (thin) - 31 - Codepage 1131 Belarusian, (swiss) - 32 - Commodore 64 (UPPER) - 33 - Commodore 64 (Lower) - 34 - Commodore 128 (UPPER) - 35 - Commodore 128 (Lower) - 36 - Atari - 37 - P0T NOoDLE (Amiga) - 38 - mO'sOul (Amiga) - 39 - MicroKnight Plus (Amiga) - 40 - Topaz Plus (Amiga) - 41 - MicroKnight (Amiga) - 42 - Topaz (Amiga) - - Not all fonts are supported in all modes. If a font is not supported - in the current mode, no action is taken, but there should be a - non-zero 'Font Selection result' value in the Font State Report. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn E (CNL) - Cursor Next Line - Defaults: Pn = 1 - Moves the cursor to the first column of the line Pn down from the - current position. Attempting to move past the screen boundaries - stops the cursor at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn F (CPL) - Cursor Preceding Line - Defaults: Pn = 1 - Moves the cursor to the first column of the row Pn up from the - current position. Attempting to move past the screen boundaries - stops the cursor at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn G (CHA) - Cursor Character Absolute - Defaults: Pn = 1 - Movies the cursor to column Pn of the current row. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn1 ; Pn2 H (CUP) - Cursor Position - Defaults: Pn1 = 1 Pn2 = 1 - Moves the cursor to the Pn2th column of the Pn1th line. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn I (CHT) - Cursor Forward Tabulation - Defaults: Pn = 1 - Move the cursor to the Pn-th next tab stop. - Basically the same as sending TAB Pn times. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Ps J (ED) - Erase in Page - Defaults: Ps = 0 - Erases from the current screen according to the value of Ps - 0 - Erase from the current position to the end of the screen. - 1 - Erase from the current position to the start of the screen. - 2 - Erase entire screen. As a violation of ECMA-048, also moves - the cursor to position 1/1 as a number of BBS programs assume - this behaviour. - Erased characters are set to the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - SOURCE BANSI.TXT - -CSI Ps K (EL) - Erase in Line - Defaults: Ps = 0 - Erases from the current line according to the value pf Ps - 0 - Erase from the current position to the end of the line. - 1 - Erase from the current position to the start of the line. - 2 - Erase entire line. - Erased characters are set to the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn L (IL) - Insert Line(s) - Defaults: Pn = 1 - Inserts Pn lines at the current line position. The current line and - those after it are scrolled down and the new empty lines are filled - with the current attribute. If the cursor is not currently inside - the scrolling margins, has no effect. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn M (DL) - Delete Line(s) / "ANSI" Music - Defaults: Pn = 1 - Deletes the current line and the Pn - 1 lines after it scrolling the - first non-deleted line up to the current line and filling the newly - empty lines at the end of the screen with the current attribute. - If the cursor is not currently inside the scrolling margins, has no - effect. - If "ANSI" Music is fully enabled (CSI = 2 M), performs "ANSI" music - instead. - See "ANSI" MUSIC section for more details. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - SOURCE: BANSI.TXT - -CSI = Ps M (CTSAM) - CTerm Set ANSI Music - NON-STANDARD EXTENSION. - Defaults: Ps = 0 - Sets the current state of ANSI music parsing. - 0 - Only CSI | will introduce an ANSI music string. - 1 - Both CSI | and CSI N will introduce an ANSI music string. - 2 - CSI |, CSI N, and CSI M will all introduce an ANSI music string. - In this mode, Delete Line will not be available. - - SOURCE: CTerm only. - -CSI N (BCAM) - BananaCom ANSI Music - "ANSI" Music / Not implemented. - If "ANSI" Music is set to BananaCom (CSI = 1 M) or fully enabled - (CSI = 2 M) performs "ANSI" music. See "ANSI" MUSIC section for more - details. - - SOURCE: BANSI.TXT - -CSI Pn P (DCH) - Delete Character - Defaults: Pn = 1 - Deletes the character at the current position by shifting all - characters from the current column + p1 left to the current column. - Opened blanks at the end of the line are filled with the current - attribute. If the cursor is not currently inside the scrolling - margins, has no effect. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn S (SU) - Scroll Up - Defaults: Pn = 1 - Scrolls all text on the screen up Pn lines. New lines emptied at the - bottom are filled with the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI ? Ps1 ; Ps2 S (XTSRGA) - XTerm Set or Request Graphics Attribute - If Ps1 is 2, and Ps2 is 1, replies with the graphics screen information - in the following format: CSI ? 2 ; 0 ; Px ; Py S - Where Px is the width of the screen in pixels and Py is the height. - - SOURCE: XTerm - -CSI Pn T (SD) - Scroll Down - Defaults: Pn = 1 - Scrolls all text on the screen down Pn lines. New lines emptied at the - top are filled with the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI U - NON-STANDARD (Disabled in current code) - Clear screen with default attribute. - This code is *supposed* to go to the "next page" according to the - ANSI/ECMA specs with CSI V going to "previous page" - - SOURCE: BANSI.TXT - -CSI Pn X (ECH) - Erase Character - Defaults: Pn = 1 - Erase p1 characters starting at the current character. Will not erase - past the end of line. - Erased characters are set to the current attribute. - This can erase across scroll margins. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn Y (CVT) - Cursor Line Tabulation - Defaults: Pn = 1 - Move the cursor to the Pn-th next tab stop. - Basically the same as sending TAB Pn times. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn Z (CBT) - Cursor Backward Tabulation - Defaults: Pn = 1 - Move the cursor to the p1th preceding tab stop. Will not go past the - start of the line. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn ` (HPA) - Character Position Absolute - Defaults: Pn = 1 - Move the cursor to the specified position on the current row. - Will not go past the end of the line. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn a (HPR) - Cursor Position Forward - Defaults: Pn = 1 - Moves the cursor position forward Pn columns from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn b (REP) - Repeat - Defaults: Pn = 1 - Repeats the previous graphic character Pn times. Will not repeat - escape sequences. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Ps c (DA) - Device Attributes - Defaults: Ps = 0 - If Ps is 0, CTerm will reply with the sequence: - CSI = 67;84;101;114;109;pN c - 64;84;101;114;109 is the ASCII values of the "CTerm" string. pN is the - CVS revision ID of CTerm with dots converted to semi-colons - (e.g. "1;156"). Use the CVS revision to detect if a specific feature - is available. If you are adding features to a forked version of cterm, - please do so by adding an extra parameter to the end, not by - incrementing any existing one! - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI < Ps c (CTDA) - CTerm Device Attributes - - Defaults: Ps = 0 - If Pn is 0, CTerm will reply with the sequence: - CSI < 0 ; Ps... c - - Possible values for Ps: - 1 - Loadable fonts are availabe via Device Control Strings - 2 - Palette entries may be modified via an Operating System Command - string - 3 - Pixel operations are supported (currently, sixel graphics) - 4 - The current font may be selected via CSI Ps1 ; Ps2 sp D - 5 - More than the standard 16 colours may by configured via - Operating System Command strings - 6 - Extended palette is available - 7 - Mouse is available - -CSI Ps d (VPA) - Line Position Absolute - Defaults: Ps = 1 - Moves to row specified by Ps. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn SP d (TSR) - Tab Stop Remove - Defaults: None - Removes a tab stop at postion Pn. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn e (VPR) - Line Position Forward - Defaults: Ps = 1 - Moves forward Ps rows. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn1 ; Pn2 (HVP) - Character and Line Position - Defaults: Pn1 = 1 Pn2 = 1 - Moves the cursor to the Pn2th column of the Pn1th line. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Ps g (TBC) - Tabulation Clear - Defaults: Pn = 0 - Deletes tab stops according to the values of P1: - 0 - Deletes tab stop at current position. - 3 - Deletes all tab stops. - 5 - Deletes all tab stops. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI = 255 h (BCSET) - NON-STANDARD EXTENSION - Enable DoorWay Mode - - SOURCE: BANSI.TXT - -CSI ? Ps... h (DECSET) - NON-STANDARD EXTENSION - Set Mode - Sets one or more mode. The following modes are supported: - - 6 - Enable origin mode. - In this mode, position parameters are relative to the top left of - the scrolling region, not the screen. Defaults to reset. - SOURCE: Digital VT102 User Guide - 7 - Enable auto wrap - This is the normal mode in which a write to the last column of a - row will move the cursor to the start of the next line triggering - a scroll if required to create a new line. Defaults to set. - SOURCE: Digital VT102 User Guide - 9 - X10 compatible mouse reporting - Mouse button presses will send a CSI M <button> <x> <y> - Where <button> is ' ' + button number (0-based) - <x> and <y> are '!' + position (0-based) - SOURCE: xterm - 25 - Display the cursor. Defaults to set. - SOURCE: "Installing and Using the VT320 Video Terminal" - 31 - Enable bright alt character set - With this mode set, the bright (1) graphic rendition selects - characters from an alternate character set. Defaults to reset. - 32 - Bright Intensity Disable - This makes the bright intensity bit not control the intensity. - Mostly for use with CSI ? 31 h to permit fonts in the same - colours. Defaults to reset. - 33 - Blink to Bright Intensity Background - With this mode set, the blink (5,6) graphic renditions cause the - background colour to be high intensity rather than causing blink. - Defaults to reset. - 34 - Enable blink alt character set - With this mode set, the blink (5, 6) graphic renditions selects - characters from an alternate character set. Defaults to reset - 35 - Blink Disabled - This makes the blink (5, 6) graphic renditions not cause the - character to blink. Mostly for use with CSI ? 34 h to permit - fonts to be used without blinking. Defaults to reset. - 69 - DEC Left Right Margin Mode enabled - Enables CSI s to set the left/right margins, and disables CSI s - from saving the current cursor position. - 80 - Sixel Scrolling Enabled - When this is set, the sixel active position begins in the - upper-left corner of the currently active text position. - When the sixel active position reaches the bottom of the - page, the page is scrolled up. At the end of the sixel - string, a sixel newline is appended, and the current cursor - position is the one in which the bottom sixel is in. - Defaults to set. - SOURCE: VT330/VT340 Programmer Reference Manual - 1000 - Normal tracking mode mouse reporting - Mouse button presses will send a CSI M <button> <x> <y> - Where <button> is ' ' + button number (0-based) - Mouse button releases will use a button number of 4 - <x> and <y> are '!' + position (0-based) - SOURCE: xterm - 1001 - Highlight tracking mode mouse reporting - (Not supported by SyncTERM) - SOURCE: xterm - 1002 - Button-event tracking mode mouse reporting - Mouse button presses and movement when a button is pressed - will send a CSI M <button> <x> <y> - Where <button> is ' ' + button number (0-based) - 32 is added to the button number for movement events. - Mouse button releases will use a button number of 4 - <x> and <y> are '!' + position (0-based) - SOURCE: xterm - 1003 - Any-event tracking mode mouse reporting - Mouse button presses and movement - will send a CSI M <button> <x> <y> - Where <button> is ' ' + button number (0-based) - 32 is added to the button number for movement events. - Mouse button releases will use a button number of 4 - <x> and <y> are '!' + position (0-based) - If no button is pressed, it acts as though button 0 is. - SOURCE: xterm - 1004 - Focus-event tracking mode mouse reporting - (Not supported by SyncTERM) - SOURCE: xterm - 1005 - UTF-8 encoded extended coordinates - (Not supported by SyncTERM) - SOURCE: xterm - 1006 - SGR encoded extended coordinates - Instead of the CSI M method, the format of mouse reporting - is change to CSI < Pb ; Px ; Py M for presses and - CSI < Pb ; Px ; Py m for releases. - Instead of CSI M - Px and Py are one-based. - Pb remains the same (32 added for movement) - Button 3 is not used for release (separate code) - SOURCE: xterm - 1007 - Alternate scroll mode - (Not supported by SyncTERM) - SOURCE: xterm - 1015 - URXVT encoded extended coordinates - (Not supported by SyncTERM) - SOURCE: xterm - -CSI Pn j (HPB) - Character Position Backward - Defaults: Pn = 1 - Moves the cursor position left Pn columns from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn k (VPB) - Line Position Backward - Defaults: Pn = 1 - Moves the cursor position up Pn lines from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI = 255 l (BCRST) - NON-STANDARD EXTENSION - Disable DoorWay Mode - - SOURCE: BANSI.TXT - -CSI ? Ps... l (DECRST) - NON-STANDARD EXTENSION - Reset Mode - Resets one or more mode. The following modes are supported: - - 6 - Origin Mode - With this mode reset, position parameters are relative to the - top left of the screen, not the scrolling region. Defaults - to reset. - SOURCE: Digital VT102 User Guide - 7 - Disable auto wrap - Resetting this mode causes a write to the last column of a to - leave the cursor where it was before the write occurred, - overwriting anything which was previously written to the same - position. - SOURCE: Digital VT102 User Guide - 9 - Disable X10 compatible mouse reporting - 25 - Hide the cursor. Defaults to set. - SOURCE: "Installing and Using the VT320 Video Terminal" - 31 - Disable bright alt character set - With this mode reset, the bright (1) graphic rendition does not - select an alternative font. Defaults to reset. - 32 - Bright Intensity Enable - When reset, bright intensity graphics rendition behaves normally. - Defaults to reset. - 33 - Disable Blink to Bright Intensity Background - With this mode set, the blink (5,6) graphic renditions do not - affect the background colour. Defaults to reset. - 34 - Disable blink alt character set - With this mode reset, the blink (5, 6) graphic renditions do not - select characters from an alternate character set. Defaults to - reset. - 35 - Blink Enable - With this mode reset, the blink (5,6) graphic renditions behave - normally (cause the characters to blink). Defaults to reset. - 69 - DEC Left Right Margin Mode disabled - Disables CSI s from setting the left/right margins, and changes - it back to saving the current cursor position. The current - left/right margins are maintained. - 80 - Sixel Scrolling Disabled - When this is reset, the sixel active position begins in the - upper-left corner of the page. Any commands that attempt to - advance the sixel position past the bottom of the page are - ignored. At the end of the sixel string, the current cursor - position is unchanged from where it was when the sixel string - started. Defaults to set. - SOURCE: VT330/VT340 Programmer Reference Manual - 1000 - Disable Normal tracking mode mouse reporting - SOURCE: xterm - 1001 - Disable Highlight tracking mode mouse reporting - (Not supported by SyncTERM) - SOURCE: xterm - 1002 - Disable Button-event tracking mode mouse reporting - SOURCE: xterm - 1003 - Disable Any-event tracking mode mouse reporting - SOURCE: xterm - 1004 - Disable Focus-event tracking mode mouse reporting - (Not supported by SyncTERM) - SOURCE: xterm - 1005 - Disable UTF-8 encoded extended coordinates - (Not supported by SyncTERM) - SOURCE: xterm - 1006 - Disable SGR encoded extended coordinates - SOURCE: xterm - 1007 - Disable Alternate scroll mode - (Not supported by SyncTERM) - SOURCE: xterm - 1015 - Disable URXVT encoded extended coordinates - (Not supported by SyncTERM) - SOURCE: xterm - -CSI Ps... m (SGR) - Select Graphic Rendition - Defaults: Ps1 = 0 - Sets or clears one or more text attributes. Unlimited parameters are - supported and are applied in received order. The following are - supported: - Blink Bold FG BG TF TB (Modified) - 0 - Default attribute, white on black X X X X X X - 1 - Bright Intensity X X - 2 - Dim intensity X X - 5 - Blink (By definition, slow blink) X X - 6 - Blink (By definition, fast blink) X X - NOTE: Both blinks are the same speed. - 7 - Negative Image - Reverses FG and BG X X X X - 8 - Concealed characters, sets the X X X - foreground colour to the background - colour. - 22 - Normal intensity X X - 25 - Steady (Not blinking) X X - 27 - Positive Image - Reverses FG and BG X X X X - NOTE: This should be a separate - attribute than 7 but this - implementation makes them equal - 30 - Black foreground X X - 31 - Red foreground X X - 32 - Green foreground X X - 33 - Yellow foreground X X - 34 - Blue foreground X X - 35 - Magenta foreground X X - 36 - Cyan foreground X X - 37 - White foreground X X - 38 - Extended Foreground (see notes) X - 39 - Default foreground (same as white) X X - 40 - Black background X X - 41 - Red background X X - 42 - Green background X X - 43 - Yellow background X X - 44 - Blue background X X - 45 - Magenta background X X - 46 - Cyan background X X - 47 - White background X X - 48 - Extended Background (see notes) X - 49 - Default background (same as black) X X - - All others are ignored. - - Blink indicates the blink bit. - Bold indicates the bold bit. - FG indicates the foreground colour. - BG indicates the background colour. - TF indicates that the Tru Colour foreground is changed. - TB indicates that the Tru Colour background is changed. - - NOTE: For 38 and 48, two additional formats are supported, a palette - selection and a direct colour selection. - - For palette selection, an additional two parameters are required - after that value. They are considered part of the 38/48, not separate - values. The first additional parameter must be a 5. The second - additional parameter specified the palette index to use. To set the - foreground to orange, and the background to a fairly dark grey, you - would send: - CSI 38 ; 5 ; 214 ; 48 ; 5 ; 238 m - - The default palette is the XTerm 256-colour palette. See here: - https://jonasjacek.github.io/colors/ - - For direct colour selection, an additional four parameters are required - after that value. They are considered part of the 38/48, not separate - values. The first additional parameter must be a 2. The second, - third, and fourth specify the R/G/B values respectively. CTerm handles - this with an internal temporary palette, so scrollback may not have the - correct colours. The internal palette is large enough for all cells in - a 132x60 screen to have unique foreground and background colours - though, so the current screen should always be as expected. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - SOURCE: XTerm - -CSI Ps n (DSR) - Device Status Report - Defaults: Ps = 0 - A request for a status report. CTerm handles the following three - requests: - 5 - Request a DSR - CTerm will always reply with CSI 0 n indicating - "ready, no malfunction detected" - 6 - Request active cursor position - CTerm will reply with CSI y ; x R where y is the current line - and x is - the current row. - 255 - NON-STANDARD EXTENSION (BCDSR) - Replies as though a CSI 6 n was received with the cursor in - the bottom right corner. i.e.: Returns the terminal size as - a position report. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - (parameters 5 and 6 only) - SOURCE: BANSI.TXT (parameter 255) - -CSI = Ps n (CTSMRR) - NON-STANDARD EXTENSION - State/Mode Request/Report - Defaults: Ps = 1 - - When Ps is 1, CTerm will respond with a Font State Report of the form - CSI = 1 ;pF ;pR ;pS0 ;pS1 ;pS2 ;pS3 n - pF is the first available loadable-font slot number - pR is the result of the previous "Font Selection" request: - 0 = successful font selection - 1 = failed font selection - 99 = no font selection request has been received - pS0 - pS3 contain the font slots numbers of previously successful - "Font Selection" requests into the 4 available alternate-font - style/attribute values: - pS0 - normal attribute font slot - PS1 - high intensity foreground attribute font slot - PS2 - blink attribute font slot - PS3 - high intensity blink attribute font slot - - When Ps is 2, CTerm will respond with a Mode Report of the form - CSI = 2[;pN [;pN] [...]] n - Where pN represent zero or more mode values set previously - (e.g. via CSI ? pN h). Mode values cleared (disabled via CSI ? pN l) - will not be included in the set of values returned in the Mode - Report. If no modes are currently set, an empty parameter will be - included as the first and only pN. - - When Ps is 3, CTerm will respond with a Mode Report of the form - CSI = 3 ; pH ; pW n - Where pH is the height of a character cell in pixels, and pW is - the width of a character cell in pixels. - - SOURCE: CTerm only. - -CSI ? Ps [ ; Pn ] n (DECDSR) - - When Ps is 62 (DECMSR) and there is no Pn, CTerm will respond - with a Mode Report of the form - CSI 32767 * { - This indicates that 524,272 bytes are available for macro storage. - This is not actually true, SyncTERM will use all available memory - for macro storage, but some software checks this value, and some - parsers don't allow more than INT16_MAX parameter values. - - When Ps is 63 (DECCKSR) Pn defaults to 1, and CTerm will respond - with a checksum of the defined macros in the form - DCS Pn ! xxxx ST - Where xxxx is the hex checksum. - - SOURCE: VT420 - -CSI Pn1 ; Pn2 r (DECSTBM) - NON-STANDARD EXTENSION. - Set Top and Bottom Margins - Defaults: Pn1 = 1 - Pn2 = last line on screen - Selects top and bottom margins, defining the scrolling region. Pn1 is - the line number of the first line in the scrolling region. Pn2 is the - line number of the bottom line. - - SOURCE: xterm - -CSI Ps1 ; Ps2 * r (DECSCS) - NON-STANDARD EXTENSION. - Set the output emulation speed (Select Communication Speed). - If Ps1 or Ps2 are omitted, causes output speed emulation to stop - Ps1 may be empty. - Sequence is ignored if Ps1 is not empty, 0, or 1. - The value of Ps2 sets the output speed emulation as follows: - - Value Speed - ----- ----- - empty, 0 Unlimited - 1 300 - 2 600 - 3 1200 - 4 2400 - 5 4800 - 6 9600 - 7 19200 - 8 38400 - 9 57600 - 10 76800 - 11 115200 - - SOURCE: VT4xx Specification from http://www.vt100.net/ - -CSI ? Ps... s (CTSMS) - NON-STANDARD EXTENSION - Save Mode Setting - Saves the current mode states as specified by CSI ? l and CSI ? h. If - Ps1 is omitted, saves all such states. If one or more values of Ps is - included, saves only the specified states (arguments to CSI ? l/h). - - SOURCE: SyncTERM only - -CSI Pn1 ; Pn2 s (DECSLRM) - (Only when DEC Left Right Margin Mode - 69 - is enabled) - NON-STANDARD EXTENSION. - Set Left and Right Margins - Defaults: Pn1 = 1 - Pn2 = last column on screen - If either Pn1 or Pn2 is zero, the current setting is retained. - Selects left and right margins, defining the scrolling region. Pn1 is - the column number of the first column in the scrolling region. Pn2 is - the column number of the right column. - - SOURCE: xterm - -CSI s (SCOSC) - (Only when DEC Left Right Margin Mode - 69 - is disabled) - NON-STANDARD EXTENSION - Save Current Position - Saves the current cursor position for later restoring with CSI u - although this is non-standard, it's so widely used in the BBS world - that any terminal program MUST implement it. - - SOURCE: ANSI.SYS - -CSI Ps ; Pn1 ; Pn2 ; Pn3 t (CT24BC) - NON-STANDARD EXTENSION - Select a 24-bit colour - If Ps is 0, sets the background colour. - If Ps is 1, sets the foreground colour. - Pn1, Pn2, Pn3 contains the RGB value to set. - CTerm handles this with an internal temporary palette, so scrollback - may not have the correct colours. The internal palette is large - enough for all cells in a 132x60 screen to have unique foreground - and background colours though, so the current screen should always - be as expected. - -CSI ? Ps... u (CTRMS) - NON-STANDARD EXTENSION - Restore Mode Setting - Saves the current mode states as specified by CSI ? l and CSI ? h. If - Ps is omitted, saves all such states. If one or more values of Ps is - included, restores all the specified states (arguments to CSI ? l/h) - - SOURCE: SyncTERM only - -CSI u (SCORC) - NON-STANDARD EXTENSION - Restore Cursor Position - Move the cursor to the last position saved by CSI s. If no position - has been saved, the cursor is not moved. - - SOURCE: ANSI.SYS - -CSI 2 $ w (DECTABSR) - Request Tab Stop Report - Requests a list of tab stops. - The list is in the form: - - DCS 2 $ u Pt ST - - The string Pt is a list of tab stops separated by /s. - - SOURCE: VT320 - -CSI Pn1 ; Ps ; Pn2 ; Pn3 ; Pn4 ; Pn5 * y (DECRQCRA) - Request Checksum of Rectangular Area - Returns a checksum for the specified rectangular area. - Pn1 is an ID that is returned in the response. - Ps MUST be 1 - Pn2 specifies the top row of the rectangle - Pn3 specifies the left column of the rectangle - Pn4 specifies the bottom row of the rectangle - Pn5 specifies the right column of the rectangle - The return value is in the format of DCS Pn1 ! ~ xxxx ST - Where xxxx is the hex value of the checksum. - - Source: VT420 - -CSI Pn * z (DECINVM) - Invoke Macro - Invokes a macro. - Pn specifies the macro number. If Pn is not 0..63, no action is - taken. - -CSI = Ps1 ; Ps2 { (CTOSF) - NON-STANDARD EXTENSION (Deprecated) - Defaults: Ps1 = 255 Ps2 = 0 - Indicates that a font block is following. - Ps1 indicates the font slot to place the loaded font into. This must - be higher than the last default defined font (See CSI sp D for list - of predefined fonts) Ps2 indicates font size according to the - following table: - 0 - 8x16 font, 4096 bytes. - 1 - 8x14 font, 3584 bytes. - 2 - 8x8 font, 2048 bytes. - - The DCS font string should be used instead as of CTerm 1.213 - - SOURCE: CTerm only. - -"ANSI" Music -============ -This is the place where the BBS world completely fell on it's face in ANSI -usage. A programmer with either TeleMate or QModem (the first two programs to -support "ANSI" music as far as I can tell) decided they needed a method of -playing music on a BBS connection. They decided to add an "unused" ANSI code -and go their merry way. Since their product didn't implement CSI M (Delete -line) they assumed it was unused and blissfully broke the spec. They defined -"ANSI" music as: -CSI M <music string> 0x0e - -They used a subset of IBM BASICs PLAY statement functionality for ANSI music -strings which often start with "MF" or "MB", so the M after the CSI was often -considered as part of the music string. You would see things such as: -CSI MFABCD 0x0e and the F would not be played as a note. This just added -further confusion to the mess. - -Later on, BananaCom realized the conflict between delete line and music, so -they added *another* broken code CSI N (Properly, erase in field... not -implemented in many BBS clients) which was to provide an "unbroken" method of -playing music strings. They also used CSI Y to disambiguate delete line, CSI Y -is supposed to be a vertical tab (also not implemented in very many clients). -BananaCom also introduced many more non-standard and standard-breaking control -sequences which are not supported by CTerm. - -CTerm has further introduced a standard compliant ANSI music introducer CSI | - -By default, CTerm allows both CSI N and CSI | to introduce a music string. -Allowed introducers are set by CSI = p1 M as defined above. - -The details of ANSI music then are as follows: -The following characters are allowed in music strings: -"aAbBcCdDeEfFgGlLmMnNoOpPsStT0123456789.-+#<> " -If any character not in this list is present, the music string is ignored as -is the introducing code. - -If the introducing code is CSI M the first char is examined, and if it is -a one of "BbFfLlSs" or if it is "N" or "n" and is not followed by a decimal -digit, then the music string is treated as though an M is located in front -of the first character. - -The music string is then parsed with the following sequences supported: -Mx sets misc. music parameters where x is one of the following: - F - Plays music in the foreground, waiting for music to complete - playing before more characters are processed. - B - Play music in the background, allowing normal processing to - continue. - N - "Normal" not legato, not staccato - L - Play notes legato - S - Play notes staccato -T### Sets the tempo of the music where ### is one or more decimal digits. - If the decimal number is greater than 255, it is forced to 255. - If it is less than 32, it is forced to 32. The number signifies - quarter notes per minute. - The default tempo is 120. -O### Sets the octave of the music where ### is one or more decimal digits. - If the decimal number is greater than 6, it is forced to 6. - The default octave is 4. -N### Plays a single note by number. Valid values are 0 - 71. Invalid - values are played as silence. Note zero is C in octave 0. - See following section for valid note modifiers. -A, B, C, D, E, F, G, or P Plays the named note or pause from the current - octave. An "Octave" is the rising sequence of the following notes: - C, C#, D, D#, E, F, F#, G, G#, A, A#, B - This is contrary to normal music terminology. - The special note "P" is a pause. - Notes may be followed by one or more modifier characters which - are applied in order. If one overrides a previous one, the last - is used. The valid modifiers are: - + - Sharp. The next highest semitone is played. - Each sharp character will move up one semitone, so "C++" - is equivalent to "D". - # - Sharp. The next highest semitone is played. - Each sharp character will move up one semitone, so "C##" - is equivalent to "D". - - - Flat. The next lowest semitone is played. - Each flat character will move down one semitone, so "D--" - is equivalent to "C". - . - Duration is 1.5 times what it would otherwise be. Dots are not - cumulative, so "C.." is equivalent to "C." - ### - Notelength as a reciprocal of the fraction of a whole note to - play the note for. For example, 4 would indicate a 1/4 note. - The default note length is 4. -L### Set the notelength parameter for all following notes which do not have - one specified (ie: override the quarter-note default) Legal note - lengths are 1-64 indicating the reciprocal of the fraction (ie: 4 - indicates a 1/4 note). -< Move the next lowest octave. - Octave cannot go above six or below zero. -> Move to the next highest octave. - Octave cannot go above six or below zero. - -The lowest playable character is C in octave zero. The frequencies for the -six C notes for the seven octaves in rising order are: -65.406, 130.810, 261.620, 523.250, 1046.500, 2093.000, 4186.000 - -Purists will note that the lower three octaves are not exactly one half of -the next higher octave in frequency. This is due to lost resolution of -low frequencies. The notes *sound* correct to me. If anyone can give me -an excellent reason to change them (and more correct integer values for all -notes) I am willing to do that assuming the notes still sound "right". - -!!!PLEASE NOTE!!! If you are playing some ANSI Music then ask the user if they -heard it, ALWAYS follow it with an 0x0f 0x0e is the shift lock character which -*will* cause people with anything but an ANSI-BBS terminal (ie: *nix users -using the bundled telnet app) to have their screen messed up. 0x0f "undoes" -the 0x0e. diff --git a/ciolib/curs_cio.c b/ciolib/curs_cio.c deleted file mode 100644 index 0188360..0000000 --- a/ciolib/curs_cio.c +++ /dev/null @@ -1,1354 +0,0 @@ -/* $Id: curs_cio.c,v 1.60 2020/06/27 00:04:45 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <langinfo.h> -#include <locale.h> -#include <sys/time.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include "gen_defs.h" /* xpdev, for BOOL/TRUE/FALSE */ - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#include "curs_cio.h" -#include "vidmodes.h" -#include "utf8_codepages.h" - -static unsigned char curs_nextgetch=0; - -static int lastattr=0; -static long mode; -static int vflags=0; -static int suspended = 0; -static int mpress = 0; -void curs_resume(void); - -static int default_font=0; -static int current_font[4]={0, 0, 0, 0}; - -static short curses_color(short color) -{ - switch(color) - { - case 0 : - return(COLOR_BLACK); - case 1 : - return(COLOR_BLUE); - case 2 : - return(COLOR_GREEN); - case 3 : - return(COLOR_CYAN); - case 4 : - return(COLOR_RED); - case 5 : - return(COLOR_MAGENTA); - case 6 : - return(COLOR_YELLOW); - case 7 : - return(COLOR_WHITE); - case 8 : - return(COLOR_BLACK+8); - case 9 : - return(COLOR_BLUE+8); - case 10 : - return(COLOR_GREEN+8); - case 11 : - return(COLOR_CYAN+8); - case 12 : - return(COLOR_RED+8); - case 13 : - return(COLOR_MAGENTA+8); - case 14 : - return(COLOR_YELLOW+8); - case 15 : - return(COLOR_WHITE+8); - } - return(0); -} - -static int _putch(unsigned char ch, BOOL refresh_now, int cp) -{ - int ret; - cchar_t cha; - wchar_t wch[2] = {0}; - attr_t attr = 0; - short cpair = 0; - - attr_get(&attr, &cpair, NULL); - attr &= ~A_COLOR; - switch (mode) { - case CIOLIB_MODE_CURSES_ASCII: - switch(ch) - { - case 30: - wch[0]=ACS_UARROW & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 31: - wch[0]=ACS_DARROW & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 176: - wch[0]=ACS_CKBOARD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 177: - wch[0]=ACS_BOARD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 178: - wch[0]=ACS_BOARD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 179: - wch[0]=ACS_SBSB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 180: - wch[0]=ACS_SBSS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 181: - wch[0]=ACS_SBSD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 182: - wch[0]=ACS_DBDS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 183: - wch[0]=ACS_BBDS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 184: - wch[0]=ACS_BBSD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 185: - wch[0]=ACS_DBDD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 186: - wch[0]=ACS_DBDB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 187: - wch[0]=ACS_BBDD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 188: - wch[0]=ACS_DBBD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 189: - wch[0]=ACS_DBBS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 190: - wch[0]=ACS_SBBD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 191: - wch[0]=ACS_BBSS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 192: - wch[0]=ACS_SSBB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 193: - wch[0]=ACS_SSBS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 194: - wch[0]=ACS_BSSS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 195: - wch[0]=ACS_SSSB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 196: - wch[0]=ACS_BSBS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 197: - wch[0]=ACS_SSSS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 198: - wch[0]=ACS_SDSB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 199: - wch[0]=ACS_DSDB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 200: - wch[0]=ACS_DDBB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 201: - wch[0]=ACS_BDDB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 202: - wch[0]=ACS_DDBD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 203: - wch[0]=ACS_BDDD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 204: - wch[0]=ACS_DDDB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 205: - wch[0]=ACS_BDBD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 206: - wch[0]=ACS_DDDD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 207: - wch[0]=ACS_SDBD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 208: - wch[0]=ACS_DSBS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 209: - wch[0]=ACS_BDSD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 210: - wch[0]=ACS_BSDS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 211: - wch[0]=ACS_DSBB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 212: - wch[0]=ACS_SDBB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 213: - wch[0]=ACS_BDSB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 214: - wch[0]=ACS_BSDB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 215: - wch[0]=ACS_DSDS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 216: - wch[0]=ACS_SDSD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 217: - wch[0]=ACS_SBBS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 218: - wch[0]=ACS_BSSB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 219: - wch[0]=ACS_BLOCK & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 254: - wch[0]=ACS_BULLET & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - default: - wch[0]=ch; - } - break; - case CIOLIB_MODE_CURSES_IBM: - wch[0]=ch; - break; - case CIOLIB_MODE_CURSES: - wch[0] = cpoint_from_cpchar_ext(cp, ch); - break; - } - - if(!wch[0]) { - wch[0]=' '; - attr |= WA_BOLD; - } - else { - attr &= ~WA_BOLD; - } - curs_resume(); - if (wch[0] < ' ') { - attr |= WA_REVERSE; - wch[0] = wch[0] + 'A' - 1; - } - - setcchar(&cha, wch, attr, cpair, NULL); - ret = add_wch(&cha); - - if(!hold_update) { - if(refresh_now) - refresh(); - } - - return(ret); -} - -int curs_vmem_puttext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) -{ - int x,y; - int fillpos=0; - unsigned char attr; - unsigned char fill_char; - unsigned char orig_attr; - int oldx, oldy; - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cio_textinfo.screenwidth - || sy > cio_textinfo.screenheight - || sx > ex - || sy > ey - || ex > cio_textinfo.screenwidth - || ey > cio_textinfo.screenheight - || fill==NULL) - return(0); - - curs_resume(); - getyx(stdscr,oldy,oldx); - orig_attr=lastattr; - for(y=sy-1;y<ey;y++) - { - for(x=sx-1;x<ex;x++) - { - fill_char=fill[fillpos].ch; - attr=fill[fillpos].legacy_attr; - textattr(attr); - move(y, x); - _putch(fill_char,FALSE,conio_fontdata[fill[fillpos].font].cp); - fillpos++; - } - } - textattr(orig_attr); - move(oldy, oldx); - if(!hold_update) - refresh(); - return(1); -} - -int curs_puttext(int sx, int sy, int ex, int ey, void *fillbuf) -{ - int x,y; - int fillpos=0; - unsigned char attr; - unsigned char fill_char; - unsigned char orig_attr; - int oldx, oldy; - unsigned char *fill; - - fill = fillbuf; - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cio_textinfo.screenwidth - || sy > cio_textinfo.screenheight - || sx > ex - || sy > ey - || ex > cio_textinfo.screenwidth - || ey > cio_textinfo.screenheight - || fill==NULL) - return(0); - - curs_resume(); - getyx(stdscr,oldy,oldx); - orig_attr=lastattr; - for(y=sy-1;y<ey;y++) - { - for(x=sx-1;x<ex;x++) - { - fill_char=fill[fillpos++]; - attr=fill[fillpos++]; - textattr(attr); - move(y, x); - _putch(fill_char,FALSE,getcodepage()); - } - } - textattr(orig_attr); - move(oldy, oldx); - if(!hold_update) - refresh(); - return(1); -} - -int curs_vmem_gettext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) -{ - int x,y; - int fillpos=0; - unsigned char attrib; - unsigned char colour; - int oldx, oldy; - unsigned char thischar; - int ext_char; - struct text_info ti; - attr_t attr; - cchar_t cchar; - int fnt = current_font[0]; - int cp; - fd_set cp_checked; - - curs_resume(); - gettextinfo(&ti); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > ti.screenwidth - || sy > ti.screenheight - || sx > ex - || sy > ey - || ex > ti.screenwidth - || ey > ti.screenheight - || fill==NULL) - return(0); - - getyx(stdscr,oldy,oldx); - for(y=sy-1;y<=ey-1;y++) - { - for(x=sx-1;x<=ex-1;x++) - { - mvin_wch(y, x, &cchar); - attr = cchar.attr; - thischar = ext_char = cchar.chars[0]; - if(attr&WA_REVERSE) { - thischar=(thischar)-'A'+1; - } - else { - switch (mode) { - case CIOLIB_MODE_CURSES_ASCII: - /* likely ones */ - if (attr & WA_ALTCHARSET) { - if (ext_char == (ACS_CKBOARD & A_CHARTEXT)) - { - thischar=176; - } - else if (ext_char == (ACS_BOARD & A_CHARTEXT)) - { - thischar=177; - } - else if (ext_char == (ACS_BSSB & A_CHARTEXT)) - { - thischar=218; - } - else if (ext_char == (ACS_SSBB & A_CHARTEXT)) - { - thischar=192; - } - else if (ext_char == (ACS_BBSS & A_CHARTEXT)) - { - thischar=191; - } - else if (ext_char == (ACS_SBBS & A_CHARTEXT)) - { - thischar=217; - } - else if (ext_char == (ACS_SBSS & A_CHARTEXT)) - { - thischar=180; - } - else if (ext_char == (ACS_SSSB & A_CHARTEXT)) - { - thischar=195; - } - else if (ext_char == (ACS_SSBS & A_CHARTEXT)) - { - thischar=193; - } - else if (ext_char == (ACS_BSSS & A_CHARTEXT)) - { - thischar=194; - } - else if (ext_char == (ACS_BSBS & A_CHARTEXT)) - { - thischar=196; - } - else if (ext_char == (ACS_SBSB & A_CHARTEXT)) - { - thischar=179; - } - else if (ext_char == (ACS_SSSS & A_CHARTEXT)) - { - thischar=197; - } - else if (ext_char == (ACS_BLOCK & A_CHARTEXT)) - { - thischar=219; - } - else if (ext_char == (ACS_UARROW & A_CHARTEXT)) - { - thischar=30; - } - else if (ext_char == (ACS_DARROW & A_CHARTEXT)) - { - thischar=31; - } - - /* unlikely (Not in ncurses) */ - else if (ext_char == (ACS_SBSD & A_CHARTEXT)) - { - thischar=181; - } - else if (ext_char == (ACS_DBDS & A_CHARTEXT)) - { - thischar=182; - } - else if (ext_char == (ACS_BBDS & A_CHARTEXT)) - { - thischar=183; - } - else if (ext_char == (ACS_BBSD & A_CHARTEXT)) - { - thischar=184; - } - else if (ext_char == (ACS_DBDD & A_CHARTEXT)) - { - thischar=185; - } - else if (ext_char == (ACS_DBDB & A_CHARTEXT)) - { - thischar=186; - } - else if (ext_char == (ACS_BBDD & A_CHARTEXT)) - { - thischar=187; - } - else if (ext_char == (ACS_DBBD & A_CHARTEXT)) - { - thischar=188; - } - else if (ext_char == (ACS_DBBS & A_CHARTEXT)) - { - thischar=189; - } - else if (ext_char == (ACS_SBBD & A_CHARTEXT)) - { - thischar=190; - } - else if (ext_char == (ACS_SDSB & A_CHARTEXT)) - { - thischar=198; - } - else if (ext_char == (ACS_DSDB & A_CHARTEXT)) - { - thischar=199; - } - else if (ext_char == (ACS_DDBB & A_CHARTEXT)) - { - thischar=200; - } - else if (ext_char == (ACS_BDDB & A_CHARTEXT)) - { - thischar=201; - } - else if (ext_char == (ACS_DDBD & A_CHARTEXT)) - { - thischar=202; - } - else if (ext_char == (ACS_BDDD & A_CHARTEXT)) - { - thischar=203; - } - else if (ext_char == (ACS_DDDB & A_CHARTEXT)) - { - thischar=204; - } - else if (ext_char == (ACS_BDBD & A_CHARTEXT)) - { - thischar=205; - } - else if (ext_char == (ACS_DDDD & A_CHARTEXT)) - { - thischar=206; - } - else if (ext_char == (ACS_SDBD & A_CHARTEXT)) - { - thischar=207; - } - else if (ext_char == (ACS_DSBS & A_CHARTEXT)) - { - thischar=208; - } - else if (ext_char == (ACS_BDSD & A_CHARTEXT)) - { - thischar=209; - } - else if (ext_char == (ACS_BSDS & A_CHARTEXT)) - { - thischar=210; - } - else if (ext_char == (ACS_DSBB & A_CHARTEXT)) - { - thischar=211; - } - else if (ext_char == (ACS_SDBB & A_CHARTEXT)) - { - thischar=212; - } - else if (ext_char == (ACS_BDSB & A_CHARTEXT)) - { - thischar=213; - } - else if (ext_char == (ACS_BSDB & A_CHARTEXT)) - { - thischar=214; - } - else if (ext_char == (ACS_DSDS & A_CHARTEXT)) - { - thischar=215; - } - else if (ext_char == (ACS_SDSD & A_CHARTEXT)) - { - thischar=216; - } - } - fnt = 0; - break; - case CIOLIB_MODE_CURSES_IBM: - if (ext_char == (ACS_UARROW & A_CHARTEXT)) - { - thischar=30; - } - else if (ext_char == (ACS_DARROW & A_CHARTEXT)) - { - thischar=31; - } - fnt = 0; - break; - case CIOLIB_MODE_CURSES: - thischar = cpchar_from_unicode_cpoint(getcodepage(), ext_char, 0); - if (thischar == 0 && ext_char != 0) { - FD_ZERO(&cp_checked); - for (fnt = 0; fnt < 256; fnt++) { - cp = conio_fontdata[fnt].cp; - if (!FD_ISSET(cp, &cp_checked)) { - FD_SET(cp, &cp_checked); - thischar = cpchar_from_unicode_cpoint(cp, ext_char, 0); - if (thischar) - break; - } - } - if (fnt == 256) { - fnt = current_font[0]; - thischar = '?'; - } - } - break; - } - } - fill[fillpos].ch=(unsigned char)(thischar); - attrib=0; - if (attr & WA_BOLD) { - if (thischar == ' ') - thischar = 0; - else - attrib |= 8; - } - if (attr & WA_BLINK) - { - attrib |= 128; - } - colour=PAIR_NUMBER(attr&A_COLOR)-1; - if (COLORS >= 16) - colour=colour&0x7f; - else - colour=((colour&56)<<1)|(colour&7); - fill[fillpos].legacy_attr = colour|attrib; - attr2palette(attrib, &fill[fillpos].fg, &fill[fillpos].bg); - fill[fillpos].font = fnt; - fillpos++; - } - } - move(oldy, oldx); - return(1); -} - -void curs_textattr(int attr) -{ - chtype attrs=WA_NORMAL; - int colour; - int fg,bg; - - if (lastattr==attr) - return; - - lastattr=attr; - - fg = attr & 0x0f; - bg = attr & 0xf0; - - if (vflags & CIOLIB_VIDEO_NOBRIGHT) - fg &= 0x07; - - if (!(vflags & CIOLIB_VIDEO_BGBRIGHT)) - bg &= 0x70; - - if (attr & 128) - { - if (!(vflags & CIOLIB_VIDEO_NOBLINK)) - attrs |= WA_BLINK; - } - - if (COLORS >= 16) { - colour = COLOR_PAIR( ((fg|bg)+1) ); - } - else { - if (fg & 8) { - attrs |= WA_BOLD; - } - colour = COLOR_PAIR( ((fg&7)|((bg&0x70)>>1))+1 ); - } - curs_resume(); -#ifdef NCURSES_VERSION_MAJOR - attrset(attrs); - color_set(colour, NULL); -#else - attrset(attrs|colour); -#endif - /* bkgdset(colour); */ - bkgdset(colour); - - cio_textinfo.attribute=attr; -} - -int curs_kbhit(void) -{ - struct timeval timeout; - fd_set rfds; - - if(curs_nextgetch) - return(1); - if(mpress || mouse_trywait()) { - mpress = 1; - return(1); - } - timeout.tv_sec=0; - timeout.tv_usec=0; - FD_ZERO(&rfds); - FD_SET(fileno(stdin),&rfds); - - return(select(fileno(stdin)+1,&rfds,NULL,NULL,&timeout)); -} - -void curs_gotoxy(int x, int y) -{ - int absx,absy; - absx=x+cio_textinfo.winleft-1; - absy=y+cio_textinfo.wintop-1; - - curs_resume(); - move(absy-1,absx-1); - if(!hold_update) - refresh(); - - cio_textinfo.curx=x; - cio_textinfo.cury=y; -} - -void curs_suspend(void) -{ - if (!suspended) { - noraw(); - endwin(); - } - suspended = 1; -} - -void curs_resume(void) -{ - if (suspended) { - raw(); - timeout(10); - refresh(); - getch(); - } - suspended = 0; -} - -int curs_initciolib(long inmode) -{ - short fg, bg, pair=0; - char *p; - - setlocale(LC_ALL, ""); - if (inmode == CIOLIB_MODE_AUTO) - inmode = CIOLIB_MODE_CURSES; - if (inmode == CIOLIB_MODE_CURSES) { - p = nl_langinfo(CODESET); - if (p == NULL) - inmode = CIOLIB_MODE_CURSES_ASCII; - else if (!strcasestr(p, "UTF")) - if (!strcasestr(p, "UCS2")) - if (!strcasestr(p, "Unicode")) - if (!strcasestr(p, "GB18030")) - inmode = CIOLIB_MODE_CURSES_ASCII; - } - -#ifdef XCURSES - char *argv[2]={"ciolib",NULL}; - - Xinitscr(1,argv); -#else - char *term; - SCREEN *tst; - - cio_api.options = 0; - - term=getenv("TERM"); - if(term==NULL) - return(0); - tst=newterm(term,stdout,stdin); - if(tst==NULL) - return(0); - endwin(); - initscr(); -#endif - start_color(); - cbreak(); - noecho(); - nonl(); - keypad(stdscr, TRUE); - scrollok(stdscr,FALSE); - halfdelay(1); - raw(); - timeout(10); - atexit(curs_suspend); - suspended = 0; - - /* Set up color pairs */ - if (COLORS >= 16) { - for(bg=0;bg<16;bg++) { - for(fg=0;fg<16;fg++) { - init_pair(++pair,curses_color(fg),curses_color(bg)); - } - } - } - else { - for(bg=0;bg<8;bg++) { - for(fg=0;fg<8;fg++) { - init_pair(++pair,curses_color(fg),curses_color(bg)); - } - } - } - mode = inmode; -#ifdef NCURSES_VERSION_MAJOR - { - mmask_t msk = BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION; -#ifdef BUTTON5_PRESSED - msk |= BUTTON4_PRESSED|BUTTON5_PRESSED; -#endif - if (mousemask(msk, NULL) == msk) { - mouseinterval(0); - cio_api.mouse=1; - } - else { - mousemask(0,NULL); - } - } -#endif - - if (COLORS >= 16) - cio_api.options = CONIO_OPT_BRIGHT_BACKGROUND; - if (can_change_color()) - cio_api.options |= CONIO_OPT_PALETTE_SETTING; - curs_textmode(0); - return(1); -} - -void curs_setcursortype(int type) { - curs_resume(); - switch(type) { - case _NOCURSOR: - curs_set(0); - break; - - case _SOLIDCURSOR: - curs_set(2); - break; - - default: /* Normal cursor */ - curs_set(1); - break; - - } - if(!hold_update) - refresh(); -} - -int curs_getch(void) -{ - wint_t ch; -#ifdef NCURSES_VERSION_MAJOR - MEVENT mevnt; -#endif - - if(curs_nextgetch) { - ch=curs_nextgetch; - curs_nextgetch=0; - } - else { - curs_resume(); - while(get_wch(&ch)==ERR) { - if(mpress || mouse_trywait()) { - mpress = 0; - curs_nextgetch=CIO_KEY_MOUSE>>8; - return(CIO_KEY_MOUSE & 0xff); - } - } - switch(ch) { - case KEY_DOWN: /* Down-arrow */ - curs_nextgetch=0x50; - ch=0; - break; - - case KEY_UP: /* Up-arrow */ - curs_nextgetch=0x48; - ch=0; - break; - - case KEY_LEFT: /* Left-arrow */ - curs_nextgetch=0x4b; - ch=0; - break; - - case KEY_RIGHT: /* Right-arrow */ - curs_nextgetch=0x4d; - ch=0; - break; - - case KEY_HOME: /* Home key (upward+left arrow) */ - curs_nextgetch=0x47; - ch=0; - break; - - case KEY_BACKSPACE: /* Backspace (unreliable) */ - ch=8; - break; - - case KEY_F(1): /* Function Key */ - curs_nextgetch=0x3b; - ch=0; - break; - - case KEY_F(2): /* Function Key */ - curs_nextgetch=0x3c; - ch=0; - break; - - case KEY_F(3): /* Function Key */ - curs_nextgetch=0x3d; - ch=0; - break; - - case KEY_F(4): /* Function Key */ - curs_nextgetch=0x3e; - ch=0; - break; - - case KEY_F(5): /* Function Key */ - curs_nextgetch=0x3f; - ch=0; - break; - - case KEY_F(6): /* Function Key */ - curs_nextgetch=0x40; - ch=0; - break; - - case KEY_F(7): /* Function Key */ - curs_nextgetch=0x41; - ch=0; - break; - - case KEY_F(8): /* Function Key */ - curs_nextgetch=0x42; - ch=0; - break; - - case KEY_F(9): /* Function Key */ - curs_nextgetch=0x43; - ch=0; - break; - - case KEY_F(10): /* Function Key */ - curs_nextgetch=0x44; - ch=0; - break; - - case KEY_F(11): /* Function Key */ - curs_nextgetch=0x57; - ch=0; - break; - - case KEY_F(12): /* Function Key */ - curs_nextgetch=0x58; - ch=0; - break; - - case KEY_DC: /* Delete character */ - curs_nextgetch=0x53; - ch=0; - break; - - case KEY_IC: /* Insert char or enter insert mode */ - curs_nextgetch=0x52; - ch=0; - break; - - case KEY_EIC: /* Exit insert char mode */ - curs_nextgetch=0x52; - ch=0; - break; - - case KEY_NPAGE: /* Next page */ - curs_nextgetch=0x51; - ch=0; - break; - - case KEY_PPAGE: /* Previous page */ - curs_nextgetch=0x49; - ch=0; - break; - - case KEY_ENTER: /* Enter or send (unreliable) */ - curs_nextgetch=0x0d; - ch=0; - break; - - case KEY_A1: /* Upper left of keypad */ - curs_nextgetch=0x47; - ch=0; - break; - - case KEY_A3: /* Upper right of keypad */ - curs_nextgetch=0x49; - ch=0; - break; - - case KEY_B2: /* Center of keypad */ - curs_nextgetch=0x4c; - ch=0; - break; - - case KEY_C1: /* Lower left of keypad */ - curs_nextgetch=0x4f; - ch=0; - break; - - case KEY_C3: /* Lower right of keypad */ - curs_nextgetch=0x51; - ch=0; - break; - - case KEY_BEG: /* Beg (beginning) */ - curs_nextgetch=0x47; - ch=0; - break; - - case KEY_CANCEL: /* Cancel */ - curs_nextgetch=0x03; - ch=0; - break; - - case KEY_END: /* End */ - curs_nextgetch=0x4f; - ch=0; - break; - - case KEY_SELECT: /* Select - Is "End" in X */ - curs_nextgetch=0x4f; - ch=0; - break; - -#ifdef NCURSES_VERSION_MAJOR - case KEY_MOUSE: /* Mouse stuff */ - if(getmouse(&mevnt)==OK) { - int evnt=0; - switch(mevnt.bstate) { - case BUTTON1_PRESSED: - evnt=CIOLIB_BUTTON_1_PRESS; - break; - case BUTTON1_RELEASED: - evnt=CIOLIB_BUTTON_1_RELEASE; - break; - case BUTTON2_PRESSED: - evnt=CIOLIB_BUTTON_2_PRESS; - break; - case BUTTON2_RELEASED: - evnt=CIOLIB_BUTTON_2_RELEASE; - break; - case BUTTON3_PRESSED: - evnt=CIOLIB_BUTTON_3_PRESS; - break; - case BUTTON3_RELEASED: - evnt=CIOLIB_BUTTON_3_RELEASE; - break; -#ifdef BUTTON5_PRESSED - case BUTTON4_PRESSED: - evnt=CIOLIB_BUTTON_4_PRESS; - break; - case BUTTON5_PRESSED: - evnt=CIOLIB_BUTTON_5_PRESS; - break; -#endif - case REPORT_MOUSE_POSITION: - evnt=CIOLIB_MOUSE_MOVE; - break; - } - ciomouse_gotevent(evnt, mevnt.x+1, mevnt.y+1, -1, -1); - } - break; -#endif - - default: - // Don't translate CTRL-x "keys"... - if (ch >= 32) - ch = cpchar_from_unicode_cpoint(getcodepage(), ch, 0); - break; - } - } - return(ch); -} - -static int -scale_integer_up(int from) -{ - int ret = from * 1000 / 256; - - if (ret < 0) - ret = 0; - if (ret > 1000) - ret = 1000; - return ret; -} - -uint32_t palette[16]; -int curs_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp) -{ - uint32_t fg = attr & 0x0f; - uint32_t bg = (attr >> 4) & 0x0f; - - if (!(vflags & CIOLIB_VIDEO_BGBRIGHT)) - bg &= 0x07; - if (vflags & CIOLIB_VIDEO_NOBRIGHT) - fg &= 0x07; - - if (fgp) - *fgp = palette[fg]; - if (bgp) - *bgp = palette[bg]; - - return 1; -} - -int curs_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b) -{ - if (!can_change_color()) - return 0; - init_color(curses_color(entry), scale_integer_up(r>>8), scale_integer_up(g>>8), scale_integer_up(b>>8)); - return 1; -} - -int curs_set_modepalette(uint32_t p[16]) -{ - int i; - - if (!can_change_color()) - return 0; - memcpy(palette, p, sizeof(palette)); - for (i = 0; i < 16; i++) { - struct dac_colors *c; - c = &dac_default[p[i]]; - curs_setpalette(i, c->red<<8 | c->red, c->green<<8 | c->green, c->blue<<8 | c->blue); - } - return 1; -} - -int curs_get_modepalette(uint32_t p[16]) -{ - if (!can_change_color()) - return 0; - memcpy(p, palette, sizeof(palette)); - return 1; -} - -void curs_textmode(int mode) -{ - int vm; - int maxx, maxy; - - curs_resume(); - getmaxyx(stdscr, maxy, maxx); - if (maxy > 255) - maxy = 255; - if (maxx > 255) - maxx = 255; - cio_textinfo.screenheight = maxy; - cio_textinfo.screenwidth = maxx; - if(has_colors()) - cio_textinfo.currmode=COLOR_MODE; - else - cio_textinfo.currmode=MONO; - - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; - cio_textinfo.attribute=7; - cio_textinfo.normattr=7; - cio_textinfo.curx=1; - cio_textinfo.cury=1; - - if(can_change_color() && (vm = find_vmode(cio_textinfo.currmode)) != -1) { - curs_set_modepalette(palettes[vparams[vm].palette]); - cio_textinfo.normattr=cio_textinfo.attribute=vparams[vm].default_attr; - vflags = vparams[vm].flags; - } - - return; -} - -int curs_hidemouse(void) -{ -/* - #ifdef NCURSES_VERSION_MAJOR - mousemask(0,NULL); - return(0); - #else - return(-1); - #endif -*/ - return(-1); -} - -int curs_showmouse(void) -{ -/* - #ifdef NCURSES_VERSION_MAJOR - if(mousemask(BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION,NULL)==BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION) - return(0); - #endif - return(-1); -*/ - return(-1); -} - -void curs_beep(void) -{ - curs_resume(); - beep(); -} - -int curs_getvideoflags(void) -{ - return vflags; -} - -void curs_setvideoflags(int flags) -{ - flags &= (CIOLIB_VIDEO_NOBRIGHT|CIOLIB_VIDEO_BGBRIGHT|CIOLIB_VIDEO_NOBLINK); - if (COLORS < 16) - flags &= ~CIOLIB_VIDEO_BGBRIGHT; - vflags = flags; -} - -int curs_setfont(int font, int force, int font_num) -{ - if (mode != CIOLIB_MODE_CURSES) - return 0; - - if(font < 0 || font>(sizeof(conio_fontdata)/sizeof(struct conio_font_data_struct)-2)) - return(0); - - switch(font_num) { - case 0: - default_font=font; - /* Fall-through */ - case 1: - current_font[0]=font; - break; - case 2: - case 3: - case 4: - current_font[font_num-1]=font; - break; - } - - return(1); -} - -int curs_getfont(int font_num) -{ - int ret; - - if (font_num == 0) - ret = default_font; - else if (font_num > 4) - ret = -1; - else - ret = current_font[font_num - 1]; - - return ret; -} diff --git a/ciolib/curs_cio.h b/ciolib/curs_cio.h deleted file mode 100644 index 5292e8b..0000000 --- a/ciolib/curs_cio.h +++ /dev/null @@ -1,80 +0,0 @@ -/* $Id: curs_cio.h,v 1.19 2020/05/02 08:46:44 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifdef __unix__ -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#undef beep -#undef getch -#undef ungetch -#undef getmouse -#undef ungetmouse -#include "curs_fix.h" - -#ifdef __cplusplus -extern "C" { -#endif -int curs_puttext(int sx, int sy, int ex, int ey, void *fillbuf); -int curs_vmem_puttext(int sx, int sy, int ex, int ey, struct vmem_cell *fillbuf); -int curs_vmem_gettext(int sx, int sy, int ex, int ey, struct vmem_cell *fillbuf); -void curs_textattr(int attr); -int curs_kbhit(void); -void curs_gotoxy(int x, int y); -void curs_suspend(void); -void curs_resume(void); -int curs_initciolib(long inmode); -void curs_setcursortype(int type); -int curs_getch(void); -void curs_textmode(int mode); -int curs_hidemouse(void); -int curs_showmouse(void); -void curs_beep(void); -int curs_getvideoflags(void); -void curs_setvideoflags(int flags); -int curs_setfont(int font, int force, int font_num); -int curs_getfont(int font_num); -int curs_set_modepalette(uint32_t p[16]); -int curs_get_modepalette(uint32_t p[16]); -int curs_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b); -int curs_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/curs_fix.h b/ciolib/curs_fix.h deleted file mode 100644 index a98cbe5..0000000 --- a/ciolib/curs_fix.h +++ /dev/null @@ -1,292 +0,0 @@ -/* $Id: curs_fix.h,v 1.6 2020/04/25 03:12:53 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifdef __DARWIN__ - #define _XOPEN_SOURCE_EXTENDED 1 - #include <ncurses.h> -#else - #ifdef __OpenBSD__ - /* OpenBSD appears to ship with an old (5.7 from November 02, 2008) version - * of ncurses. This apparently predates both _XOPEN_SOURCE >= 500 and - * NCURSES_WIDECHAR support for enabling wide characters. - * so, define _XOPEN_SOURCE_EXTENDED to get these. */ - #define _XOPEN_SOURCE_EXTENDED 1 - #endif - #define NCURSES_WIDECHAR 1 - #ifdef XCURSES - #include <xcurses.h> - #else - #ifdef N_CURSES_LIB - #include <ncurses.h> - #else - #ifdef DEBIAN_HATES_YOU - #include <ncursesw/ncurses.h> - #else - #include <curses.h> - #endif - #endif - #endif -#endif - -#ifndef ACS_SBSD -#define ACS_SBSD ACS_SBSS -#endif - -#ifndef ACS_DBDS -#define ACS_DBDS ACS_SBSS -#endif - -#ifndef ACS_BBDS -#define ACS_BBDS ACS_BBSS -#endif - -#ifndef ACS_BBSD -#define ACS_BBSD ACS_BBSS -#endif - -#ifndef ACS_DBDD -#define ACS_DBDD ACS_SBSS -#endif - -#ifndef ACS_DBDB -#define ACS_DBDB ACS_SBSB -#endif - -#ifndef ACS_BBDD -#define ACS_BBDD ACS_BBSS -#endif - -#ifndef ACS_DBBD -#define ACS_DBBD ACS_SBBS -#endif - -#ifndef ACS_DBBS -#define ACS_DBBS ACS_SBBS -#endif - -#ifndef ACS_SBBD -#define ACS_SBBD ACS_SBBS -#endif - -#ifndef ACS_SDSB -#define ACS_SDSB ACS_SSSB -#endif - -#ifndef ACS_DSDB -#define ACS_DSDB ACS_SSSB -#endif - -#ifndef ACS_DDBB -#define ACS_DDBB ACS_SSBB -#endif - -#ifndef ACS_BDDB -#define ACS_BDDB ACS_BSSB -#endif - -#ifndef ACS_DDBD -#define ACS_DDBD ACS_SSBS -#endif - -#ifndef ACS_BDDD -#define ACS_BDDD ACS_BSSS -#endif - -#ifndef ACS_DDDB -#define ACS_DDDB ACS_SSSB -#endif - -#ifndef ACS_BDBD -#define ACS_BDBD ACS_BSBS -#endif - -#ifndef ACS_DDDD -#define ACS_DDDD ACS_SSSS -#endif - -#ifndef ACS_SDBD -#define ACS_SDBD ACS_SSBS -#endif - -#ifndef ACS_DSBS -#define ACS_DSBS ACS_SSBS -#endif - -#ifndef ACS_BDSD -#define ACS_BDSD ACS_BSSS -#endif - -#ifndef ACS_BSDS -#define ACS_BSDS ACS_BSSS -#endif - -#ifndef ACS_DSBB -#define ACS_DSBB ACS_SSBB -#endif - -#ifndef ACS_SDBB -#define ACS_SDBB ACS_SSBB -#endif - -#ifndef ACS_BDSB -#define ACS_BDSB ACS_BSSB -#endif - -#ifndef ACS_BSDB -#define ACS_BSDB ACS_BSSB -#endif - -#ifndef ACS_DSDS -#define ACS_DSDS ACS_SSSS -#endif - -#ifndef ACS_SDSD -#define ACS_SDSD ACS_SSSS -#endif - -// Now wide... -#ifndef WACS_SBSD -#define WACS_SBSD WACS_SBSS -#endif - -#ifndef WACS_DBDS -#define WACS_DBDS WACS_SBSS -#endif - -#ifndef WACS_BBDS -#define WACS_BBDS WACS_BBSS -#endif - -#ifndef WACS_BBSD -#define WACS_BBSD WACS_BBSS -#endif - -#ifndef WACS_DBDD -#define WACS_DBDD WACS_SBSS -#endif - -#ifndef WACS_DBDB -#define WACS_DBDB WACS_SBSB -#endif - -#ifndef WACS_BBDD -#define WACS_BBDD WACS_BBSS -#endif - -#ifndef WACS_DBBD -#define WACS_DBBD WACS_SBBS -#endif - -#ifndef WACS_DBBS -#define WACS_DBBS WACS_SBBS -#endif - -#ifndef WACS_SBBD -#define WACS_SBBD WACS_SBBS -#endif - -#ifndef WACS_SDSB -#define WACS_SDSB WACS_SSSB -#endif - -#ifndef WACS_DSDB -#define WACS_DSDB WACS_SSSB -#endif - -#ifndef WACS_DDBB -#define WACS_DDBB WACS_SSBB -#endif - -#ifndef WACS_BDDB -#define WACS_BDDB WACS_BSSB -#endif - -#ifndef WACS_DDBD -#define WACS_DDBD WACS_SSBS -#endif - -#ifndef WACS_BDDD -#define WACS_BDDD WACS_BSSS -#endif - -#ifndef WACS_DDDB -#define WACS_DDDB WACS_SSSB -#endif - -#ifndef WACS_BDBD -#define WACS_BDBD WACS_BSBS -#endif - -#ifndef WACS_DDDD -#define WACS_DDDD WACS_SSSS -#endif - -#ifndef WACS_SDBD -#define WACS_SDBD WACS_SSBS -#endif - -#ifndef WACS_DSBS -#define WACS_DSBS WACS_SSBS -#endif - -#ifndef WACS_BDSD -#define WACS_BDSD WACS_BSSS -#endif - -#ifndef WACS_BSDS -#define WACS_BSDS WACS_BSSS -#endif - -#ifndef WACS_DSBB -#define WACS_DSBB WACS_SSBB -#endif - -#ifndef WACS_SDBB -#define WACS_SDBB WACS_SSBB -#endif - -#ifndef WACS_BDSB -#define WACS_BDSB WACS_BSSB -#endif - -#ifndef WACS_BSDB -#define WACS_BSDB WACS_BSSB -#endif - -#ifndef WACS_DSDS -#define WACS_DSDS WACS_SSSS -#endif - -#ifndef WACS_SDSD -#define WACS_SDSD WACS_SSSS -#endif diff --git a/ciolib/hqx.c b/ciolib/hqx.c deleted file mode 100644 index 2d7fd4d..0000000 --- a/ciolib/hqx.c +++ /dev/null @@ -1,414 +0,0 @@ -/* - * Copyright (c) 2014 Clément Bœsch - * - * This file is part of FFmpeg. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/** - * @file - * hqx magnification filters (hq2x, hq3x, hq4x) - * - * Originally designed by Maxim Stephin. - * - * @see http://en.wikipedia.org/wiki/Hqx - * @see http://web.archive.org/web/20131114143602/http://www.hiend3d.com/hq3x.html - * @see http://blog.pkh.me/p/19-butchering-hqx-scaling-filters.html - */ - -#include <inttypes.h> - -#if 0 -/* (c1*w1 + c2*w2) >> s */ -inline __attribute__((always_inline)) uint32_t interp_2px(uint32_t c1, int w1, uint32_t c2, int w2, int s) -{ - return (((((c1 & 0xff00ff00) >> 8) * w1 + ((c2 & 0xff00ff00) >> 8) * w2) << (8 - s)) & 0xff00ff00) | - (((((c1 & 0x00ff00ff) ) * w1 + ((c2 & 0x00ff00ff) ) * w2) >> s ) & 0x00ff00ff); -} - -/* (c1*w1 + c2*w2 + c3*w3) >> s */ -inline __attribute__((always_inline)) uint32_t interp_3px(uint32_t c1, int w1, uint32_t c2, int w2, uint32_t c3, int w3, int s) -{ - return (((((c1 & 0xff00ff00) >> 8) * w1 + ((c2 & 0xff00ff00) >> 8) * w2 + ((c3 & 0xff00ff00) >> 8) * w3) << (8 - s)) & 0xff00ff00) | - (((((c1 & 0x00ff00ff) ) * w1 + ((c2 & 0x00ff00ff) ) * w2 + ((c3 & 0x00ff00ff) ) * w3) >> s ) & 0x00ff00ff); -} -#else -/* (c1*w1 + c2*w2) >> s */ -inline __attribute__((always_inline)) uint32_t interp_2px(uint32_t c1, int w1, uint32_t c2, int w2, int s) -{ - return w2 > w1 ? c2 : c1; -} - -/* (c1*w1 + c2*w2 + c3*w3) >> s */ -inline __attribute__((always_inline)) uint32_t interp_3px(uint32_t c1, int w1, uint32_t c2, int w2, uint32_t c3, int w3, int s) -{ - if (w3 > w2 && w3 > w1) - return c3; - if (w2 > w1) - return c2; - return c1; -} -#endif - -/* m is the mask of diff with the center pixel that matters in the pattern, and - * r is the expected result (bit set to 1 if there is difference with the - * center, 0 otherwise) */ -#define P(m, r) ((k_shuffled & (m)) == (r)) - -/* adjust 012345678 to 01235678: the mask doesn't contain the (null) diff - * between the center/current pixel and itself */ -#define DROP4(z) ((z) > 4 ? (z)-1 : (z)) - -/* shuffle the input mask: move bit n (4-adjusted) to position stored in p<n> */ -#define SHF(x, rot, n) (((x) >> ((rot) ? 7-DROP4(n) : DROP4(n)) & 1) << DROP4(p##n)) - -/* used to check if there is YUV difference between 2 pixels */ -#define WDIFF(c1, c2) (c1 != c2) - -/* bootstrap template for every interpolation code. It defines the shuffled - * masks and surrounding pixels. The rot flag is used to indicate if it's a - * rotation; its basic effect is to shuffle k using p8..p0 instead of p0..p8 */ -#define INTERP_BOOTSTRAP(rot) \ - const int k_shuffled = SHF(k,rot,0) | SHF(k,rot,1) | SHF(k,rot,2) \ - | SHF(k,rot,3) | 0 | SHF(k,rot,5) \ - | SHF(k,rot,6) | SHF(k,rot,7) | SHF(k,rot,8); \ - \ - const uint32_t w0 = w[p0], w1 = w[p1], \ - w3 = w[p3], w4 = w[p4], w5 = w[p5], \ - w7 = w[p7] - -/* Assuming p0..p8 is mapped to pixels 0..8, this function interpolates the - * top-left pixel in the total of the 2x2 pixels to interpolates. The function - * is also used for the 3 other pixels */ -inline __attribute__((always_inline)) uint32_t hq2x_interp_1x1(int k, - const uint32_t *w, - int p0, int p1, int p2, - int p3, int p4, int p5, - int p6, int p7, int p8) -{ - INTERP_BOOTSTRAP(0); - - if ((P(0xbf,0x37) || P(0xdb,0x13)) && WDIFF(w1, w5)) - return interp_2px(w4, 3, w3, 1, 2); - if ((P(0xdb,0x49) || P(0xef,0x6d)) && WDIFF(w7, w3)) - return interp_2px(w4, 3, w1, 1, 2); - if ((P(0x0b,0x0b) || P(0xfe,0x4a) || P(0xfe,0x1a)) && WDIFF(w3, w1)) - return w4; - if ((P(0x6f,0x2a) || P(0x5b,0x0a) || P(0xbf,0x3a) || P(0xdf,0x5a) || - P(0x9f,0x8a) || P(0xcf,0x8a) || P(0xef,0x4e) || P(0x3f,0x0e) || - P(0xfb,0x5a) || P(0xbb,0x8a) || P(0x7f,0x5a) || P(0xaf,0x8a) || - P(0xeb,0x8a)) && WDIFF(w3, w1)) - return interp_2px(w4, 3, w0, 1, 2); - if (P(0x0b,0x08)) - return interp_3px(w4, 2, w0, 1, w1, 1, 2); - if (P(0x0b,0x02)) - return interp_3px(w4, 2, w0, 1, w3, 1, 2); - if (P(0x2f,0x2f)) - return interp_3px(w4, 14, w3, 1, w1, 1, 4); - if (P(0xbf,0x37) || P(0xdb,0x13)) - return interp_3px(w4, 5, w1, 2, w3, 1, 3); - if (P(0xdb,0x49) || P(0xef,0x6d)) - return interp_3px(w4, 5, w3, 2, w1, 1, 3); - if (P(0x1b,0x03) || P(0x4f,0x43) || P(0x8b,0x83) || P(0x6b,0x43)) - return interp_2px(w4, 3, w3, 1, 2); - if (P(0x4b,0x09) || P(0x8b,0x89) || P(0x1f,0x19) || P(0x3b,0x19)) - return interp_2px(w4, 3, w1, 1, 2); - if (P(0x7e,0x2a) || P(0xef,0xab) || P(0xbf,0x8f) || P(0x7e,0x0e)) - return interp_3px(w4, 2, w3, 3, w1, 3, 3); - if (P(0xfb,0x6a) || P(0x6f,0x6e) || P(0x3f,0x3e) || P(0xfb,0xfa) || - P(0xdf,0xde) || P(0xdf,0x1e)) - return interp_2px(w4, 3, w0, 1, 2); - if (P(0x0a,0x00) || P(0x4f,0x4b) || P(0x9f,0x1b) || P(0x2f,0x0b) || - P(0xbe,0x0a) || P(0xee,0x0a) || P(0x7e,0x0a) || P(0xeb,0x4b) || - P(0x3b,0x1b)) - return interp_3px(w4, 2, w3, 1, w1, 1, 2); - return interp_3px(w4, 6, w3, 1, w1, 1, 3); -} - -/* Assuming p0..p8 is mapped to pixels 0..8, this function interpolates the - * top-left and top-center pixel in the total of the 3x3 pixels to - * interpolates. The function is also used for the 3 other couples of pixels - * defining the outline. The center pixel is not defined through this function, - * since it's just the same as the original value. */ -inline __attribute__((always_inline)) void hq3x_interp_2x1(uint32_t *dst, int dst_linesize, - int k, - const uint32_t *w, - int pos00, int pos01, - int p0, int p1, int p2, - int p3, int p4, int p5, - int p6, int p7, int p8, - int rotate) -{ - INTERP_BOOTSTRAP(rotate); - - uint32_t *dst00 = &dst[dst_linesize*(pos00>>1) + (pos00&1)]; - uint32_t *dst01 = &dst[dst_linesize*(pos01>>1) + (pos01&1)]; - - if ((P(0xdb,0x49) || P(0xef,0x6d)) && WDIFF(w7, w3)) - *dst00 = interp_2px(w4, 3, w1, 1, 2); - else if ((P(0xbf,0x37) || P(0xdb,0x13)) && WDIFF(w1, w5)) - *dst00 = interp_2px(w4, 3, w3, 1, 2); - else if ((P(0x0b,0x0b) || P(0xfe,0x4a) || P(0xfe,0x1a)) && WDIFF(w3, w1)) - *dst00 = w4; - else if ((P(0x6f,0x2a) || P(0x5b,0x0a) || P(0xbf,0x3a) || P(0xdf,0x5a) || - P(0x9f,0x8a) || P(0xcf,0x8a) || P(0xef,0x4e) || P(0x3f,0x0e) || - P(0xfb,0x5a) || P(0xbb,0x8a) || P(0x7f,0x5a) || P(0xaf,0x8a) || - P(0xeb,0x8a)) && WDIFF(w3, w1)) - *dst00 = interp_2px(w4, 3, w0, 1, 2); - else if (P(0x4b,0x09) || P(0x8b,0x89) || P(0x1f,0x19) || P(0x3b,0x19)) - *dst00 = interp_2px(w4, 3, w1, 1, 2); - else if (P(0x1b,0x03) || P(0x4f,0x43) || P(0x8b,0x83) || P(0x6b,0x43)) - *dst00 = interp_2px(w4, 3, w3, 1, 2); - else if (P(0x7e,0x2a) || P(0xef,0xab) || P(0xbf,0x8f) || P(0x7e,0x0e)) - *dst00 = interp_2px(w3, 1, w1, 1, 1); - else if (P(0x4f,0x4b) || P(0x9f,0x1b) || P(0x2f,0x0b) || P(0xbe,0x0a) || - P(0xee,0x0a) || P(0x7e,0x0a) || P(0xeb,0x4b) || P(0x3b,0x1b)) - *dst00 = interp_3px(w4, 2, w3, 7, w1, 7, 4); - else if (P(0x0b,0x08) || P(0xf9,0x68) || P(0xf3,0x62) || P(0x6d,0x6c) || - P(0x67,0x66) || P(0x3d,0x3c) || P(0x37,0x36) || P(0xf9,0xf8) || - P(0xdd,0xdc) || P(0xf3,0xf2) || P(0xd7,0xd6) || P(0xdd,0x1c) || - P(0xd7,0x16) || P(0x0b,0x02)) - *dst00 = interp_2px(w4, 3, w0, 1, 2); - else - *dst00 = interp_3px(w4, 2, w3, 1, w1, 1, 2); - - if ((P(0xfe,0xde) || P(0x9e,0x16) || P(0xda,0x12) || P(0x17,0x16) || - P(0x5b,0x12) || P(0xbb,0x12)) && WDIFF(w1, w5)) - *dst01 = w4; - else if ((P(0x0f,0x0b) || P(0x5e,0x0a) || P(0xfb,0x7b) || P(0x3b,0x0b) || - P(0xbe,0x0a) || P(0x7a,0x0a)) && WDIFF(w3, w1)) - *dst01 = w4; - else if (P(0xbf,0x8f) || P(0x7e,0x0e) || P(0xbf,0x37) || P(0xdb,0x13)) - *dst01 = interp_2px(w1, 3, w4, 1, 2); - else if (P(0x02,0x00) || P(0x7c,0x28) || P(0xed,0xa9) || P(0xf5,0xb4) || - P(0xd9,0x90)) - *dst01 = interp_2px(w4, 3, w1, 1, 2); - else if (P(0x4f,0x4b) || P(0xfb,0x7b) || P(0xfe,0x7e) || P(0x9f,0x1b) || - P(0x2f,0x0b) || P(0xbe,0x0a) || P(0x7e,0x0a) || P(0xfb,0x4b) || - P(0xfb,0xdb) || P(0xfe,0xde) || P(0xfe,0x56) || P(0x57,0x56) || - P(0x97,0x16) || P(0x3f,0x1e) || P(0xdb,0x12) || P(0xbb,0x12)) - *dst01 = interp_2px(w4, 7, w1, 1, 3); - else - *dst01 = w4; -} - -/* Assuming p0..p8 is mapped to pixels 0..8, this function interpolates the - * top-left block of 2x2 pixels in the total of the 4x4 pixels (or 4 blocks) to - * interpolates. The function is also used for the 3 other blocks of 2x2 - * pixels. */ -inline __attribute__((always_inline)) void hq4x_interp_2x2(uint32_t *dst, int dst_linesize, - int k, - const uint32_t *w, - int pos00, int pos01, - int pos10, int pos11, - int p0, int p1, int p2, - int p3, int p4, int p5, - int p6, int p7, int p8) -{ - INTERP_BOOTSTRAP(0); - - uint32_t *dst00 = &dst[dst_linesize*(pos00>>1) + (pos00&1)]; - uint32_t *dst01 = &dst[dst_linesize*(pos01>>1) + (pos01&1)]; - uint32_t *dst10 = &dst[dst_linesize*(pos10>>1) + (pos10&1)]; - uint32_t *dst11 = &dst[dst_linesize*(pos11>>1) + (pos11&1)]; - - const int cond00 = (P(0xbf,0x37) || P(0xdb,0x13)) && WDIFF(w1, w5); - const int cond01 = (P(0xdb,0x49) || P(0xef,0x6d)) && WDIFF(w7, w3); - const int cond02 = (P(0x6f,0x2a) || P(0x5b,0x0a) || P(0xbf,0x3a) || - P(0xdf,0x5a) || P(0x9f,0x8a) || P(0xcf,0x8a) || - P(0xef,0x4e) || P(0x3f,0x0e) || P(0xfb,0x5a) || - P(0xbb,0x8a) || P(0x7f,0x5a) || P(0xaf,0x8a) || - P(0xeb,0x8a)) && WDIFF(w3, w1); - const int cond03 = P(0xdb,0x49) || P(0xef,0x6d); - const int cond04 = P(0xbf,0x37) || P(0xdb,0x13); - const int cond05 = P(0x1b,0x03) || P(0x4f,0x43) || P(0x8b,0x83) || - P(0x6b,0x43); - const int cond06 = P(0x4b,0x09) || P(0x8b,0x89) || P(0x1f,0x19) || - P(0x3b,0x19); - const int cond07 = P(0x0b,0x08) || P(0xf9,0x68) || P(0xf3,0x62) || - P(0x6d,0x6c) || P(0x67,0x66) || P(0x3d,0x3c) || - P(0x37,0x36) || P(0xf9,0xf8) || P(0xdd,0xdc) || - P(0xf3,0xf2) || P(0xd7,0xd6) || P(0xdd,0x1c) || - P(0xd7,0x16) || P(0x0b,0x02); - const int cond08 = (P(0x0f,0x0b) || P(0x2b,0x0b) || P(0xfe,0x4a) || - P(0xfe,0x1a)) && WDIFF(w3, w1); - const int cond09 = P(0x2f,0x2f); - const int cond10 = P(0x0a,0x00); - const int cond11 = P(0x0b,0x09); - const int cond12 = P(0x7e,0x2a) || P(0xef,0xab); - const int cond13 = P(0xbf,0x8f) || P(0x7e,0x0e); - const int cond14 = P(0x4f,0x4b) || P(0x9f,0x1b) || P(0x2f,0x0b) || - P(0xbe,0x0a) || P(0xee,0x0a) || P(0x7e,0x0a) || - P(0xeb,0x4b) || P(0x3b,0x1b); - const int cond15 = P(0x0b,0x03); - - if (cond00) - *dst00 = interp_2px(w4, 5, w3, 3, 3); - else if (cond01) - *dst00 = interp_2px(w4, 5, w1, 3, 3); - else if ((P(0x0b,0x0b) || P(0xfe,0x4a) || P(0xfe,0x1a)) && WDIFF(w3, w1)) - *dst00 = w4; - else if (cond02) - *dst00 = interp_2px(w4, 5, w0, 3, 3); - else if (cond03) - *dst00 = interp_2px(w4, 3, w3, 1, 2); - else if (cond04) - *dst00 = interp_2px(w4, 3, w1, 1, 2); - else if (cond05) - *dst00 = interp_2px(w4, 5, w3, 3, 3); - else if (cond06) - *dst00 = interp_2px(w4, 5, w1, 3, 3); - else if (P(0x0f,0x0b) || P(0x5e,0x0a) || P(0x2b,0x0b) || P(0xbe,0x0a) || - P(0x7a,0x0a) || P(0xee,0x0a)) - *dst00 = interp_2px(w1, 1, w3, 1, 1); - else if (cond07) - *dst00 = interp_2px(w4, 5, w0, 3, 3); - else - *dst00 = interp_3px(w4, 2, w1, 1, w3, 1, 2); - - if (cond00) - *dst01 = interp_2px(w4, 7, w3, 1, 3); - else if (cond08) - *dst01 = w4; - else if (cond02) - *dst01 = interp_2px(w4, 3, w0, 1, 2); - else if (cond09) - *dst01 = w4; - else if (cond10) - *dst01 = interp_3px(w4, 5, w1, 2, w3, 1, 3); - else if (P(0x0b,0x08)) - *dst01 = interp_3px(w4, 5, w1, 2, w0, 1, 3); - else if (cond11) - *dst01 = interp_2px(w4, 5, w1, 3, 3); - else if (cond04) - *dst01 = interp_2px(w1, 3, w4, 1, 2); - else if (cond12) - *dst01 = interp_3px(w1, 2, w4, 1, w3, 1, 2); - else if (cond13) - *dst01 = interp_2px(w1, 5, w3, 3, 3); - else if (cond05) - *dst01 = interp_2px(w4, 7, w3, 1, 3); - else if (P(0xf3,0x62) || P(0x67,0x66) || P(0x37,0x36) || P(0xf3,0xf2) || - P(0xd7,0xd6) || P(0xd7,0x16) || P(0x0b,0x02)) - *dst01 = interp_2px(w4, 3, w0, 1, 2); - else if (cond14) - *dst01 = interp_2px(w1, 1, w4, 1, 1); - else - *dst01 = interp_2px(w4, 3, w1, 1, 2); - - if (cond01) - *dst10 = interp_2px(w4, 7, w1, 1, 3); - else if (cond08) - *dst10 = w4; - else if (cond02) - *dst10 = interp_2px(w4, 3, w0, 1, 2); - else if (cond09) - *dst10 = w4; - else if (cond10) - *dst10 = interp_3px(w4, 5, w3, 2, w1, 1, 3); - else if (P(0x0b,0x02)) - *dst10 = interp_3px(w4, 5, w3, 2, w0, 1, 3); - else if (cond15) - *dst10 = interp_2px(w4, 5, w3, 3, 3); - else if (cond03) - *dst10 = interp_2px(w3, 3, w4, 1, 2); - else if (cond13) - *dst10 = interp_3px(w3, 2, w4, 1, w1, 1, 2); - else if (cond12) - *dst10 = interp_2px(w3, 5, w1, 3, 3); - else if (cond06) - *dst10 = interp_2px(w4, 7, w1, 1, 3); - else if (P(0x0b,0x08) || P(0xf9,0x68) || P(0x6d,0x6c) || P(0x3d,0x3c) || - P(0xf9,0xf8) || P(0xdd,0xdc) || P(0xdd,0x1c)) - *dst10 = interp_2px(w4, 3, w0, 1, 2); - else if (cond14) - *dst10 = interp_2px(w3, 1, w4, 1, 1); - else - *dst10 = interp_2px(w4, 3, w3, 1, 2); - - if ((P(0x7f,0x2b) || P(0xef,0xab) || P(0xbf,0x8f) || P(0x7f,0x0f)) && - WDIFF(w3, w1)) - *dst11 = w4; - else if (cond02) - *dst11 = interp_2px(w4, 7, w0, 1, 3); - else if (cond15) - *dst11 = interp_2px(w4, 7, w3, 1, 3); - else if (cond11) - *dst11 = interp_2px(w4, 7, w1, 1, 3); - else if (P(0x0a,0x00) || P(0x7e,0x2a) || P(0xef,0xab) || P(0xbf,0x8f) || - P(0x7e,0x0e)) - *dst11 = interp_3px(w4, 6, w3, 1, w1, 1, 3); - else if (cond07) - *dst11 = interp_2px(w4, 7, w0, 1, 3); - else - *dst11 = w4; -} - -void hqx_filter(uint32_t* src, uint32_t* dst, int width, int height, int n) -{ - int x, y; - const int dst32_linesize = width * n; - const int src32_linesize = width; - uint32_t *src32, *dst32; - - src32 = src; - dst32 = dst; - for (y = 0; y < height; y++) { - const int prevline = y > 0 ? -src32_linesize : 0; - const int nextline = y < height - 1 ? src32_linesize : 0; - - for (x = 0; x < width; x++) { - const int prevcol = x > 0 ? -1 : 0; - const int nextcol = x < width -1 ? 1 : 0; - const uint32_t w[3*3] = { - src32[prevcol + prevline], src32[prevline], src32[prevline + nextcol], - src32[prevcol ], src32[ 0], src32[ nextcol], - src32[prevcol + nextline], src32[nextline], src32[nextline + nextcol] - }; - const uint32_t yuv1 = w[4]; - const int pattern = (w[4] != w[0] ? 1 : 0) - | (w[4] != w[1] ? 1 : 0) << 1 - | (w[4] != w[2] ? 1 : 0) << 2 - | (w[4] != w[3] ? 1 : 0) << 3 - | (w[4] != w[5] ? 1 : 0) << 4 - | (w[4] != w[6] ? 1 : 0) << 5 - | (w[4] != w[7] ? 1 : 0) << 6 - | (w[4] != w[8] ? 1 : 0) << 7; - - if (n == 2) { - dst32[dst32_linesize*0 + 0] = hq2x_interp_1x1(pattern, w, 0,1,2,3,4,5,6,7,8); // 00 - dst32[dst32_linesize*0 + 1] = hq2x_interp_1x1(pattern, w, 2,1,0,5,4,3,8,7,6); // 01 (vert mirrored) - dst32[dst32_linesize*1 + 0] = hq2x_interp_1x1(pattern, w, 6,7,8,3,4,5,0,1,2); // 10 (horiz mirrored) - dst32[dst32_linesize*1 + 1] = hq2x_interp_1x1(pattern, w, 8,7,6,5,4,3,2,1,0); // 11 (center mirrored) - } else if (n == 3) { - hq3x_interp_2x1(dst32, dst32_linesize, pattern, w, 0,1, 0,1,2,3,4,5,6,7,8, 0); // 00 01 - hq3x_interp_2x1(dst32 + 1, dst32_linesize, pattern, w, 1,3, 2,5,8,1,4,7,0,3,6, 1); // 02 12 (rotated to the right) - hq3x_interp_2x1(dst32 + 1*dst32_linesize, dst32_linesize, pattern, w, 2,0, 6,3,0,7,4,1,8,5,2, 1); // 20 10 (rotated to the left) - hq3x_interp_2x1(dst32 + 1*dst32_linesize + 1, dst32_linesize, pattern, w, 3,2, 8,7,6,5,4,3,2,1,0, 0); // 22 21 (center mirrored) - dst32[dst32_linesize + 1] = w[4]; // 11 - } else if (n == 4) { - hq4x_interp_2x2(dst32, dst32_linesize, pattern, w, 0,1,2,3, 0,1,2,3,4,5,6,7,8); // 00 01 10 11 - hq4x_interp_2x2(dst32 + 2, dst32_linesize, pattern, w, 1,0,3,2, 2,1,0,5,4,3,8,7,6); // 02 03 12 13 (vert mirrored) - hq4x_interp_2x2(dst32 + 2*dst32_linesize, dst32_linesize, pattern, w, 2,3,0,1, 6,7,8,3,4,5,0,1,2); // 20 21 30 31 (horiz mirrored) - hq4x_interp_2x2(dst32 + 2*dst32_linesize + 2, dst32_linesize, pattern, w, 3,2,1,0, 8,7,6,5,4,3,2,1,0); // 22 23 32 33 (center mirrored) - } else { - return; - } - - src32 += 1; - dst32 += n; - } - dst32 += dst32_linesize * (n - 1); - } -} diff --git a/ciolib/hqx.h b/ciolib/hqx.h deleted file mode 100644 index c9f347e..0000000 --- a/ciolib/hqx.h +++ /dev/null @@ -1,11 +0,0 @@ -#include <inttypes.h> - -#ifdef __cplusplus -extern "C" { -#endif - -void hqx_filter(uint32_t* src, uint32_t* dst, int height, int width, int n); - -#ifdef __cplusplus -} -#endif diff --git a/ciolib/keys.h b/ciolib/keys.h deleted file mode 100644 index 7a8bdc1..0000000 --- a/ciolib/keys.h +++ /dev/null @@ -1,2 +0,0 @@ -/* This header file is dead. */ -#error This file is obsolete! diff --git a/ciolib/makefont.pl b/ciolib/makefont.pl deleted file mode 100755 index 65d5752..0000000 --- a/ciolib/makefont.pl +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/local/bin/perl - -my @sources = ( - 'font/plane00/unifont-base.hex', - 'font/plane00/spaces.hex', - 'font/plane00/wqy.hex', - 'font/plane00/hangul-syllables.hex', - 'font/plane00/copyleft.hex', - 'font/plane00csur/plane00csur.hex', - 'font/plane00csur/plane00csur-spaces.hex', - 'font/plane00/alt/codepage-437.hex', - 'font/plane01/plane01.hex', - 'font/plane01/space.hex', - 'font/plane0E/plane0E.hex', - 'font/plane0Fcsur/plane0Fcsur.hex' -); - -my %font; -foreach my $source (@sources) { - open IN,'<',$source; - while (<IN>) { - chomp; - my ($code, $data) = split(':'); - $code = hex($code); - $data =~ s/([0-9A-F]{2})/\\x$1/g; - if (defined $font{$code} && $font{$code} ne $data) { - if ($source ne './font/plane00/alt/codepage-437.hex') { - die "Item $code already exists ($source)!"; - } - } - $font{$code} = $data; - } - close IN; -} - -print "#include <stdint.h>\n"; -print "#include <stdbool.h>\n\n"; -print "struct unifont_entry {\n"; -print " const uint32_t cp;\n"; -print " const bool wide;\n"; -print " const char * const data;\n"; -print "};\n\n"; -print "const struct unifont_entry unifont[",(scalar keys %font),"] = {\n"; -foreach my $cp (sort {$a <=> $b} keys %font) { - my $wide = length($font{$cp}) > 64 ? 1 : 0; - printf(" {0x%05x, %d, \"%s\"},\n", $cp, $wide, $font{$cp}); -} -print "};\n"; diff --git a/ciolib/mouse.c b/ciolib/mouse.c deleted file mode 100644 index 423016d..0000000 --- a/ciolib/mouse.c +++ /dev/null @@ -1,612 +0,0 @@ -/* $Id: mouse.c,v 1.48 2020/06/27 00:04:45 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> -#include <string.h> - -#include <genwrap.h> -#include <semwrap.h> -#include <threadwrap.h> -#include <link_list.h> - -#include "ciolib.h" - -#define MSEC_CLOCK() (msclock()*MSCLOCKS_PER_SEC/1000) - -enum { - MOUSE_NOSTATE - ,MOUSE_SINGLEPRESSED - ,MOUSE_CLICKED - ,MOUSE_DOUBLEPRESSED - ,MOUSE_DOUBLECLICKED - ,MOUSE_TRIPLEPRESSED - ,MOUSE_TRIPLECLICKED - ,MOUSE_QUADPRESSED - ,MOUSE_QUADCLICKED - ,MOUSE_DRAGSTARTED -}; - -struct in_mouse_event { - int event; - int x; - int y; - int x_res; - int y_res; - clock_t ts; - void *nextevent; -}; - -struct out_mouse_event { - int event; - int bstate; - int kbsm; /* Known button state mask */ - int startx; - int starty; - int endx; - int endy; - int startx_res; - int starty_res; - int endx_res; - int endy_res; - void *nextevent; -}; - -struct mouse_state { - int buttonstate; /* Current state of all buttons - bitmap */ - int knownbuttonstatemask; /* Mask of buttons that have done something since - * We started watching... the rest are actually in - * an unknown state */ - int button_state[5]; /* Expanded state of each button */ - int button_x[5]; /* Start X/Y position of the current state */ - int button_y[5]; - int button_x_res[5]; /* Start X/Y position of the current state */ - int button_y_res[5]; - clock_t timeout[5]; /* Button event timeouts (timespecs ie: time of expiry) */ - int curx; /* Current X position */ - int cury; /* Current Y position */ - int curx_res; /* Current X position */ - int cury_res; /* Current Y position */ - int events; /* Currently enabled events */ - int click_timeout; /* Timeout between press and release events for a click (ms) */ - int multi_timeout; /* Timeout after a click for detection of multi clicks (ms) */ - int click_drift; /* Allowed "drift" during a click event */ - link_list_t input; - link_list_t output; -}; - -struct mouse_state state; -uint64_t mouse_events=0; -int ciolib_mouse_initialized=0; -static int ungot=0; -pthread_mutex_t unget_mutex; - -void init_mouse(void) -{ - memset(&state,0,sizeof(state)); - state.click_timeout=0; - state.multi_timeout=300; - listInit(&state.input,LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); - listInit(&state.output,LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); - pthread_mutex_init(&unget_mutex, NULL); - ciolib_mouse_initialized=1; -} - -void mousestate(int *x, int *y, uint8_t *buttons) -{ - if (!ciolib_mouse_initialized) { - if (x) - *x = -1; - if (y) - *y = -1; - return; - } - if (x) - *x = state.curx; - if (y) - *y = state.cury; - if (buttons) - *buttons = (state.buttonstate & 0xff); - return; -} - -void mousestate_res(int *x, int *y, uint8_t *buttons) -{ - if (!ciolib_mouse_initialized) { - if (x) - *x = -1; - if (y) - *y = -1; - return; - } - if (x) - *x = state.curx_res; - if (y) - *y = state.cury_res; - if (buttons) - *buttons = (state.buttonstate & 0xff); - return; -} - -uint64_t ciomouse_setevents(uint64_t events) -{ - mouse_events=events; - return mouse_events; -} - -uint64_t ciomouse_addevents(uint64_t events) -{ - mouse_events |= events; - return mouse_events; -} - -uint64_t ciomouse_delevents(uint64_t events) -{ - mouse_events &= ~events; - return mouse_events; -} - -uint64_t ciomouse_addevent(uint64_t event) -{ - mouse_events |= (UINT64_C(1)<<event); - return mouse_events; -} - -uint64_t ciomouse_delevent(uint64_t event) -{ - mouse_events &= ~(UINT64_C(1)<<event); - return mouse_events; -} - -void ciomouse_gotevent(int event, int x, int y, int x_res, int y_res) -{ - struct in_mouse_event *ime; - - while(!ciolib_mouse_initialized) - SLEEP(1); - ime=(struct in_mouse_event *)malloc(sizeof(struct in_mouse_event)); - if(ime) { - ime->ts=MSEC_CLOCK(); - ime->event=event; - ime->x=x; - ime->y=y; - ime->x_res=x_res; - ime->y_res=y_res; - ime->nextevent=NULL; - - listPushNode(&state.input,ime); - } -} - -void add_outevent(int event, int x, int y, int xres, int yres) -{ - struct out_mouse_event *ome; - int but; - - if(!(mouse_events & UINT64_C(1)<<event)) - return; - ome=(struct out_mouse_event *)malloc(sizeof(struct out_mouse_event)); - - if(ome) { - but=CIOLIB_BUTTON_NUMBER(event); - ome->event=event; - ome->bstate=state.buttonstate; - ome->kbsm=state.knownbuttonstatemask; - ome->startx=but?state.button_x[but-1]:state.curx; - ome->starty=but?state.button_y[but-1]:state.cury; - ome->endx=x; - ome->endy=y; - ome->startx_res=but ? state.button_x_res[but-1] : state.curx_res; - ome->starty_res=but ? state.button_y_res[but-1] : state.cury_res; - ome->endx_res=xres; - ome->endy_res=yres; - - ome->nextevent=(struct out_mouse_event *)NULL; - - listPushNode(&state.output,ome); - } -} - -int more_multies(int button, int clicks) -{ - switch(clicks) { - case 0: - if(mouse_events & (UINT64_C(1)<<CIOLIB_BUTTON_CLICK(button))) - return(1); - /* Fall-through */ - case 1: - if(mouse_events & (UINT64_C(1)<<CIOLIB_BUTTON_DBL_CLICK(button))) - return(1); - /* Fall-through */ - case 2: - if(mouse_events & (UINT64_C(1)<<CIOLIB_BUTTON_TRPL_CLICK(button))) - return(1); - /* Fall-through */ - case 3: - if(mouse_events & (UINT64_C(1)<<CIOLIB_BUTTON_QUAD_CLICK(button))) - return(1); - /* Fall-through */ - } - return(0); -} - -void ciolib_mouse_thread(void *data) -{ - int timedout; - int timeout_button=0; - int but; - int delay; - clock_t ttime=0; - - SetThreadName("Mouse"); - init_mouse(); - while(1) { - timedout=0; - if(timeout_button) { - delay=state.timeout[timeout_button-1]-MSEC_CLOCK(); - if(delay<=0) { - timedout=1; - } - else { - timedout=!listSemTryWaitBlock(&state.input,delay); - } - } - else { - listSemWait(&state.input); - } - if(timedout) { - state.timeout[timeout_button-1]=0; - switch(state.button_state[timeout_button-1]) { - case MOUSE_SINGLEPRESSED: - /* Press event */ - add_outevent(CIOLIB_BUTTON_PRESS(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_CLICKED: - /* Click Event */ - add_outevent(CIOLIB_BUTTON_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_DOUBLEPRESSED: - /* Click event, then press event */ - add_outevent(CIOLIB_BUTTON_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - add_outevent(CIOLIB_BUTTON_PRESS(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_DOUBLECLICKED: - /* Double-click event */ - add_outevent(CIOLIB_BUTTON_DBL_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_TRIPLEPRESSED: - /* Double-click event, then press event */ - add_outevent(CIOLIB_BUTTON_DBL_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - add_outevent(CIOLIB_BUTTON_PRESS(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_TRIPLECLICKED: - /* Triple-click event */ - add_outevent(CIOLIB_BUTTON_TRPL_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_QUADPRESSED: - /* Triple-click evetn then press event */ - add_outevent(CIOLIB_BUTTON_TRPL_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - add_outevent(CIOLIB_BUTTON_PRESS(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_QUADCLICKED: - add_outevent(CIOLIB_BUTTON_QUAD_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - /* Quad click event (This doesn't need a timeout does it? */ - break; - } - state.button_state[timeout_button-1]=MOUSE_NOSTATE; - } - else { - struct in_mouse_event *in; - - in=listShiftNode(&state.input); - if(in==NULL) { - YIELD(); - continue; - } - but=CIOLIB_BUTTON_NUMBER(in->event); - if (in->x < 0) - in->x = state.curx; - if (in->y < 0) - in->y = state.cury; - if (in->x_res < 0) - in->x_res = state.curx_res; - if (in->y_res < 0) - in->y_res = state.cury_res; - - switch(CIOLIB_BUTTON_BASE(in->event)) { - case CIOLIB_MOUSE_MOVE: - if(in->x==state.curx && in->y==state.cury && - in->x_res==state.curx_res && in->y_res==state.cury_res) - break; - add_outevent(CIOLIB_MOUSE_MOVE,in->x,in->y,in->x_res, in->y_res); - for(but=1;but<=5;but++) { - switch(state.button_state[but-1]) { - case MOUSE_NOSTATE: - if(state.buttonstate & CIOLIB_BUTTON(but)) { - add_outevent(CIOLIB_BUTTON_DRAG_START(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=MOUSE_DRAGSTARTED; - } - break; - case MOUSE_SINGLEPRESSED: - add_outevent(CIOLIB_BUTTON_DRAG_START(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=MOUSE_DRAGSTARTED; - break; - case MOUSE_CLICKED: - add_outevent(CIOLIB_BUTTON_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - state.button_state[but-1]=MOUSE_NOSTATE; - break; - case MOUSE_DOUBLEPRESSED: - add_outevent(CIOLIB_BUTTON_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_START(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=MOUSE_DRAGSTARTED; - break; - case MOUSE_DOUBLECLICKED: - add_outevent(CIOLIB_BUTTON_DBL_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - state.button_state[but-1]=MOUSE_NOSTATE; - break; - case MOUSE_TRIPLEPRESSED: - add_outevent(CIOLIB_BUTTON_DBL_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_START(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=MOUSE_DRAGSTARTED; - break; - case MOUSE_TRIPLECLICKED: - add_outevent(CIOLIB_BUTTON_TRPL_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - state.button_state[but-1]=MOUSE_NOSTATE; - break; - case MOUSE_QUADPRESSED: - add_outevent(CIOLIB_BUTTON_TRPL_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_START(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=MOUSE_DRAGSTARTED; - break; - case MOUSE_DRAGSTARTED: - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - break; - } - } - break; - case CIOLIB_BUTTON_1_PRESS: - state.buttonstate|=1<<(but-1); - state.knownbuttonstatemask|=1<<(but-1); - switch(state.button_state[but-1]) { - case MOUSE_NOSTATE: - state.button_state[but-1]=MOUSE_SINGLEPRESSED; - state.button_x[but-1]=in->x; - state.button_y[but-1]=in->y; - state.button_x_res[but-1]=in->x_res; - state.button_y_res[but-1]=in->y_res; - state.timeout[but-1]=MSEC_CLOCK()+state.click_timeout; - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - if(state.click_timeout==0) - state.timeout[but-1]=0; - if(!more_multies(but,0)) { - add_outevent(CIOLIB_BUTTON_PRESS(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - state.button_state[but-1]=MOUSE_NOSTATE; - state.timeout[but-1]=0; - } - // Scroll "buttons"... - if (but > 3) - state.button_state[but-1] = MOUSE_NOSTATE; - break; - case MOUSE_CLICKED: - state.button_state[but-1]=MOUSE_DOUBLEPRESSED; - state.timeout[but-1]=MSEC_CLOCK()+state.click_timeout; - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - if(state.click_timeout==0) - state.timeout[but-1]=0; - break; - case MOUSE_DOUBLECLICKED: - state.button_state[but-1]=MOUSE_TRIPLEPRESSED; - state.timeout[but-1]=MSEC_CLOCK()+state.click_timeout; - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - if(state.click_timeout==0) - state.timeout[but-1]=0; - break; - case MOUSE_TRIPLECLICKED: - state.button_state[but-1]=MOUSE_QUADPRESSED; - state.timeout[but-1]=MSEC_CLOCK()+state.click_timeout; - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - if(state.click_timeout==0) - state.timeout[but-1]=0; - break; - } - break; - case CIOLIB_BUTTON_1_RELEASE: - state.buttonstate&= ~(1<<(but-1)); - state.knownbuttonstatemask|=1<<(but-1); - switch(state.button_state[but-1]) { - case MOUSE_NOSTATE: - state.button_x[but-1]=in->x; - state.button_y[but-1]=in->y; - state.button_x_res[but-1]=in->x_res; - state.button_y_res[but-1]=in->y_res; - add_outevent(CIOLIB_BUTTON_RELEASE(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - break; - case MOUSE_SINGLEPRESSED: - state.button_state[but-1]=MOUSE_CLICKED; - state.timeout[but-1]=more_multies(but,1)?MSEC_CLOCK()+state.multi_timeout:MSEC_CLOCK(); - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - break; - case MOUSE_DOUBLEPRESSED: - state.button_state[but-1]=MOUSE_DOUBLECLICKED; - state.timeout[but-1]=more_multies(but,2)?MSEC_CLOCK()+state.multi_timeout:MSEC_CLOCK(); - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - break; - case MOUSE_TRIPLEPRESSED: - state.button_state[but-1]=MOUSE_TRIPLECLICKED; - state.timeout[but-1]=more_multies(but,3)?MSEC_CLOCK()+state.multi_timeout:MSEC_CLOCK(); - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - break; - case MOUSE_QUADPRESSED: - state.button_state[but-1]=MOUSE_NOSTATE; - add_outevent(CIOLIB_BUTTON_QUAD_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - state.timeout[but-1]=0; - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - break; - case MOUSE_DRAGSTARTED: - add_outevent(CIOLIB_BUTTON_DRAG_END(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=0; - } - } - state.curx=in->x; - state.cury=in->y; - state.curx_res=in->x_res; - state.cury_res=in->y_res; - - free(in); - } - - timeout_button=0; - for(but=1;but<=5;but++) { - if(state.button_state[but-1]==MOUSE_DRAGSTARTED && - (mouse_events & ((UINT64_C(1)<<CIOLIB_BUTTON_DRAG_START(but)) | (UINT64_C(1)<<CIOLIB_BUTTON_DRAG_MOVE(but)) | (UINT64_C(1)<<CIOLIB_BUTTON_DRAG_END(but)))) == 0) - state.button_state[but-1] = MOUSE_NOSTATE; - } - - for(but=1;but<=5;but++) { - if(state.button_state[but-1]!=MOUSE_NOSTATE - && state.button_state[but-1]!=MOUSE_DRAGSTARTED - && state.timeout[but-1]!=0 - && (timeout_button==0 || state.timeout[but-1]<ttime)) { - ttime=state.timeout[but-1]; - timeout_button=but; - } - } - } -} - -int mouse_trywait(void) -{ - int result; - - while(!ciolib_mouse_initialized) - SLEEP(1); - while(1) { - result=listSemTryWait(&state.output); - pthread_mutex_lock(&unget_mutex); - if(ungot==0) { - pthread_mutex_unlock(&unget_mutex); - return(result); - } - ungot--; - pthread_mutex_unlock(&unget_mutex); - } -} - -int mouse_wait(void) -{ - int result; - - while(!ciolib_mouse_initialized) - SLEEP(1); - while(1) { - result=listSemWait(&state.output); - pthread_mutex_lock(&unget_mutex); - if(ungot==0) { - pthread_mutex_unlock(&unget_mutex); - return(result); - } - ungot--; - pthread_mutex_unlock(&unget_mutex); - } -} - -int mouse_pending(void) -{ - while(!ciolib_mouse_initialized) - SLEEP(1); - return(listCountNodes(&state.output)); -} - -int ciolib_getmouse(struct mouse_event *mevent) -{ - int retval=0; - - while(!ciolib_mouse_initialized) - SLEEP(1); - if(listCountNodes(&state.output)) { - struct out_mouse_event *out; - out=listShiftNode(&state.output); - if(out==NULL) - return(-1); - if(mevent != NULL) { - mevent->event=out->event; - mevent->bstate=out->bstate; - mevent->kbsm=out->kbsm; - mevent->startx=out->startx; - mevent->starty=out->starty; - mevent->endx=out->endx; - mevent->endy=out->endy; - mevent->startx_res=out->startx_res; - mevent->starty_res=out->starty_res; - mevent->endx_res=out->endx_res; - mevent->endy_res=out->endy_res; - } - free(out); - } - else { - fprintf(stderr,"WARNING: attempt to get a mouse key when none pending!\n"); - if(mevent != NULL) - memset(mevent,0,sizeof(struct mouse_event)); - retval=-1; - } - return(retval); -} - -int ciolib_ungetmouse(struct mouse_event *mevent) -{ - struct mouse_event *me; - - if((me=(struct mouse_event *)malloc(sizeof(struct mouse_event)))==NULL) - return(-1); - memcpy(me,mevent,sizeof(struct mouse_event)); - pthread_mutex_lock(&unget_mutex); - if(listInsertNode(&state.output,me)==NULL) { - pthread_mutex_unlock(&unget_mutex); - return(FALSE); - } - ungot++; - pthread_mutex_unlock(&unget_mutex); - return(TRUE); -} diff --git a/ciolib/mouse.h b/ciolib/mouse.h deleted file mode 100644 index 7a8bdc1..0000000 --- a/ciolib/mouse.h +++ /dev/null @@ -1,2 +0,0 @@ -/* This header file is dead. */ -#error This file is obsolete! diff --git a/ciolib/pasteboard.h b/ciolib/pasteboard.h deleted file mode 100644 index b0b0eb9..0000000 --- a/ciolib/pasteboard.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _PASTEBOARD_H_ -#define _PASTEBOARD_H_ - -#include <stddef.h> - -void OSX_copytext(const char *text, size_t len); -char *OSX_getcliptext(void); - -#endif diff --git a/ciolib/pasteboard.m b/ciolib/pasteboard.m deleted file mode 100644 index 31dcb21..0000000 --- a/ciolib/pasteboard.m +++ /dev/null @@ -1,34 +0,0 @@ -#import <Foundation/Foundation.h> -#import <Cocoa/Cocoa.h> - -#include <stddef.h> - -void OSX_copytext(const char *text, size_t len) -{ - NSString *cp = [[NSString alloc] initWithBytes:text length:len encoding:CFStringConvertEncodingToNSStringEncoding(CFStringConvertWindowsCodepageToEncoding(437))]; - if (cp != nil) { - NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; - [pasteboard clearContents]; - NSArray *copiedObjects = [NSArray arrayWithObject:cp]; - [pasteboard writeObjects:copiedObjects]; - } - [cp release]; -} - -char *OSX_getcliptext(void) -{ - NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; - NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; - NSDictionary *options = [NSDictionary dictionary]; - BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options]; - if (ok) { - NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options]; - NSString *ct = [objectsToPaste objectAtIndex:0]; - if (ct != nil) { - const char *ptr = [ct cStringUsingEncoding:CFStringConvertEncodingToNSStringEncoding(CFStringConvertWindowsCodepageToEncoding(437))]; - if (ptr) - return strdup(ptr); - } - } - return NULL; -} diff --git a/ciolib/petscii.c b/ciolib/petscii.c deleted file mode 100644 index 597d55c..0000000 --- a/ciolib/petscii.c +++ /dev/null @@ -1,218 +0,0 @@ -#include "ciolib.h" - -struct ascii_trans { - unsigned char native; - unsigned char cp437; -}; - -struct key_trans { - int keypress; - int translated; -}; - -struct ascii_trans display_petscii[] = { - {32,' '} - ,{33,'!'} - ,{34,'"'} - ,{35,'#'} - ,{36,'$'} - ,{37,'%'} - ,{38,'&'} - ,{39,'\''} - ,{40,'('} - ,{41,')'} - ,{42,'*'} - ,{43,'+'} - ,{44,','} - ,{45,'-'} - ,{46,'.'} - ,{47,'/'} - ,{48,'0'} - ,{49,'1'} - ,{50,'2'} - ,{51,'3'} - ,{52,'4'} - ,{53,'5'} - ,{54,'6'} - ,{55,'7'} - ,{56,'8'} - ,{57,'9'} - ,{58,':'} - ,{59,';'} - ,{60,'<'} - ,{61,'='} - ,{62,'>'} - ,{63,'?'} - ,{64,'@'} - ,{65,'a'} - ,{66,'b'} - ,{67,'c'} - ,{68,'d'} - ,{69,'e'} - ,{70,'f'} - ,{71,'g'} - ,{72,'h'} - ,{73,'i'} - ,{74,'j'} - ,{75,'k'} - ,{76,'l'} - ,{77,'m'} - ,{78,'n'} - ,{79,'o'} - ,{80,'p'} - ,{81,'q'} - ,{82,'r'} - ,{83,'s'} - ,{84,'t'} - ,{85,'u'} - ,{86,'v'} - ,{87,'w'} - ,{88,'x'} - ,{89,'y'} - ,{90,'z'} - ,{91,'['} - ,{92,156} - ,{93,']'} - ,{94,24} - ,{95,27} - ,{96,196} - ,{97,'A'} - ,{98,'B'} - ,{99,'C'} - ,{100,'D'} - ,{101,'E'} - ,{102,'F'} - ,{103,'G'} - ,{104,'H'} - ,{105,'I'} - ,{106,'J'} - ,{107,'K'} - ,{108,'L'} - ,{109,'M'} - ,{110,'N'} - ,{111,'O'} - ,{112,'P'} - ,{113,'Q'} - ,{114,'R'} - ,{115,'S'} - ,{116,'T'} - ,{117,'U'} - ,{118,'V'} - ,{119,'W'} - ,{120,'X'} - ,{121,'Y'} - ,{122,'Z'} - ,{123,197} - ,{124,181} ///* Left side fine 50% checker */ - ,{125,179} - ,{126,178} ///* Course 50% checker */ - ,{127,176} ///* Horizontal cross-hatch (light shade) */ - ,{160,255} - ,{161,221} - ,{162,220} - ,{163,'^'} /* Row 1 set */ - ,{164,'_'} ///* Row 8 set */ - ,{165,'{'} /* Col 1 set */ - ,{166,177} ///* Fine 50% checker */ - ,{167,'}'} /* Col 8 set */ - ,{168,210} ///* Bottom fine 50% checker */ - ,{169,31} /* Top left half set */ - ,{170,245} /* Cols 7 & 8 set */ - ,{171,195} - ,{172,201} ///* Bottom right quadrant set */ - ,{173,192} - ,{174,191} - ,{175,205} /* Rows 7 & 8 set */ - ,{176,218} - ,{177,193} - ,{178,194} - ,{179,180} - ,{180,244} /* Cols 1 & 2 set */ - ,{181,185} /* Cols 1, 2, & 3 set */ - ,{182,222} /* Cols 6, 7, & 8 set */ - ,{183,169} /* Rows 1 & 2 set */ - ,{184,223} /* Rows 1, 2, & 3 set */ - ,{185,22} /* Rows 6, 7, & 8 set */ - ,{186,251} - ,{187,187} ///* Bottom left quadrant set */ - ,{188,200} ///* Top right quadrant set */ - ,{189,217} - ,{190,188} ///* Top left quadrant set */ - ,{191,206} /* Top left and bottom right quadrants set */ -}; - -struct key_trans input_petscii[] = { - {'A', 'a'} - ,{'B', 'b'} - ,{'C', 'c'} - ,{'D', 'd'} - ,{'E', 'e'} - ,{'F', 'f'} - ,{'G', 'g'} - ,{'H', 'h'} - ,{'I', 'i'} - ,{'J', 'j'} - ,{'K', 'k'} - ,{'L', 'l'} - ,{'M', 'm'} - ,{'N', 'n'} - ,{'O', 'o'} - ,{'P', 'p'} - ,{'Q', 'q'} - ,{'R', 'r'} - ,{'S', 's'} - ,{'T', 't'} - ,{'U', 'u'} - ,{'V', 'v'} - ,{'W', 'w'} - ,{'X', 'x'} - ,{'Y', 'y'} - ,{'Z', 'z'} - ,{'a', 'A'} - ,{'b', 'B'} - ,{'c', 'C'} - ,{'d', 'D'} - ,{'e', 'E'} - ,{'f', 'F'} - ,{'g', 'G'} - ,{'h', 'H'} - ,{'i', 'I'} - ,{'j', 'J'} - ,{'k', 'K'} - ,{'l', 'L'} - ,{'m', 'M'} - ,{'n', 'N'} - ,{'o', 'O'} - ,{'p', 'P'} - ,{'q', 'Q'} - ,{'r', 'R'} - ,{'s', 'S'} - ,{'t', 'T'} - ,{'u', 'U'} - ,{'v', 'V'} - ,{'w', 'W'} - ,{'x', 'X'} - ,{'y', 'Y'} - ,{'z', 'Z'} - ,{'\n',141} - ,{CIO_KEY_DOWN, 17} - ,{CIO_KEY_HOME, 19} - ,{CIO_KEY_DC, 20} - ,{'\b', 20} - ,{CIO_KEY_RIGHT, 29} - ,{CIO_KEY_F(1), 133} - ,{CIO_KEY_F(3), 134} - ,{CIO_KEY_F(5), 135} - ,{CIO_KEY_F(7), 136} - ,{CIO_KEY_F(2), 137} - ,{CIO_KEY_F(4), 138} - ,{CIO_KEY_F(6), 139} - ,{CIO_KEY_F(8), 140} - ,{CIO_KEY_UP, 145} - ,{CIO_KEY_IC, 148} - ,{CIO_KEY_LEFT, 157} - ,{CIO_KEY_END, 147} - ,{CIO_KEY_PPAGE, 131} - ,{CIO_KEY_NPAGE, 3} -}; - diff --git a/ciolib/scale.c b/ciolib/scale.c deleted file mode 100644 index 6a9154c..0000000 --- a/ciolib/scale.c +++ /dev/null @@ -1,893 +0,0 @@ -#include <math.h> -#include <stdbool.h> -#include <stdlib.h> -#include <stdio.h> - -#include "ciolib.h" -#include "scale.h" -#include "xbr.h" - -uint32_t r2y[1<<24]; -uint32_t y2r[1<<24]; -static int r2y_inited; - -static void pointy_scale3(uint32_t* src, uint32_t* dest, int width, int height); -static void pointy_scale5(uint32_t* src, uint32_t* dest, int width, int height); -static void pointy_scale_odd(uint32_t* src, uint32_t* dest, int width, int height, int mult); -static void interpolate_height(uint32_t* src, uint32_t* dst, int width, int height, int newheight); -static void interpolate_width(uint32_t* src, uint32_t* dst, int width, int height, int newwidth); -static void multiply_scale(uint32_t* src, uint32_t* dst, int width, int height, int xmult, int ymult); - -static struct graphics_buffer *free_list; - -#define CLAMP(x) do { \ - if (x < 0) \ - x = 0; \ - else if (x > 255) \ - x = 255; \ -} while(0) - -/* - * Corrects width/height to have the specified aspect ratio - */ -void -aspect_fix(int *x, int *y, int aspect_width, int aspect_height) -{ - int bestx, besty; - - // Nothing we can do here... - if (aspect_width == 0 || aspect_height == 0) - return; - bestx = lround((double)*y * aspect_width / aspect_height); - besty = lround((double)*x * aspect_height / aspect_width); - - if (bestx < *x && bestx > 0) - *x = bestx; - else - *y = besty; -} - -/* - * Given a width/height of a source image, adjust it to match the current aspect - * ratio. Will not reduce either number - */ -void -aspect_correct(int *x, int *y, int aspect_width, int aspect_height) -{ - int width = *x; - int height; - - if (!aspect_height || !aspect_width) - return; - height = lround((double)(width * aspect_height) / aspect_width); - if (height < *y) { - height = *y; - width = lround(((double)height * aspect_width) / aspect_height); - } - - *x = width; - *y = height; -} - -/* - * Essentially the opposite of the above. Given an output width/height, translates to - * the size of the source image. - * - * Note that this is much trickier as the "source" bitmap may have been integer scaled - * differently in both directions... so what this does is reverse the aspect ratio - * calculation, then find the next lowest even multiple of the mode bitmap size. - */ -void -aspect_reverse(int *x, int *y, int scrnwidth, int scrnheight, int aspect_width, int aspect_height) -{ - int width = *x; - int height = *y; - int cheight; - int cwidth; - - if (!aspect_height || !aspect_width) { - width = scrnwidth * (*x / scrnwidth); - if (width < scrnwidth) - width = scrnwidth; - height = scrnheight * (*x / scrnheight); - if (height < scrnheight) - height = scrnheight; - return; - } - // First, find the "controlling" dimension... the one that won't be scaled (ie: the one that gets smaller) - cwidth = lround((double)(height * aspect_width) / aspect_height * scrnwidth / scrnheight); - cheight = lround((double)(width * aspect_height) / aspect_width * scrnheight / scrnwidth); - if (cwidth > width) { - // Width controls, so this is simply finding the largest width multiple that fits in the box - width = scrnwidth * (*x / scrnwidth); - if (width < scrnwidth) - width = scrnwidth; - - // Now we need to find the largest bitmap height that would fit in the output height - // So, we scale the height to bitmap size... - height = lround((double)*y / ((double)scrnwidth / scrnheight) * ((double)aspect_width / aspect_height)); - // And do the same calculation... - height = lround((double)scrnheight * ((double)height / scrnheight)); - } - else if (cheight > height) { - // Height controls - height = scrnheight * (*x / scrnheight); - if (height < scrnheight) - height = scrnheight; - - width = lround((double)*x / ((double)scrnheight / scrnwidth) * ((double)aspect_height / aspect_width)); - width = lround((double)scrnwidth * ((double)width / scrnwidth)); - } - - *x = width; - *y = height; -} - -void -init_r2y(void) -{ - int r, g, b; - int y, u, v; - const double luma = 255.0 / 219; - const double col = 255.0 / 224; - - if (r2y_inited) - return; - for (r = 0; r < 256; r++) { - for (g = 0; g < 256; g++) { - for (b = 0; b < 256; b++) { - y = 16 + ( 65.738 * r + 129.057 * g + 25.064 * b + 128) / 256; - CLAMP(y); - u = 128 + (-37.945 * r - 74.494 * g + 112.439 * b + 128) / 256; - CLAMP(u); - v = 128 + (112.439 * r - 94.154 * g - 18.285 * b + 128) / 256; - CLAMP(v); - - r2y[(r<<16) | (g<<8) | b] = (y<<16)|(u<<8)|v; - } - } - } - for (y = 0; y < 256; y++) { - for (u = 0; u < 256; u++) { - for (v = 0; v < 256; v++) { - const int c = y - 16; - const int d = u - 128; - const int e = v - 128; - r = luma * c + col * 1.402 * e; - CLAMP(r); - g = luma * c - col * 1.772 * (0.114 / 0.587) * d - col * 1.402 * (0.299 / 0.587) * e; - CLAMP(g); - b = luma * c + col * 1.772 * d; - CLAMP(b); - - y2r[(y<<16) | (u<<8) | v] = (r<<16)|(g<<8)|b; - } - } - } - r2y_inited = 1; -} - -struct graphics_buffer * -get_buffer(void) -{ - struct graphics_buffer* ret = NULL; - - if (free_list) { - ret = free_list; - free_list = free_list->next; - ret->next = NULL; - return ret; - } - - ret = calloc(1, sizeof(struct graphics_buffer)); - return ret; -} - -void -release_buffer(struct graphics_buffer *buf) -{ - if (buf == NULL) - return; - buf->next = free_list; - free_list = buf; -} - -struct graphics_buffer * -do_scale(struct rectlist* rect, int xscale, int yscale, int aspect_width, int aspect_height) -{ - struct graphics_buffer* ret1 = get_buffer(); - struct graphics_buffer* ret2 = get_buffer(); - int pointymult = 1; - int pointy5 = 0; - int pointy3 = 0; - int xbr2 = 0; - int xbr4 = 0; - int ymult = 1; - int xmult = 1; - int total_xscaling = 1; - int total_yscaling = 1; - struct graphics_buffer *ctarget; - struct graphics_buffer *csrc; - uint32_t* nt; - int fheight; - int fwidth; - bool swapxy = false; - - if (xscale > yscale) { - swapxy = true; - total_xscaling = xscale; - xscale = yscale; - yscale = total_xscaling; - } - total_xscaling = xscale; - xscale = 1; - total_yscaling = yscale; - yscale = 1; - // If x/y scaling isn't a simple multiple, block scale everything... - if ((total_yscaling % total_xscaling) == 0) { - if (!(cio_api.options & CONIO_OPT_BLOCKY_SCALING)) { - if ((total_xscaling & 1) == 1 && total_xscaling > 5) { - pointymult = total_xscaling; - total_xscaling /= pointymult; - xscale *= pointymult; - total_yscaling /= pointymult; - yscale *= pointymult; - } - while (total_xscaling > 1 && ((total_xscaling % 5) == 0) && ((total_yscaling % 5) == 0)) { - pointy5++; - total_xscaling /= 5; - xscale *= 5; - total_yscaling /= 5; - yscale *= 5; - } - while (total_xscaling > 1 && ((total_xscaling % 3) == 0) && ((total_yscaling % 3) == 0)) { - pointy3++; - total_xscaling /= 3; - xscale *= 3; - total_yscaling /= 3; - yscale *= 3; - } - while (total_xscaling > 1 && ((total_xscaling % 4) == 0) && ((total_yscaling % 4) == 0)) { - xbr4++; - total_xscaling /= 4; - xscale *= 4; - total_yscaling /= 4; - yscale *= 4; - } - while (total_xscaling > 1 && ((total_xscaling % 2) == 0) && ((total_yscaling % 2) == 0)) { - xbr2++; - total_xscaling /= 2; - xscale *= 2; - total_yscaling /= 2; - yscale *= 2; - } - } - } - - xmult = total_xscaling; - xscale *= xmult; - total_xscaling = 1; - - ymult = total_yscaling; - yscale *= ymult; - total_yscaling = 1; - - if (swapxy) { - int tmp; - - tmp = ymult; - ymult = xmult; - xmult = tmp; - - tmp = xscale; - xscale = yscale; - yscale = tmp; - } - - // Calculate the scaled height from rxscaleatio... - fwidth = rect->rect.width * xscale; - fheight = rect->rect.height * yscale; - aspect_correct(&fwidth, &fheight, aspect_width, aspect_height); - - // Now make sure target is big enough... - size_t needsz = fwidth * fheight * sizeof(uint32_t); - if (needsz > ret1->sz) { - nt = realloc(ret1->data, needsz); - if (nt == NULL) { - release_buffer(ret1); - release_buffer(ret2); - return NULL; - } - ret1->data = nt; - ret1->sz = needsz; - } - - if (needsz > ret2->sz) { - nt = realloc(ret2->data, needsz); - if (nt == NULL) { - release_buffer(ret1); - release_buffer(ret2); - return NULL; - } - ret2->data = nt; - ret2->sz = needsz; - } - - // Copy rect into first buffer - // TODO: Unify bitmap rects and scaling buffers so this can just whomp on over. - csrc = ret1; - ctarget = ret2; - memcpy(csrc->data, rect->data, rect->rect.width * rect->rect.height * sizeof(rect->data[0])); - csrc->w = rect->rect.width; - csrc->h = rect->rect.height; - -#if 0 -fprintf(stderr, "Plan:\n" -"start: %dx%d\n" -"pointymulti: %d\n" -"pointy5: %d\n" -"pointy3: %d\n" -"xBR4: %d\n" -"xBR2: %d\n" -"Multiply: %dx%d\n" -"hinterp: %zu -> %zu\n" -"winterp: %zu -> %zu\n", -csrc->w, csrc->h, pointymult, pointy5, pointy3, xbr4, xbr2, xmult, ymult, csrc->h * yscale, fheight, csrc->w * xscale, fwidth); -#endif - // And scale... - if (ymult != 1 || xmult != 1) { - multiply_scale(csrc->data, ctarget->data, csrc->w, csrc->h, xmult, ymult); - ctarget->w = csrc->w * xmult; - ctarget->h = csrc->h * ymult; - ymult = 1; - xmult = 1; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - if (pointymult > 1 && pointymult & 1) { - pointy_scale_odd(csrc->data, ctarget->data, csrc->w, csrc->h, pointymult); - ctarget->w = csrc->w * pointymult; - ctarget->h = csrc->h * pointymult; - pointymult = 1; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - while (pointy5 > 0) { - pointy_scale5(csrc->data, ctarget->data, csrc->w, csrc->h); - pointy5--; - ctarget->w = csrc->w * 5; - ctarget->h = csrc->h * 5; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - while (pointy3 > 0) { - pointy_scale3(csrc->data, ctarget->data, csrc->w, csrc->h); - pointy3--; - ctarget->w = csrc->w * 3; - ctarget->h = csrc->h * 3; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - while (xbr4 > 0) { - xbr_filter(csrc->data, ctarget->data, csrc->w, csrc->h, 4); - xbr4--; - ctarget->w = csrc->w * 4; - ctarget->h = csrc->h * 4; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - while (xbr2 > 0) { - xbr_filter(csrc->data, ctarget->data, csrc->w, csrc->h, 2); - xbr2--; - ctarget->w = csrc->w * 2; - ctarget->h = csrc->h * 2; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - - // And finally, interpolate if needed - if (fheight != csrc->h) { - interpolate_height(csrc->data, ctarget->data, csrc->w, csrc->h, fheight); - ctarget->h = fheight; - ctarget->w = csrc->w; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - - if (fwidth != csrc->w) { - interpolate_width(csrc->data, ctarget->data, csrc->w, csrc->h, fwidth); - ctarget->h = csrc->h; - ctarget->w = fwidth; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - - release_buffer(ctarget); - return csrc; -} - -static void -pointy_scale_odd(uint32_t* src, uint32_t* dest, int width, int height, int mult) -{ - int x, y; - uint32_t* s; - uint32_t* d; - int prevline, prevcol, nextline, nextcol; - int i, j; - int mid = mult / 2; - int multoff = mult - 1; - int dline = width * mult; - int dbott; - int dstripe = dline * mult; - - s = src; - d = dest; - prevline = 0; - nextline = width; - for (y = 0; y < height; y++) { - if (y == height - 1) - nextline = 0; - prevcol = 0; - nextcol = 1; - for (x = 0; x < width; x++) { - if (x == width - 1) - nextcol = 0; - - for (i = 0; i < mid; i++) { - d = &dest[dstripe * y + dline * i + x * mult]; - dbott = dline * (multoff - i * 2); - - for (j = 0; j < mid - i; j++) { - if (s[prevline + prevcol] == s[0]) { - d[j] = s[0]; - } - else if (s[prevline] == s[prevcol]) { - d[j] = s[prevcol]; - } - else { - d[j] = s[0]; - } - - if (s[prevline + nextcol] == s[0]) { - d[multoff - j] = s[0]; - } - else if (s[prevline] == s[nextcol]) { - d[multoff - j] = s[nextcol]; - } - else { - d[multoff - j] = s[0]; - } - - if (s[prevcol + nextline] == s[0]) { - d[dbott + j] = s[0]; - } - else if(s[prevcol] == s[nextline]) { - d[dbott + j] = s[prevcol]; - } - else { - d[dbott + j] = s[0]; - } - - if (s[nextcol + nextline] == s[0]) { - d[dbott + multoff - j] = s[0]; - } - else if (s[nextcol] == s[nextline]) { - d[dbott + multoff - j] = s[nextcol]; - } - else { - d[dbott + multoff - j] = s[0]; - } - } - - // And the rest is always kept the same - for (; j < mid; j++) { - d[j] = s[0]; - d[multoff - j] = s[0]; - d[dbott + j] = s[0]; - d[dbott + multoff - j] = s[0]; - } - - // And the middle dot. - d[j] = s[0]; - d[dbott + j] = s[0]; - } - - d = &dest[dstripe * y + dline * i + x * mult]; - - for (j = 0; j < mid; j++) { - d[j] = s[0]; - d[multoff - j] = s[0]; - } - d[j] = s[0]; - - s++; - - if (x == 0) - prevcol = -1; - } - if (y == 0) - prevline = -width; - } -} - -static void -pointy_scale5(uint32_t* src, uint32_t* dest, int width, int height) -{ - int x, y; - uint32_t* s; - uint32_t* d; - int w5 = width * 5; - int w10 = width * 10; - int w15 = width * 15; - int w20 = width * 20; - int prevline, prevcol, nextline, nextcol; - - s = src; - d = dest; - prevline = 0; - nextline = width; - for (y = 0; y < height; y++) { - if (y == height - 1) - nextline = 0; - prevcol = 0; - nextcol = 1; - for (x = 0; x < width; x++) { - if (x == width - 1) - nextcol = 0; - - if (s[prevline + prevcol] == s[0]) { - d[0] = s[0]; - d[1] = s[0]; - d[w5] = s[0]; - } - else if (s[prevcol] == s[prevline]) { - d[0] = s[prevcol]; - d[1] = s[prevcol]; - d[w5] = s[prevcol]; - } - else { - d[0] = *s; - d[1] = *s; - d[w5] = *s; - } - - // Top-middle stays OG. - d[2] = *s; - d[w5+1] = *s; - d[w5+2] = *s; - d[w5+3] = *s; - - // And so on around the outside (round the outside) - if (s[prevline + nextcol] == s[0]) { - d[3] = s[0]; - d[4] = s[0]; - d[w5 + 4] = s[0]; - } - else if (s[nextcol] == s[prevline]) { - d[3] = s[nextcol]; - d[4] = s[nextcol]; - d[w5 + 4] = s[nextcol]; - } - else { - d[3] = s[0]; - d[4] = s[0]; - d[w5 + 4] = s[0]; - } - - d[w10] = *s; - d[w10+1] = *s; - d[w10+2] = *s; - d[w10+3] = *s; - d[w10+4] = *s; - - if (s[prevcol + nextline] == s[0]) { - d[w15] = s[0]; - d[w20] = s[0]; - d[w20 + 1] = s[0]; - } - else if(s[prevcol] == s[nextline]) { - d[w15] = s[prevcol]; - d[w20] = s[prevcol]; - d[w20 + 1] = s[prevcol]; - } - else { - d[w15] = s[0]; - d[w20] = s[0]; - d[w20 + 1] = s[0]; - } - - d[w15 + 1] = *s; - d[w15 + 2] = *s; - d[w15 + 3] = *s; - d[w20 + 2] = *s; - - if (s[nextcol + nextline] == s[0]) { - d[w15 + 4] = s[0]; - d[w20 + 3] = s[0]; - d[w20 + 4] = s[0]; - } - else if (s[nextcol] == s[nextline]) { - d[w15 + 4] = s[nextcol]; - d[w20 + 3] = s[nextcol]; - d[w20 + 4] = s[nextcol]; - } - else { - d[w15 + 4] = s[0]; - d[w20 + 3] = s[0]; - d[w20 + 4] = s[0]; - } - - d += 5; - s++; - - if (x == 0) - prevcol = -1; - } - d += w20; - if (y == 0) - prevline = -width; - } -} - -static void -pointy_scale3(uint32_t* src, uint32_t* dest, int width, int height) -{ - int x, y; - uint32_t* s; - uint32_t* d; - int w3 = width * 3; - int w6 = width * 6; - int prevline, prevcol, nextline, nextcol; - - s = src; - d = dest; - prevline = 0; - nextline = width; - for (y = 0; y < height; y++) { - if (y == height - 1) - nextline = 0; - prevcol = 0; - nextcol = 1; - for (x = 0; x < width; x++) { - if (x == width - 1) - nextcol = 0; - - // Top-left is filled if both left and top are the same. - if (s[prevline + prevcol] == s[0]) - d[0] = s[0]; - else if (s[prevcol] == s[prevline]) - d[0] = s[prevcol]; - else - d[0] = *s; - - // Top-middle stays OG. - d[1] = *s; - - // And so on around the outside (round the outside) - if (s[prevline + nextcol] == s[0]) - d[2] = s[0]; - else if (s[nextcol] == s[prevline]) - d[2] = s[nextcol]; - else - d[2] = *s; - - d[w3] = *s; - d[w3 + 1] = *s; - d[w3 + 2] = *s; - - if (s[prevcol + nextline] == s[0]) - d[w6] = s[0]; - else if(s[prevcol] == s[nextline]) - d[w6] = s[prevcol]; - else - d[w6] = *s; - - d[w6 + 1] = *s; - - if (s[nextcol + nextline] == s[0]) - d[w6 + 2] = s[0]; - else if (s[nextcol] == s[nextline]) - d[w6 + 2] = s[nextcol]; - else - d[w6 + 2] = s[0]; - - d += 3; - s++; - - if (x == 0) - prevcol = -1; - } - d += w6; - if (y == 0) - prevline = -width; - } -} - -static uint32_t -blend(const uint32_t c1, const uint32_t c2, int weight) -{ - uint8_t yuv1[4]; - uint8_t yuv2[4]; - uint8_t yuv3[4]; - const double iw = 256 - weight; - - *(uint32_t *)yuv1 = r2y[c1]; - *(uint32_t *)yuv2 = r2y[c2]; -#ifdef __BIG_ENDIAN__ - yuv3[0] = 0; - yuv3[1] = (yuv1[1] * iw + yuv2[1] * weight) / 256; - yuv3[2] = (yuv1[2] * iw + yuv2[2] * weight) / 256; - yuv3[3] = (yuv1[3] * iw + yuv2[3] * weight) / 256; -#else - yuv3[3] = 0; - yuv3[2] = (yuv1[2] * iw + yuv2[2] * weight) / 256; - yuv3[1] = (yuv1[1] * iw + yuv2[1] * weight) / 256; - yuv3[0] = (yuv1[0] * iw + yuv2[0] * weight) / 256; -#endif - - return y2r[*(uint32_t*)yuv3]; -} - -/* - * This does non-integer *width* scaling. It does not scale in the other - * direction. This does the interpolation using Y'UV to prevent dimming of - * pixels. - */ -static void -interpolate_width(uint32_t* src, uint32_t* dst, int width, int height, int newwidth) -{ - int x, y; - const double mult = (double)width / newwidth; - - for (y = 0; y < height; y++) { - for (x = 0; x < newwidth; x++) { - // First, calculate which two pixels this is between. - const double xpos = mult * x; - const int xposi = xpos; - if (x == xpos) { - // Exact match! - *dst = src[width * y + x]; - } - else { - const double weight = xpos - xposi; - // Now pick the two pixels - const uint32_t pix1 = src[y * width + xposi]; - uint32_t pix2; - if (xposi < width - 1) - pix2 = src[y * width + xposi + 1]; - else - pix2 = src[y * width + xposi]; - if (pix1 == pix2) - *dst = pix1; - else { - *dst = blend(pix1, pix2, weight); - } - } - dst++; - } - } -} - -/* - * This does non-integer *height* scaling. It does not scale in the other - * direction. This does the interpolation using Y'UV to prevent dimming of - * pixels. - */ -static void -interpolate_height(uint32_t* src, uint32_t* dst, int width, int height, int newheight) -{ - int x, y; - const double mult = (double)height / newheight; - double ypos = 0; - int last_yposi = 0; - int ywn = width; - static uint32_t *nline = NULL; - static uint32_t *tline = NULL; - static size_t nsz = 0; - static size_t tsz = 0; - uint32_t *stmp; - - if (nsz < width * 4) { - stmp = realloc(nline, width * 4); - if (stmp == NULL) - goto fail; - nline = stmp; - nsz = width * 4; - } - if (tsz < width * 4) { - stmp = realloc(tline, width * 4); - if (stmp == NULL) - goto fail; - tline = stmp; - tsz = width * 4; - } - - memcpy(tline, src, width * sizeof(*tline)); - memcpy(nline, src + width, width * sizeof(*tline)); - for (y = 0; y < newheight; y++) { - const int yposi = ypos; - if (yposi != last_yposi) { - ywn += width; - last_yposi = yposi; - stmp = tline; - tline = nline; - nline = stmp; - memcpy(nline, &src[ywn], nsz); - } - if (y == ypos || yposi >= height - 1) { - memcpy(dst, tline, tsz); - dst += width; - } - else { - const uint8_t weight = ypos * 256; - for (x = 0; x < width; x++) { - // Now pick the two pixels - const uint32_t pix1 = tline[x]; - const uint32_t pix2 = nline[x]; - if (pix1 == pix2) - *dst = pix1; - else - *dst = blend(pix1, pix2, weight); - dst++; - } - } - ypos += mult; - } - - return; -fail: - free(nline); - free(tline); - nline = NULL; - tline = NULL; - nsz = 0; - tsz = 0; - memcpy(src, dst, width * height * sizeof(*src)); - fprintf(stderr, "Allocation failure in interpolate_height()!"); -} - -static void -multiply_scale(uint32_t* src, uint32_t* dst, int width, int height, int xmult, int ymult) -{ - int x, y; - int mx, my; - uint32_t* slstart; - - for (y = 0; y < height; y++) { - slstart = src; - for (my = 0; my < ymult; my++) { - src = slstart; - for (x = 0; x < width; x++) { - for (mx = 0; mx < xmult; mx++) { - *dst = *src; - dst++; - } - src++; - } - } - } -} diff --git a/ciolib/scale.h b/ciolib/scale.h deleted file mode 100644 index efead79..0000000 --- a/ciolib/scale.h +++ /dev/null @@ -1,21 +0,0 @@ -#include "bitmap_con.h" - -struct graphics_buffer { - uint32_t* data; - size_t sz; - size_t w; - size_t h; - struct graphics_buffer *next; -}; - -extern uint32_t r2y[1<<24]; -extern uint32_t y2r[1<<24]; - -struct graphics_buffer * get_buffer(void); -void release_buffer(struct graphics_buffer *); -void init_r2y(void); - -struct graphics_buffer * do_scale(struct rectlist* rect, int xscale, int yscale, int aspect_width, int aspect_height); -void aspect_correct(int *x, int *y, int aspect_width, int aspect_height); -void aspect_reverse(int *x, int *y, int scrnwidth, int scrnheight, int aspect_width, int aspect_height); -void aspect_fix(int *x, int *y, int aspect_width, int aspect_height); diff --git a/ciolib/sdl_con.c b/ciolib/sdl_con.c deleted file mode 100644 index 01fe454..0000000 --- a/ciolib/sdl_con.c +++ /dev/null @@ -1,1300 +0,0 @@ -#include <math.h> -#include <stdarg.h> -#include <stdbool.h> -#include <stdio.h> /* NULL */ -#include <stdlib.h> -#include <string.h> - -#include "gen_defs.h" -#include "genwrap.h" -#include "dirwrap.h" -#include "xpbeep.h" -#include "threadwrap.h" -#include <xp_dl.h> - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#include "utf8_codepages.h" -#include "vidmodes.h" -#define BITMAP_CIOLIB_DRIVER -#include "bitmap_con.h" -#include "scale.h" - -#include "SDL.h" - -#include "sdlfuncs.h" - -int bitmap_width,bitmap_height; - -/* 256 bytes so I can cheat */ -unsigned char sdl_keybuf[256]; /* Keyboard buffer */ -unsigned char sdl_key=0; /* Index into keybuf for next key in buffer */ -unsigned char sdl_keynext=0; /* Index into keybuf for next free position */ - -int sdl_exitcode=0; - -bool internal_scaling = true; // Protected by the win mutex - -SDL_Window *win=NULL; -SDL_Cursor *curs=NULL; -SDL_Renderer *renderer=NULL; -SDL_Texture *texture=NULL; -pthread_mutex_t win_mutex; -SDL_Surface *sdl_icon=NULL; - -sem_t sdl_ufunc_ret; -sem_t sdl_ufunc_rec; -pthread_mutex_t sdl_ufunc_mtx; -int sdl_ufunc_retval; - -sem_t sdl_flush_sem; -int pending_updates=0; - -int fullscreen=0; - -int sdl_init_good=0; -pthread_mutex_t sdl_keylock; -sem_t sdl_key_pending; -static unsigned int sdl_pending_mousekeys=0; - -static struct video_stats cvstat; - -struct sdl_keyvals { - int keysym - ,key - ,shift - ,ctrl - ,alt; -}; - -static pthread_mutex_t sdl_headlock; -static struct rectlist *update_list = NULL; -static struct rectlist *update_list_tail = NULL; - -enum { - SDL_USEREVENT_FLUSH - ,SDL_USEREVENT_SETTITLE - ,SDL_USEREVENT_SETNAME - ,SDL_USEREVENT_SETICON - ,SDL_USEREVENT_SETVIDMODE - ,SDL_USEREVENT_SHOWMOUSE - ,SDL_USEREVENT_HIDEMOUSE - ,SDL_USEREVENT_INIT - ,SDL_USEREVENT_QUIT - ,SDL_USEREVENT_GETWINPOS - ,SDL_USEREVENT_MOUSEPOINTER -}; - -const struct sdl_keyvals sdl_keyval[] = -{ - {SDLK_BACKSPACE, 0x08, 0x08, 0x7f, 0x0e00}, - {SDLK_TAB, 0x09, 0x0f00, 0x9400, 0xa500}, - {SDLK_RETURN, 0x0d, 0x0d, 0x0a, 0xa600}, - {SDLK_ESCAPE, 0x1b, 0x1b, 0x1b, 0x0100}, - {SDLK_SPACE, 0x20, 0x20, 0x0300, 0x20}, - {SDLK_0, '0', ')', 0, 0x8100}, - {SDLK_1, '1', '!', 0, 0x7800}, - {SDLK_2, '2', '@', 0x0300, 0x7900}, - {SDLK_3, '3', '#', 0, 0x7a00}, - {SDLK_4, '4', '$', 0, 0x7b00}, - {SDLK_5, '5', '%', 0, 0x7c00}, - {SDLK_6, '6', '^', 0x1e, 0x7d00}, - {SDLK_7, '7', '&', 0, 0x7e00}, - {SDLK_8, '8', '*', 0, 0x7f00}, - {SDLK_9, '9', '(', 0, 0x8000}, - {SDLK_a, 'a', 'A', 0x01, 0x1e00}, - {SDLK_b, 'b', 'B', 0x02, 0x3000}, - {SDLK_c, 'c', 'C', 0x03, 0x2e00}, - {SDLK_d, 'd', 'D', 0x04, 0x2000}, - {SDLK_e, 'e', 'E', 0x05, 0x1200}, - {SDLK_f, 'f', 'F', 0x06, 0x2100}, - {SDLK_g, 'g', 'G', 0x07, 0x2200}, - {SDLK_h, 'h', 'H', 0x08, 0x2300}, - {SDLK_i, 'i', 'I', 0x09, 0x1700}, - {SDLK_j, 'j', 'J', 0x0a, 0x2400}, - {SDLK_k, 'k', 'K', 0x0b, 0x2500}, - {SDLK_l, 'l', 'L', 0x0c, 0x2600}, - {SDLK_m, 'm', 'M', 0x0d, 0x3200}, - {SDLK_n, 'n', 'N', 0x0e, 0x3100}, - {SDLK_o, 'o', 'O', 0x0f, 0x1800}, - {SDLK_p, 'p', 'P', 0x10, 0x1900}, - {SDLK_q, 'q', 'Q', 0x11, 0x1000}, - {SDLK_r, 'r', 'R', 0x12, 0x1300}, - {SDLK_s, 's', 'S', 0x13, 0x1f00}, - {SDLK_t, 't', 'T', 0x14, 0x1400}, - {SDLK_u, 'u', 'U', 0x15, 0x1600}, - {SDLK_v, 'v', 'V', 0x16, 0x2f00}, - {SDLK_w, 'w', 'W', 0x17, 0x1100}, - {SDLK_x, 'x', 'X', 0x18, 0x2d00}, - {SDLK_y, 'y', 'Y', 0x19, 0x1500}, - {SDLK_z, 'z', 'Z', 0x1a, 0x2c00}, - {SDLK_PAGEUP, 0x4900, 0x4900, 0x8400, 0x9900}, - {SDLK_PAGEDOWN, 0x5100, 0x5100, 0x7600, 0xa100}, - {SDLK_END, 0x4f00, 0x4f00, 0x7500, 0x9f00}, - {SDLK_HOME, 0x4700, 0x4700, 0x7700, 0x9700}, - {SDLK_LEFT, 0x4b00, 0x4b00, 0x7300, 0x9b00}, - {SDLK_UP, 0x4800, 0x4800, 0x8d00, 0x9800}, - {SDLK_RIGHT, 0x4d00, 0x4d00, 0x7400, 0x9d00}, - {SDLK_DOWN, 0x5000, 0x5000, 0x9100, 0xa000}, - {SDLK_INSERT, CIO_KEY_IC, CIO_KEY_SHIFT_IC, CIO_KEY_CTRL_IC, CIO_KEY_ALT_IC}, - {SDLK_DELETE, CIO_KEY_DC, CIO_KEY_SHIFT_DC, CIO_KEY_CTRL_DC, CIO_KEY_ALT_DC}, - {SDLK_KP_0, 0x5200, 0x5200, 0x9200, 0}, - {SDLK_KP_1, 0x4f00, 0x4f00, 0x7500, 0}, - {SDLK_KP_2, 0x5000, 0x5000, 0x9100, 0}, - {SDLK_KP_3, 0x5100, 0x5100, 0x7600, 0}, - {SDLK_KP_4, 0x4b00, 0x4b00, 0x7300, 0}, - {SDLK_KP_5, 0x4c00, 0x4c00, 0x8f00, 0}, - {SDLK_KP_6, 0x4d00, 0x4d00, 0x7400, 0}, - {SDLK_KP_7, 0x4700, 0x4700, 0x7700, 0}, - {SDLK_KP_8, 0x4800, 0x4800, 0x8d00, 0}, - {SDLK_KP_9, 0x4900, 0x4900, 0x8400, 0}, - {SDLK_KP_MULTIPLY, '*', '*', 0x9600, 0x3700}, - {SDLK_KP_PLUS, '+', '+', 0x9000, 0x4e00}, - {SDLK_KP_MINUS, '-', '-', 0x8e00, 0x4a00}, - {SDLK_KP_PERIOD, 0x7f, 0x7f, 0x5300, 0x9300}, - {SDLK_KP_DIVIDE, '/', '/', 0x9500, 0xa400}, - {SDLK_KP_ENTER, 0x0d, 0x0d, 0x0a, 0xa600}, - {SDLK_F1, 0x3b00, 0x5400, 0x5e00, 0x6800}, - {SDLK_F2, 0x3c00, 0x5500, 0x5f00, 0x6900}, - {SDLK_F3, 0x3d00, 0x5600, 0x6000, 0x6a00}, - {SDLK_F4, 0x3e00, 0x5700, 0x6100, 0x6b00}, - {SDLK_F5, 0x3f00, 0x5800, 0x6200, 0x6c00}, - {SDLK_F6, 0x4000, 0x5900, 0x6300, 0x6d00}, - {SDLK_F7, 0x4100, 0x5a00, 0x6400, 0x6e00}, - {SDLK_F8, 0x4200, 0x5b00, 0x6500, 0x6f00}, - {SDLK_F9, 0x4300, 0x5c00, 0x6600, 0x7000}, - {SDLK_F10, 0x4400, 0x5d00, 0x6700, 0x7100}, - {SDLK_F11, 0x8500, 0x8700, 0x8900, 0x8b00}, - {SDLK_F12, 0x8600, 0x8800, 0x8a00, 0x8c00}, - {SDLK_BACKSLASH, '\\', '|', 0x1c, 0x2b00}, - {SDLK_SLASH, '/', '?', 0, 0x3500}, - {SDLK_MINUS, '-', '_', 0x1f, 0x8200}, - {SDLK_EQUALS, '=', '+', 0, 0x8300}, - {SDLK_LEFTBRACKET, '[', '{', 0x1b, 0x1a00}, - {SDLK_RIGHTBRACKET, ']', '}', 0x1d, 0x1b00}, - {SDLK_SEMICOLON, ';', ':', 0, 0x2700}, - {SDLK_QUOTE, '\'', '"', 0, 0x2800}, - {SDLK_COMMA, ',', '<', 0, 0x3300}, - {SDLK_PERIOD, '.', '>', 0, 0x3400}, - {SDLK_BACKQUOTE, '`', '~', 0, 0x2900}, - {0, 0, 0, 0, 0} /** END **/ -}; - -void sdl_video_event_thread(void *data); - -static void sdl_user_func(int func, ...) -{ - va_list argptr; - SDL_Event ev; - int rv; - - ev.type=SDL_USEREVENT; - ev.user.data1=NULL; - ev.user.data2=NULL; - ev.user.code=func; - pthread_mutex_lock(&sdl_ufunc_mtx); - while (1) { - va_start(argptr, func); - switch(func) { - case SDL_USEREVENT_SETICON: - ev.user.data1=va_arg(argptr, void *); - if((ev.user.data2=(unsigned long *)malloc(sizeof(unsigned long)))==NULL) { - pthread_mutex_unlock(&sdl_ufunc_mtx); - va_end(argptr); - return; - } - *(unsigned long *)ev.user.data2=va_arg(argptr, unsigned long); - break; - case SDL_USEREVENT_SETNAME: - case SDL_USEREVENT_SETTITLE: - if((ev.user.data1=strdup(va_arg(argptr, char *)))==NULL) { - pthread_mutex_unlock(&sdl_ufunc_mtx); - va_end(argptr); - return; - } - break; - case SDL_USEREVENT_MOUSEPOINTER: - ev.user.data1 = (void *)(intptr_t)va_arg(argptr, int); - break; - case SDL_USEREVENT_SHOWMOUSE: - case SDL_USEREVENT_HIDEMOUSE: - case SDL_USEREVENT_FLUSH: - break; - default: - va_end(argptr); - return; - } - va_end(argptr); - while((rv = sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT))!=1) - YIELD(); - break; - } - pthread_mutex_unlock(&sdl_ufunc_mtx); -} - -/* Called from main thread only */ -static int sdl_user_func_ret(int func, ...) -{ - int rv; - va_list argptr; - SDL_Event ev; - - ev.type=SDL_USEREVENT; - ev.user.data1=NULL; - ev.user.data2=NULL; - ev.user.code=func; - va_start(argptr, func); - pthread_mutex_lock(&sdl_ufunc_mtx); - /* Drain the swamp */ - while(1) { - switch(func) { - case SDL_USEREVENT_GETWINPOS: - ev.user.data1 = va_arg(argptr, void *); - ev.user.data2 = va_arg(argptr, void *); - // Fallthrough - case SDL_USEREVENT_SETVIDMODE: - case SDL_USEREVENT_INIT: - case SDL_USEREVENT_QUIT: - while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)!=1) - YIELD(); - break; - default: - pthread_mutex_unlock(&sdl_ufunc_mtx); - va_end(argptr); - return -1; - } - rv = sem_wait(&sdl_ufunc_ret); - if(rv==0) - break; - } - pthread_mutex_unlock(&sdl_ufunc_mtx); - va_end(argptr); - return(sdl_ufunc_retval); -} - -void exit_sdl_con(void) -{ - // Avoid calling exit(0) from an atexit() function... - ciolib_reaper = 0; - sdl_user_func_ret(SDL_USEREVENT_QUIT); -} - -void sdl_copytext(const char *text, size_t buflen) -{ - sdl.SetClipboardText(text); -} - -char *sdl_getcliptext(void) -{ - uint8_t *u8; - u8 = (uint8_t *)sdl.GetClipboardText(); - char *ret = strdup((char *)u8); - sdl.free(u8); - return ret; -} - -void sdl_drawrect(struct rectlist *data) -{ - if(sdl_init_good) { - data->next = NULL; - pthread_mutex_lock(&sdl_headlock); - if (update_list == NULL) - update_list = update_list_tail = data; - else { - update_list_tail->next = data; - update_list_tail = data; - } - pthread_mutex_unlock(&sdl_headlock); - } - else - bitmap_drv_free_rect(data); -} - -void sdl_flush(void) -{ - sdl_user_func(SDL_USEREVENT_FLUSH); -} - -/* - * Returns true if the specified width/height can use the - * internal scaler - * - * vstat lock must be held - */ -static bool -window_can_scale_internally(int winwidth, int winheight) -{ - int fw, fh; - aspect_fix(&winwidth, &winheight, cvstat.aspect_width, cvstat.aspect_height); - fw = winwidth; - fh = winheight; - aspect_reverse(&winwidth, &winheight, cvstat.scrnwidth, cvstat.scrnheight, cvstat.aspect_width, cvstat.aspect_height); - if (fw == winwidth || fh == winheight) - return true; - return false; -} - -static void -internal_scaling_factors(int winwidth, int winheight, int *x, int *y) -{ - aspect_fix(&winwidth, &winheight, cvstat.aspect_width, cvstat.aspect_height); - aspect_reverse(&winwidth, &winheight, cvstat.scrnwidth, cvstat.scrnheight, cvstat.aspect_width, cvstat.aspect_height); - *x = winwidth / cvstat.scrnwidth; - *y = winheight / cvstat.scrnheight; - if (*x < 1 || *x > 14) - *x = 1; - if (*y < 1 || *y > 14) - *y = 1; -} - -static int sdl_init_mode(int mode) -{ - int oldcols; - - if (mode != CIOLIB_MODE_CUSTOM) { - pthread_mutex_lock(&vstatlock); - if (mode == vstat.mode) { - pthread_mutex_unlock(&vstatlock); - return 0; - } - pthread_mutex_unlock(&vstatlock); - } - - sdl_user_func(SDL_USEREVENT_FLUSH); - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - oldcols = cvstat.cols; - bitmap_drv_init_mode(mode, &bitmap_width, &bitmap_height); - vstat.winwidth = lround((double)cvstat.winwidth / cvstat.scrnwidth * vstat.scrnwidth); - vstat.winheight = lround((double)cvstat.winheight / cvstat.scrnheight * vstat.scrnheight); - aspect_correct(&vstat.winwidth, &cvstat.winheight, cvstat.aspect_width, cvstat.aspect_height); - if (oldcols != vstat.cols) { - if (oldcols == 0) { - if (ciolib_initial_window_width > 0) - vstat.winwidth = ciolib_initial_window_width; - if (ciolib_initial_window_height > 0) - vstat.winheight = ciolib_initial_window_height; - if (vstat.cols == 40) - oldcols = 40; - } - if (oldcols == 40) { - vstat.winwidth /= 2; - vstat.winheight /= 2; - } - if (vstat.cols == 40) { - vstat.winwidth *= 2; - vstat.winheight *= 2; - } - } - if (vstat.winwidth < vstat.scrnwidth) - vstat.winwidth = vstat.scrnwidth; - if (vstat.winheight < vstat.scrnheight) - vstat.winheight = vstat.scrnheight; - - cvstat = vstat; - internal_scaling = window_can_scale_internally(vstat.winwidth, vstat.winheight); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - - sdl_user_func_ret(SDL_USEREVENT_SETVIDMODE); - - return(0); -} - -/* Called from main thread only (Passes Event) */ -int sdl_init(int mode) -{ - bitmap_drv_init(sdl_drawrect, sdl_flush); - - if(mode==CIOLIB_MODE_SDL_FULLSCREEN) - fullscreen=1; - // Needs to be *after* bitmap_drv_init() -#if defined(__DARWIN__) - sem_post(&startsdl_sem); -#else - _beginthread(sdl_video_event_thread, 0, NULL); -#endif - sdl_user_func_ret(SDL_USEREVENT_INIT); - sdl_init_mode(3); - - if(sdl_init_good) { - cio_api.mode=fullscreen?CIOLIB_MODE_SDL_FULLSCREEN:CIOLIB_MODE_SDL; -#ifdef _WIN32 - FreeConsole(); -#endif - cio_api.options |= CONIO_OPT_PALETTE_SETTING | CONIO_OPT_SET_TITLE | CONIO_OPT_SET_NAME | CONIO_OPT_SET_ICON; - return(0); - } - - ciolib_reaper = 0; - sdl_user_func_ret(SDL_USEREVENT_QUIT); - return(-1); -} - -void sdl_setwinsize_locked(int w, int h) -{ - if (w > 16384) - w = 16384; - if (h > 16384) - h = 16384; - if (w < cvstat.scrnwidth) - w = cvstat.scrnwidth; - if (h < cvstat.scrnheight) - h = cvstat.scrnheight; - cvstat.winwidth = vstat.winwidth = w; - cvstat.winheight = vstat.winheight = h; - internal_scaling = window_can_scale_internally(cvstat.winwidth, cvstat.winheight); -} - -void sdl_setwinsize(int w, int h) -{ - pthread_mutex_lock(&vstatlock); - sdl_setwinsize_locked(w, h); - pthread_mutex_unlock(&vstatlock); -} - -void sdl_setwinposition(int x, int y) -{ - pthread_mutex_lock(&win_mutex); - sdl.SetWindowPosition(win, x, y); - pthread_mutex_unlock(&win_mutex); -} - -void sdl_getwinsize_locked(int *w, int *h) -{ - if (w) - *w = cvstat.winwidth; - if (h) - *h = cvstat.winheight; -} - -void sdl_getwinsize(int *w, int *h) -{ - pthread_mutex_lock(&vstatlock); - sdl_getwinsize_locked(w, h); - pthread_mutex_unlock(&vstatlock); -} - -/* Called from main thread only */ -int sdl_kbhit(void) -{ - int ret; - - pthread_mutex_lock(&sdl_keylock); - ret=(sdl_key!=sdl_keynext); - pthread_mutex_unlock(&sdl_keylock); - return(ret); -} - -/* Called from main thread only */ -int sdl_getch(void) -{ - int ch; - - sem_wait(&sdl_key_pending); - pthread_mutex_lock(&sdl_keylock); - - /* This always frees up space in keybuf for one more char */ - ch=sdl_keybuf[sdl_key++]; - /* If we have missed mouse keys, tack them on to the end of the buffer now */ - if(sdl_pending_mousekeys) { - if(sdl_pending_mousekeys & 1) /* Odd number... second char */ - sdl_keybuf[sdl_keynext++]=CIO_KEY_MOUSE >> 8; - else /* Even number... first char */ - sdl_keybuf[sdl_keynext++]=CIO_KEY_MOUSE & 0xff; - sem_post(&sdl_key_pending); - sdl_pending_mousekeys--; - } - pthread_mutex_unlock(&sdl_keylock); - return(ch); -} - -/* Called from main thread only */ -void sdl_textmode(int mode) -{ - sdl_init_mode(mode); -} - -/* Called from main thread only (Passes Event) */ -int sdl_setname(const char *name) -{ - sdl_user_func(SDL_USEREVENT_SETNAME,name); - return(0); -} - -/* Called from main thread only (Passes Event) */ -int sdl_seticon(const void *icon, unsigned long size) -{ - sdl_user_func(SDL_USEREVENT_SETICON,icon,size); - return(0); -} - -/* Called from main thread only (Passes Event) */ -int sdl_settitle(const char *title) -{ - sdl_user_func(SDL_USEREVENT_SETTITLE,title); - return(0); -} - -int sdl_showmouse(void) -{ - sdl_user_func(SDL_USEREVENT_SHOWMOUSE); - return(1); -} - -int sdl_hidemouse(void) -{ - sdl_user_func(SDL_USEREVENT_HIDEMOUSE); - return(0); -} - -int sdl_get_window_info(int *width, int *height, int *xpos, int *ypos) -{ - int wx, wy; - - if (xpos || ypos) { - sdl_user_func_ret(SDL_USEREVENT_GETWINPOS, &wx, &wy); - if(xpos) - *xpos=wx; - if(ypos) - *ypos=wy; - } - - if (width || height) { - pthread_mutex_lock(&vstatlock); - if(width) - *width=cvstat.winwidth; - if(height) - *height=cvstat.winheight; - pthread_mutex_unlock(&vstatlock); - } - - return(1); -} - -static void setup_surfaces_locked(void) -{ - int flags=0; - SDL_Event ev; - SDL_Texture *newtexture; - int idealw; - int idealh; - int idealmw; - int idealmh; - - if(fullscreen) - flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; - else - flags |= SDL_WINDOW_RESIZABLE; -#if (SDL_MINOR_VERSION > 0) || (SDL_PATCHLEVEL >= 1) - flags |= SDL_WINDOW_ALLOW_HIGHDPI; -#endif - - - pthread_mutex_lock(&win_mutex); - idealmw = cvstat.scrnwidth; - idealmh = cvstat.scrnheight; - aspect_correct(&idealmw, &idealmh, cvstat.aspect_width, cvstat.aspect_height); - idealw = cvstat.winwidth; - idealh = cvstat.winheight; - aspect_fix(&idealw, &idealh, cvstat.aspect_width, cvstat.aspect_height); - internal_scaling = window_can_scale_internally(idealw, idealh); - sdl.SetHint(SDL_HINT_RENDER_SCALE_QUALITY, internal_scaling ? "0" : "2"); - - if (win == NULL) { - // SDL2: This is slow sometimes... not sure why. - if (sdl.CreateWindowAndRenderer(cvstat.winwidth, cvstat.winheight, flags, &win, &renderer) == 0) { - sdl.RenderClear(renderer); - if (internal_scaling) - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, idealw, idealh); - else - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, cvstat.scrnwidth, cvstat.scrnheight); - - if (texture) - sdl.DestroyTexture(texture); - texture = newtexture; - } - else { - win = NULL; - renderer = NULL; - } - } - else { - sdl.SetWindowMinimumSize(win, idealmw, idealmh); - sdl.SetWindowSize(win, idealw, idealh); - if (internal_scaling) - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, idealw, idealh); - else - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, cvstat.scrnwidth, cvstat.scrnheight); - sdl.RenderClear(renderer); - if (texture) - sdl.DestroyTexture(texture); - texture = newtexture; - } - sdl.SetWindowMinimumSize(win, idealmw, idealmh); - - if(win!=NULL) { - bitmap_drv_request_pixels(); - } - else if(sdl_init_good) { - ev.type=SDL_QUIT; - sdl_exitcode=1; - sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT); - } - pthread_mutex_unlock(&win_mutex); -} - -static void setup_surfaces(void) -{ - pthread_mutex_lock(&vstatlock); - setup_surfaces_locked(); - pthread_mutex_unlock(&vstatlock); -} - -/* Called from event thread only */ -static void sdl_add_key(unsigned int keyval) -{ - if(keyval==0xa600) { - fullscreen=!fullscreen; - cio_api.mode=fullscreen?CIOLIB_MODE_SDL_FULLSCREEN:CIOLIB_MODE_SDL; - sdl.SetWindowFullscreen(win, fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); - setup_surfaces(); - return; - } - if(keyval <= 0xffff) { - pthread_mutex_lock(&sdl_keylock); - if(sdl_keynext+1==sdl_key) { - beep(); - pthread_mutex_unlock(&sdl_keylock); - return; - } - if((sdl_keynext+2==sdl_key) && keyval > 0xff) { - if(keyval==CIO_KEY_MOUSE) - sdl_pending_mousekeys+=2; - else - beep(); - pthread_mutex_unlock(&sdl_keylock); - return; - } - sdl_keybuf[sdl_keynext++]=keyval & 0xff; - sem_post(&sdl_key_pending); - if(keyval>0xff) { - sdl_keybuf[sdl_keynext++]=keyval >> 8; - sem_post(&sdl_key_pending); - } - pthread_mutex_unlock(&sdl_keylock); - } -} - -/* Called from event thread only */ -static unsigned int sdl_get_char_code(unsigned int keysym, unsigned int mod) -{ - int expect; - int i; - - /* We don't handle META */ - if (mod & KMOD_GUI) - return(0x0001ffff); - - /* Glah! */ -#ifdef __DARWIN__ - if(keysym==0x7f && !(mod & KMOD_CTRL)) { - keysym=0x08; - keysym=SDLK_BACKSPACE; - } -#endif - - /* Find the SDL keysym */ - for(i=0;sdl_keyval[i].keysym;i++) { - if(sdl_keyval[i].keysym==keysym) { - /* KeySym found in table */ - - /* - * Using the modifiers, look up the expected scan code. - */ - if(mod & KMOD_ALT) - expect = sdl_keyval[i].alt; - else if(mod & KMOD_CTRL) - expect=sdl_keyval[i].ctrl; - else if(mod & KMOD_SHIFT) { - if((mod & KMOD_CAPS) && keysym != '\t') - expect=sdl_keyval[i].key; - else - expect=sdl_keyval[i].shift; - } - else { - if(mod & KMOD_CAPS && (toupper(sdl_keyval[i].key) == sdl_keyval[i].shift)) - expect=sdl_keyval[i].shift; - else - expect=sdl_keyval[i].key; - } - - return(expect); - } - } - /* - * Well, we can't find it in our table, or it's a regular key. - */ - if(keysym > 0 && keysym < 128) { - if (isalpha(keysym)) { - /* - * If CAPS and SHIFT are not in the same state, - * upper-case. - */ - if(!!(mod & KMOD_CAPS) != !!(mod & KMOD_SHIFT)) - return toupper(keysym); - } - return keysym; - } - - /* Give up. It's not working out for us. */ - return(0x0001ffff); -} - -static void -sdl_add_keys(uint8_t *utf8s) -{ - char *chars; - char *p; - - chars = utf8_to_cp(getcodepage(), utf8s, '\x00', strlen((char *)utf8s), NULL); - if (chars) { - for (p = chars; *p; p++) { - sdl_add_key(*((uint8_t *)p)); - } - free(chars); - } -} - -/* Mouse event/keyboard thread */ -static void sdl_mouse_thread(void *data) -{ - SetThreadName("SDL Mouse"); - while(1) { - if(mouse_wait()) - sdl_add_key(CIO_KEY_MOUSE); - } -} - -static int win_to_text_xpos(int winpos) -{ - int ret; - - pthread_mutex_lock(&vstatlock); - ret = winpos/(((float)cvstat.winwidth)/cvstat.cols)+1; - if (ret > cvstat.cols) - ret = cvstat.cols; - if (ret < 1) - ret = 1; - pthread_mutex_unlock(&vstatlock); - return ret; -} - -static int win_to_text_ypos(int winpos) -{ - int ret; - - pthread_mutex_lock(&vstatlock); - ret = winpos/(((float)cvstat.winheight)/cvstat.rows)+1; - if (ret > cvstat.rows) - ret = cvstat.rows; - if (ret < 1) - ret = 1; - pthread_mutex_unlock(&vstatlock); - return ret; -} - -static int win_to_res_xpos(int winpos) -{ - int ret; - - pthread_mutex_lock(&vstatlock); - ret = winpos * (cvstat.scrnwidth) / cvstat.winwidth; - pthread_mutex_unlock(&vstatlock); - return ret; -} - -static int win_to_res_ypos(int winpos) -{ - int ret; - - pthread_mutex_lock(&vstatlock); - ret = winpos * (cvstat.scrnheight) / cvstat.winheight; - pthread_mutex_unlock(&vstatlock); - return ret; -} - -void sdl_video_event_thread(void *data) -{ - SDL_Event ev; - int block_text = 0; - static SDL_Keycode last_sym = SDLK_UNKNOWN; - static Uint16 last_mod = 0; - - while(1) { - if(sdl.WaitEventTimeout(&ev, 1)!=1) - continue; - switch (ev.type) { - case SDL_KEYDOWN: /* Keypress */ - last_mod = ev.key.keysym.mod; - last_sym = ev.key.keysym.sym; - if ((ev.key.keysym.mod & (KMOD_CTRL|KMOD_ALT|KMOD_GUI)) && !(ev.key.keysym.mod & KMOD_MODE)) { - block_text = 1; - if ((ev.key.keysym.mod & KMOD_ALT) && - (ev.key.keysym.sym == SDLK_LEFT || - ev.key.keysym.sym == SDLK_RIGHT)) { - int w, h; - - // Don't allow ALT-DIR to change size when maximized... - if ((sdl.GetWindowFlags(win) & SDL_WINDOW_MAXIMIZED) == 0) { - bool wc; - pthread_mutex_lock(&vstatlock); - w = cvstat.winwidth; - h = cvstat.winheight; - aspect_fix(&w, &h, cvstat.aspect_width, cvstat.aspect_height); - if (cvstat.aspect_width == 0 || cvstat.aspect_height == 0) - wc = true; - else - wc = lround((double)(h * cvstat.aspect_width) / cvstat.aspect_height * cvstat.scrnwidth / cvstat.scrnheight) > w; - switch(ev.key.keysym.sym) { - case SDLK_LEFT: - if (wc) { - if (w % (cvstat.scrnwidth)) { - w = w - w % cvstat.scrnwidth; - } - else { - w -= cvstat.scrnwidth; - if (w < cvstat.scrnwidth) - w = cvstat.scrnwidth; - } - } - else { - if (h % (cvstat.scrnheight)) { - h = h - h % cvstat.scrnheight; - } - else { - h -= cvstat.scrnheight; - if (h < cvstat.scrnheight) - h = cvstat.scrnheight; - } - } - break; - case SDLK_RIGHT: - if (wc) - w = (w - w % cvstat.scrnwidth) + cvstat.scrnwidth; - else - h = (h - h % cvstat.scrnheight) + cvstat.scrnheight; - break; - } - if (wc) - h = INT_MAX; - else - w = INT_MAX; - aspect_fix(&w, &h, cvstat.aspect_width, cvstat.aspect_height); - if (w > 16384 || h > 16384) - beep(); - else { - cvstat.winwidth = w; - cvstat.winheight = h; - internal_scaling = window_can_scale_internally(w, h); - } - setup_surfaces_locked(); - pthread_mutex_unlock(&vstatlock); - } - break; - } - } - if (ev.key.keysym.mod & KMOD_RALT) { // Possible AltGr, let textinput sort it out... - block_text = 0; - break; - } - if ((ev.key.keysym.mod & KMOD_SHIFT) && (ev.key.keysym.sym == '\t')) - block_text = 1; - if (block_text || ev.key.keysym.sym < 0 || ev.key.keysym.sym > 127) { - // NUMLOCK makes - if ((ev.key.keysym.mod & KMOD_NUM) && ((ev.key.keysym.sym >= SDLK_KP_1 && ev.key.keysym.sym <= SDLK_KP_0) - || ev.key.keysym.sym == SDLK_KP_DIVIDE - || ev.key.keysym.sym == SDLK_KP_MULTIPLY - || ev.key.keysym.sym == SDLK_KP_MINUS - || ev.key.keysym.sym == SDLK_KP_PLUS - || ev.key.keysym.sym == SDLK_KP_PERIOD)) - break; - sdl_add_key(sdl_get_char_code(ev.key.keysym.sym, ev.key.keysym.mod)); - } - else if (!isprint(ev.key.keysym.sym)) { - if (ev.key.keysym.sym < 128) - sdl_add_key(ev.key.keysym.sym); - } - break; - case SDL_TEXTINPUT: - if (!block_text) { - unsigned int charcode = sdl_get_char_code(last_sym, last_mod & ~(KMOD_ALT)); - // If the key is exactly what we would expect, use sdl_get_char_code() - if (*(uint8_t *)ev.text.text == charcode) - sdl_add_key(sdl_get_char_code(last_sym, last_mod)); - else - sdl_add_keys((uint8_t *)ev.text.text); - } - break; - case SDL_KEYUP: - last_mod = ev.key.keysym.mod; - if (!(ev.key.keysym.mod & (KMOD_CTRL|KMOD_ALT|KMOD_GUI))) - block_text = 0; - break; - case SDL_MOUSEMOTION: - if(!ciolib_mouse_initialized) - break; - ciomouse_gotevent(CIOLIB_MOUSE_MOVE,win_to_text_xpos(ev.motion.x),win_to_text_ypos(ev.motion.y), win_to_res_xpos(ev.motion.x), win_to_res_ypos(ev.motion.y)); - break; - case SDL_MOUSEBUTTONDOWN: - if(!ciolib_mouse_initialized) - break; - switch(ev.button.button) { - case SDL_BUTTON_LEFT: - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(1),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - case SDL_BUTTON_MIDDLE: - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(2),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - case SDL_BUTTON_RIGHT: - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(3),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - } - break; - case SDL_MOUSEWHEEL: - if (!ciolib_mouse_initialized) - break; - if (ev.wheel.y) { -#if (SDL_MINOR_VERSION > 0) || (SDL_PATCHLEVEL > 3) - if (ev.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) - ev.wheel.y = 0 - ev.wheel.y; -#endif - if (ev.wheel.y > 0) - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(4), -1, -1, -1, -1); - if (ev.wheel.y < 0) - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(5), -1, -1, -1, -1); - } - break; - case SDL_MOUSEBUTTONUP: - if(!ciolib_mouse_initialized) - break; - switch(ev.button.button) { - case SDL_BUTTON_LEFT: - ciomouse_gotevent(CIOLIB_BUTTON_RELEASE(1),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - case SDL_BUTTON_MIDDLE: - ciomouse_gotevent(CIOLIB_BUTTON_RELEASE(2),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - case SDL_BUTTON_RIGHT: - ciomouse_gotevent(CIOLIB_BUTTON_RELEASE(3),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - } - break; - case SDL_QUIT: - /* - * SDL2: Do we still need the reaper? - * This is what exit()s programs when the - * X is hit. - */ - if (ciolib_reaper) - sdl_user_func(SDL_USEREVENT_QUIT); - else - sdl_add_key(CIO_KEY_QUIT); - break; - case SDL_WINDOWEVENT: - switch(ev.window.event) { - case SDL_WINDOWEVENT_SIZE_CHANGED: - // SDL2: User resized window - case SDL_WINDOWEVENT_RESIZED: - { - // SDL2: Something resized window - const char *newh; - - pthread_mutex_lock(&vstatlock); - pthread_mutex_lock(&win_mutex); - internal_scaling = window_can_scale_internally(ev.window.data1, ev.window.data2); - if (internal_scaling) { - newh = "0"; - } - else { - newh = "2"; - } - sdl.GetWindowSize(win, &cvstat.winwidth, &cvstat.winheight); - if (strcmp(newh, sdl.GetHint(SDL_HINT_RENDER_SCALE_QUALITY))) { - SDL_Texture *newtexture; - sdl.SetHint(SDL_HINT_RENDER_SCALE_QUALITY, newh); - if (internal_scaling) { - int idealw, idealh; - idealw = cvstat.winwidth; - idealh = cvstat.winheight; - aspect_fix(&idealw, &idealh, cvstat.aspect_width, cvstat.aspect_height); - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, idealw, idealh); - } - else - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, cvstat.scrnwidth, cvstat.scrnheight); - sdl.RenderClear(renderer); - if (texture) - sdl.DestroyTexture(texture); - texture = newtexture; - } - sdl.RenderClear(renderer); - bitmap_drv_request_pixels(); - pthread_mutex_unlock(&win_mutex); - pthread_mutex_unlock(&vstatlock); - break; - } - case SDL_WINDOWEVENT_EXPOSED: - bitmap_drv_request_pixels(); - break; - } - break; - case SDL_USEREVENT: { - struct rectlist *list; - struct rectlist *old_next; - switch(ev.user.code) { - case SDL_USEREVENT_QUIT: - sdl_ufunc_retval=0; - if (ciolib_reaper) - exit(0); - sem_post(&sdl_ufunc_ret); - return; - case SDL_USEREVENT_FLUSH: - pthread_mutex_lock(&win_mutex); - if (win != NULL) { - pthread_mutex_lock(&sdl_headlock); - list = update_list; - update_list = update_list_tail = NULL; - pthread_mutex_unlock(&sdl_headlock); - for (; list; list = old_next) { - SDL_Rect src; - SDL_Rect dst; - - old_next = list->next; - if (list->next == NULL) { - void *pixels; - int pitch; - int row; - int tw, th; - - if (internal_scaling) { - struct graphics_buffer *gb; - int xscale, yscale; - internal_scaling_factors(cvstat.winwidth, cvstat.winheight, &xscale, &yscale); - gb = do_scale(list, xscale, yscale, - cvstat.aspect_width, cvstat.aspect_height); - src.x = 0; - src.y = 0; - src.w = gb->w; - src.h = gb->h; - sdl.QueryTexture(texture, NULL, NULL, &tw, &th); - sdl.LockTexture(texture, &src, &pixels, &pitch); - if (pitch != gb->w * sizeof(gb->data[0])) { - // If this happens, we need to copy a row at a time... - for (row = 0; row < gb->h && row < th; row++) { - if (pitch < gb->w * sizeof(gb->data[0])) - memcpy(pixels, &gb->data[gb->w * row], pitch); - else - memcpy(pixels, &gb->data[gb->w * row], gb->w * sizeof(gb->data[0])); - pixels = (void *)((char*)pixels + pitch); - } - } - else { - int ch = gb->h; - if (ch > th) - ch = th; - memcpy(pixels, gb->data, gb->w * ch * sizeof(gb->data[0])); - } - sdl.UnlockTexture(texture); - dst.x = (cvstat.winwidth - gb->w) / 2; - dst.y = (cvstat.winheight - gb->h) / 2; - dst.w = gb->w; - dst.h = gb->h; - release_buffer(gb); - } - else { - src.x = 0; - src.y = 0; - src.w = list->rect.width; - src.h = list->rect.height; - sdl.QueryTexture(texture, NULL, NULL, &tw, &th); - sdl.LockTexture(texture, &src, &pixels, &pitch); - if (pitch != list->rect.width * sizeof(list->data[0])) { - // If this happens, we need to copy a row at a time... - for (row = 0; row < list->rect.height && row < th; row++) { - if (pitch < list->rect.width * sizeof(list->data[0])) - memcpy(pixels, &list->data[list->rect.width * row], pitch); - else - memcpy(pixels, &list->data[list->rect.width * row], list->rect.width * sizeof(list->data[0])); - pixels = (void *)((char*)pixels + pitch); - } - } - else { - int ch = list->rect.height; - if (ch > th) - ch = th; - memcpy(pixels, list->data, list->rect.width * ch * sizeof(list->data[0])); - } - sdl.UnlockTexture(texture); - dst.w = cvstat.winwidth; - dst.h = cvstat.winheight; - // Get correct aspect ratio for dst... - aspect_fix(&dst.w, &dst.h, cvstat.aspect_width, cvstat.aspect_height); - dst.x = (cvstat.winwidth - dst.w) / 2; - dst.y = (cvstat.winheight - dst.h) / 2; - } - sdl.RenderCopy(renderer, texture, &src, &dst); - } - bitmap_drv_free_rect(list); - } - sdl.RenderPresent(renderer); - } - pthread_mutex_unlock(&win_mutex); - break; - case SDL_USEREVENT_SETNAME: - pthread_mutex_lock(&win_mutex); - sdl.SetWindowTitle(win, (char *)ev.user.data1); - pthread_mutex_unlock(&win_mutex); - free(ev.user.data1); - break; - case SDL_USEREVENT_SETICON: - if(sdl_icon != NULL) - sdl.FreeSurface(sdl_icon); - sdl_icon=sdl.CreateRGBSurfaceFrom(ev.user.data1 - , *(unsigned long *)ev.user.data2 - , *(unsigned long *)ev.user.data2 - , 32 - , *(unsigned long *)ev.user.data2*4 - , *(DWORD *)"\377\0\0\0" - , *(DWORD *)"\0\377\0\0" - , *(DWORD *)"\0\0\377\0" - , *(DWORD *)"\0\0\0\377" - ); - pthread_mutex_lock(&win_mutex); - sdl.SetWindowIcon(win, sdl_icon); - pthread_mutex_unlock(&win_mutex); - free(ev.user.data2); - break; - case SDL_USEREVENT_SETTITLE: - pthread_mutex_lock(&win_mutex); - sdl.SetWindowTitle(win, (char *)ev.user.data1); - pthread_mutex_unlock(&win_mutex); - free(ev.user.data1); - break; - case SDL_USEREVENT_SETVIDMODE: - pthread_mutex_lock(&vstatlock); - setup_surfaces_locked(); - pthread_mutex_unlock(&vstatlock); - sdl_ufunc_retval=0; - sem_post(&sdl_ufunc_ret); - break; - case SDL_USEREVENT_HIDEMOUSE: - sdl.ShowCursor(SDL_DISABLE); - break; - case SDL_USEREVENT_SHOWMOUSE: - sdl.ShowCursor(SDL_ENABLE); - break; - case SDL_USEREVENT_INIT: - if(!sdl_init_good) { - if(sdl.WasInit(SDL_INIT_VIDEO)==SDL_INIT_VIDEO) { - pthread_mutex_lock(&win_mutex); - _beginthread(sdl_mouse_thread, 0, NULL); - sdl_init_good=1; - pthread_mutex_unlock(&win_mutex); - } - } - sdl_ufunc_retval=0; - sem_post(&sdl_ufunc_ret); - break; - case SDL_USEREVENT_GETWINPOS: - sdl.GetWindowPosition(win, ev.user.data1, ev.user.data2); - sem_post(&sdl_ufunc_ret); - break; - case SDL_USEREVENT_MOUSEPOINTER: - { - int cid = INT_MIN; - SDL_Cursor *oc = curs; - switch((intptr_t)ev.user.data1) { - case CIOLIB_MOUSEPTR_ARROW: - break; // Default - case CIOLIB_MOUSEPTR_BAR: - cid = SDL_SYSTEM_CURSOR_IBEAM; - break; - } - if (cid == INT_MIN) { - sdl.SetCursor(sdl.GetDefaultCursor()); - curs = NULL; - } - else { - curs = sdl.CreateSystemCursor(cid); - if (curs == NULL) - sdl.SetCursor(sdl.GetDefaultCursor()); - else - sdl.SetCursor(curs); - } - if (oc) - sdl.FreeCursor(oc); - break; - } - } - break; - } - case SDL_SYSWMEVENT: /* ToDo... This is where Copy/Paste needs doing */ - - /* Ignore this stuff */ - case SDL_JOYAXISMOTION: - case SDL_JOYBALLMOTION: - case SDL_JOYHATMOTION: - case SDL_JOYBUTTONDOWN: - case SDL_JOYBUTTONUP: - default: - break; - } - } - return; -} - -int sdl_initciolib(int mode) -{ -#if defined(__DARWIN__) - if (initsdl_ret) { -#else - if(init_sdl_video()) { -#endif - fprintf(stderr,"SDL Video Initialization Failed\n"); - return(-1); - } - sem_init(&sdl_key_pending, 0, 0); - sem_init(&sdl_ufunc_ret, 0, 0); - sem_init(&sdl_ufunc_rec, 0, 0); - pthread_mutex_init(&sdl_ufunc_mtx, NULL); - pthread_mutex_init(&sdl_headlock, NULL); - pthread_mutex_init(&win_mutex, NULL); - pthread_mutex_init(&sdl_keylock, NULL); - return(sdl_init(mode)); -} - -void -sdl_beep(void) -{ - static unsigned char wave[2206]; - - if (wave[2205] == 0) { - xptone_makewave(440, wave, 2205, WAVE_SHAPE_SINE_SAW_HARM); - wave[2205] = 1; - } - xp_play_sample(wave, 2205, TRUE); -} - -/* Called from main thread only (Passes Event) */ -int sdl_mousepointer(enum ciolib_mouse_ptr type) -{ - sdl_user_func(SDL_USEREVENT_MOUSEPOINTER,type); - return(0); -} diff --git a/ciolib/sdl_con.h b/ciolib/sdl_con.h deleted file mode 100644 index 8484f8a..0000000 --- a/ciolib/sdl_con.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _SDL_CON_H_ -#define _SDL_CON_H_ - -#ifdef __cplusplus -extern "C" { -#endif -/* Low-Level stuff (Shouldn't be used by ciolib programs */ -int sdl_init(int mode); -int sdl_load_font(char *filename, int width, int height, double scale); -int sdl_init_mode(int mode); -int sdl_setup_colours(void); -int sdl_draw_char(unsigned short vch, int xpos, int ypos); -int sdl_screen_redraw(void); -void exit_sdl_con(void); - -/* High-level stuff */ -int sdl_puttext(int sx, int sy, int ex, int ey, void *fill); -int sdl_gettext(int sx, int sy, int ex, int ey, void *fill); -int sdl_kbhit(void); -void sdl_delay(long msec); -void sdl_gotoxy(int x, int y); -int sdl_initciolib(long inmode); -void sdl_setcursortype(int type); -int sdl_getch(void); -void sdl_textmode(int mode); -void sdl_setname(const char *name); -void sdl_seticon(const void *, unsigned long size); -void sdl_settitle(const char *title); -int sdl_hidemouse(void); -int sdl_showmouse(void); -void sdl_copytext(const char *text, size_t buflen); -char *sdl_getcliptext(void); -int sdl_setfont(int font, int force); -int sdl_getfont(void); -int sdl_loadfont(char *filename); -int sdl_get_window_info(int *width, int *height, int *xpos, int *ypos); -int sdl_setpalette(uint32_t index, uint16_t r, uint16_t g, uint16_t b); -void sdl_setwinsize(int w, int h); -void sdl_setwinposition(int x, int y); -void sdl_beep(void); -int sdl_mousepointer(enum ciolib_mouse_ptr type); - -#if defined(__DARWIN__) -void sdl_init_darwin(void *args); -void sdl_video_event_thread(void *data); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/sdlfuncs.c b/ciolib/sdlfuncs.c deleted file mode 100644 index d5c2f09..0000000 --- a/ciolib/sdlfuncs.c +++ /dev/null @@ -1,316 +0,0 @@ -#include <stdlib.h> /* getenv()/exit()/atexit() */ -#include <stdio.h> /* NULL */ - -#include "gen_defs.h" -#include "threadwrap.h" -#include <SDL.h> -#include "ciolib.h" -#include "sdlfuncs.h" -#include "sdl_con.h" -extern int sdl_video_initialized; - -struct sdlfuncs sdl; - -/* Make xp_dl do static linking */ -#ifdef STATIC_SDL -#define STATIC_LINK -#endif -#include <xp_dl.h> - -static int sdl_funcs_loaded=0; - -static void QuitWrap(void); - -int load_sdl_funcs(struct sdlfuncs *sdlf) -{ - dll_handle sdl_dll; - const char *libnames[]={"SDL2", "SDL", NULL}; - - sdlf->gotfuncs=0; - if((sdl_dll=xp_dlopen(libnames,RTLD_LAZY|RTLD_GLOBAL,SDL_PATCHLEVEL))==NULL) - return(-1); - - if((sdlf->Init=xp_dlsym(sdl_dll, SDL_Init))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->Quit=xp_dlsym(sdl_dll, SDL_Quit))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->PeepEvents=xp_dlsym(sdl_dll, SDL_PeepEvents))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetCurrentVideoDriver=xp_dlsym(sdl_dll, SDL_GetCurrentVideoDriver))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->EventState=xp_dlsym(sdl_dll, SDL_EventState))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CreateRGBSurfaceFrom=xp_dlsym(sdl_dll, SDL_CreateRGBSurfaceFrom))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->RenderPresent=xp_dlsym(sdl_dll, SDL_RenderPresent))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->WaitEventTimeout=xp_dlsym(sdl_dll, SDL_WaitEventTimeout))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CreateWindowAndRenderer=xp_dlsym(sdl_dll, SDL_CreateWindowAndRenderer))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->FreeSurface=xp_dlsym(sdl_dll, SDL_FreeSurface))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowTitle=xp_dlsym(sdl_dll, SDL_SetWindowTitle))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetWindowSize=xp_dlsym(sdl_dll, SDL_GetWindowSize))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowIcon=xp_dlsym(sdl_dll, SDL_SetWindowIcon))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->ShowCursor=xp_dlsym(sdl_dll, SDL_ShowCursor))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->WasInit=xp_dlsym(sdl_dll, SDL_WasInit))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetWindowWMInfo=xp_dlsym(sdl_dll, SDL_GetWindowWMInfo))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetError=xp_dlsym(sdl_dll, SDL_GetError))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->InitSubSystem=xp_dlsym(sdl_dll, SDL_InitSubSystem))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->QuitSubSystem=xp_dlsym(sdl_dll, SDL_QuitSubSystem))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CreateTexture=xp_dlsym(sdl_dll, SDL_CreateTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->UpdateTexture=xp_dlsym(sdl_dll, SDL_UpdateTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->RenderClear=xp_dlsym(sdl_dll, SDL_RenderClear))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->RenderCopy=xp_dlsym(sdl_dll, SDL_RenderCopy))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetHint=xp_dlsym(sdl_dll, SDL_SetHint))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetHint=xp_dlsym(sdl_dll, SDL_GetHint))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetModState=xp_dlsym(sdl_dll, SDL_GetModState))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowSize=xp_dlsym(sdl_dll, SDL_SetWindowSize))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->DestroyTexture=xp_dlsym(sdl_dll, SDL_DestroyTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowFullscreen=xp_dlsym(sdl_dll, SDL_SetWindowFullscreen))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->LockTexture=xp_dlsym(sdl_dll, SDL_LockTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->UnlockTexture=xp_dlsym(sdl_dll, SDL_UnlockTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->QueryTexture=xp_dlsym(sdl_dll, SDL_QueryTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetWindowPosition=xp_dlsym(sdl_dll, SDL_GetWindowPosition))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowPosition=xp_dlsym(sdl_dll, SDL_SetWindowPosition))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowMinimumSize=xp_dlsym(sdl_dll, SDL_SetWindowMinimumSize))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetClipboardText=xp_dlsym(sdl_dll, SDL_SetClipboardText))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetClipboardText=xp_dlsym(sdl_dll, SDL_GetClipboardText))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CreateSystemCursor=xp_dlsym(sdl_dll, SDL_CreateSystemCursor))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetDefaultCursor=xp_dlsym(sdl_dll, SDL_GetDefaultCursor))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->FreeCursor=xp_dlsym(sdl_dll, SDL_FreeCursor))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetCursor=xp_dlsym(sdl_dll, SDL_SetCursor))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->free=xp_dlsym(sdl_dll, SDL_free))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetWindowFlags=xp_dlsym(sdl_dll, SDL_GetWindowFlags))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } -#ifndef STATIC_SDL - { - int (HACK_HACK_HACK *ra)(char *name, Uint32 style, void *hInst); - if ((ra = xp_dlsym(sdl_dll, SDL_RegisterApp)) != NULL) { - ra(ciolib_appname, 0, NULL); - } - } -#endif - - sdlf->gotfuncs=1; - sdl_funcs_loaded=1; - return(0); -} - -int init_sdl_video(void) -{ - const char *drivername; - - if(sdl_video_initialized) - return(0); - - load_sdl_funcs(&sdl); - - if (!sdl.gotfuncs) - return -1; - - sdl.SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "2" ); - sdl.SetHint(SDL_HINT_VIDEO_ALLOW_SCREENSAVER, "1" ); -#ifdef _WIN32 - // code that tells windows we're High DPI aware so it doesn't scale our windows - // taken from Yamagi Quake II - - typedef enum D3_PROCESS_DPI_AWARENESS { - D3_PROCESS_DPI_UNAWARE = 0, - D3_PROCESS_SYSTEM_DPI_AWARE = 1, - D3_PROCESS_PER_MONITOR_DPI_AWARE = 2 - } YQ2_PROCESS_DPI_AWARENESS; - - /* For Vista, Win7 and Win8 */ - BOOL(WINAPI *SetProcessDPIAware)(void) = NULL; - - /* Win8.1 and later */ - HRESULT(WINAPI *SetProcessDpiAwareness)(enum D3_PROCESS_DPI_AWARENESS dpiAwareness) = NULL; - - const char* user32dll[] = {"User32", NULL}; - dll_handle userDLL = xp_dlopen(user32dll, RTLD_LAZY, 0); - - if (userDLL) - { - SetProcessDPIAware = xp_dlsym(userDLL, SetProcessDPIAware); - } - - - const char* shcoredll[] = {"SHCore", NULL}; - dll_handle shcoreDLL = xp_dlopen(shcoredll, RTLD_LAZY, 0); - - if (shcoreDLL) - { - SetProcessDpiAwareness = xp_dlsym(shcoreDLL, SetProcessDpiAwareness); - } - - if (SetProcessDpiAwareness) { - SetProcessDpiAwareness(D3_PROCESS_PER_MONITOR_DPI_AWARE); - } - else if (SetProcessDPIAware) { - SetProcessDPIAware(); - } - /* Fail to windib (ie: No mouse attached) */ - if(sdl.Init(SDL_INIT_VIDEO) == 0) { - sdl_video_initialized=TRUE; - } -#else - /* - * SDL2: Is the below comment still true for SDL2? - * On Linux, SDL doesn't properly detect availability of the - * framebuffer apparently. This results in remote connections - * displaying on the local framebuffer... a definate no-no. - * This ugly hack attempts to prevent this... of course, remote X11 - * connections must still be allowed. - */ - if(getenv("DISPLAY") != NULL || (getenv("REMOTEHOST") == NULL && getenv("SSH_CLIENT") == NULL)) { - if(sdl.Init(SDL_INIT_VIDEO)==0) { - sdl_video_initialized=TRUE; - } - } -#endif - if(sdl_video_initialized && (drivername = sdl.GetCurrentVideoDriver())!=NULL) { - /* Unacceptable drivers */ - if((!strcmp(drivername, "caca")) || (!strcmp(drivername,"aalib")) || (!strcmp(drivername,"dummy"))) { - sdl.Quit(); - sdl_video_initialized=FALSE; - } - } - - if(sdl_video_initialized) { - atexit(QuitWrap); - return 0; - } - - return(-1); -} - -static void QuitWrap(void) -{ - if (sdl_video_initialized) { -#if !defined(__DARWIN__) - exit_sdl_con(); -#endif - if(sdl.Quit) - sdl.Quit(); - } -} diff --git a/ciolib/sdlfuncs.h b/ciolib/sdlfuncs.h deleted file mode 100644 index 7dd75bd..0000000 --- a/ciolib/sdlfuncs.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef _SDLFUNCS_H_ -#define _SDLFUNCS_H_ - -#include "SDL.h" -#include "SDL_syswm.h" - -#ifdef _WIN32 - #define HACK_HACK_HACK __cdecl -#else - #define HACK_HACK_HACK -#endif - -struct sdlfuncs { - int (HACK_HACK_HACK *Init) (Uint32 flags); - void (HACK_HACK_HACK *Quit) (void); - int (HACK_HACK_HACK *PeepEvents) (SDL_Event *events, int numevents, - SDL_eventaction action, Uint32 minType, Uint32 maxType); - const char *(HACK_HACK_HACK *GetCurrentVideoDriver) (void); - Uint8 (HACK_HACK_HACK *EventState) (Uint32 type, int state); - SDL_Surface *(HACK_HACK_HACK *CreateRGBSurfaceFrom)(void *pixels, int width, int height, int depth, int pitch, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); - void (HACK_HACK_HACK *RenderPresent) (SDL_Renderer *renderer); - int (HACK_HACK_HACK *WaitEventTimeout) (SDL_Event *event, int timeout); - int (HACK_HACK_HACK *CreateWindowAndRenderer) (int w, int h, Uint32 flags, SDL_Window **win, SDL_Renderer **ren); - void (HACK_HACK_HACK *FreeSurface) (SDL_Surface *surface); - void (HACK_HACK_HACK *SetWindowTitle) (SDL_Window *window, const char *title); - void (HACK_HACK_HACK *GetWindowSize) (SDL_Window *window, int *w, int *h); - void (HACK_HACK_HACK *SetWindowIcon) (SDL_Window *win, SDL_Surface *icon); - int (HACK_HACK_HACK *ShowCursor) (int toggle); - Uint32 (HACK_HACK_HACK *WasInit) (Uint32 flags); - SDL_bool (HACK_HACK_HACK *GetWindowWMInfo) (SDL_Window *window, SDL_SysWMinfo *info); - const char *(HACK_HACK_HACK *GetError) (void); - int (HACK_HACK_HACK *InitSubSystem)(Uint32 flags); - void (HACK_HACK_HACK *QuitSubSystem)(Uint32 flags); - SDL_Texture* (HACK_HACK_HACK *CreateTexture) (SDL_Renderer *renderer, Uint32 format, int access, int w, int h); - int (HACK_HACK_HACK *UpdateTexture) (SDL_Texture *texture, const SDL_Rect * rect, const void *pixels, int pitch); - int (HACK_HACK_HACK *RenderClear) (SDL_Renderer *renderer); - int (HACK_HACK_HACK *RenderCopy) (SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_Rect *dstrect); - SDL_bool (HACK_HACK_HACK *SetHint) (const char *name, const char *value); - const char * (HACK_HACK_HACK *GetHint) (const char *name); - SDL_Keymod (HACK_HACK_HACK *GetModState) (void); - void (HACK_HACK_HACK *SetWindowSize) (SDL_Window *window, int w, int h); - void (HACK_HACK_HACK *DestroyTexture) (SDL_Texture *texture); - int (HACK_HACK_HACK *SetWindowFullscreen) (SDL_Window *window, Uint32 flags); - int (HACK_HACK_HACK *LockTexture) (SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch); - void (HACK_HACK_HACK *UnlockTexture) (SDL_Texture *texture); - int (HACK_HACK_HACK *QueryTexture) (SDL_Texture *texture, Uint32 *format, int *access, int *w, int *h); - void (HACK_HACK_HACK *GetWindowPosition) (SDL_Window *window, int *x, int *y); - void (HACK_HACK_HACK *SetWindowPosition) (SDL_Window *window, int x, int y); - void (HACK_HACK_HACK *SetWindowMinimumSize) (SDL_Window *window, int w, int y); - int (HACK_HACK_HACK *SetClipboardText) (const char *); - char *(HACK_HACK_HACK *GetClipboardText) (void); - SDL_Cursor *(HACK_HACK_HACK *CreateSystemCursor) (SDL_SystemCursor id); - SDL_Cursor *(HACK_HACK_HACK *GetDefaultCursor) (void); - void (HACK_HACK_HACK *SetCursor) (SDL_Cursor *curs); - void (HACK_HACK_HACK *FreeCursor) (SDL_Cursor *curs); - void(HACK_HACK_HACK *free) (void *); - Uint32(HACK_HACK_HACK *GetWindowFlags) (SDL_Window * window); - int gotfuncs; -}; - -/* Defined in SDL_win32_main.c for Win32 */ -extern struct sdlfuncs sdl; -extern sem_t *sdl_exit_sem; - -#ifdef __cplusplus -extern "C" { -#endif -int load_sdl_funcs(struct sdlfuncs *sdlf); -int init_sdl_audio(void); -int init_sdl_video(void); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/syncicon64.c b/ciolib/syncicon64.c deleted file mode 100644 index b2d6cb2..0000000 --- a/ciolib/syncicon64.c +++ /dev/null @@ -1,695 +0,0 @@ -/* GIMP RGBA C-Source image dump (syncicon64.c) */ - -const char syncicon64[64*64*4] = - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\376\376\376\000\376\376\376\000\376" - "\376\376\000\376\376\376\000\375\375\375\000\375\375\375\000\374\374\374\000\374\374" - "\374\000\374\374\374\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373" - "\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000" - "\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000\374\374\374\000\374" - "\374\374\000\375\375\375\000\375\375\375\000\376\376\376\000\376\376\376\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\374\374\374\000\373" - "\373\373\000\372\372\372\000\371\371\371\000\366\366\366\000\363\363\363\000\361\361" - "\361\000\356\356\356\000\354\354\354\000\352\352\352\000\351\351\351\000\350\350\350" - "\000\347\347\347\000\346\346\346\000\346\346\346\000\346\346\346\000\346\346\346\000" - "\347\347\347\000\350\350\350\000\351\351\351\000\352\352\352\000\354\354\354\000\356" - "\356\356\000\361\361\361\000\363\363\363\000\366\366\366\000\371\371\371\000\372\372" - "\372\000\373\373\373\000\374\374\374\000\375\375\375\000\376\376\376\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\376\376\376\000\376\376\376\000\376\376\376\000" - "\375\375\375\000\374\374\374\000\373\373\373\000\371\371\371\000\365\365\365\000\361" - "\361\361\000\354\354\354\000\347\347\347\000\341\341\341\000\331\331\331\000\321\321" - "\321\000\311\311\311\000\302\302\302\000\274\274\274\000\267\267\267\000\262\262\262" - "\000\257\257\257\000\254\254\254\000\253\253\253\000\252\252\252\000\252\252\252\000" - "\253\253\253\000\254\254\254\000\257\257\257\000\262\262\262\000\266\266\266\000\274" - "\274\274\000\302\302\302\000\311\311\311\000\321\321\321\000\331\331\331\000\341\341" - "\341\000\347\347\347\000\354\354\354\000\361\361\361\000\365\365\365\000\371\371\371" - "\000\373\373\373\000\374\374\374\000\375\375\375\000\376\376\376\000\376\376\376\000" - "\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\374\374\374\000" - "\372\372\372\000\367\367\367\000\361\361\361\000\352\352\352\000\342\342\342\000\327" - "\327\327\000\312\312\312\000\275\275\275\000\261\261\261\000\246\246\246\000\231\231" - "\231\000\215\215\215\000\201\201\201\000xxx\377ppp\377hhh\377bbb\377]]]\377ZZZ" - "\377WWW\377VVV\377VVV\377WWW\377ZZZ\377]]]\377bbb\377hhh\377ppp\377xxx\377" - "\201\201\201\000\215\215\215\000\231\231\231\000\245\245\245\000\261\261\261\000\275" - "\275\275\000\312\312\312\000\327\327\327\000\342\342\342\000\352\352\352\000\361\361" - "\361\000\366\366\366\000\372\372\372\000\374\374\374\000\375\375\375\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375" - "\375\000\373\373\373\000\367\367\367\000\361\361\361\000\350\350\350\000\334\334\334" - "\000\314\314\314\000\273\273\273\000\251\251\251\000\226\226\226\000\203\203\203\000" - "rrr\377bbb\377UUU\377JJJ\377AAA\377:::\377\063\063\063\377---\377(((\377$$$" - "\377\"\"\"\377\037\037\037\377\036\036\036\377\036\036\036\377\036\036\036\377\036\036" - "\036\377\037\037\037\377\"\"\"\377$$$\377(((\377---\377\063\063\063\377:::\377A" - "AA\377JJJ\377UUU\377bbb\377rrr\377\203\203\203\000\226\226\226\000\251\251\251" - "\000\272\272\272\000\314\314\314\000\334\334\334\000\350\350\350\000\360\360\360\000" - "\367\367\367\000\373\373\373\000\375\375\375\000\376\376\376\000\376\376\376\000\376" - "\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\376\376\376\000\376\376\376\000\376\376\376\000\374\374\374" - "\000\371\371\371\000\364\364\364\000\352\352\352\000\335\335\335\000\313\313\313\000" - "\265\265\265\000\236\236\236\000\206\206\206\000ooo\377ZZZ\377III\377<<<\377//" - "/\377%%%\377\036\036\036\377\036\036\036\377\037\037\037\377\040\040\040\377!!!\377\"" - "\"\"\377!!!\377\033\033\033\377\036\036\036\377###\377###\377###\377###\377###" - "\377###\377\036\036\036\377\033\033\033\377!!!\377\"\"\"\377!!!\377\040\040\040\377" - "\037\037\037\377\036\036\036\377\036\036\036\377%%%\377///\377;;;\377III\377ZZZ\377" - "ooo\377\206\206\206\000\236\236\236\000\265\265\265\000\312\312\312\000\335\335\335" - "\000\352\352\352\000\363\363\363\000\371\371\371\000\374\374\374\000\376\376\376\000" - "\376\376\376\000\376\376\376\000\376\376\376\000\377\377\377\000\376\376\376\000\376" - "\376\376\000\376\376\376\000\374\374\374\000\371\371\371\000\361\361\361\000\345\345" - "\345\000\324\324\324\000\275\275\275\000\243\243\243\000\205\205\205\000jjj\377RRR" - "\377>>>\377---\377\"\"\"\377\036\036\036\377\040\040\040\377\"\"\"\377\033\033\033" - "\377###\377###\377\026\026\026\377\015\015\015\377\015\015\015\377\015\015\015\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\015" - "\015\015\377\026\026\026\377\026\026\026\377###\377\033\033\033\377\"\"\"\377\040\040" - "\040\377\036\036\036\377\"\"\"\377---\377>>>\377QQQ\377jjj\377\205\205\205\000" - "\242\242\242\000\275\275\275\000\324\324\324\000\345\345\345\000\361\361\361\000\371" - "\371\371\000\374\374\374\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376" - "\376\000\375\375\375\000\371\371\371\000\362\362\362\000\345\345\345\000\320\320\320" - "\000\265\265\265\000\225\225\225\000uuu\377WWW\377???\377,,,\377\036\036\036\377\037" - "\037\037\377\"\"\"\377\033\033\033\377###\377\026\026\026\377\015\015\015\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\026\026\026\377###\377\036" - "\036\036\377\"\"\"\377\037\037\037\377\036\036\036\377,,,\377???\377WWW\377uuu\377" - "\225\225\225\000\264\264\264\000\320\320\320\000\344\344\344\000\362\362\362\000\371" - "\371\371\000\375\375\375\000\376\376\376\000\373\373\373\000\365\365\365\000\351\351" - "\351\000\323\323\323\000\265\265\265\000\221\221\221\000mmm\377MMM\377\063\063\063\377" - "\"\"\"\377\037\037\037\377\"\"\"\377###\377\026\026\026\377\015\015\015\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\014\377\000\000z\377\000\000t\377\000\000\000\377\000\000\000\377" - "\000\000j\377\000\000\006\377\000\000\000\377\000\000\000\377\015\015\015\377\026\026\026\377###\377" - "\"\"\"\377\037\037\037\377!!!\377\063\063\063\377LLL\377mmm\377\221\221\221\000\265" - "\265\265\000\323\323\323\000\350\350\350\000\365\365\365\000\373\373\373\000\355\355" - "\355\000\334\334\334\000\276\276\276\000\230\230\230\000ppp\377KKK\377///\377\036" - "\036\036\377!!!\377\033\033\033\377\026\026\026\377\015\015\015\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\007\377\000\000\012\377\000\000\000\377\000\000\020\377\000\000\026\377\000\000)\377" - "\000\000\017\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\020\377\000\000\177\377\000\000G\377\000" - "\000\062\377\000\000\000\377\000\000\000\377\000\000-\377\000\000\002\377\000\000\000\377\006\006\006\377\010\010" - "\010\377\014\014\014\377\007\007\007\377\033\034\033\377\026\026\026\377\033\033\033\377!!!" - "\377\036\036\036\377///\377KKK\377ppp\377\227\227\227\000\276\276\276\000\334\334" - "\334\000\355\355\355\000\306\306\306\000\247\247\247\000}}}\377SSS\377\062\062\062\377" - "\036\036\036\377!!!\377\036\036\036\377\026\026\026\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\002\002\002\377\003\003\003\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000;\377\000\000T\377\000\000\003\377\000\000\214\377\000" - "\000\223\377\000\000;\377\000\000!\377\000\000\016\377\000\000\003\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\002\377\000\000\224\377\000\000" - "Q\377\000\000\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\025\025\025\377\033\034\033\377\027\027\027\377\027\027\027\377\021\021\021\377\000\000\000\377" - "\000\000\000\377\015\015\015\377\036\036\036\377!!!\377\036\036\036\377\062\062\062\377SSS" - "\377}}}\377\246\246\246\000\306\306\306\000\201\201\201\000aaa\377>>>\377###\377" - "\040\040\040\377\036\036\036\377\026\026\026\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\001\001\001\377\026\026\026\377\025\025\025\377" - "\021\022\021\377\027\030\027\377\000\000\000\377\000\000\007\377\000\000:\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000,\377\000\000\213\377\000\000\300\377\000\000_\377" - "\000\000=\377\000\000\000\377\000\000\000\377\000\000/\377\000\000H\377\000\000\001\377\000\000\000\377\000\000!" - "\377\000\000\237\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\026\026\026\377\036\036\036\377\040\040" - "\040\377###\377===\377aaa\377\200\200\200\000;;;\377)))\377\036\036\036\377!!!" - "\377\026\026\026\377\000\000\001\377\000\000\002\377\000\000\004\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\001\001\001\377\001\001\001\377&&&\377OPO\377QRQ\377#$#\377\000\000\000\377\000\000\000\377" - "\000\000\001\377\000\000\002\377\000\000\014\377\000\000\036\377\000\000V\377\000\000V\377\000\000V\377\000\000" - "X\377\000\000\071\377\000\000\066\377\000\000\300\377\000\000\274\377\000\000\250\377\000\000:\377" - "\000\000\006\377\000\000\251\377\000\000\327\377\000\000)\377\000\000\021\377\000\000\024\377\000\004\240" - "\377\007\007\034\377???\377-.-\377WWW\377`_`\377`_`\377`_`\377TST\377\"\"\"\377" - "\000\000\000\377\000\000\006\377\000\000A\377\000\000\000\377\000\000%\377\000\000U\377\000\000\024\377\000\000" - "\001\377\000\000\000\377\000\000\000\377\026\026\026\377!!!\377\036\036\036\377)))\377;;;\377" - "\040\040\040\377!!!\377###\377\015\015\015\377\000\000\006\377\000\000q\377\000\000\025\377\000" - "\000\062\377\000\000\000\377\000\000\000\377\017\020\017\377xyx\377\203\203\203\377\230\230" - "\230\377\272\273\272\377lll\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000a\377\000" - "\000\216\377\000\000\216\377\000\000\244\377\000\000\337\377\000\000\334\377\000\000\315\377\000" - "\000\342\377\000\000\270\377\000\000d\377\000\000\301\377\000\000\242\377\000\000\214\377\000\000+" - "\377\000\000\016\377\000\000\333\377\000\000\346\377\000\000^\377\000\000S\377\000\000\236\377\000\012" - "\340\377\005\005\067\377///\377HIH\377\303\303\303\377\312\311\312\377\312\311" - "\312\377\312\311\312\377\265\265\265\377QRQ\377\000\000\000\377\000\000\005\377\000\000\060" - "\377\000\000\000\377\000\000\034\377\000\000?\377\000\000|\377\000\000y\377\000\000\007\377\000\000\000\377" - "\000\000\000\377\015\015\015\377###\377!!!\377\040\040\040\377\026\026\026\377\015\015\015" - "\377\000\000\010\377\000\000W\377\000\000)\377\000\000&\377\003\003\003\377\017\017\017\377ede\377" - "\231\231\231\377\226\227\226\377\271\272\271\377\275\276\275\377\274\275" - "\274\377\200\200\200\377&&&\377\000\000\003\377\000\000D\377\000\000\241\377\000\000\331\377" - "\000\000\344\377\000\000\330\377\000\000\214\377\010\010>\377\017\017D\377\017\017?\377\000\000" - "\063\377\000\000s\377\000\000\305\377\000\000\277\377\001\001?\377\016\016-\377\017\017\017\377" - "\010\010\013\377\000\000X\377\000\000\360\377\000\005>\377\000+\225\377\000\020\333\377\000\003\352" - "\377\000\000\223\377\000\000\020\377\015\015\015\377xwx\377\343\342\343\377\357\360\357" - "\377\357\360\357\377\340\341\340\377~~~\377\000\000\000\377\014\014\014\377\017\017" - "\017\377\017\017\017\377\017\017\017\377\017\017\017\377\004\004(\377\000\000\210\377\000\000Q" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\000\000\000" - "\377\000\000\000\377\000\000j\377\000\000c\377\000\000\002\377\000\000\000\377\062\062\062\377\266\267" - "\266\377\273\274\273\377\275\276\275\377\275\276\275\377\275\276\275\377" - "\275\276\275\377\275\276\275\377sss\377\016\016\016\377\000\001F\377\002\003\335\377" - "\000\002\375\377\000\000\374\377\004\004H\377\035\035'\377\036\036#\377klk\377\264\265\264" - "\377\235\236\235\377\000\000&\377\000\000\317\377\000\000\307\377\026\026V\377--.\377\246" - "\247\246\377\266\267\266\377jjj\377\000\000)\377\000\032\347\377\000\007\302\377\000/" - "\220\377\000\022_\377\025\025\037\377!!)\377!!\"\377!!!\377\061\062\061\377\262\262" - "\262\377\365\365\365\377\365\365\365\377\352\352\352\377\213\213\213\377" - "\006\006\006\377\216\217\216\377\266\267\266\377\266\267\266\377\252\253\252\377" - "\230\231\230\377##<\377\000\000\216\377\000\000Y\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\246\377\000\000\033\377" - "\000\000\000\377\000\000\000\377klk\377\276\277\276\377\275\276\275\377\275\276\275\377" - "\311\311\311\377\312\311\312\377\275\276\275\377\275\276\275\377\207\210" - "\207\377\001\001\004\377\000\005\352\377\013\020\373\377\000\012\375\377\000\000\363\377\030" - "\027?\377\260\257\260\377\265\266\265\377\271\272\271\377\260\261\260\377" - ")))\377\000\000~\377\000\000\317\377%%i\377\237\236\242\377\271\271\271\377\274\275" - "\274\377\275\276\275\377\255\255\255\377\000\001\004\377\000\\\251\377\000\003\201\377" - "\011\014\025\377\062\063\067\377\234\234\234\377\310\307\310\377\310\307\310\377" - "\310\307\310\377\217\216\217\377\225\226\225\377\302\302\302\377\300\301" - "\300\377\277\300\277\377\210\211\210\377###\377\224\224\224\377\275\276\275" - "\377\301\301\301\377xwx\377\010\010\071\377\002\002n\377\000\000\225\377\000\000r\377\000" - "\000[\377\000\000\040\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\011d\377\000\013\027\377\000\000\000\377\024\024\024\377\261\261\261\377\334\334" - "\334\377\333\334\333\377\324\324\324\377\205\203\205\377\211\210\211\377" - "\275\276\275\377\275\276\275\377\236\237\236\377\017\017\021\377\000\003\233\377" - "\007\012\375\377\000\006\301\377\000\000\313\377\031\030?\377\270\267\270\377\275\276" - "\275\377\271\272\271\377\240\241\240\377\022\023D\377\000\004\350\377\000\000]\377" - "RRR\377\300\300\300\377\301\301\301\377\275\276\275\377\275\276\275\377\261" - "\261\261\377\036\036\037\377\000\000Z\377\021\021\023\377iii\377\235\236\235\377\305" - "\305\305\377\310\310\310\377\310\310\310\377\310\310\310\377\303\303\303" - "\377\207\207\207\377\243\243\243\377\331\332\331\377\333\334\333\377\270" - "\270\270\377@@@\377qqq\377\303\304\303\377\277\300\277\377\224\224\224\377" - "\000\000|\377\000\000\177\377\002\002\211\377\002\002\370\377\000\000\354\377\000\000\207\377\000\000" - "\061\377\000\000\007\377\000\000\024\377\000\000\000\377\000\000\000\377\000\000\000\377\000\025\025\377\000" - "\024\027\377\000\000\001\377*+*\377\372\372\372\377\375\375\375\377\376\376\376\377" - "\372\371\372\377\211\211\211\377\031\031\031\377nmn\377\326\323\326\377\300" - "\300\300\377\214\215\214\377\000\000\015\377\000\000C\377\002\002\"\377\000\000\240\377\031" - "\030?\377\270\267\270\377\275\276\275\377\263\264\263\377\214\215\214\377" - "\000\001i\377\000\016\315\377\022\022\026\377\\]\\\377TTT\377\246\246\246\377\276\277" - "\276\377\275\276\275\377\264\265\264\377BCB\377\001\001\001\377\226\226\226\377" - "\314\313\314\377\277\300\277\377\275\276\275\377\275\276\275\377\275\276" - "\275\377\275\276\275\377\275\276\275\377EEE\377~}~\377\373\373\373\377\377" - "\377\377\377\362\362\362\377bbb\377FGF\377\312\311\312\377\275\276\275\377" - "\271\272\271\377\002\002#\377\000\000\267\377\006\006\367\377\006\006\371\377\000\000\355\377" - "\000\000\274\377\000\000l\377\000\000\016\377\000\000,\377\000\000\001\377\000\000\000\377\000\000\005\377\000" - "\005\035\377\000\004p\377\000\000B\377\014\014\017\377yzy\377\300\300\300\377\320\320\320" - "\377\315\315\315\377\274\274\274\377\220\216\220\377\040\040\040\377\062\061\062" - "\377\062\062\062\377;;;\377\025\026\025\377\040\040\040\377<=<\377\006\006c\377\031\030" - "\060\377\270\267\270\377\275\276\275\377\262\263\262\377\200\200\200\377\037" - "\040\066\377\000q\234\377\005\010\010\377\026\027\"\377\013\013\023\377LML\377\263\263" - "\263\377\275\276\275\377\301\302\301\377HGH\377\065\065\065\377\276\277\276" - "\377\301\302\301\377\276\277\276\377\300\300\300\377\276\277\276\377\275" - "\276\275\377\266\267\266\377\266\267\266\377\017\017\017\377\061\061\061\377\367" - "\367\367\377\377\377\377\377\375\375\375\377ooo\377...\377\260\261\260\377" - "\275\276\275\377\264\265\264\377UUU\377\025\026;\377\027\027L\377\027\027L\377" - "\025\026J\377\011\011\062\377\017\017'\377\003\003\006\377\000\000^\377\000\000\026\377\000\000\004\377" - "\000\000D\377\000\000\314\377\000\000\305\377\000\000\303\377\000\001A\377\003\011\035\377MKM\377" - "\300\275\300\377\276\276\276\377\275\276\275\377\275\276\275\377\201\201" - "\201\377\021\021\021\377./.\377\243\243\243\377\267\270\267\377\225\226\225" - "\377Z[Z\377\010\010F\377\034\034,\377\277\277\277\377\307\310\307\377\263\264" - "\263\377\213\213\213\377\264\264\264\377(--\377\031\030\031\377\000\000S\377\000\000" - "\070\377\061\061\061\377\270\270\270\377\307\310\307\377\314\314\314\377MMM\377" - "[\\[\377\310\311\310\377\310\311\310\377\302\303\302\377\274\272\274\377" - "\261\261\261\377\273\274\273\377\265\266\265\377\252\252\252\377\000\000\000\377" - "\027\030\027\377\343\343\343\377\376\376\376\377\377\377\377\377\331\332\331" - "\377\302\303\302\377\307\310\307\377\307\310\307\377\277\300\277\377\304" - "\305\304\377\242\243\242\377\231\232\231\377\231\232\231\377\231\232\231" - "\377>?>\377kkk\377\025\025\030\377\000\000t\377\000\000\027\377\000\000\032\377\000\000\300\377" - "\000\000\355\377\000\000r\377\000\000\257\377\000\005\363\377\000%\263\377\001\001X\377\001\001)\377" - "MMM\377xxx\377\307\305\307\377\316\315\316\377\216\215\216\377\037\040\037\377" - "\236\237\236\377\275\276\275\377\275\276\275\377\240\241\240\377\011\011\012" - "\377\061\061\061\377\346\345\346\377\377\377\377\377\261\261\261\377\310\310" - "\310\377\376\376\376\377\374\373\374\377\305\304\305\377__`\377\033\033\034" - "\377\030\030\030\377\343\343\343\377\377\377\377\377\364\362\364\377cbc\377" - "\332\332\332\377\375\375\375\377\377\377\377\377\271\271\271\377(((\377K" - "KK\377\262\263\262\377\275\276\275\377srs\377\000\000=\377\000\000\016\377\200\200" - "\200\377\372\372\372\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\376\376\376\377\377\377\377\377;;;\377\001" - "\001W\377\001\030h\377\001\063b\377\001\001a\377\001\001Z\377\000\000k\377\000\000W\377\000\000\000\377" - "\000\002>\377\000\030\307\377\000\020\342\377\000\000_\377\000\000\330\377\000\003\364\377\000\022" - "g\377\000\000g\377\000\000/\377\000\000\000\377\016\015\016\377jhj\377\266\265\266\377\310" - "\307\310\377\202\202\202\377\252\252\252\377\276\277\276\377\275\276\275" - "\377\267\267\267\377)()\377AAA\377\322\322\322\377\336\337\336\377\256\257" - "\256\377\245\245\245\377\337\337\337\377\336\337\336\377\336\337\336\377" - "\316\316\316\377\212\211\212\377)))\377\307\310\307\377\341\341\341\377\336" - "\335\336\377\\[\\\377\326\325\326\377\376\375\376\377\376\376\376\377\206" - "\206\206\377\000\000\000\377)))\377\202\203\202\377\275\276\275\377\227\230\227" - "\377##%\377\000\000\000\377www\377\343\343\343\377\336\337\336\377\313\314\313" - "\377\200\200\200\377\212\212\212\377\337\337\337\377\336\337\336\377\336" - "\337\336\377Z[Z\377\000\000s\377\000\033\340\377\000:\310\377\000\004\274\377\000\000\207" - "\377\000\000q\377\000\000\000\377\000\000\000\377\000\006b\377\000\062\315\377\000\036\330\377\000\000" - "M\377\000\000\205\377\000\000\067\377\037\037\037\377\223\223\223\377\223\223\223\377" - "+++\377\000\000x\377\000\000\015\377\224\225\224\377\302\302\302\377\275\276\275\377" - "\267\270\267\377\277\300\277\377\275\276\275\377\301\301\301\377\243\243" - "\243\377hhh\377\275\276\275\377\275\276\275\377\254\255\254\377\202\202\202" - "\377\277\300\277\377\275\276\275\377\275\276\275\377\275\276\275\377\302" - "\303\302\377\241\241\241\377\272\273\272\377\304\304\304\377\310\307\310" - "\377TUT\377\321\320\321\377\375\375\375\377\376\375\376\377\206\206\206\377" - "\000\000\000\377\001\001t\377\022\023$\377*+*\377*+*\377\020\020\020\377\000\000\000\377jjj\377" - "\316\315\316\377\275\276\275\377\227\230\227\377\000\000\000\377\025\025\025\377\277" - "\300\277\377\275\276\275\377\275\276\275\377{{{\377\000\000\007\377\000\000/\377\000" - "\000|\377\000\013\345\377\000\000>\377\000\000\000\377\000\000\000\377\000\000\000\377\000\001!\377\000\010" - "\263\377\000\021\366\377\000\021\337\377\000\000\274\377+++\377\231\227\231\377\265" - "\266\265\377wxw\377'('\377\037\037\067\377@?B\377\304\303\304\377\275\276\275" - "\377\320\316\320\377[Z[\377\310\306\310\377\331\331\331\377\361\360\361\377" - "\363\364\363\377\351\351\351\377\365\365\365\377\365\365\365\377\205\205" - "\205\377\215\214\215\377\301\301\301\377\300\301\300\377\223\222\223\377" - "^^^\377\263\264\263\377\275\276\275\377\275\276\275\377\302\302\302\377\310" - "\307\310\377FGF\377\251\247\251\377\364\363\364\377\372\371\372\377\314\314" - "\314\377MNM\377\006\006)\377\000\000\177\377\000\000b\377\016\016\016\377=>=\377\061\062\061" - "\377***\377\273\274\273\377\275\276\275\377\227\230\227\377\000\000\065\377\003" - "\003\063\377\216\216\216\377\275\276\275\377\275\276\275\377\263\264\263\377" - "\013\025&\377\000D\262\377\000\000\277\377\000\002n\377\000\000\011\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\001\377\000\000\064\377\000<\277\377\000N\273\377\000\000\245\377\062\063\063" - "\377\255\253\255\377\265\266\265\377\271\272\271\377\265\266\265\377\265" - "\266\265\377\276\276\276\377\316\314\316\377\303\303\303\377\325\323\325" - "\377\272\272\272\377WYW\377SRS\377\273\270\273\377\322\321\322\377\363\363" - "\363\377\362\362\362\377\360\360\360\377nnn\377\230\227\230\377\304\304\304" - "\377\303\304\303\377\225\224\225\377\007\007\007\377hhh\377\267\270\267\377\275" - "\276\275\377\301\301\301\377\307\307\307\377SSS\377\066\067\066\377\347\346" - "\347\377\361\360\361\377\324\324\324\377\275\275\275\377HGH\377&&-\377*)" - "/\377ghg\377\204\205\204\377HIH\377\031\031\031\377\260\260\260\377\277\300" - "\277\377\233\234\233\377\000\000M\377\000\010\261\377\206\206\206\377\301\302\301" - "\377\301\302\301\377\276\277\276\377\037*:\377\000\\\234\377\000\006\021\377\000\000" - "\004\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\062\063\062\377\255\253\255\377\275\276\275\377\275" - "\276\275\377\275\276\275\377\275\276\275\377\301\302\301\377\321\320\321" - "\377\332\330\332\377\311\311\311\377\275\276\275\377\265\265\265\377kkk\377" - "\021\021\021\377\062\063\062\377\277\300\277\377\275\276\275\377\261\262\261\377" - "+++\377\276\277\276\377\320\316\320\377\316\315\316\377\275\276\275\377\020" - "\020\020\377\000\000\000\377[\\[\377\264\265\264\377\275\276\275\377\307\307\307" - "\377\230\230\230\377\000\000\000\377yyy\377\313\311\313\377\275\276\275\377\327" - "\325\327\377\325\323\325\377\304\304\304\377\312\311\312\377\275\276\275" - "\377\237\240\237\377\200\201\200\377\000\000L\377\215\215\221\377\310\310\310" - "\377\253\254\253\377\000\002Y\377\000(\275\377\213\212\213\377\322\320\322\377" - "\322\320\322\377\302\302\302\377opo\377\000\212\214\377\000\037\040\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\011\011\377" - "\000\036\036\377\000\006\007\377\034\034\034\377\267\266\267\377\322\321\322\377\322\321" - "\322\377\277\277\277\377\232\233\232\377\263\264\263\377\303\303\303\377" - "\307\306\307\377{{{\377WX[\377[[`\377PPT\377\020\021\022\377]]]\377\311\310" - "\311\377\310\310\310\377\234\234\234\377FFF\377\272\273\272\377\302\302\302" - "\377\332\327\332\377\323\321\323\377ono\377\013\014R\377\010\010\037\377^^^\377" - "\274\274\274\377\302\302\302\377\245\245\245\377\026\027\026\377\022\022\023\377" - "^]`\377\206\207\206\377\306\305\306\377\300\301\300\377\301\301\301\377\266" - "\265\266\377\257\260\257\377\253\254\253\377PPP\377\000\000K\377\211\211\214" - "\377\301\301\301\377uuu\377\000;w\377\000\035e\377\200\200\200\377\306\306\306" - "\377\302\300\302\377\320\317\320\377<PP\377\000\232\233\377\000\016\016\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\023\023" - "\377\000\067\070\377\000\014\014\377\002\002\002\377HHH\377\303\302\303\377\303\302\303" - "\377\262\263\262\377jkj\377$$$\377'**\377'**\377\014\017\025\377\000\002\251\377" - "\000\001\302\377\000\000\243\377\000\000O\377\203\203\203\377\320\317\320\377\322\320" - "\320\377\211\210\210\377\024\024\024\377(((\377'''\377\303\302\303\377\303\302" - "\303\377\257\260\257\377\026\026\062\377\000\001\232\377\006\006\036\377XXX\377\272\273" - "\272\377\263\263\263\377\236\237\236\377\005\006!\377\000\000j\377\022\022\022\377'" - "')\377\235\236\236\377\274\274\274\377\230\226\230\377bbb\377'''\377\010\010" - "\010\377\000\000\000\377\206\207\206\377yzy\377\017\017\020\377\000h\220\377\003\030\035" - "\377z{z\377\275\276\275\377\264\263\264\377\334\333\334\377\020\030\030\377" - "\000$$\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\003\003\377\000\007\007\377\000bc\377\000\027\027\377\005\014\014\377\031-" - "-\377\031\031\031\377\027//\377\016//\377\000=>\377\000\217\221\377\000\240\243\377" - "\000\275\304\377\000w\345\377\000$\311\377\000\000\245\377\031\031k\377\306\304\306\377" - "\311\311\303\377\353\352y\377ff\032\377!!!\377\063\063\063\377\010\010\010\377\031" - "\031\037\377\031\031.\377YZY\377\060\060\060\377\000Is\377\000$\263\377\010\010\061\377" - "\031\031.\377ooo\377\236\237\236\377{|\200\377():\377\020\020\020\377\000\000]\377" - "\024\024\063\377\031\031\066\377\024\024\065\377\013\013\034\377\000\000\000\377\000\000\000\377" - "\066\066\066\377\224\224\224\377WWW\377\000\000,\377\012\030M\377uxx\377\226\226\226" - "\377\236\237\236\377\235\236\235\377<<<\377\002\002\002\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000!!\377\000_`\377\000\000\000\377\000ln\377" - "\000\235\237\377\000\226\227\377\000\000\004\377\000QY\377\000\244\262\377\000g\273\377\000" - "\037\223\377\000\000K\377\063\063\063\377\325\323\325\377\325\325\232\377\363\362" - "Q\377\207\207\034\377[\\[\377kjj\377EE\022\377\000\000\035\377\000\000e\377\000\000\031\377" - "\000\000\062\377\000P~\377\000\247\315\377\000$\363\377\000\010\225\377\000\000:\377\000\000\022" - "\377\031\031\031\377\213\213\213\377KKK\377\000\000\000\377\000\000\015\377\000\000\211\377" - "\000\000\233\377\000\000S\377\035\035\035\377\012\012\012\377\231\231\231\377\010\010\010" - "\377\000\000\000\377\000\000&\377\000\000*\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\001\001\377\000\002\002\377\000\000\000\377\000\002\002\377\000\003\003\377\000\003\003\377\000\000\020" - "\377\000\002\034\377\000\003&\377\000\002\065\377\000\001\003\377\"\"#\377\231\231\231\377\350" - "\346\217\377\374\374\023\377\377\377\001\377\375\375W\377\374\374\374\377\372" - "\372\367\377\221\221-\377\000\000\001\377\000\000\002\377\000\000\061\377\000\000b\377\000\013\272" - "\377\000Y\315\377\000M\316\377\000\037\314\377\000\000\227\377\000\000\214\377\000\000\003\377" - "\003\003\003\377\001\001\001\377\000\000\000\377FFF\377\002\002\004\377\000\000\003\377\000\000\002\377\071\071" - "\071\377\023\023\023\377\003\003\003\377\000\000\000\377\000\000\000\377\000\000\001\377\000\000K\377\000\000" - "\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\007\377\000\000\013\377\000\000\017\377\000\000\025\377\000" - "\000\000\377\034\035\034\377PPP\377cc\031\377ll\000\377\206\206\000\377\377\377%\377" - "\377\377l\377\232\232j\377\023\023\023\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000G\377\000\000V\377\000\005V\377\000\015V\377\000\000\037\377\000\000\206\377\000\000Z\377" - "\000\000\071\377\000\000\015\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\027\027\000\377\314\314\003\377\372\372" - "\012\377\236\236\000\377\014\014\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000W\377\000\000" - "\220\377\000\000]\377\000\000\024\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377FF\000\377\343\343\035\377\216" - "\216k\377\025\025\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\017\377\000\000\027\377\000\000\001\377\000\000u\377\000\000" - "\027\377\000\000\015\377\000\000\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\040\040\040" - "\377!!!\377###\377\015\015\015\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\315\315\063\377\240\240\007\377" - "\004\004\004\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000/\377\000\000K\377\000\000\000\377\000\000\004\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\015\015\015\377###\377!!!\377\040\040\040\377:::\377(((\377\036" - "\036\036\377!!!\377\026\026\026\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000``\377\314\341\322\377\226\226\030\377\\\\\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\026" - "\026\026\377!!!\377\037\037\037\377(((\377:::\377\200\200\200\000aaa\377===\377" - "###\377!!!\377\036\036\036\377\015\015\015\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000CC\377m|W\377\315\315\011\377@@\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\036\036\036\377!!!\377###\377==" - "=\377aaa\377\200\200\200\000\306\306\306\000\246\246\246\000}}}\377SSS\377\062\062" - "\062\377\036\036\036\377!!!\377\036\036\036\377\015\015\015\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\257\257\000\377==\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\015\015\015\377###\377\"\"\"\377\036\036\036\377\062\062\062\377RRR\377}" - "}}\377\246\246\246\000\305\305\305\000\355\355\355\000\334\334\334\000\276\276\276" - "\000\227\227\227\000ooo\377KKK\377///\377\036\036\036\377!!!\377\033\033\033\377\026" - "\026\026\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\207\207\000\377\001\001\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\026\026\026\377\033\033\033\377!!!\377\036\036\036\377///\377JJJ\377ooo\377\227\227" - "\227\000\276\276\276\000\333\333\333\000\355\355\355\000\372\372\372\000\365\365\365" - "\000\350\350\350\000\323\323\323\000\264\264\264\000\221\221\221\000mmm\377LLL\377" - "\063\063\063\377\"\"\"\377\037\037\037\377\"\"\"\377###\377\026\026\026\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\\\\\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\026\026\026" - "\377###\377\"\"\"\377\037\037\037\377!!!\377\063\063\063\377LLL\377mmm\377\220" - "\220\220\000\264\264\264\000\322\322\322\000\350\350\350\000\365\365\365\000\372\372" - "\372\000\375\375\375\000\374\374\374\000\371\371\371\000\362\362\362\000\345\345\345" - "\000\320\320\320\000\264\264\264\000\225\225\225\000uuu\377WWW\377>>>\377+++\377" - "\036\036\036\377\037\037\037\377\"\"\"\377\036\036\036\377\026\026\026\377\015\015\015\377" - "\015\015\015\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\015" - "\015\015\377\026\026\026\377\036\036\036\377\"\"\"\377\037\037\037\377\036\036\036\377" - "+++\377>>>\377WWW\377uuu\377\224\224\224\000\264\264\264\000\317\317\317\000\344" - "\344\344\000\362\362\362\000\371\371\371\000\374\374\374\000\375\375\375\000\376\376" - "\376\000\376\376\376\000\375\375\375\000\374\374\374\000\370\370\370\000\361\361\361" - "\000\345\345\345\000\323\323\323\000\275\275\275\000\242\242\242\000\205\205\205\000" - "jjj\377RRR\377>>>\377---\377!!!\377\036\036\036\377\040\040\040\377\"\"\"\377\033" - "\033\033\377###\377\026\026\026\377\015\015\015\377\015\015\015\377\015\015\015\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\015\015\015\377\015\015\015\377\026\026\026\377###\377\033\033\033\377\"\"\"\377\040" - "\040\040\377\036\036\036\377!!!\377---\377>>>\377QQQ\377jjj\377\205\205\205\000" - "\242\242\242\000\274\274\274\000\323\323\323\000\345\345\345\000\361\361\361\000\370" - "\370\370\000\374\374\374\000\375\375\375\000\376\376\376\000\376\376\376\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\374\374\374" - "\000\371\371\371\000\363\363\363\000\352\352\352\000\335\335\335\000\312\312\312\000" - "\265\265\265\000\236\236\236\000\206\206\206\000ooo\377ZZZ\377III\377;;;\377.." - ".\377%%%\377\036\036\036\377\036\036\036\377\037\037\037\377\040\040\040\377\"\"\"\377" - "\"\"\"\377!!!\377\033\033\033\377\036\036\036\377###\377###\377###\377###\377#" - "##\377###\377\036\036\036\377\033\033\033\377!!!\377\"\"\"\377\"\"\"\377\040\040" - "\040\377\037\037\037\377\036\036\036\377\036\036\036\377%%%\377...\377;;;\377III\377" - "YYY\377nnn\377\205\205\205\000\236\236\236\000\265\265\265\000\312\312\312\000\335" - "\335\335\000\352\352\352\000\363\363\363\000\370\370\370\000\374\374\374\000\375\375" - "\375\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\377\377\377" - "\000\377\377\377\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000" - "\375\375\375\000\374\374\374\000\372\372\372\000\366\366\366\000\360\360\360\000\347" - "\347\347\000\333\333\333\000\313\313\313\000\272\272\272\000\250\250\250\000\226\226" - "\226\000\203\203\203\000rrr\377bbb\377UUU\377JJJ\377AAA\377:::\377\062\062\062\377" - "---\377(((\377$$$\377!!!\377\037\037\037\377\036\036\036\377\035\035\035\377\035\035" - "\035\377\036\036\036\377\037\037\037\377!!!\377$$$\377(((\377---\377\062\062\062\377" - "\071\071\071\377AAA\377JJJ\377UUU\377bbb\377rrr\377\203\203\203\000\226\226\226" - "\000\250\250\250\000\272\272\272\000\313\313\313\000\333\333\333\000\347\347\347\000" - "\360\360\360\000\366\366\366\000\372\372\372\000\374\374\374\000\375\375\375\000\376" - "\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\375\375\375\000" - "\374\374\374\000\372\372\372\000\366\366\366\000\361\361\361\000\352\352\352\000\342" - "\342\342\000\327\327\327\000\312\312\312\000\275\275\275\000\261\261\261\000\245\245" - "\245\000\231\231\231\000\214\214\214\000\201\201\201\000xxx\377ooo\377hhh\377bbb" - "\377]]]\377ZZZ\377WWW\377VVV\377VVV\377WWW\377ZZZ\377]]]\377bbb\377hhh\377" - "ooo\377xxx\377\201\201\201\000\214\214\214\000\231\231\231\000\245\245\245\000\261" - "\261\261\000\275\275\275\000\312\312\312\000\327\327\327\000\342\342\342\000\352\352" - "\352\000\361\361\361\000\366\366\366\000\372\372\372\000\374\374\374\000\375\375\375" - "\000\375\375\375\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000" - "\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375" - "\000\375\375\375\000\374\374\374\000\372\372\372\000\370\370\370\000\365\365\365\000" - "\360\360\360\000\354\354\354\000\347\347\347\000\341\341\341\000\331\331\331\000\321" - "\321\321\000\311\311\311\000\301\301\301\000\273\273\273\000\266\266\266\000\262\262" - "\262\000\257\257\257\000\254\254\254\000\253\253\253\000\252\252\252\000\252\252\252" - "\000\253\253\253\000\254\254\254\000\257\257\257\000\262\262\262\000\266\266\266\000" - "\273\273\273\000\301\301\301\000\310\310\310\000\321\321\321\000\331\331\331\000\341" - "\341\341\000\347\347\347\000\354\354\354\000\360\360\360\000\365\365\365\000\370\370" - "\370\000\372\372\372\000\374\374\374\000\375\375\375\000\375\375\375\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\376\376\376\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\375\375\375\000" - "\374\374\374\000\374\374\374\000\373\373\373\000\372\372\372\000\370\370\370\000\366" - "\366\366\000\363\363\363\000\360\360\360\000\356\356\356\000\354\354\354\000\352\352" - "\352\000\350\350\350\000\347\347\347\000\346\346\346\000\346\346\346\000\346\346\346" - "\000\346\346\346\000\346\346\346\000\346\346\346\000\347\347\347\000\350\350\350\000" - "\352\352\352\000\354\354\354\000\356\356\356\000\360\360\360\000\363\363\363\000\366" - "\366\366\000\370\370\370\000\372\372\372\000\373\373\373\000\374\374\374\000\374\374" - "\374\000\375\375\375\000\375\375\375\000\376\376\376\000\376\376\376\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\376\376\376\000\376\376\376\000" - "\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\375" - "\375\375\000\375\375\375\000\374\374\374\000\374\374\374\000\374\374\374\000\373\373" - "\373\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373" - "\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000" - "\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000\374\374\374\000\374" - "\374\374\000\375\375\375\000\375\375\375\000\375\375\375\000\375\375\375\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\376\376\376\000\376\376\376\000\376" - "\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000" - "\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376" - "\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377"; - diff --git a/ciolib/syncicon64.h b/ciolib/syncicon64.h deleted file mode 100644 index 58a37ce..0000000 --- a/ciolib/syncicon64.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef SYNCICON64_H_ -#define SYNCICON64_H_ - -#define SYNCICON64_WIDTH 64 -#define SYNCICON64_HEIGHT 64 -extern const char syncicon64[64*64*4]; - -#endif diff --git a/ciolib/syncicon64.ico b/ciolib/syncicon64.ico deleted file mode 100644 index 39069e2a0e15a5740dd956ceb5bf4d81988aee2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 diff --git a/ciolib/utf8_codepages.c b/ciolib/utf8_codepages.c deleted file mode 100644 index b3a9005..0000000 --- a/ciolib/utf8_codepages.c +++ /dev/null @@ -1,1929 +0,0 @@ -#include <inttypes.h> -#include <stdlib.h> -#include "utf8_codepages.h" - -struct ciolib_cpmap { - uint32_t unicode; - uint8_t cpchar; -}; - -// Sorted by unicode codepoint... -const static struct ciolib_cpmap cp437_table[162] = { - {0x0000, 0}, {0x00A0, 255}, {0x00A1, 173}, {0x00A2, 155}, - {0x00A3, 156}, {0x00A5, 157}, {0x00A6, 124}, {0x00A7, 21}, {0x00AA, 166}, - {0x00AB, 174}, {0x00AC, 170}, {0x00B0, 248}, {0x00B1, 241}, - {0x00B2, 253}, {0x00B5, 230}, {0x00B6, 20}, {0x00B7, 250}, - {0x00BA, 167}, {0x00BB, 175}, {0x00BC, 172}, {0x00BD, 171}, - {0x00BF, 168}, {0x00C4, 142}, {0x00C5, 143}, {0x00C6, 146}, - {0x00C7, 128}, {0x00C9, 144}, {0x00D1, 165}, {0x00D6, 153}, - {0x00DC, 154}, {0x00DF, 225}, {0x00E0, 133}, {0x00E1, 160}, - {0x00E2, 131}, {0x00E4, 132}, {0x00E5, 134}, {0x00E6, 145}, - {0x00E7, 135}, {0x00E8, 138}, {0x00E9, 130}, {0x00EA, 136}, - {0x00EB, 137}, {0x00EC, 141}, {0x00ED, 161}, {0x00EE, 140}, - {0x00EF, 139}, {0x00F1, 164}, {0x00F2, 149}, {0x00F3, 162}, - {0x00F4, 147}, {0x00F6, 148}, {0x00F7, 246}, {0x00F9, 151}, - {0x00FA, 163}, {0x00FB, 150}, {0x00FC, 129}, {0x00FF, 152}, - {0x0192, 159}, {0x0393, 226}, {0x0398, 233}, {0x03A3, 228}, - {0x03A6, 232}, {0x03A9, 234}, {0x03B1, 224}, {0x03B4, 235}, - {0x03B5, 238}, {0x03C0, 227}, {0x03C3, 229}, {0x03C4, 231}, - {0x03C6, 237}, {0x2022, 7}, {0x203C, 19}, {0x207F, 252}, - {0x20A7, 158}, {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, - {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, {0x21A8, 23}, - {0x2219, 249}, {0x221A, 251}, {0x221E, 236}, {0x221F, 28}, - {0x2229, 239}, {0x2248, 247}, {0x2261, 240}, {0x2264, 243}, - {0x2265, 242}, {0x2310, 169}, {0x2320, 244}, {0x2321, 245}, - {0x2500, 196}, {0x2502, 179}, {0x250C, 218}, {0x2510, 191}, - {0x2514, 192}, {0x2518, 217}, {0x251C, 195}, {0x2524, 180}, - {0x252C, 194}, {0x2534, 193}, {0x253C, 197}, {0x2550, 205}, - {0x2551, 186}, {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, - {0x2555, 184}, {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, - {0x2559, 211}, {0x255A, 200}, {0x255B, 190}, {0x255C, 189}, - {0x255D, 188}, {0x255E, 198}, {0x255F, 199}, {0x2560, 204}, - {0x2561, 181}, {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, - {0x2565, 210}, {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, - {0x2569, 202}, {0x256A, 216}, {0x256B, 215}, {0x256C, 206}, - {0x2580, 223}, {0x2584, 220}, {0x2588, 219}, {0x258C, 221}, - {0x2590, 222}, {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, - {0x25A0, 254}, {0x25AC, 22}, {0x25B2, 30}, {0x25BA, 16}, - {0x25BC, 31}, {0x25C4, 17}, {0x25CB, 9}, {0x25D8, 8}, - {0x25D9, 10}, {0x263A, 1}, {0x263B, 2}, {0x263C, 15}, - {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, - {0x2665, 3}, {0x2666, 4}, {0x266A, 13}, {0x266B, 14}, - {0xfffd, '?'} -}; - -const static uint32_t cp437_ext_table[32] = { - 0x0000, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, - 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, - 0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8, - 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC -}; - -const static uint32_t cp437_unicode_table[128] = { - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, - 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, - 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, - 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, - 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 -}; - -const static struct ciolib_cpmap cp1251_table[156] = { - {0x00a0, 160}, {0x00a4, 164}, {0x00a6, 166}, {0x00a7, 167}, - {0x00a9, 169}, {0x00ab, 171}, {0x00ac, 172}, {0x00ad, 173}, - {0x00ae, 174}, {0x00b0, 176}, {0x00b1, 177}, {0x00b5, 181}, - {0x00b6, 20}, {0x00b7, 183}, {0x00bb, 187}, {0x0401, 168}, - {0x0402, 128}, {0x0403, 129}, {0x0404, 170}, {0x0405, 189}, - {0x0406, 178}, {0x0407, 175}, {0x0408, 163}, {0x0409, 138}, - {0x040a, 140}, {0x040b, 142}, {0x040c, 141}, {0x040e, 161}, - {0x040f, 143}, {0x0410, 192}, {0x0411, 193}, {0x0412, 194}, - {0x0413, 195}, {0x0414, 196}, {0x0415, 197}, {0x0416, 198}, - {0x0417, 199}, {0x0418, 200}, {0x0419, 201}, {0x041a, 202}, - {0x041b, 203}, {0x041c, 204}, {0x041d, 205}, {0x041e, 206}, - {0x041f, 207}, {0x0420, 208}, {0x0421, 209}, {0x0422, 210}, - {0x0423, 211}, {0x0424, 212}, {0x0425, 213}, {0x0426, 214}, - {0x0427, 215}, {0x0428, 216}, {0x0429, 217}, {0x042a, 218}, - {0x042b, 219}, {0x042c, 220}, {0x042d, 221}, {0x042e, 222}, - {0x042f, 223}, {0x0430, 224}, {0x0431, 225}, {0x0432, 226}, - {0x0433, 227}, {0x0434, 228}, {0x0435, 229}, {0x0436, 230}, - {0x0437, 231}, {0x0438, 232}, {0x0439, 233}, {0x043a, 234}, - {0x043b, 235}, {0x043c, 236}, {0x043d, 237}, {0x043e, 238}, - {0x043f, 239}, {0x0440, 240}, {0x0441, 241}, {0x0442, 242}, - {0x0443, 243}, {0x0444, 244}, {0x0445, 245}, {0x0446, 246}, - {0x0447, 247}, {0x0448, 248}, {0x0449, 249}, {0x044a, 250}, - {0x044b, 251}, {0x044c, 252}, {0x044d, 253}, {0x044e, 254}, - {0x044f, 255}, {0x0451, 184}, {0x0452, 144}, {0x0453, 131}, - {0x0454, 186}, {0x0455, 190}, {0x0456, 179}, {0x0457, 191}, - {0x0458, 188}, {0x0459, 154}, {0x045a, 156}, {0x045b, 158}, - {0x045c, 157}, {0x045e, 162}, {0x045f, 159}, {0x0490, 165}, - {0x0491, 180}, {0x2013, 150}, {0x2014, 151}, {0x2018, 145}, - {0x2019, 146}, {0x201a, 130}, {0x201c, 147}, {0x201d, 148}, - {0x201e, 132}, {0x2020, 134}, {0x2021, 135}, {0x2022, 7}, - {0x2026, 133}, {0x2030, 137}, {0x2039, 139}, {0x203a, 155}, - {0x203c, 19}, {0x20ac, 136}, {0x2116, 185}, {0x2122, 153}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x221f, 28}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t cp1251_unicode_table[128] = { - 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, - 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, - 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, - 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, - 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, - 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, - 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, - 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f -}; - -const static struct ciolib_cpmap koi8_r_table[160] = { - {0x00a0, 154}, {0x00a7, 21}, {0x00a9, 191}, {0x00b0, 156}, - {0x00b2, 157}, {0x00b6, 20}, {0x00b7, 158}, {0x00f7, 159}, - {0x0401, 179}, {0x0410, 225}, {0x0411, 226}, {0x0412, 247}, - {0x0413, 231}, {0x0414, 228}, {0x0415, 229}, {0x0416, 246}, - {0x0417, 250}, {0x0418, 233}, {0x0419, 234}, {0x041a, 235}, - {0x041b, 236}, {0x041c, 237}, {0x041d, 238}, {0x041e, 239}, - {0x041f, 240}, {0x0420, 242}, {0x0421, 243}, {0x0422, 244}, - {0x0423, 245}, {0x0424, 230}, {0x0425, 232}, {0x0426, 227}, - {0x0427, 254}, {0x0428, 251}, {0x0429, 253}, {0x042a, 255}, - {0x042b, 249}, {0x042c, 248}, {0x042d, 252}, {0x042e, 224}, - {0x042f, 241}, {0x0430, 193}, {0x0431, 194}, {0x0432, 215}, - {0x0433, 199}, {0x0434, 196}, {0x0435, 197}, {0x0436, 214}, - {0x0437, 218}, {0x0438, 201}, {0x0439, 202}, {0x043a, 203}, - {0x043b, 204}, {0x043c, 205}, {0x043d, 206}, {0x043e, 207}, - {0x043f, 208}, {0x0440, 210}, {0x0441, 211}, {0x0442, 212}, - {0x0443, 213}, {0x0444, 198}, {0x0445, 200}, {0x0446, 195}, - {0x0447, 222}, {0x0448, 219}, {0x0449, 221}, {0x044a, 223}, - {0x044b, 217}, {0x044c, 216}, {0x044d, 220}, {0x044e, 192}, - {0x044f, 209}, {0x0451, 163}, {0x2022, 7}, {0x203c, 19}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x2219, 149}, - {0x221a, 150}, {0x221f, 28}, {0x2248, 151}, {0x2264, 152}, - {0x2265, 153}, {0x2320, 147}, {0x2321, 155}, {0x2500, 128}, - {0x2502, 129}, {0x250c, 130}, {0x2510, 131}, {0x2514, 132}, - {0x2518, 133}, {0x251c, 134}, {0x2524, 135}, {0x252c, 136}, - {0x2534, 137}, {0x253c, 138}, {0x2550, 160}, {0x2551, 161}, - {0x2552, 162}, {0x2553, 164}, {0x2554, 165}, {0x2555, 166}, - {0x2556, 167}, {0x2557, 168}, {0x2558, 169}, {0x2559, 170}, - {0x255a, 171}, {0x255b, 172}, {0x255c, 173}, {0x255d, 174}, - {0x255e, 175}, {0x255f, 176}, {0x2560, 177}, {0x2561, 178}, - {0x2562, 180}, {0x2563, 181}, {0x2564, 182}, {0x2565, 183}, - {0x2566, 184}, {0x2567, 185}, {0x2568, 186}, {0x2569, 187}, - {0x256a, 188}, {0x256b, 189}, {0x256c, 190}, {0x2580, 139}, - {0x2584, 140}, {0x2588, 141}, {0x258c, 142}, {0x2590, 143}, - {0x2591, 144}, {0x2592, 145}, {0x2593, 146}, {0x25a0, 148}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t koi8_r_unicode_table[128] = { - 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, - 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, - 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, - 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, - 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, - 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, - 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, - 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, - 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, - 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, - 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, - 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, - 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, - 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, - 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, - 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a -}; - -const static uint32_t empty_ext_table[32] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd -}; - -const static struct ciolib_cpmap iso8859_2_table[127] = { - {0x00a0, 160}, {0x00a4, 164}, {0x00a7, 167}, {0x00a8, 168}, - {0x00ad, 173}, {0x00b0, 176}, {0x00b4, 180}, {0x00b6, 20}, - {0x00b8, 184}, {0x00c1, 193}, {0x00c2, 194}, {0x00c4, 196}, - {0x00c7, 199}, {0x00c9, 201}, {0x00cb, 203}, {0x00cd, 205}, - {0x00ce, 206}, {0x00d3, 211}, {0x00d4, 212}, {0x00d6, 214}, - {0x00d7, 215}, {0x00da, 218}, {0x00dc, 220}, {0x00dd, 221}, - {0x00df, 223}, {0x00e1, 225}, {0x00e2, 226}, {0x00e4, 228}, - {0x00e7, 231}, {0x00e9, 233}, {0x00eb, 235}, {0x00ed, 237}, - {0x00ee, 238}, {0x00f3, 243}, {0x00f4, 244}, {0x00f6, 246}, - {0x00f7, 247}, {0x00fa, 250}, {0x00fc, 252}, {0x00fd, 253}, - {0x0102, 195}, {0x0103, 227}, {0x0104, 161}, {0x0105, 177}, - {0x0106, 198}, {0x0107, 230}, {0x010c, 200}, {0x010d, 232}, - {0x010e, 207}, {0x010f, 239}, {0x0110, 208}, {0x0111, 240}, - {0x0118, 202}, {0x0119, 234}, {0x011a, 204}, {0x011b, 236}, - {0x0139, 197}, {0x013a, 229}, {0x013d, 165}, {0x013e, 181}, - {0x0141, 163}, {0x0142, 179}, {0x0143, 209}, {0x0144, 241}, - {0x0147, 210}, {0x0148, 242}, {0x0150, 213}, {0x0151, 245}, - {0x0154, 192}, {0x0155, 224}, {0x0158, 216}, {0x0159, 248}, - {0x015a, 166}, {0x015b, 182}, {0x015e, 170}, {0x015f, 186}, - {0x0160, 169}, {0x0161, 185}, {0x0162, 222}, {0x0163, 254}, - {0x0164, 171}, {0x0165, 187}, {0x016e, 217}, {0x016f, 249}, - {0x0170, 219}, {0x0171, 251}, {0x0179, 172}, {0x017a, 188}, - {0x017b, 175}, {0x017c, 191}, {0x017d, 174}, {0x017e, 190}, - {0x02c7, 183}, {0x02d8, 162}, {0x02d9, 255}, {0x02db, 178}, - {0x02dd, 189}, {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, - {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, - {0x2195, 18}, {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, - {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, - {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, - {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, - {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, - {0x266a, 13}, {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_2_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, - 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, - 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, - 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, - 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, - 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, - 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, - 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, - 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, - 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, - 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, - 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9 -}; - -const static struct ciolib_cpmap iso8859_4_table[127] = { - {0x00a0, 160}, {0x00a4, 164}, {0x00a7, 167}, {0x00a8, 168}, - {0x00ad, 173}, {0x00af, 175}, {0x00b0, 176}, {0x00b4, 180}, - {0x00b6, 20}, {0x00b8, 184}, {0x00c1, 193}, {0x00c2, 194}, - {0x00c3, 195}, {0x00c4, 196}, {0x00c5, 197}, {0x00c6, 198}, - {0x00c9, 201}, {0x00cb, 203}, {0x00cd, 205}, {0x00ce, 206}, - {0x00d4, 212}, {0x00d5, 213}, {0x00d6, 214}, {0x00d7, 215}, - {0x00d8, 216}, {0x00da, 218}, {0x00db, 219}, {0x00dc, 220}, - {0x00df, 223}, {0x00e1, 225}, {0x00e2, 226}, {0x00e3, 227}, - {0x00e4, 228}, {0x00e5, 229}, {0x00e6, 230}, {0x00e9, 233}, - {0x00eb, 235}, {0x00ed, 237}, {0x00ee, 238}, {0x00f4, 244}, - {0x00f5, 245}, {0x00f6, 246}, {0x00f7, 247}, {0x00f8, 248}, - {0x00fa, 250}, {0x00fb, 251}, {0x00fc, 252}, {0x0100, 192}, - {0x0101, 224}, {0x0104, 161}, {0x0105, 177}, {0x010c, 200}, - {0x010d, 232}, {0x0110, 208}, {0x0111, 240}, {0x0112, 170}, - {0x0113, 186}, {0x0116, 204}, {0x0117, 236}, {0x0118, 202}, - {0x0119, 234}, {0x0122, 171}, {0x0123, 187}, {0x0128, 165}, - {0x0129, 181}, {0x012a, 207}, {0x012b, 239}, {0x012e, 199}, - {0x012f, 231}, {0x0136, 211}, {0x0137, 243}, {0x0138, 162}, - {0x013b, 166}, {0x013c, 182}, {0x0145, 209}, {0x0146, 241}, - {0x014a, 189}, {0x014b, 191}, {0x014c, 210}, {0x014d, 242}, - {0x0156, 163}, {0x0157, 179}, {0x0160, 169}, {0x0161, 185}, - {0x0166, 172}, {0x0167, 188}, {0x0168, 221}, {0x0169, 253}, - {0x016a, 222}, {0x016b, 254}, {0x0172, 217}, {0x0173, 249}, - {0x017d, 174}, {0x017e, 190}, {0x02c7, 183}, {0x02d9, 255}, - {0x02db, 178}, {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, - {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, - {0x2195, 18}, {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, - {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, - {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, - {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, - {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, - {0x266a, 13}, {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_4_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, - 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, - 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, - 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, - 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, - 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, - 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, - 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, - 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, - 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9 -}; - -#if 0 -const static struct ciolib_cpmap cp866_table[160] = { - {0x00a0, 255}, {0x00a4, 253}, {0x00a7, 21}, {0x00b0, 248}, - {0x00b6, 20}, {0x00b7, 250}, {0x0401, 240}, {0x0404, 242}, - {0x0407, 244}, {0x040e, 246}, {0x0410, 128}, {0x0411, 129}, - {0x0412, 130}, {0x0413, 131}, {0x0414, 132}, {0x0415, 133}, - {0x0416, 134}, {0x0417, 135}, {0x0418, 136}, {0x0419, 137}, - {0x041a, 138}, {0x041b, 139}, {0x041c, 140}, {0x041d, 141}, - {0x041e, 142}, {0x041f, 143}, {0x0420, 144}, {0x0421, 145}, - {0x0422, 146}, {0x0423, 147}, {0x0424, 148}, {0x0425, 149}, - {0x0426, 150}, {0x0427, 151}, {0x0428, 152}, {0x0429, 153}, - {0x042a, 154}, {0x042b, 155}, {0x042c, 156}, {0x042d, 157}, - {0x042e, 158}, {0x042f, 159}, {0x0430, 160}, {0x0431, 161}, - {0x0432, 162}, {0x0433, 163}, {0x0434, 164}, {0x0435, 165}, - {0x0436, 166}, {0x0437, 167}, {0x0438, 168}, {0x0439, 169}, - {0x043a, 170}, {0x043b, 171}, {0x043c, 172}, {0x043d, 173}, - {0x043e, 174}, {0x043f, 175}, {0x0440, 224}, {0x0441, 225}, - {0x0442, 226}, {0x0443, 227}, {0x0444, 228}, {0x0445, 229}, - {0x0446, 230}, {0x0447, 231}, {0x0448, 232}, {0x0449, 233}, - {0x044a, 234}, {0x044b, 235}, {0x044c, 236}, {0x044d, 237}, - {0x044e, 238}, {0x044f, 239}, {0x0451, 241}, {0x0454, 243}, - {0x0457, 245}, {0x045e, 247}, {0x2022, 7}, {0x203c, 19}, - {0x2116, 252}, {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, - {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, - {0x2219, 249}, {0x221a, 251}, {0x221f, 28}, {0x2500, 196}, - {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, {0x2514, 192}, - {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, {0x252c, 194}, - {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, {0x2551, 186}, - {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, {0x2555, 184}, - {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, {0x2559, 211}, - {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, {0x255d, 188}, - {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, {0x2561, 181}, - {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, {0x2565, 210}, - {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, {0x2569, 202}, - {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, {0x2590, 222}, - {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, {0x25a0, 254}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp866_unicode_table[128] = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, - 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0 -}; -#endif - -const static struct ciolib_cpmap cp866m_table[160] = { - {0x00a0, 255}, {0x00a7, 21}, {0x00b0, 248}, {0x00B2, 253}, - {0x00b6, 20}, {0x00b7, 250}, {0x00F7, 246}, {0x0401, 240}, - {0x0410, 128}, {0x0411, 129}, {0x0412, 130}, {0x0413, 131}, - {0x0414, 132}, {0x0415, 133}, {0x0416, 134}, {0x0417, 135}, - {0x0418, 136}, {0x0419, 137}, {0x041a, 138}, {0x041b, 139}, - {0x041c, 140}, {0x041d, 141}, {0x041e, 142}, {0x041f, 143}, - {0x0420, 144}, {0x0421, 145}, {0x0422, 146}, {0x0423, 147}, - {0x0424, 148}, {0x0425, 149}, {0x0426, 150}, {0x0427, 151}, - {0x0428, 152}, {0x0429, 153}, {0x042a, 154}, {0x042b, 155}, - {0x042c, 156}, {0x042d, 157}, {0x042e, 158}, {0x042f, 159}, - {0x0430, 160}, {0x0431, 161}, {0x0432, 162}, {0x0433, 163}, - {0x0434, 164}, {0x0435, 165}, {0x0436, 166}, {0x0437, 167}, - {0x0438, 168}, {0x0439, 169}, {0x043a, 170}, {0x043b, 171}, - {0x043c, 172}, {0x043d, 173}, {0x043e, 174}, {0x043f, 175}, - {0x0440, 224}, {0x0441, 225}, {0x0442, 226}, {0x0443, 227}, - {0x0444, 228}, {0x0445, 229}, {0x0446, 230}, {0x0447, 231}, - {0x0448, 232}, {0x0449, 233}, {0x044a, 234}, {0x044b, 235}, - {0x044c, 236}, {0x044d, 237}, {0x044e, 238}, {0x044f, 239}, - {0x0451, 241}, {0x045F, 252}, {0x2022, 7}, {0x203c, 19}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x2219, 249}, - {0x221a, 251}, {0x221f, 28}, {0x2264, 243}, {0x2265, 242}, - {0x2320, 244}, {0x2321, 245}, {0x2248, 247}, {0x2500, 196}, - {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, {0x2514, 192}, - {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, {0x252c, 194}, - {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, {0x2551, 186}, - {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, {0x2555, 184}, - {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, {0x2559, 211}, - {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, {0x255d, 188}, - {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, {0x2561, 181}, - {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, {0x2565, 210}, - {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, {0x2569, 202}, - {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, {0x2590, 222}, - {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, {0x25a0, 254}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp866m_unicode_table[128] = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, - 0x00b0, 0x2219, 0x00b7, 0x221a, 0x045F, 0x00B2, 0x25a0, 0x00a0 -}; - -const static struct ciolib_cpmap iso8859_9_table[126] = { - {0x00a0, 160}, {0x00a1, 161}, {0x00a2, 162}, {0x00a3, 163}, - {0x00a4, 164}, {0x00a5, 165}, {0x00a6, 166}, {0x00a7, 167}, - {0x00a8, 168}, {0x00a9, 169}, {0x00aa, 170}, {0x00ab, 171}, - {0x00ac, 172}, {0x00ad, 173}, {0x00ae, 174}, {0x00af, 175}, - {0x00b0, 176}, {0x00b1, 177}, {0x00b2, 178}, {0x00b3, 179}, - {0x00b4, 180}, {0x00b5, 181}, {0x00b6, 182}, {0x00b7, 183}, - {0x00b8, 184}, {0x00b9, 185}, {0x00ba, 186}, {0x00bb, 187}, - {0x00bc, 188}, {0x00bd, 189}, {0x00be, 190}, {0x00bf, 191}, - {0x00c0, 192}, {0x00c1, 193}, {0x00c2, 194}, {0x00c3, 195}, - {0x00c4, 196}, {0x00c5, 197}, {0x00c6, 198}, {0x00c7, 199}, - {0x00c8, 200}, {0x00c9, 201}, {0x00ca, 202}, {0x00cb, 203}, - {0x00cc, 204}, {0x00cd, 205}, {0x00ce, 206}, {0x00cf, 207}, - {0x00d1, 209}, {0x00d2, 210}, {0x00d3, 211}, {0x00d4, 212}, - {0x00d5, 213}, {0x00d6, 214}, {0x00d7, 215}, {0x00d8, 216}, - {0x00d9, 217}, {0x00da, 218}, {0x00db, 219}, {0x00dc, 220}, - {0x00df, 223}, {0x00e0, 224}, {0x00e1, 225}, {0x00e2, 226}, - {0x00e3, 227}, {0x00e4, 228}, {0x00e5, 229}, {0x00e6, 230}, - {0x00e7, 231}, {0x00e8, 232}, {0x00e9, 233}, {0x00ea, 234}, - {0x00eb, 235}, {0x00ec, 236}, {0x00ed, 237}, {0x00ee, 238}, - {0x00ef, 239}, {0x00f1, 241}, {0x00f2, 242}, {0x00f3, 243}, - {0x00f4, 244}, {0x00f5, 245}, {0x00f6, 246}, {0x00f7, 247}, - {0x00f8, 248}, {0x00f9, 249}, {0x00fa, 250}, {0x00fb, 251}, - {0x00fc, 252}, {0x00ff, 255}, {0x011e, 208}, {0x011f, 240}, - {0x0130, 221}, {0x0131, 253}, {0x015e, 222}, {0x015f, 254}, - {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_9_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff -}; - -const static struct ciolib_cpmap iso8859_8_table[90] = { - {0x00a0, 160}, {0x00a2, 162}, {0x00a3, 163}, {0x00a4, 164}, - {0x00a5, 165}, {0x00a6, 166}, {0x00a7, 167}, {0x00a8, 168}, - {0x00a9, 169}, {0x00ab, 171}, {0x00ac, 172}, {0x00ad, 173}, - {0x00ae, 174}, {0x00af, 175}, {0x00b0, 176}, {0x00b1, 177}, - {0x00b2, 178}, {0x00b3, 179}, {0x00b4, 180}, {0x00b5, 181}, - {0x00b6, 182}, {0x00b7, 183}, {0x00b8, 184}, {0x00b9, 185}, - {0x00bb, 187}, {0x00bc, 188}, {0x00bd, 189}, {0x00be, 190}, - {0x00d7, 170}, {0x00f7, 186}, {0x05d0, 224}, {0x05d1, 225}, - {0x05d2, 226}, {0x05d3, 227}, {0x05d4, 228}, {0x05d5, 229}, - {0x05d6, 230}, {0x05d7, 231}, {0x05d8, 232}, {0x05d9, 233}, - {0x05da, 234}, {0x05db, 235}, {0x05dc, 236}, {0x05dd, 237}, - {0x05de, 238}, {0x05df, 239}, {0x05e0, 240}, {0x05e1, 241}, - {0x05e2, 242}, {0x05e3, 243}, {0x05e4, 244}, {0x05e5, 245}, - {0x05e6, 246}, {0x05e7, 247}, {0x05e8, 248}, {0x05e9, 249}, - {0x05ea, 250}, {0x200e, 253}, {0x200f, 254}, {0x2017, 223}, - {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_8_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2017, - 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, - 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, - 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, - 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd -}; - -const static struct ciolib_cpmap koi8_u_table[160] = { - {0x00a0, 154}, {0x00a7, 21}, {0x00a9, 191}, {0x00b0, 156}, - {0x00b2, 157}, {0x00b6, 20}, {0x00b7, 158}, {0x00f7, 159}, - {0x0401, 179}, {0x0404, 180}, {0x0406, 182}, {0x0407, 183}, - {0x0410, 225}, {0x0411, 226}, {0x0412, 247}, {0x0413, 231}, - {0x0414, 228}, {0x0415, 229}, {0x0416, 246}, {0x0417, 250}, - {0x0418, 233}, {0x0419, 234}, {0x041a, 235}, {0x041b, 236}, - {0x041c, 237}, {0x041d, 238}, {0x041e, 239}, {0x041f, 240}, - {0x0420, 242}, {0x0421, 243}, {0x0422, 244}, {0x0423, 245}, - {0x0424, 230}, {0x0425, 232}, {0x0426, 227}, {0x0427, 254}, - {0x0428, 251}, {0x0429, 253}, {0x042a, 255}, {0x042b, 249}, - {0x042c, 248}, {0x042d, 252}, {0x042e, 224}, {0x042f, 241}, - {0x0430, 193}, {0x0431, 194}, {0x0432, 215}, {0x0433, 199}, - {0x0434, 196}, {0x0435, 197}, {0x0436, 214}, {0x0437, 218}, - {0x0438, 201}, {0x0439, 202}, {0x043a, 203}, {0x043b, 204}, - {0x043c, 205}, {0x043d, 206}, {0x043e, 207}, {0x043f, 208}, - {0x0440, 210}, {0x0441, 211}, {0x0442, 212}, {0x0443, 213}, - {0x0444, 198}, {0x0445, 200}, {0x0446, 195}, {0x0447, 222}, - {0x0448, 219}, {0x0449, 221}, {0x044a, 223}, {0x044b, 217}, - {0x044c, 216}, {0x044d, 220}, {0x044e, 192}, {0x044f, 209}, - {0x0451, 163}, {0x0454, 164}, {0x0456, 166}, {0x0457, 167}, - {0x0490, 189}, {0x0491, 173}, {0x2022, 7}, {0x203c, 19}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x2219, 149}, - {0x221a, 150}, {0x221f, 28}, {0x2248, 151}, {0x2264, 152}, - {0x2265, 153}, {0x2320, 147}, {0x2321, 155}, {0x2500, 128}, - {0x2502, 129}, {0x250c, 130}, {0x2510, 131}, {0x2514, 132}, - {0x2518, 133}, {0x251c, 134}, {0x2524, 135}, {0x252c, 136}, - {0x2534, 137}, {0x253c, 138}, {0x2550, 160}, {0x2551, 161}, - {0x2552, 162}, {0x2554, 165}, {0x2557, 168}, {0x2558, 169}, - {0x2559, 170}, {0x255a, 171}, {0x255b, 172}, {0x255d, 174}, - {0x255e, 175}, {0x255f, 176}, {0x2560, 177}, {0x2561, 178}, - {0x2563, 181}, {0x2566, 184}, {0x2567, 185}, {0x2568, 186}, - {0x2569, 187}, {0x256a, 188}, {0x256c, 190}, {0x2580, 139}, - {0x2584, 140}, {0x2588, 141}, {0x258c, 142}, {0x2590, 143}, - {0x2591, 144}, {0x2592, 145}, {0x2593, 146}, {0x25a0, 148}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t koi8_u_unicode_table[128] = { - 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, - 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, - 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, - 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, - 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, - 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x255d, 0x255e, - 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, - 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x256c, 0x00a9, - 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, - 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, - 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, - 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, - 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, - 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, - 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, - 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a -}; - -const static struct ciolib_cpmap iso8859_15_table[126] = { - {0x00a0, 160}, {0x00a1, 161}, {0x00a2, 162}, {0x00a3, 163}, - {0x00a5, 165}, {0x00a7, 167}, {0x00a9, 169}, {0x00aa, 170}, - {0x00ab, 171}, {0x00ac, 172}, {0x00ad, 173}, {0x00ae, 174}, - {0x00af, 175}, {0x00b0, 176}, {0x00b1, 177}, {0x00b2, 178}, - {0x00b3, 179}, {0x00b5, 181}, {0x00b6, 20}, {0x00b7, 183}, - {0x00b9, 185}, {0x00ba, 186}, {0x00bb, 187}, {0x00bf, 191}, - {0x00c0, 192}, {0x00c1, 193}, {0x00c2, 194}, {0x00c3, 195}, - {0x00c4, 196}, {0x00c5, 197}, {0x00c6, 198}, {0x00c7, 199}, - {0x00c8, 200}, {0x00c9, 201}, {0x00ca, 202}, {0x00cb, 203}, - {0x00cc, 204}, {0x00cd, 205}, {0x00ce, 206}, {0x00cf, 207}, - {0x00d0, 208}, {0x00d1, 209}, {0x00d2, 210}, {0x00d3, 211}, - {0x00d4, 212}, {0x00d5, 213}, {0x00d6, 214}, {0x00d7, 215}, - {0x00d8, 216}, {0x00d9, 217}, {0x00da, 218}, {0x00db, 219}, - {0x00dc, 220}, {0x00dd, 221}, {0x00de, 222}, {0x00df, 223}, - {0x00e0, 224}, {0x00e1, 225}, {0x00e2, 226}, {0x00e3, 227}, - {0x00e4, 228}, {0x00e5, 229}, {0x00e6, 230}, {0x00e7, 231}, - {0x00e8, 232}, {0x00e9, 233}, {0x00ea, 234}, {0x00eb, 235}, - {0x00ec, 236}, {0x00ed, 237}, {0x00ee, 238}, {0x00ef, 239}, - {0x00f0, 240}, {0x00f1, 241}, {0x00f2, 242}, {0x00f3, 243}, - {0x00f4, 244}, {0x00f5, 245}, {0x00f6, 246}, {0x00f7, 247}, - {0x00f8, 248}, {0x00f9, 249}, {0x00fa, 250}, {0x00fb, 251}, - {0x00fc, 252}, {0x00fd, 253}, {0x00fe, 254}, {0x00ff, 255}, - {0x0152, 188}, {0x0153, 189}, {0x0160, 166}, {0x0161, 168}, - {0x0178, 190}, {0x017d, 180}, {0x017e, 184}, {0x2022, 7}, - {0x203c, 19}, {0x20ac, 164}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_15_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, - 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, - 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff -}; - -const static struct ciolib_cpmap iso8859_5_table[127] = { - {0x00a0, 160}, {0x00a7, 21}, {0x00ad, 173}, {0x00b6, 20}, - {0x0401, 161}, {0x0402, 162}, {0x0403, 163}, {0x0404, 164}, - {0x0405, 165}, {0x0406, 166}, {0x0407, 167}, {0x0408, 168}, - {0x0409, 169}, {0x040a, 170}, {0x040b, 171}, {0x040c, 172}, - {0x040e, 174}, {0x040f, 175}, {0x0410, 176}, {0x0411, 177}, - {0x0412, 178}, {0x0413, 179}, {0x0414, 180}, {0x0415, 181}, - {0x0416, 182}, {0x0417, 183}, {0x0418, 184}, {0x0419, 185}, - {0x041a, 186}, {0x041b, 187}, {0x041c, 188}, {0x041d, 189}, - {0x041e, 190}, {0x041f, 191}, {0x0420, 192}, {0x0421, 193}, - {0x0422, 194}, {0x0423, 195}, {0x0424, 196}, {0x0425, 197}, - {0x0426, 198}, {0x0427, 199}, {0x0428, 200}, {0x0429, 201}, - {0x042a, 202}, {0x042b, 203}, {0x042c, 204}, {0x042d, 205}, - {0x042e, 206}, {0x042f, 207}, {0x0430, 208}, {0x0431, 209}, - {0x0432, 210}, {0x0433, 211}, {0x0434, 212}, {0x0435, 213}, - {0x0436, 214}, {0x0437, 215}, {0x0438, 216}, {0x0439, 217}, - {0x043a, 218}, {0x043b, 219}, {0x043c, 220}, {0x043d, 221}, - {0x043e, 222}, {0x043f, 223}, {0x0440, 224}, {0x0441, 225}, - {0x0442, 226}, {0x0443, 227}, {0x0444, 228}, {0x0445, 229}, - {0x0446, 230}, {0x0447, 231}, {0x0448, 232}, {0x0449, 233}, - {0x044a, 234}, {0x044b, 235}, {0x044c, 236}, {0x044d, 237}, - {0x044e, 238}, {0x044f, 239}, {0x0451, 241}, {0x0452, 242}, - {0x0453, 243}, {0x0454, 244}, {0x0455, 245}, {0x0456, 246}, - {0x0457, 247}, {0x0458, 248}, {0x0459, 249}, {0x045a, 250}, - {0x045b, 251}, {0x045c, 252}, {0x045e, 254}, {0x045f, 255}, - {0x2022, 7}, {0x203c, 19}, {0x2116, 240}, {0x2190, 27}, - {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, - {0x2195, 18}, {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, - {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, - {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, - {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, - {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, - {0x266a, 13}, {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_5_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, - 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, - 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f -}; - -const static struct ciolib_cpmap cp850_table[158] = { - {0x00a0, 255}, {0x00a1, 173}, {0x00a2, 189}, {0x00a3, 156}, - {0x00a4, 207}, {0x00a5, 190}, {0x00a6, 221}, {0x00a7, 21}, - {0x00a8, 249}, {0x00a9, 184}, {0x00aa, 166}, {0x00ab, 174}, - {0x00ac, 170}, {0x00ad, 240}, {0x00ae, 169}, {0x00af, 238}, - {0x00b0, 248}, {0x00b1, 241}, {0x00b2, 253}, {0x00b3, 252}, - {0x00b4, 239}, {0x00b5, 230}, {0x00b6, 20}, {0x00b7, 250}, - {0x00b8, 247}, {0x00b9, 251}, {0x00ba, 167}, {0x00bb, 175}, - {0x00bc, 172}, {0x00bd, 171}, {0x00be, 243}, {0x00bf, 168}, - {0x00c0, 183}, {0x00c1, 181}, {0x00c2, 182}, {0x00c3, 199}, - {0x00c4, 142}, {0x00c5, 143}, {0x00c6, 146}, {0x00c7, 128}, - {0x00c8, 212}, {0x00c9, 144}, {0x00ca, 210}, {0x00cb, 211}, - {0x00cc, 222}, {0x00cd, 214}, {0x00ce, 215}, {0x00cf, 216}, - {0x00d0, 209}, {0x00d1, 165}, {0x00d2, 227}, {0x00d3, 224}, - {0x00d4, 226}, {0x00d5, 229}, {0x00d6, 153}, {0x00d7, 158}, - {0x00d8, 157}, {0x00d9, 235}, {0x00da, 233}, {0x00db, 234}, - {0x00dc, 154}, {0x00dd, 237}, {0x00de, 232}, {0x00df, 225}, - {0x00e0, 133}, {0x00e1, 160}, {0x00e2, 131}, {0x00e3, 198}, - {0x00e4, 132}, {0x00e5, 134}, {0x00e6, 145}, {0x00e7, 135}, - {0x00e8, 138}, {0x00e9, 130}, {0x00ea, 136}, {0x00eb, 137}, - {0x00ec, 141}, {0x00ed, 161}, {0x00ee, 140}, {0x00ef, 139}, - {0x00f0, 208}, {0x00f1, 164}, {0x00f2, 149}, {0x00f3, 162}, - {0x00f4, 147}, {0x00f5, 228}, {0x00f6, 148}, {0x00f7, 246}, - {0x00f8, 155}, {0x00f9, 151}, {0x00fa, 163}, {0x00fb, 150}, - {0x00fc, 129}, {0x00fd, 236}, {0x00fe, 231}, {0x00ff, 152}, - {0x0131, 213}, {0x0192, 159}, {0x2017, 242}, {0x2022, 7}, - {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, - {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, - {0x221f, 28}, {0x2500, 196}, {0x2502, 179}, {0x250c, 218}, - {0x2510, 191}, {0x2514, 192}, {0x2518, 217}, {0x251c, 195}, - {0x2524, 180}, {0x252c, 194}, {0x2534, 193}, {0x253c, 197}, - {0x2550, 205}, {0x2551, 186}, {0x2554, 201}, {0x2557, 187}, - {0x255a, 200}, {0x255d, 188}, {0x2560, 204}, {0x2563, 185}, - {0x2566, 203}, {0x2569, 202}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x2591, 176}, {0x2592, 177}, - {0x2593, 178}, {0x25a0, 254}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t cp850_unicode_table[128] = { - 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, - 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, - 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, - 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192, - 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, - 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, - 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, - 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce, - 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, - 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe, - 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4, - 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, - 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0 -}; - -const static struct ciolib_cpmap cp865_table[160] = { - {0x00a0, 255}, {0x00a1, 173}, {0x00a3, 156}, {0x00a4, 175}, - {0x00a7, 21}, {0x00aa, 166}, {0x00ab, 174}, {0x00ac, 170}, - {0x00b0, 248}, {0x00b1, 241}, {0x00b2, 253}, {0x00b5, 230}, - {0x00b6, 20}, {0x00b7, 250}, {0x00ba, 167}, {0x00bc, 172}, - {0x00bd, 171}, {0x00bf, 168}, {0x00c4, 142}, {0x00c5, 143}, - {0x00c6, 146}, {0x00c7, 128}, {0x00c9, 144}, {0x00d1, 165}, - {0x00d6, 153}, {0x00d8, 157}, {0x00dc, 154}, {0x00df, 225}, - {0x00e0, 133}, {0x00e1, 160}, {0x00e2, 131}, {0x00e4, 132}, - {0x00e5, 134}, {0x00e6, 145}, {0x00e7, 135}, {0x00e8, 138}, - {0x00e9, 130}, {0x00ea, 136}, {0x00eb, 137}, {0x00ec, 141}, - {0x00ed, 161}, {0x00ee, 140}, {0x00ef, 139}, {0x00f1, 164}, - {0x00f2, 149}, {0x00f3, 162}, {0x00f4, 147}, {0x00f6, 148}, - {0x00f7, 246}, {0x00f8, 155}, {0x00f9, 151}, {0x00fa, 163}, - {0x00fb, 150}, {0x00fc, 129}, {0x00ff, 152}, {0x0192, 159}, - {0x0393, 226}, {0x0398, 233}, {0x03a3, 228}, {0x03a6, 232}, - {0x03a9, 234}, {0x03b1, 224}, {0x03b4, 235}, {0x03b5, 238}, - {0x03c0, 227}, {0x03c3, 229}, {0x03c4, 231}, {0x03c6, 237}, - {0x2022, 7}, {0x203c, 19}, {0x207f, 252}, {0x20a7, 158}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x2219, 249}, - {0x221a, 251}, {0x221e, 236}, {0x221f, 28}, {0x2229, 239}, - {0x2248, 247}, {0x2261, 240}, {0x2264, 243}, {0x2265, 242}, - {0x2310, 169}, {0x2320, 244}, {0x2321, 245}, {0x2500, 196}, - {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, {0x2514, 192}, - {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, {0x252c, 194}, - {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, {0x2551, 186}, - {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, {0x2555, 184}, - {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, {0x2559, 211}, - {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, {0x255d, 188}, - {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, {0x2561, 181}, - {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, {0x2565, 210}, - {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, {0x2569, 202}, - {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, {0x2590, 222}, - {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, {0x25a0, 254}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp865_unicode_table[128] = { - 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, - 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, - 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, - 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x20a7, 0x0192, - 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, - 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00a4, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, - 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, - 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, - 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 - -}; - -const static struct ciolib_cpmap iso8859_7_table[124] = { - {0x00a0, 160}, {0x00a3, 163}, {0x00a6, 166}, {0x00a7, 21}, - {0x00a8, 168}, {0x00a9, 169}, {0x00ab, 171}, {0x00ac, 172}, - {0x00ad, 173}, {0x00b0, 176}, {0x00b1, 177}, {0x00b2, 178}, - {0x00b3, 179}, {0x00b6, 20}, {0x00b7, 183}, {0x00bb, 187}, - {0x00bd, 189}, {0x037a, 170}, {0x0384, 180}, {0x0385, 181}, - {0x0386, 182}, {0x0388, 184}, {0x0389, 185}, {0x038a, 186}, - {0x038c, 188}, {0x038e, 190}, {0x038f, 191}, {0x0390, 192}, - {0x0391, 193}, {0x0392, 194}, {0x0393, 195}, {0x0394, 196}, - {0x0395, 197}, {0x0396, 198}, {0x0397, 199}, {0x0398, 200}, - {0x0399, 201}, {0x039a, 202}, {0x039b, 203}, {0x039c, 204}, - {0x039d, 205}, {0x039e, 206}, {0x039f, 207}, {0x03a0, 208}, - {0x03a1, 209}, {0x03a3, 211}, {0x03a4, 212}, {0x03a5, 213}, - {0x03a6, 214}, {0x03a7, 215}, {0x03a8, 216}, {0x03a9, 217}, - {0x03aa, 218}, {0x03ab, 219}, {0x03ac, 220}, {0x03ad, 221}, - {0x03ae, 222}, {0x03af, 223}, {0x03b0, 224}, {0x03b1, 225}, - {0x03b2, 226}, {0x03b3, 227}, {0x03b4, 228}, {0x03b5, 229}, - {0x03b6, 230}, {0x03b7, 231}, {0x03b8, 232}, {0x03b9, 233}, - {0x03ba, 234}, {0x03bb, 235}, {0x03bc, 236}, {0x03bd, 237}, - {0x03be, 238}, {0x03bf, 239}, {0x03c0, 240}, {0x03c1, 241}, - {0x03c2, 242}, {0x03c3, 243}, {0x03c4, 244}, {0x03c5, 245}, - {0x03c6, 246}, {0x03c7, 247}, {0x03c8, 248}, {0x03c9, 249}, - {0x03ca, 250}, {0x03cb, 251}, {0x03cc, 252}, {0x03cd, 253}, - {0x03ce, 254}, {0x2015, 175}, {0x2018, 161}, {0x2019, 162}, - {0x2022, 7}, {0x203c, 19}, {0x20ac, 164}, {0x20af, 165}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x221f, 28}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_7_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0xfffd, 0x2015, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, - 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, - 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, - 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, - 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, - 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, - 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, - 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, - 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd -}; - -const static struct ciolib_cpmap iso8859_1_table[126] = { - {0x00a0, 160}, {0x00a1, 161}, {0x00a2, 162}, {0x00a3, 163}, - {0x00a4, 164}, {0x00a5, 165}, {0x00a6, 166}, {0x00a7, 167}, - {0x00a8, 168}, {0x00a9, 169}, {0x00aa, 170}, {0x00ab, 171}, - {0x00ac, 172}, {0x00ad, 173}, {0x00ae, 174}, {0x00af, 175}, - {0x00b0, 176}, {0x00b1, 177}, {0x00b2, 178}, {0x00b3, 179}, - {0x00b4, 180}, {0x00b5, 181}, {0x00b6, 182}, {0x00b7, 183}, - {0x00b8, 184}, {0x00b9, 185}, {0x00ba, 186}, {0x00bb, 187}, - {0x00bc, 188}, {0x00bd, 189}, {0x00be, 190}, {0x00bf, 191}, - {0x00c0, 192}, {0x00c1, 193}, {0x00c2, 194}, {0x00c3, 195}, - {0x00c4, 196}, {0x00c5, 197}, {0x00c6, 198}, {0x00c7, 199}, - {0x00c8, 200}, {0x00c9, 201}, {0x00ca, 202}, {0x00cb, 203}, - {0x00cc, 204}, {0x00cd, 205}, {0x00ce, 206}, {0x00cf, 207}, - {0x00d0, 208}, {0x00d1, 209}, {0x00d2, 210}, {0x00d3, 211}, - {0x00d4, 212}, {0x00d5, 213}, {0x00d6, 214}, {0x00d7, 215}, - {0x00d8, 216}, {0x00d9, 217}, {0x00da, 218}, {0x00db, 219}, - {0x00dc, 220}, {0x00dd, 221}, {0x00de, 222}, {0x00df, 223}, - {0x00e0, 224}, {0x00e1, 225}, {0x00e2, 226}, {0x00e3, 227}, - {0x00e4, 228}, {0x00e5, 229}, {0x00e6, 230}, {0x00e7, 231}, - {0x00e8, 232}, {0x00e9, 233}, {0x00ea, 234}, {0x00eb, 235}, - {0x00ec, 236}, {0x00ed, 237}, {0x00ee, 238}, {0x00ef, 239}, - {0x00f0, 240}, {0x00f1, 241}, {0x00f2, 242}, {0x00f3, 243}, - {0x00f4, 244}, {0x00f5, 245}, {0x00f6, 246}, {0x00f7, 247}, - {0x00f8, 248}, {0x00f9, 249}, {0x00fa, 250}, {0x00fb, 251}, - {0x00fc, 252}, {0x00fd, 253}, {0x00fe, 254}, {0x00ff, 255}, - {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_1_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff -}; - -const static struct ciolib_cpmap cp866m2_table[160] = { - {0x00a0, 255}, {0x00a7, 21}, {0x00A9, 252}, {0x00b0, 248}, - {0x00B2, 253}, {0x00b6, 20}, {0x00b7, 250}, {0x00F7, 246}, - {0x0401, 240}, {0x0410, 128}, {0x0411, 129}, {0x0412, 130}, - {0x0413, 131}, {0x0414, 132}, {0x0415, 133}, {0x0416, 134}, - {0x0417, 135}, {0x0418, 136}, {0x0419, 137}, {0x041a, 138}, - {0x041b, 139}, {0x041c, 140}, {0x041d, 141}, {0x041e, 142}, - {0x041f, 143}, {0x0420, 144}, {0x0421, 145}, {0x0422, 146}, - {0x0423, 147}, {0x0424, 148}, {0x0425, 149}, {0x0426, 150}, - {0x0427, 151}, {0x0428, 152}, {0x0429, 153}, {0x042a, 154}, - {0x042b, 155}, {0x042c, 156}, {0x042d, 157}, {0x042e, 158}, - {0x042f, 159}, {0x0430, 160}, {0x0431, 161}, {0x0432, 162}, - {0x0433, 163}, {0x0434, 164}, {0x0435, 165}, {0x0436, 166}, - {0x0437, 167}, {0x0438, 168}, {0x0439, 169}, {0x043a, 170}, - {0x043b, 171}, {0x043c, 172}, {0x043d, 173}, {0x043e, 174}, - {0x043f, 175}, {0x0440, 224}, {0x0441, 225}, {0x0442, 226}, - {0x0443, 227}, {0x0444, 228}, {0x0445, 229}, {0x0446, 230}, - {0x0447, 231}, {0x0448, 232}, {0x0449, 233}, {0x044a, 234}, - {0x044b, 235}, {0x044c, 236}, {0x044d, 237}, {0x044e, 238}, - {0x044f, 239}, {0x0451, 241}, {0x2022, 7}, {0x203c, 19}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x2219, 249}, - {0x221a, 251}, {0x221f, 28}, {0x2264, 243}, {0x2265, 242}, - {0x2320, 244}, {0x2321, 245}, {0x2248, 247}, {0x2500, 196}, - {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, {0x2514, 192}, - {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, {0x252c, 194}, - {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, {0x2551, 186}, - {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, {0x2555, 184}, - {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, {0x2559, 211}, - {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, {0x255d, 188}, - {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, {0x2561, 181}, - {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, {0x2565, 210}, - {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, {0x2569, 202}, - {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, {0x2590, 222}, - {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, {0x25a0, 254}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp866m2_unicode_table[128] = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, - 0x00b0, 0x2219, 0x00b7, 0x221a, 0x00A9, 0x00B2, 0x25a0, 0x00a0 -}; - -const static struct ciolib_cpmap cp866u_table[160] = { - {0x00a0, 255}, {0x00a7, 21}, {0x00A9, 252}, {0x00B2, 253}, - {0x00b6, 20}, {0x00b7, 250}, {0x0401, 240}, {0x0404, 244}, - {0x0406, 246}, {0x0407, 248}, {0x0410, 128}, {0x0411, 129}, - {0x0412, 130}, {0x0413, 131}, {0x0414, 132}, {0x0415, 133}, - {0x0416, 134}, {0x0417, 135}, {0x0418, 136}, {0x0419, 137}, - {0x041a, 138}, {0x041b, 139}, {0x041c, 140}, {0x041d, 141}, - {0x041e, 142}, {0x041f, 143}, {0x0420, 144}, {0x0421, 145}, - {0x0422, 146}, {0x0423, 147}, {0x0424, 148}, {0x0425, 149}, - {0x0426, 150}, {0x0427, 151}, {0x0428, 152}, {0x0429, 153}, - {0x042a, 154}, {0x042b, 155}, {0x042c, 156}, {0x042d, 157}, - {0x042e, 158}, {0x042f, 159}, {0x0430, 160}, {0x0431, 161}, - {0x0432, 162}, {0x0433, 163}, {0x0434, 164}, {0x0435, 165}, - {0x0436, 166}, {0x0437, 167}, {0x0438, 168}, {0x0439, 169}, - {0x043a, 170}, {0x043b, 171}, {0x043c, 172}, {0x043d, 173}, - {0x043e, 174}, {0x043f, 175}, {0x0440, 224}, {0x0441, 225}, - {0x0442, 226}, {0x0443, 227}, {0x0444, 228}, {0x0445, 229}, - {0x0446, 230}, {0x0447, 231}, {0x0448, 232}, {0x0449, 233}, - {0x044a, 234}, {0x044b, 235}, {0x044c, 236}, {0x044d, 237}, - {0x044e, 238}, {0x044f, 239}, {0x0451, 241}, {0x0454, 245}, - {0x0456, 247}, {0x0457, 249}, {0x0490, 242}, {0x0491, 243}, - {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221a, 251}, {0x221f, 28}, {0x2500, 196}, - {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, {0x2514, 192}, - {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, {0x252c, 194}, - {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, {0x2551, 186}, - {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, {0x2555, 184}, - {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, {0x2559, 211}, - {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, {0x255d, 188}, - {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, {0x2561, 181}, - {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, {0x2565, 210}, - {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, {0x2569, 202}, - {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, {0x2590, 222}, - {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, {0x25a0, 254}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp866u_unicode_table[128] = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x0490, 0x0491, 0x0404, 0x0454, 0x0406, 0x0456, - 0x0407, 0x0457, 0x00b7, 0x221a, 0x00A9, 0x00B2, 0x25a0, 0x00a0 -}; - -const static struct ciolib_cpmap cp1131_table[160] = { - {0x00a0, 255}, {0x00a7, 21}, {0x00b6, 20}, {0x00b7, 250}, - {0x0401, 240}, {0x0404, 242}, {0x0406, 248}, {0x0407, 244}, - {0x040e, 246}, {0x0410, 128}, {0x0411, 129}, {0x0412, 130}, - {0x0413, 131}, {0x0414, 132}, {0x0415, 133}, {0x0416, 134}, - {0x0417, 135}, {0x0418, 136}, {0x0419, 137}, {0x041a, 138}, - {0x041b, 139}, {0x041c, 140}, {0x041d, 141}, {0x041e, 142}, - {0x041f, 143}, {0x0420, 144}, {0x0421, 145}, {0x0422, 146}, - {0x0423, 147}, {0x0424, 148}, {0x0425, 149}, {0x0426, 150}, - {0x0427, 151}, {0x0428, 152}, {0x0429, 153}, {0x042a, 154}, - {0x042b, 155}, {0x042c, 156}, {0x042d, 157}, {0x042e, 158}, - {0x042f, 159}, {0x0430, 160}, {0x0431, 161}, {0x0432, 162}, - {0x0433, 163}, {0x0434, 164}, {0x0435, 165}, {0x0436, 166}, - {0x0437, 167}, {0x0438, 168}, {0x0439, 169}, {0x043a, 170}, - {0x043b, 171}, {0x043c, 172}, {0x043d, 173}, {0x043e, 174}, - {0x043f, 175}, {0x0440, 224}, {0x0441, 225}, {0x0442, 226}, - {0x0443, 227}, {0x0444, 228}, {0x0445, 229}, {0x0446, 230}, - {0x0447, 231}, {0x0448, 232}, {0x0449, 233}, {0x044a, 234}, - {0x044b, 235}, {0x044c, 236}, {0x044d, 237}, {0x044e, 238}, - {0x044f, 239}, {0x0451, 241}, {0x0454, 243}, {0x0456, 249}, - {0x0457, 245}, {0x045e, 247}, {0x0490, 252}, {0x0491, 253}, - {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x2219, 254}, {0x221a, 251}, {0x221f, 28}, - {0x2500, 196}, {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, - {0x2514, 192}, {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, - {0x252c, 194}, {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, - {0x2551, 186}, {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, - {0x2555, 184}, {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, - {0x2559, 211}, {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, - {0x255d, 188}, {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, - {0x2561, 181}, {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, - {0x2565, 210}, {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, - {0x2569, 202}, {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, - {0x2580, 223}, {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, - {0x2590, 222}, {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp1131_unicode_table[128] = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, - 0x0406, 0x0456, 0x00b7, 0x221a, 0x0490, 0x0491, 0x2219, 0x00a0 -}; - -const static struct ciolib_cpmap armscii8_table[122] = { - {0x00a0, 160}, {0x00a7, 162}, {0x00ab, 167}, {0x00b6, 20}, - {0x00bb, 166}, {0x02bc, 254}, {0x0531, 178}, {0x0532, 180}, - {0x0533, 182}, {0x0534, 184}, {0x0535, 186}, {0x0536, 188}, - {0x0537, 190}, {0x0538, 192}, {0x0539, 194}, {0x053a, 196}, - {0x053b, 198}, {0x053c, 200}, {0x053d, 202}, {0x053e, 204}, - {0x053f, 206}, {0x0540, 208}, {0x0541, 210}, {0x0542, 212}, - {0x0543, 214}, {0x0544, 216}, {0x0545, 218}, {0x0546, 220}, - {0x0547, 222}, {0x0548, 224}, {0x0549, 226}, {0x054a, 228}, - {0x054b, 230}, {0x054c, 232}, {0x054d, 234}, {0x054e, 236}, - {0x054f, 238}, {0x0550, 240}, {0x0551, 242}, {0x0552, 244}, - {0x0553, 246}, {0x0554, 248}, {0x0555, 250}, {0x0556, 252}, - {0x055b, 176}, {0x055c, 175}, {0x055d, 170}, {0x055e, 177}, - {0x0561, 179}, {0x0562, 181}, {0x0563, 183}, {0x0564, 185}, - {0x0565, 187}, {0x0566, 189}, {0x0567, 191}, {0x0568, 193}, - {0x0569, 195}, {0x056a, 197}, {0x056b, 199}, {0x056c, 201}, - {0x056d, 203}, {0x056e, 205}, {0x056f, 207}, {0x0570, 209}, - {0x0571, 211}, {0x0572, 213}, {0x0573, 215}, {0x0574, 217}, - {0x0575, 219}, {0x0576, 221}, {0x0577, 223}, {0x0578, 225}, - {0x0579, 227}, {0x057a, 229}, {0x057b, 231}, {0x057c, 233}, - {0x057d, 235}, {0x057e, 237}, {0x057f, 239}, {0x0580, 241}, - {0x0581, 243}, {0x0582, 245}, {0x0583, 247}, {0x0584, 249}, - {0x0585, 251}, {0x0586, 253}, {0x0589, 163}, {0x058a, 173}, - {0x058e, 161}, {0x2013, 172}, {0x2014, 168}, {0x2022, 7}, - {0x2026, 174}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t armscii8_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x058e, 0x00a7, 0x0589, 0x0029, 0x002a, 0x00bb, 0x00ab, - 0x2014, 0x002e, 0x055d, 0x002c, 0x2013, 0x058a, 0x2026, 0x055c, - 0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, - 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, - 0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, - 0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, - 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, - 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, - 0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, - 0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, - 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, - 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x02bc, 0xfffd -}; - -const static struct ciolib_cpmap haik8_table[122] = { - {0x00a0, 128}, {0x00a7, 21}, {0x00ab, 135}, {0x00b6, 20}, - {0x00bb, 134}, {0x02bc, 254}, {0x0531, 146}, {0x0532, 148}, - {0x0533, 150}, {0x0534, 152}, {0x0535, 154}, {0x0536, 156}, - {0x0537, 158}, {0x0538, 160}, {0x0539, 162}, {0x053a, 164}, - {0x053b, 166}, {0x053c, 168}, {0x053d, 170}, {0x053e, 172}, - {0x053f, 174}, {0x0540, 176}, {0x0541, 178}, {0x0542, 180}, - {0x0543, 182}, {0x0544, 184}, {0x0545, 186}, {0x0546, 188}, - {0x0547, 190}, {0x0548, 224}, {0x0549, 226}, {0x054a, 228}, - {0x054b, 230}, {0x054c, 232}, {0x054d, 234}, {0x054e, 236}, - {0x054f, 238}, {0x0550, 240}, {0x0551, 242}, {0x0552, 244}, - {0x0553, 246}, {0x0554, 248}, {0x0555, 250}, {0x0556, 252}, - {0x055b, 144}, {0x055c, 143}, {0x055d, 138}, {0x055e, 145}, - {0x0561, 147}, {0x0562, 149}, {0x0563, 151}, {0x0564, 153}, - {0x0565, 155}, {0x0566, 157}, {0x0567, 159}, {0x0568, 161}, - {0x0569, 163}, {0x056a, 165}, {0x056b, 167}, {0x056c, 169}, - {0x056d, 171}, {0x056e, 173}, {0x056f, 175}, {0x0570, 177}, - {0x0571, 179}, {0x0572, 181}, {0x0573, 183}, {0x0574, 185}, - {0x0575, 187}, {0x0576, 189}, {0x0577, 191}, {0x0578, 225}, - {0x0579, 227}, {0x057a, 229}, {0x057b, 231}, {0x057c, 233}, - {0x057d, 235}, {0x057e, 237}, {0x057f, 239}, {0x0580, 241}, - {0x0581, 243}, {0x0582, 245}, {0x0583, 247}, {0x0584, 249}, - {0x0585, 251}, {0x0586, 253}, {0x0589, 131}, {0x058a, 141}, - {0x058e, 129}, {0x2013, 140}, {0x2014, 136}, {0x2022, 7}, - {0x2026, 142}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t haik8_unicode_table[128] = { - 0x00a0, 0x058e, 0x00a7, 0x0589, 0x0029, 0x002a, 0x00bb, 0x00ab, - 0x2014, 0x002e, 0x055d, 0x002c, 0x2013, 0x058a, 0x2026, 0x055c, - 0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, - 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, - 0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, - 0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, - 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, - 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, - 0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, - 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, - 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x02bc, 0xfffd -}; - -const static struct ciolib_cpmap atascii_table[148] = { - {0x0007, 252}, {0x0008, 126}, {0x0009, 127}, {0x000d, 155}, - {0x001b, 27}, {0x0020, 32}, {0x0021, 33}, {0x0022, 34}, - {0x0023, 35}, {0x0024, 36}, {0x0025, 37}, {0x0026, 38}, - {0x0027, 39}, {0x0028, 40}, {0x0029, 41}, {0x002a, 42}, - {0x002b, 43}, {0x002c, 44}, {0x002d, 45}, {0x002e, 46}, - {0x002f, 47}, {0x0030, 48}, {0x0031, 49}, {0x0032, 50}, - {0x0033, 51}, {0x0034, 52}, {0x0035, 53}, {0x0036, 54}, - {0x0037, 55}, {0x0038, 56}, {0x0039, 57}, {0x003a, 58}, - {0x003b, 59}, {0x003c, 60}, {0x003d, 61}, {0x003e, 62}, - {0x003f, 63}, {0x0040, 64}, {0x0041, 65}, {0x0042, 66}, - {0x0043, 67}, {0x0044, 68}, {0x0045, 69}, {0x0046, 70}, - {0x0047, 71}, {0x0048, 72}, {0x0049, 73}, {0x004a, 74}, - {0x004b, 75}, {0x004c, 76}, {0x004d, 77}, {0x004e, 78}, - {0x004f, 79}, {0x0050, 80}, {0x0051, 81}, {0x0052, 82}, - {0x0053, 83}, {0x0054, 84}, {0x0055, 85}, {0x0056, 86}, - {0x0057, 87}, {0x0058, 88}, {0x0059, 89}, {0x005a, 90}, - {0x005b, 91}, {0x005c, 92}, {0x005d, 93}, {0x005e, 94}, - {0x005f, 95}, {0x0061, 97}, {0x0062, 98}, {0x0063, 99}, - {0x0064, 100}, {0x0065, 101}, {0x0066, 102}, {0x0067, 103}, - {0x0068, 104}, {0x0069, 105}, {0x006a, 106}, {0x006b, 107}, - {0x006c, 108}, {0x006d, 109}, {0x006e, 110}, {0x006f, 111}, - {0x0070, 112}, {0x0071, 113}, {0x0072, 114}, {0x0073, 115}, - {0x0074, 116}, {0x0075, 117}, {0x0076, 118}, {0x0077, 119}, - {0x0078, 120}, {0x0079, 121}, {0x007a, 122}, {0x007c, 124}, - {0x007f, 253}, {0x00a0, 155}, {0x2022, 148}, {0x2190, 30}, - {0x2191, 28}, {0x2192, 159}, {0x2193, 157}, {0x21b0, 125}, - {0x241b, 27}, {0x2500, 18}, {0x250c, 145}, {0x2510, 5}, - {0x2514, 26}, {0x2518, 131}, {0x251c, 129}, {0x2524, 132}, - {0x252c, 23}, {0x2534, 24}, {0x253c, 147}, {0x2571, 6}, - {0x2572, 135}, {0x2580, 149}, {0x2582, 142}, {0x2584, 21}, - {0x2586, 141}, {0x2588, 160}, {0x258a, 130}, {0x258c, 25}, - {0x258e, 150}, {0x2590, 153}, {0x2596, 143}, {0x2597, 137}, - {0x2598, 140}, {0x2599, 139}, {0x259b, 137}, {0x259c, 143}, - {0x259d, 139}, {0x259f, 140}, {0x25b6, 127}, {0x25c0, 126}, - {0x25d8, 148}, {0x25e2, 136}, {0x25e3, 10}, {0x25e4, 136}, - {0x25e5, 138}, {0x2660, 123}, {0x2663, 144}, {0x2665, 63}, - {0x2666, 96}, {0xfffd, 63}, {0x1fb82, 13}, {0x1fb87, 2} -}; - -const static uint32_t atascii_unicode_table[256] = { - 0x2665, 0x251c,0x1fb87, 0x2518, 0x2524, 0x2510, 0x2571, 0x2572, - 0x25e2, 0x2597, 0x25e3, 0x259d, 0x2598,0x1fb82, 0x2582, 0x2596, - 0x2663, 0x250c, 0x2500, 0x253c, 0x2022, 0x2584, 0x258e, 0x252c, - 0x2534, 0x258c, 0x2514, 0x001b, 0x2191, 0x2193, 0x2190, 0x2192, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x2666, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x2660, 0x007c, 0x21b0, 0x0008, 0x0009, - 0x2665, 0x251c, 0x258a, 0x2518, 0x2524, 0x2510, 0x2571, 0x2572, - 0x25e4, 0x259b, 0x25e5, 0x2599, 0x259f, 0x2586, 0x2582, 0x259c, - 0x2663, 0x250c, 0x2500, 0x253c, 0x25d8, 0x2580, 0x258e, 0x252c, - 0x2534, 0x2590, 0x2514, 0x000d, 0x2191, 0x2193, 0x2190, 0x2192, - 0x2588, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x2666, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x2660, 0x0007, 0x007f, 0x25c0, 0x25b6 -}; - -const static uint32_t atascii_ext_table[256] = { - 0x2665, 0x251c,0x1fb87, 0x2518, 0x2524, 0x2510, 0x2571, 0x2572, - 0x25e2, 0x2597, 0x25e3, 0x259d, 0x2598,0x1fb82, 0x2582, 0x2596, - 0x2663, 0x250c, 0x2500, 0x253c, 0x2022, 0x2584, 0x258e, 0x252c, - 0x2534, 0x258c, 0x2514, 0x241b, 0x2191, 0x2193, 0x2190, 0x2192, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x2666, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x2660, 0x007c, 0x21b0, 0x25c0, 0x25b6, - 0x2665, 0x251c,0x1fb87, 0x2518, 0x2524, 0x2510, 0x2571, 0x2572, - 0x25e2, 0x2597, 0x25e3, 0x259d, 0x2598,0x1fb82, 0x2582, 0x2596, - 0x2663, 0x250c, 0x2500, 0x253c, 0x2022, 0x2584, 0x258e, 0x252c, - 0x2534, 0x258c, 0x2514, 0x00a0, 0x2191, 0x2193, 0x2190, 0x2192, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x2666, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x2660, 0x007c, 0x21b0, 0x25c0, 0x25b6 -}; - -const static struct ciolib_cpmap petsciiu_table[129] = { - {0x0020, 32}, {0x0021, 33}, {0x0022, 34}, {0x0023, 35}, - {0x0024, 36}, {0x0025, 37}, {0x0026, 38}, {0x0027, 39}, - {0x0028, 40}, {0x0029, 41}, {0x002a, 42}, {0x002b, 43}, - {0x002c, 44}, {0x002d, 45}, {0x002e, 46}, {0x002f, 47}, - {0x0030, 48}, {0x0031, 49}, {0x0032, 50}, {0x0033, 51}, - {0x0034, 52}, {0x0035, 53}, {0x0036, 54}, {0x0037, 55}, - {0x0038, 56}, {0x0039, 57}, {0x003a, 58}, {0x003b, 59}, - {0x003c, 60}, {0x003d, 61}, {0x003e, 62}, {0x003f, 63}, - {0x0040, 64}, {0x0041, 65}, {0x0042, 66}, {0x0043, 67}, - {0x0044, 68}, {0x0045, 69}, {0x0046, 70}, {0x0047, 71}, - {0x0048, 72}, {0x0049, 73}, {0x004a, 74}, {0x004b, 75}, - {0x004c, 76}, {0x004d, 77}, {0x004e, 78}, {0x004f, 79}, - {0x0050, 80}, {0x0051, 81}, {0x0052, 82}, {0x0053, 83}, - {0x0054, 84}, {0x0055, 85}, {0x0056, 86}, {0x0057, 87}, - {0x0058, 88}, {0x0059, 89}, {0x005a, 90}, {0x005b, 91}, - {0x005d, 93}, {0x00a0, 160}, {0x00a3, 92}, {0x03c0, 126}, - {0x2190, 95}, {0x2191, 94}, {0x2500, 96}, {0x2502, 125}, - {0x250c, 176}, {0x2510, 174}, {0x2514, 173}, {0x2518, 189}, - {0x251c, 171}, {0x2524, 179}, {0x252c, 178}, {0x2534, 177}, - {0x253c, 123}, {0x256d, 117}, {0x256e, 105}, {0x256f, 107}, - {0x2570, 106}, {0x2571, 110}, {0x2572, 109}, {0x2573, 118}, - {0x2581, 164}, {0x2582, 175}, {0x2583, 185}, {0x2584, 162}, - {0x258c, 161}, {0x258d, 181}, {0x258e, 180}, {0x258f, 165}, - {0x2592, 166}, {0x2594, 163}, {0x2595, 167}, {0x2596, 187}, - {0x2597, 172}, {0x2598, 190}, {0x259a, 191}, {0x259d, 188}, - {0x25cb, 119}, {0x25cf, 113}, {0x25e4, 169}, {0x25e5, 127}, - {0x2660, 97}, {0x2663, 120}, {0x2665, 115}, {0x2666, 122}, - {0xfffd, 63}, {0x1fb70, 116}, {0x1fb71, 103}, {0x1fb72, 98}, - {0x1fb74, 104}, {0x1fb75, 121}, {0x1fb76, 101}, {0x1fb77, 100}, - {0x1fb78, 99}, {0x1fb7a, 102}, {0x1fb7b, 114}, {0x1fb7c, 108}, - {0x1fb7d, 111}, {0x1fb7e, 112}, {0x1fb7f, 186}, {0x1fb82, 183}, - {0x1fb83, 184}, {0x1fb87, 170}, {0x1fb88, 182}, {0x1fb8c, 124}, - {0x1fb8f, 168} -}; - -const static uint32_t petsciiu_unicode_table[256] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x00a3, 0x005d, 0x2191, 0x2190, - 0x2500, 0x2660,0x1fb72,0x1fb78,0x1fb77,0x1fb76,0x1fb7a,0x1fb71, - 0x1fb74,0x256e, 0x2570, 0x256f,0x1fb7c, 0x2572, 0x2571,0x1fb7d, - 0x1fb7e,0x25cf,0x1fb7b, 0x2665,0x1fb70, 0x256d, 0x2573, 0x25cb, - 0x2663,0x1fb75, 0x2666, 0x253c,0x1fb8c, 0x2502, 0x03c0, 0x25e5, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x258c, 0x2584, 0x2594, 0x2581, 0x258f, 0x2592, 0x2595, - 0x1fb8f,0x25e4,0x1fb87, 0x251c, 0x2597, 0x2514, 0x2510, 0x2582, - 0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d,0x1fb88,0x1fb82, - 0x1fb83,0x2583,0x1fb7f, 0x2596, 0x259d, 0x2518, 0x2598, 0x259a, - 0x2500, 0x2660,0x1fb72,0x1fb78,0x1fb77,0x1fb76,0x1fb7a,0x1fb71, - 0x1fb74,0x256e, 0x2570, 0x256f,0x1fb7c, 0x2572, 0x2571,0x1fb7d, - 0x1fb7e,0x25cf,0x1fb7b, 0x2665,0x1fb70, 0x256d, 0x2573, 0x25cb, - 0x2663,0x1fb75, 0x2666, 0x253c,0x1fb8c, 0x2502, 0x03c0, 0x25e5, - 0x00a0, 0x258c, 0x2584, 0x2594, 0x2581, 0x258f, 0x2592, 0x2595, - 0x1fb8f,0x25e4,0x1fb87, 0x251c, 0x2597, 0x2514, 0x2510, 0x2582, - 0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d,0x1fb88,0x1fb82, - 0x1fb83,0x2583,0x1fb7f, 0x2596, 0x259d, 0x2518, 0x2598, 0x03c0 -}; - -const static struct ciolib_cpmap petsciil_table[129] = { - {0x0020, 32}, {0x0021, 33}, {0x0022, 34}, {0x0023, 35}, - {0x0024, 36}, {0x0025, 37}, {0x0026, 38}, {0x0027, 39}, - {0x0028, 40}, {0x0029, 41}, {0x002a, 42}, {0x002b, 43}, - {0x002c, 44}, {0x002d, 45}, {0x002e, 46}, {0x002f, 47}, - {0x0030, 48}, {0x0031, 49}, {0x0032, 50}, {0x0033, 51}, - {0x0034, 52}, {0x0035, 53}, {0x0036, 54}, {0x0037, 55}, - {0x0038, 56}, {0x0039, 57}, {0x003a, 58}, {0x003b, 59}, - {0x003c, 60}, {0x003d, 61}, {0x003e, 62}, {0x003f, 63}, - {0x0040, 64}, {0x0041, 97}, {0x0042, 98}, {0x0043, 99}, - {0x0044, 100}, {0x0045, 101}, {0x0046, 102}, {0x0047, 103}, - {0x0048, 104}, {0x0049, 105}, {0x004a, 106}, {0x004b, 107}, - {0x004c, 108}, {0x004d, 109}, {0x004e, 110}, {0x004f, 111}, - {0x0050, 112}, {0x0051, 113}, {0x0052, 114}, {0x0053, 115}, - {0x0054, 116}, {0x0055, 117}, {0x0056, 118}, {0x0057, 119}, - {0x0058, 120}, {0x0059, 121}, {0x005a, 122}, {0x005b, 91}, - {0x005d, 93}, {0x0061, 65}, {0x0062, 66}, {0x0063, 67}, - {0x0064, 68}, {0x0065, 69}, {0x0066, 70}, {0x0067, 71}, - {0x0068, 72}, {0x0069, 73}, {0x006a, 74}, {0x006b, 75}, - {0x006c, 76}, {0x006d, 77}, {0x006e, 78}, {0x006f, 79}, - {0x0070, 80}, {0x0071, 81}, {0x0072, 82}, {0x0073, 83}, - {0x0074, 84}, {0x0075, 85}, {0x0076, 86}, {0x0077, 87}, - {0x0078, 88}, {0x0079, 89}, {0x007a, 90}, {0x00a0, 160}, - {0x00a3, 92}, {0x2190, 95}, {0x2191, 94}, {0x2500, 96}, - {0x2502, 125}, {0x250c, 176}, {0x2510, 174}, {0x2514, 173}, - {0x2518, 189}, {0x251c, 171}, {0x2524, 179}, {0x252c, 178}, - {0x2534, 177}, {0x253c, 123}, {0x2581, 164}, {0x2582, 175}, - {0x2583, 185}, {0x2584, 162}, {0x258c, 161}, {0x258d, 181}, - {0x258e, 180}, {0x258f, 165}, {0x2592, 166}, {0x2594, 163}, - {0x2595, 167}, {0x2596, 187}, {0x2597, 172}, {0x2598, 190}, - {0x259a, 191}, {0x259d, 188}, {0x2713, 186}, {0xfffd, 63}, - {0x1fb82, 183}, {0x1fb83, 184}, {0x1fb87, 170}, {0x1fb88, 182}, - {0x1fb8c, 124}, {0x1fb8f, 168}, {0x1fb96, 126}, {0x1fb98, 127}, - {0x1fb99, 169} -}; - -const static uint32_t petsciil_unicode_table[256] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x005b, 0x00a3, 0x005d, 0x2191, 0x2190, - 0x2500, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x253c,0x1fb8c, 0x2502,0x1fb96,0x1fb98, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x258c, 0x2584, 0x2594, 0x2581, 0x258f, 0x2592, 0x2595, - 0x1fb8f,0x1fb99,0x1fb87,0x251c, 0x2597, 0x2514, 0x2510, 0x2582, - 0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d,0x1fb88,0x1fb82, - 0x1fb83,0x2583, 0x2713, 0x2596, 0x259d, 0x2518, 0x2598, 0x259a, - 0x2500, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x253c,0x1fb8c, 0x2502,0x1fb96,0x1fb98, - 0x00a0, 0x258c, 0x2584, 0x2594, 0x2581, 0x258f, 0x2592, 0x2595, - 0x1fb8f,0x1fb99,0x1fb87,0x251c, 0x2597, 0x2514, 0x2510, 0x2582, - 0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d,0x1fb88,0x1fb82, - 0x1fb83,0x2583, 0x2713, 0x2596, 0x259d, 0x2518, 0x2598,0x1fb96 -}; - -static int -cmptab(const void *key, const void *entry) -{ - const uint32_t *pkey = key; - const struct ciolib_cpmap *pentry = entry; - - if (*pkey == pentry->unicode) - return 0; - if (*pkey < pentry->unicode) - return -1; - return 1; -} - -static uint8_t -cptable_from_unicode_cpoint(uint32_t cpoint, char unmapped, const struct codepage_def *cpdef) -{ - struct ciolib_cpmap *mapped; - - if (cpoint < 128) - return cpoint; - mapped = bsearch(&cpoint, cpdef->cp_table, cpdef->cp_table_sz, sizeof(cpdef->cp_table[0]), cmptab); - if (mapped == NULL) - return unmapped; - return mapped->cpchar; -} - -static uint32_t -cpoint_from_cptable(uint8_t ch, const struct codepage_def *cpdef) -{ - if (ch < 128) - return ch; - return cpdef->cp_unicode_table[ch - 128]; -} - -static uint32_t -cpoint_from_cptable_ext(uint8_t ch, const struct codepage_def *cpdef) -{ - if (ch < 32) - return cpdef->cp_ext_unicode_table[ch]; - return ciolib_cp[cpdef->cp].from_cpchar(ch, cpdef); -} - -static uint32_t -ft_cpoint_from_cptable(uint8_t ch, const struct codepage_def *cpdef) -{ - return cpdef->cp_unicode_table[ch]; -} - -static uint32_t -ft_cpoint_from_cptable_ext(uint8_t ch, const struct codepage_def *cpdef) -{ - return cpdef->cp_ext_unicode_table[ch]; -} - -static int -write_cp(uint8_t *str, uint32_t cp) -{ - if (cp < 128) { - *str = cp; - return 1; - } - if (cp < 0x800) { - *(str++) = 0xc0 | (cp >> 6); - *(str++) = 0x80 | (cp & 0x3f); - return 2; - } - if (cp < 0x10000) { - *(str++) = 0xe0 | (cp >> 12); - *(str++) = 0x80 | ((cp >> 6) & 0x3f); - *(str++) = 0x80 | (cp & 0x3f); - return 3; - } - if (cp < 0x110000) { - *(str++) = 0xf0 | (cp >> 18); - *(str++) = 0x80 | ((cp >> 12) & 0x3f); - *(str++) = 0x80 | ((cp >> 6) & 0x3f); - *(str++) = 0x80 | (cp & 0x3f); - return 4; - } - return -1; -} - -static int -read_cp(const uint8_t *str, uint32_t *cp) -{ - int incode; - const uint8_t *p = str; - - if (cp == NULL) - goto error; - - if (str == NULL) - goto error; - - if (*p & 0x80) { - if ((*p & 0xe0) == 0xc0) { - incode = 1; - *cp = *p & 0x1f; - } - else if ((*p & 0xf0) == 0xe0) { - incode = 2; - *cp = *p & 0x0f; - } - else if ((*p & 0xf8) == 0xf0) { - incode = 3; - *cp = *p & 0x07; - } - else - goto error; - - while (incode) { - p++; - incode--; - if ((*p & 0xc0) != 0x80) - goto error; - *cp <<= 6; - *cp |= (*p & 0x3f); - } - } - else { - *cp = *p; - } - return p - str + 1; - -error: - if (cp) - *cp = 0xffff; - return -1; -} - -static int -utf8_bytes(uint32_t cp) -{ - if (cp < 0x80) - return 1; - if (cp < 0x800) - return 2; - if (cp < 0x10000) - return 3; - if (cp < 0x11000) - return 4; - return -1; -} - -static uint8_t * -cpstr_to_utf8(const char *cpstr, size_t buflen, size_t *outlen, const struct codepage_def *cpdef) -{ - size_t needed = 0; - int cplen; - uint8_t *ret = NULL; - uint8_t *rp; - size_t idx; - uint8_t ch; - - // Calculate the number of bytes needed - for (idx = 0; idx < buflen; idx++) { - ch = cpstr[idx]; - if (ch == 0) - cplen = 4; - else if (ch < 128) - cplen = 1; - else - cplen = utf8_bytes(cpdef->cp_unicode_table[ch - 128]); - if (cplen == -1) - goto error; - needed += cplen; - } - - ret = malloc(needed + 1); - if (ret == NULL) - goto error; - - rp = ret; - for (idx = 0; idx < buflen; idx++) { - ch = cpstr[idx]; - if (ch == 0) { - *(rp++) = 0xef; - *(rp++) = 0xbf; - *(rp++) = 0xbe; - cplen = 0; - } - else if (ch < 128) { - *rp = ch; - cplen = 1; - } - else { - cplen = write_cp(rp, cpdef->cp_unicode_table[ch - 128]); - if (cplen < 1) - goto error; - } - rp += cplen; - } - *rp = 0; - if (outlen) - *outlen = rp - ret; - return ret; - -error: - free(ret); - return NULL; -} - -static uint8_t -ft_from_unicode_cpoint(uint32_t cpoint, char unmapped, const struct codepage_def *cpdef) -{ - struct ciolib_cpmap *mapped; - - mapped = bsearch(&cpoint, cpdef->cp_table, cpdef->cp_table_sz, sizeof(cpdef->cp_table[0]), cmptab); - if (mapped == NULL) - return unmapped; - return mapped->cpchar; -} - -static uint8_t * -ftstr_to_utf8(const char *cpstr, size_t buflen, size_t *outlen, const struct codepage_def *cpdef) -{ - size_t needed = 0; - int cplen; - uint8_t *ret = NULL; - uint8_t *rp; - size_t idx; - uint8_t ch; - - // Calculate the number of bytes needed - for (idx = 0; idx < buflen; idx++) { - ch = cpstr[idx]; - cplen = utf8_bytes(cpdef->cp_unicode_table[ch]); - if (cplen == -1) - goto error; - needed += cplen; - } - - ret = malloc(needed + 1); - if (ret == NULL) - goto error; - - rp = ret; - for (idx = 0; idx < buflen; idx++) { - ch = cpstr[idx]; - cplen = write_cp(rp, cpdef->cp_unicode_table[ch]); - if (cplen < 1) - goto error; - rp += cplen; - } - *rp = 0; - if (outlen) - *outlen = rp - ret; - return ret; - -error: - free(ret); - return NULL; -} - -/* - * Converts UTF-8 to defined codepage, replacing unmapped characters - * with unmapped if unmapped is zero, unmapped characters are stripped. - * - * Returns NULL if there are invalid sequences or codepoints. - * Does not normalize the unicode, just a simple mapping - * (TODO: Normalize into combined chars etc) - */ -static char * -utf8_to_cpstr(const uint8_t *utf8str, char unmapped, size_t inlen, size_t *outlen, const struct codepage_def *cpdef) -{ - size_t idx; - char *rp; - size_t outsz = 0; - int incode = 0; - uint32_t codepoint; - char *ret = NULL; - - // TODO: Normalize UTF-8... - - // Calculate the number of code points and validate. - for (idx = 0; idx < inlen; idx++) { - if (incode) { - switch (utf8str[idx] & 0xc0) { - case 0x80: - incode--; - if (incode == 0) - outsz++; - break; - default: - goto error; - } - } - else { - if (utf8str[idx] & 0x80) { - if ((utf8str[idx] & 0xe0) == 0xc0) - incode = 1; - else if ((utf8str[idx] & 0xf0) == 0xe0) - incode = 2; - else if ((utf8str[idx] & 0xf8) == 0xf0) - incode = 3; - else - goto error; - } - else - outsz++; - } - } - ret = malloc(outsz + 1); - if (ret == NULL) - goto error; - rp = ret; - - // Fill the string... - for (idx = 0; idx < inlen;) { - idx += read_cp(&utf8str[idx], &codepoint); - if (codepoint == 0xffff || codepoint == 0xfffe) - goto error; - *(rp++) = cpdef->from_unicode_cpoint(codepoint, unmapped, cpdef); - } - *rp = 0; - if (outlen) - *outlen = rp - ret; - - return ret; -error: - free(ret); - return NULL; -} - -const struct codepage_def ciolib_cp[CIOLIB_CP_COUNT] = { - // 0 - {"CP437", CIOLIB_CP437, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp437_table, sizeof(cp437_table) / sizeof(cp437_table[0]), - cp437_unicode_table, cp437_ext_table}, - {"CP1251", CIOLIB_CP1251, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp1251_table, sizeof(cp1251_table) / sizeof(cp1251_table[0]), - cp1251_unicode_table, cp437_ext_table}, - {"KOI8-R", CIOLIB_KOI8_R, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - koi8_r_table, sizeof(koi8_r_table) / sizeof(koi8_r_table[0]), - koi8_r_unicode_table, empty_ext_table}, - {"ISO-8859-2", CIOLIB_ISO_8859_2, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_2_table, sizeof(iso8859_2_table) / sizeof(iso8859_2_table[0]), - iso8859_2_unicode_table, empty_ext_table}, - {"ISO-8859-4", CIOLIB_ISO_8859_4, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_4_table, sizeof(iso8859_4_table) / sizeof(iso8859_4_table[0]), - iso8859_4_unicode_table, empty_ext_table}, - // 5 - {"CP866M", CIOLIB_CP866M, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp866m_table, sizeof(cp866m_table) / sizeof(cp866m_table[0]), - cp866m_unicode_table, cp437_ext_table}, - {"ISO-8859-9", CIOLIB_ISO_8859_9, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_9_table, sizeof(iso8859_9_table) / sizeof(iso8859_9_table[0]), - iso8859_9_unicode_table, empty_ext_table}, - {"ISO-8859-8", CIOLIB_ISO_8859_8, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_8_table, sizeof(iso8859_8_table) / sizeof(iso8859_8_table[0]), - iso8859_8_unicode_table, empty_ext_table}, - {"KOI8-U", CIOLIB_KOI8_U, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - koi8_u_table, sizeof(koi8_u_table) / sizeof(koi8_u_table[0]), - koi8_u_unicode_table, empty_ext_table}, - {"ISO-8859-15", CIOLIB_ISO_8859_15, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_15_table, sizeof(iso8859_15_table) / sizeof(iso8859_15_table[0]), - iso8859_15_unicode_table, empty_ext_table}, - // 10 - {"ISO-8859-5", CIOLIB_ISO_8859_5, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_5_table, sizeof(iso8859_5_table) / sizeof(iso8859_5_table[0]), - iso8859_5_unicode_table, empty_ext_table}, - {"CP850", CIOLIB_CP850, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp850_table, sizeof(cp850_table) / sizeof(cp850_table[0]), - cp850_unicode_table, cp437_ext_table}, - {"CP865", CIOLIB_CP865, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp865_table, sizeof(cp865_table) / sizeof(cp865_table[0]), - cp865_unicode_table, cp437_ext_table}, - {"ISO-8859-7", CIOLIB_ISO_8859_7, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_7_table, sizeof(iso8859_7_table) / sizeof(iso8859_7_table[0]), - iso8859_7_unicode_table, empty_ext_table}, - {"ISO-8859-1", CIOLIB_ISO_8859_1, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_1_table, sizeof(iso8859_1_table) / sizeof(iso8859_1_table[0]), - iso8859_1_unicode_table, empty_ext_table}, - // 15 - {"CP866M2", CIOLIB_CP866M2, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp866m2_table, sizeof(cp866m2_table) / sizeof(cp866m2_table[0]), - cp866m2_unicode_table, cp437_ext_table}, - {"CP866U", CIOLIB_CP866U, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp866u_table, sizeof(cp866u_table) / sizeof(cp866u_table[0]), - cp866u_unicode_table, cp437_ext_table}, - {"CP1131", CIOLIB_CP1131, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp1131_table, sizeof(cp1131_table) / sizeof(cp1131_table[0]), - cp1131_unicode_table, cp437_ext_table}, - {"ARMSCII-8", CIOLIB_ARMSCII8, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - armscii8_table, sizeof(armscii8_table) / sizeof(armscii8_table[0]), - armscii8_unicode_table, cp437_ext_table}, - {"HAIK8", CIOLIB_HAIK8, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - haik8_table, sizeof(haik8_table) / sizeof(haik8_table[0]), - haik8_unicode_table, cp437_ext_table}, - // 20 - {"ATASCII", CIOLIB_ATASCII, ftstr_to_utf8, utf8_to_cpstr, ft_from_unicode_cpoint, ft_cpoint_from_cptable, ft_cpoint_from_cptable_ext, - atascii_table, sizeof(atascii_table) / sizeof(atascii_table[0]), - atascii_unicode_table, atascii_ext_table}, - {"PETSCIIU", CIOLIB_PETSCIIU, ftstr_to_utf8, utf8_to_cpstr, ft_from_unicode_cpoint, ft_cpoint_from_cptable, cpoint_from_cptable_ext, - petsciiu_table, sizeof(petsciiu_table) / sizeof(petsciiu_table[0]), - petsciiu_unicode_table, empty_ext_table}, - {"PETSCIIL", CIOLIB_PETSCIIL, ftstr_to_utf8, utf8_to_cpstr, ft_from_unicode_cpoint, ft_cpoint_from_cptable, cpoint_from_cptable_ext, - petsciil_table, sizeof(petsciil_table) / sizeof(petsciil_table[0]), - petsciil_unicode_table, empty_ext_table}, -}; - -uint8_t *cp_to_utf8(enum ciolib_codepage cp, const char *cpstr, size_t buflen, size_t *outlen) -{ - if (cp < 0 || cp >= CIOLIB_CP_COUNT) - return NULL; - - return ciolib_cp[cp].to_utf8(cpstr, buflen, outlen, &ciolib_cp[cp]); -} - -char *utf8_to_cp(enum ciolib_codepage cp, const uint8_t *utf8str, char unmapped, size_t buflen, size_t *outlen) -{ - if (cp < 0 || cp >= CIOLIB_CP_COUNT) - return NULL; - - return ciolib_cp[cp].utf8_to(utf8str, unmapped, buflen, outlen, &ciolib_cp[cp]); -} - -uint8_t cpchar_from_unicode_cpoint(enum ciolib_codepage cp, uint32_t cpoint, char unmapped) -{ - if (cp < 0 || cp >= CIOLIB_CP_COUNT) - return unmapped; - - return ciolib_cp[cp].from_unicode_cpoint(cpoint, unmapped, &ciolib_cp[cp]); -} - -uint32_t cpoint_from_cpchar(enum ciolib_codepage cp, uint8_t ch) -{ - if (cp < 0 || cp >= CIOLIB_CP_COUNT) - return 0; - - return ciolib_cp[cp].from_cpchar(ch, &ciolib_cp[cp]); -} - -uint32_t cpoint_from_cpchar_ext(enum ciolib_codepage cp, uint8_t ch) -{ - if (cp < 0 || cp >= CIOLIB_CP_COUNT) - return 0; - - return ciolib_cp[cp].from_cpchar_ext(ch, &ciolib_cp[cp]); -} diff --git a/ciolib/utf8_codepages.h b/ciolib/utf8_codepages.h deleted file mode 100644 index f654d9c..0000000 --- a/ciolib/utf8_codepages.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef UTF8_CODEPAGES_H -#define UTF8_CODEPAGES_H - -enum ciolib_codepage { - CIOLIB_CP437, - CIOLIB_CP1251, - CIOLIB_KOI8_R, - CIOLIB_ISO_8859_2, - CIOLIB_ISO_8859_4, - CIOLIB_CP866M, - CIOLIB_ISO_8859_9, - CIOLIB_ISO_8859_8, - CIOLIB_KOI8_U, - CIOLIB_ISO_8859_15, - CIOLIB_ISO_8859_5, - CIOLIB_CP850, - CIOLIB_CP865, - CIOLIB_ISO_8859_7, - CIOLIB_ISO_8859_1, - CIOLIB_CP866M2, - CIOLIB_CP866U, - CIOLIB_CP1131, - CIOLIB_ARMSCII8, - CIOLIB_HAIK8, - CIOLIB_ATASCII, - CIOLIB_PETSCIIU, - CIOLIB_PETSCIIL, - CIOLIB_CP_COUNT -}; - -struct codepage_def { - const char name[32]; - const enum ciolib_codepage cp; - uint8_t *(*to_utf8)(const char *cp437str, size_t buflen, size_t *outlen, const struct codepage_def *cpdef); - char *(*utf8_to)(const uint8_t *utf8str, char unmapped, size_t buflen, size_t *outlen, const struct codepage_def *cpdef); - uint8_t (*from_unicode_cpoint)(uint32_t cpoint, char unmapped, const struct codepage_def *cpdef); - uint32_t (*from_cpchar)(uint8_t cpoint, const struct codepage_def *cpdef); - uint32_t (*from_cpchar_ext)(uint8_t cpoint, const struct codepage_def *cpdef); - const struct ciolib_cpmap *cp_table; - const size_t cp_table_sz; - const uint32_t *cp_unicode_table; - const uint32_t *cp_ext_unicode_table; -}; - -extern const struct codepage_def ciolib_cp[CIOLIB_CP_COUNT]; - -#ifdef __cplusplus -extern "C" { -#endif - -uint8_t *cp_to_utf8(enum ciolib_codepage cp, const char *cpstr, size_t buflen, size_t *outlen); -char *utf8_to_cp(enum ciolib_codepage cp, const uint8_t *utf8str, char unmapped, size_t buflen, size_t *outlen); -uint8_t cpchar_from_unicode_cpoint(enum ciolib_codepage cp, uint32_t cpoint, char unmapped); -uint32_t cpoint_from_cpchar(enum ciolib_codepage cp, uint8_t ch); -uint32_t cpoint_from_cpchar_ext(enum ciolib_codepage cp, uint8_t ch); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/vidmodes.c b/ciolib/vidmodes.c deleted file mode 100644 index cd8bbb8..0000000 --- a/ciolib/vidmodes.c +++ /dev/null @@ -1,390 +0,0 @@ -/* $Id: vidmodes.c,v 1.33 2020/06/27 00:04:45 deuce Exp $ */ - -#include <stdlib.h> -#include <stdbool.h> - -/* xpdev: */ -#include <gen_defs.h> /* FREE_AND_NULL */ - -#include "vidmodes.h" - -// TODO: Pretty much all the 1:1 aspect ratios are wrong... -struct video_params vparams[] = { - /* BW 40x25 */ - {BW40, GREYSCALE_PALETTE, 40, 25, 14, 15, 16, 8, 7, 0, 4, 3, 320, 200}, - /* CO 40x25 */ - {C40, COLOUR_PALETTE, 40, 25, 14, 15, 16, 8, 7, 0, 4, 3, 320, 200}, - /* BW 80x25 */ - {BW80, GREYSCALE_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 4, 3, 640, 400}, - /* CO 80x25 */ - {C80, COLOUR_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 4, 3, 640, 400}, - /* MONO */ - {MONO, 0, 80, 25, 14, 15, 16, 8, 7, 0, 4, 3, 640, 400}, - /* CO 40x14 */ - {C40X14, COLOUR_PALETTE, 40, 14, 14, 15, 16, 8, 7, 0, 4, 3, 320, 224}, - /* CO 40x21 */ - {C40X21, COLOUR_PALETTE, 40, 21, 14, 15, 16, 8, 7, 0, 4, 3, 320, 336}, - /* CO 40x28 */ - {C40X28, COLOUR_PALETTE, 40, 28, 12, 13, 14, 8, 7, 0, 4, 3, 320, 392}, - /* CO 40x43 */ - {C40X43, COLOUR_PALETTE, 40, 43, 7, 7, 8, 8, 7, 0, 4, 3, 320, 774}, - /* CO 40x50 */ - {C40X50, COLOUR_PALETTE, 40, 50, 7, 7, 8, 8, 7, 0, 4, 3, 320, 400}, - /* CO 40x60 */ - {C40X60, COLOUR_PALETTE, 40, 60, 7, 7, 8, 8, 7, 0, 4, 3, 320, 480}, - /* CO 80x14 */ - {C80X14, COLOUR_PALETTE, 80, 14, 14, 15, 16, 8, 7, 0, 4, 3, 640, 224}, - /* CO 80x21 */ - {C80X21, COLOUR_PALETTE, 80, 21, 14, 15, 16, 8, 7, 0, 4, 3, 640, 336}, - /* CO 80x28 */ - {C80X28, COLOUR_PALETTE, 80, 28, 12, 13, 14, 8, 7, 0, 4, 3, 640, 392}, - /* CO 80x30 */ - {C80X30, COLOUR_PALETTE, 80, 30, 14, 15, 16, 8, 7, 0, 4, 3, 640, 480}, - /* CO 80x43 */ - {C80X43, COLOUR_PALETTE, 80, 43, 7, 7, 8, 8, 7, 0, 4, 3, 640, 350}, - /* EGA 80x25 */ - {EGA80X25, COLOUR_PALETTE, 80, 25, 12, 13, 14, 8, 7, 0, 4, 3, 640, 350}, - /* CO 80x50 */ - {C80X50, COLOUR_PALETTE, 80, 50, 7, 7, 8, 8, 7, 0, 4, 3, 640, 400}, - /* CO 80x60 */ - {C80X60, COLOUR_PALETTE, 80, 60, 7, 7, 8, 8, 7, 0, 4, 3, 640, 480}, - /* B 40x14 */ - {BW40X14, GREYSCALE_PALETTE, 40, 14, 14, 15, 16, 8, 7, 0, 4, 3, 320, 224}, - /* BW 40x21 */ - {BW40X21, GREYSCALE_PALETTE, 40, 21, 14, 15, 16, 8, 7, 0, 4, 3, 320, 336}, - /* BW 40x28 */ - {BW40X28, GREYSCALE_PALETTE, 40, 28, 12, 13, 14, 8, 7, 0, 4, 3, 320, 392}, - /* BW 40x43 */ - {BW40X43, GREYSCALE_PALETTE, 40, 43, 7, 7, 14, 8, 7, 0, 4, 3, 320, 350}, - /* BW 40x50 */ - {BW40X50, GREYSCALE_PALETTE, 40, 50, 7, 7, 8, 8, 7, 0, 4, 3, 320, 400}, - /* BW 40x60 */ - {BW40X60, GREYSCALE_PALETTE, 40, 60, 7, 7, 8, 8, 7, 0, 4, 3, 320, 480}, - /* BW 80x14 */ - {BW80X14, GREYSCALE_PALETTE, 80, 14, 14, 15, 16, 8, 7, 0, 4, 3, 640, 224}, - /* BW 80x21 */ - {BW80X21, GREYSCALE_PALETTE, 80, 21, 14, 15, 16, 8, 7, 0, 4, 3, 640, 336}, - /* BW 80x28 */ - {BW80X28, GREYSCALE_PALETTE, 80, 28, 12, 13, 14, 8, 7, 0, 4, 3, 640, 392}, - /* BW 80x43 */ - {BW80X43, GREYSCALE_PALETTE, 80, 43, 7, 7, 14, 8, 7, 0, 4, 3, 640, 350}, - /* BW 80x50 */ - {BW80X50, GREYSCALE_PALETTE, 80, 50, 7, 7, 8, 8, 7, 0, 4, 3, 640, 400}, - /* BW 80x60 */ - {BW80X60, GREYSCALE_PALETTE, 80, 60, 7, 7, 8, 8, 7, 0, 4, 3, 640, 480}, - /* MONO 80x14 */ - {MONO14, MONO_PALETTE, 80, 14, 14, 15, 16, 8, 7, 0, 4, 3, 640, 224}, - /* MONO 80x21 */ - {MONO21, MONO_PALETTE, 80, 21, 14, 15, 16, 8, 7, 0, 4, 3, 640, 336}, - /* MONO 80x28 */ - {MONO28, MONO_PALETTE, 80, 28, 12, 13, 14, 8, 7, 0, 4, 3, 640, 392}, - /* MONO 80x43 */ - {MONO43, MONO_PALETTE, 80, 43, 7, 7, 14, 8, 7, 0, 4, 3, 640, 350}, - /* MONO 80x50 */ - {MONO50, MONO_PALETTE, 80, 50, 7, 7, 8, 8, 7, 0, 4, 3, 640, 400}, - /* MONO 80x60 */ - {MONO60, MONO_PALETTE, 80, 60, 7, 7, 8, 8, 7, 0, 4, 3, 640, 480}, - /* Magical C4350 Mode */ - {C4350, COLOUR_PALETTE, 80, 50, 7, 7, 8, 8, 7, 0, 4, 3, 640, 400}, - /* Commodore 64 40x25 mode */ - // This is the NTSC aspect ratio... the pixel aspect ratio is about 75:100 due to the - // borders. - {C64_40X25, C64_PALETTE, 40, 25, 0, 7, 8, 8, 0x6e, CIOLIB_VIDEO_BGBRIGHT|CIOLIB_VIDEO_NOBLINK, 6, 5, 320, 200}, - /* Commodore 128 40x25 mode */ - // The C128 uses the same aspect ratio as the C64 in 40 column mode - {C128_40X25, C64_PALETTE, 40, 25, 0, 7, 8, 8, 0xbd, CIOLIB_VIDEO_BGBRIGHT|CIOLIB_VIDEO_NOBLINK, 6, 5, 320, 200}, - /* Commodore 128 80x25 mode */ - // But in 80-column mode is a 4:3 CGA style output. - {C128_80X25, COLOUR_PALETTE, 80, 25, 0, 7, 8, 8, 7, CIOLIB_VIDEO_BGBRIGHT|CIOLIB_VIDEO_NOBLINK, 4, 3, 640, 200}, - /* Atari 800 40x24 mode */ - {ATARI_40X24, ATARI_PALETTE, 40, 24, 0, 7, 8, 8, 7, 0, 4, 3, 320, 192}, - /* Atari 800 XEP80 80x25 mode */ - {ATARI_80X25, GREYSCALE_PALETTE, 80, 25, 0, 15, 16, 8, 7, 0, 4, 3, 640, 400}, - /* VESA 21x132 mode */ - {VESA_132X21, COLOUR_PALETTE, 132, 21, 14, 15, 16, 8, 7, 0, 4, 3, 1056, 336}, - /* VESA 25x132 mode */ - {VESA_132X25, COLOUR_PALETTE, 132, 25, 14, 15, 16, 8, 7, 0, 4, 3, 1056, 400}, - /* VESA 28x132 mode */ - {VESA_132X28, COLOUR_PALETTE, 132, 28, 12, 13, 14, 8, 7, 0, 4, 3, 1056, 392}, - /* VESA 30x132 mode */ - {VESA_132X30, COLOUR_PALETTE, 132, 30, 14, 15, 16, 8, 7, 0, 4, 3, 1056, 480}, - /* VESA 34x132 mode */ - {VESA_132X34, COLOUR_PALETTE, 132, 34, 12, 13, 14, 8, 7, 0, 4, 3, 1056, 476}, - /* VESA 43x132 mode */ - {VESA_132X43, COLOUR_PALETTE, 132, 43, 7, 7, 8, 8, 7, 0, 4, 3, 1056, 350}, - /* VESA 50x132 mode */ - {VESA_132X50, COLOUR_PALETTE, 132, 50, 7, 7, 8, 8, 7, 0, 4, 3, 1056, 400}, - /* VESA 60x132 mode */ - {VESA_132X60, COLOUR_PALETTE, 132, 60, 7, 7, 8, 8, 7, 0, 4, 3, 1056, 480}, - /* Awesome modes */ - {ST132X37_16_9, COLOUR_PALETTE, 132, 37, 14, 15, 16, 8, 7, 0, 16, 9, 1056, 600}, - {ST132X52_5_4, COLOUR_PALETTE, 132, 52, 14, 15, 16, 8, 7, 0, 5, 4, 1056, 823}, - /* Stupid modes */ - {VGA80X25, COLOUR_PALETTE, 80, 25, 14, 15, 16, 9, 7, CIOLIB_VIDEO_EXPAND | CIOLIB_VIDEO_LINE_GRAPHICS_EXPAND, 4, 3, 720, 400}, - /* DigitalMon */ - {LCD80X25, COLOUR_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 8, 5, 640, 400}, - /* Custom mode */ - {CIOLIB_MODE_CUSTOM, COLOUR_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 0, 0, -1, -1}, -}; - -uint32_t palettes[5][16] = { - /* Mono */ - { 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07 - }, - /* Black and White */ - { 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f - }, - /* Colour */ - { 0x00, 0x04, 0x02, 0x06, 0x01, 0x05, 0x03, 0x07, - 0x08, 0x0c, 0x0a, 0x0e, 0x09, 0x0d, 0x0b, 0x0f - }, - /* C64 */ - { 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, - 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f - }, - /* Atari */ - { 0x110, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, - 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111 - }, -}; - -struct dac_colors dac_default[TOTAL_DAC_SIZE] = { - /* "System" colours */ - {0, 0, 0}, // Black - {168, 0, 0}, // Red - {0, 168, 0}, // Green - {168, 84, 0}, // Brown - {0, 0, 168}, // Blue - {168, 0, 168}, // Magenta - {0, 168, 168}, // Cyan - {168, 168, 168}, // Light Gray - - {84, 84, 84}, // Dark Gray - {255, 84, 84}, // Light Red - {84, 255, 84}, // Light Green - {255, 255, 84}, // Yellow - {84, 84, 255}, // Light Blue - {255, 84, 255}, // Light Magenta - {84, 255, 255}, // Light Cyan - {255, 255, 255}, // White - - /* XTerm 256 colour palette */ - {0, 0, 0}, {0, 0, 95}, {0, 0, 135}, {0, 0, 175}, - {0, 0, 215}, {0, 0, 255}, {0, 95, 0}, {0, 95, 95}, - {0, 95, 135}, {0, 95, 175}, {0, 95, 215}, {0, 95, 255}, - {0, 135, 0}, {0, 135, 95}, {0, 135, 135}, {0, 135, 175}, - {0, 135, 215}, {0, 135, 255}, {0, 175, 0}, {0, 175, 95}, - {0, 175, 135}, {0, 175, 175}, {0, 175, 215}, {0, 175, 255}, - {0, 215, 0}, {0, 215, 95}, {0, 215, 135}, {0, 215, 175}, - {0, 215, 215}, {0, 215, 255}, {0, 255, 0}, {0, 255, 95}, - {0, 255, 135}, {0, 255, 175}, {0, 255, 215}, {0, 255, 255}, - {95, 0, 0}, {95, 0, 95}, {95, 0, 135}, {95, 0, 175}, - {95, 0, 215}, {95, 0, 255}, {95, 95, 0}, {95, 95, 95}, - {95, 95, 135}, {95, 95, 175}, {95, 95, 215}, {95, 95, 255}, - {95, 135, 0}, {95, 135, 95}, {95, 135, 135}, {95, 135, 175}, - {95, 135, 215}, {95, 135, 255}, {95, 175, 0}, {95, 175, 95}, - {95, 175, 135}, {95, 175, 175}, {95, 175, 215}, {95, 175, 255}, - {95, 215, 0}, {95, 215, 95}, {95, 215, 135}, {95, 215, 175}, - {95, 215, 215}, {95, 215, 255}, {95, 255, 0}, {95, 255, 95}, - {95, 255, 135}, {95, 255, 175}, {95, 255, 215}, {95, 255, 255}, - {135, 0, 0}, {135, 0, 95}, {135, 0, 135}, {135, 0, 175}, - {135, 0, 215}, {135, 0, 255}, {135, 95, 0}, {135, 95, 95}, - {135, 95, 135}, {135, 95, 175}, {135, 95, 215}, {135, 95, 255}, - {135, 135, 0}, {135, 135, 95}, {135, 135, 135}, {135, 135, 175}, - {135, 135, 215}, {135, 135, 255}, {135, 175, 0}, {135, 175, 95}, - {135, 175, 135}, {135, 175, 175}, {135, 175, 215}, {135, 175, 255}, - {135, 215, 0}, {135, 215, 95}, {135, 215, 135}, {135, 215, 175}, - {135, 215, 215}, {135, 215, 255}, {135, 255, 0}, {135, 255, 95}, - {135, 255, 135}, {135, 255, 175}, {135, 255, 215}, {135, 255, 255}, - {175, 0, 0}, {175, 0, 95}, {175, 0, 135}, {175, 0, 175}, - {175, 0, 215}, {175, 0, 255}, {175, 95, 0}, {175, 95, 95}, - {175, 95, 135}, {175, 95, 175}, {175, 95, 215}, {175, 95, 255}, - {175, 135, 0}, {175, 135, 95}, {175, 135, 135}, {175, 135, 175}, - {175, 135, 215}, {175, 135, 255}, {175, 175, 0}, {175, 175, 95}, - {175, 175, 135}, {175, 175, 175}, {175, 175, 215}, {175, 175, 255}, - {175, 215, 0}, {175, 215, 95}, {175, 215, 135}, {175, 215, 175}, - {175, 215, 215}, {175, 215, 255}, {175, 255, 0}, {175, 255, 95}, - {175, 255, 135}, {175, 255, 175}, {175, 255, 215}, {175, 255, 255}, - {215, 0, 0}, {215, 0, 95}, {215, 0, 135}, {215, 0, 175}, - {215, 0, 215}, {215, 0, 255}, {215, 95, 0}, {215, 95, 95}, - {215, 95, 135}, {215, 95, 175}, {215, 95, 215}, {215, 95, 255}, - {215, 135, 0}, {215, 135, 95}, {215, 135, 135}, {215, 135, 175}, - {215, 135, 215}, {215, 135, 255}, {215, 175, 0}, {215, 175, 95}, - {215, 175, 135}, {215, 175, 175}, {215, 175, 215}, {215, 175, 255}, - {215, 215, 0}, {215, 215, 95}, {215, 215, 135}, {215, 215, 175}, - {215, 215, 215}, {215, 215, 255}, {215, 255, 0}, {215, 255, 95}, - {215, 255, 135}, {215, 255, 175}, {215, 255, 215}, {215, 255, 255}, - {255, 0, 0}, {255, 0, 95}, {255, 0, 135}, {255, 0, 175}, - {255, 0, 215}, {255, 0, 255}, {255, 95, 0}, {255, 95, 95}, - {255, 95, 135}, {255, 95, 175}, {255, 95, 215}, {255, 95, 255}, - {255, 135, 0}, {255, 135, 95}, {255, 135, 135}, {255, 135, 175}, - {255, 135, 215}, {255, 135, 255}, {255, 175, 0}, {255, 175, 95}, - {255, 175, 135}, {255, 175, 175}, {255, 175, 215}, {255, 175, 255}, - {255, 215, 0}, {255, 215, 95}, {255, 215, 135}, {255, 215, 175}, - {255, 215, 215}, {255, 215, 255}, {255, 255, 0}, {255, 255, 95}, - {255, 255, 135}, {255, 255, 175}, {255, 255, 215}, {255, 255, 255}, - {8, 8, 8}, {18, 18, 18}, {28, 28, 28}, {38, 38, 38}, - {48, 48, 48}, {58, 58, 58}, {68, 68, 68}, {78, 78, 78}, - {88, 88, 88}, {98, 98, 98}, {108, 108, 108}, {118, 118, 118}, - {128, 128, 128}, {138, 138, 138}, {148, 148, 148}, {158, 158, 158}, - {168, 168, 168}, {178, 178, 178}, {188, 188, 188}, {198, 198, 198}, - {208, 208, 208}, {218, 218, 218}, {228, 228, 228}, {238, 238, 238}, - - /* C64 colours */ - /* Black, White, Red, Cyan, Purple, Green, Blue, Yellow */ - /* Orange, Brown, Lt Red, Dk Grey, Grey, Lt Green, Lt Blue, Lt Grey */ -#if 0 - /* Taken from CTerm source */ - {0x00, 0x00, 0x00}, // Black - {0xFD, 0xFE, 0xFC}, // White - {0xBE, 0x1A, 0x24}, // Red - {0x30, 0xE6, 0xC6}, // Cyan - {0xB4, 0x1A, 0xE2}, // Purple - {0x1F, 0xD2, 0x1E}, // Green - {0x21, 0x1B, 0xAE}, // Blue - {0xDF, 0xF6, 0x0A}, // Yellow - {0xB8, 0x41, 0x04}, // Orange - {0x6A, 0x33, 0x04}, // Brown - {0xFE, 0x4A, 0x57}, // Light Red - {0x42, 0x45, 0x40}, // Dark Grey - {0x70, 0x74, 0x6F}, // Grey - {0x59, 0xFE, 0x59}, // Light Green - {0x5F, 0x53, 0xFE}, // Light Blue - {0xA4, 0xA7, 0xA2}, // Light Grey -#else - /* - * Taken from https://www.pepto.de/projects/colorvic/ - * a much more convincing source. - */ - {0x00, 0x00, 0x00}, - {0xFF, 0xFF, 0xFF}, - {0x81, 0x33, 0x38}, - {0x75, 0xCE, 0xC8}, - {0x8E, 0x3C, 0x97}, - {0x56, 0xAC, 0x4D}, - {0x2E, 0x2C, 0x9B}, - {0xED, 0xF1, 0x71}, - {0x8E, 0x50, 0x29}, - {0x55, 0x38, 0x00}, - {0xC4, 0x6C, 0x71}, - {0x4A, 0x4A, 0x4A}, - {0x7B, 0x7B, 0x7B}, - {0xA9, 0xFF, 0x9F}, - {0x70, 0x6D, 0xEB}, - {0xB2, 0xB2, 0xB2}, -#endif - - /* Atari Colours */ - /* BG, FG */ - {0, 81, 129}, {96, 183, 231}, -}; - -int find_vmode(int mode) -{ - unsigned i; - - for (i = 0; i < NUMMODES; i++) - if (vparams[i].mode == mode) - return i; - - return -1; -} - -struct vstat_vmem *get_vmem(struct video_stats *vs) -{ - vs->vmem->refcount++; - return vs->vmem; -} - -void release_vmem(struct vstat_vmem *vm) -{ - if (vm == NULL) - return; - vm->refcount--; - if (vm->refcount == 0) { - FREE_AND_NULL(vm->vmem); - FREE_AND_NULL(vm); - } -} - -static struct vstat_vmem *new_vmem(int cols, int rows, bool palette) -{ - struct vstat_vmem *ret = malloc(sizeof(struct vstat_vmem)); - - if (ret == NULL) - return ret; - ret->refcount = 1; - ret->vmem = malloc(cols*rows*sizeof(ret->vmem[0])); - if (ret->vmem == NULL) { - free(ret); - return NULL; - } - return ret; -} - -int load_vmode(struct video_stats *vs, int mode) -{ - int i; - - i=find_vmode(mode); - if(i==-1) - return(-1); - release_vmem(vs->vmem); - vs->vmem=new_vmem(vparams[i].cols, vparams[i].rows, vs->flags & VIDMODES_FLAG_PALETTE_VMEM); - if (vs->vmem == NULL) - return -1; - vs->rows=vparams[i].rows; - vs->cols=vparams[i].cols; - vs->curs_start=vparams[i].curs_start; - vs->curs_end=vparams[i].curs_end; - vs->default_curs_start=vparams[i].curs_start; - vs->default_curs_end=vparams[i].curs_end; - vs->curs_blinks=1; - vs->curs_visible=1; - vs->curs_row=1; - vs->curs_col=1; - vs->bright_background=vparams[i].flags & CIOLIB_VIDEO_BGBRIGHT; - vs->no_bright=vparams[i].flags & CIOLIB_VIDEO_NOBRIGHT; - vs->bright_altcharset=vparams[i].flags & CIOLIB_VIDEO_ALTCHARS; - vs->no_blink=vparams[i].flags & CIOLIB_VIDEO_NOBLINK; - vs->blink_altcharset=vparams[i].flags & CIOLIB_VIDEO_BLINKALTCHARS; - if (vparams[i].flags & CIOLIB_VIDEO_EXPAND) - vs->flags |= VIDMODES_FLAG_EXPAND; - else - vs->flags &= ~VIDMODES_FLAG_EXPAND; - if (vparams[i].flags & CIOLIB_VIDEO_LINE_GRAPHICS_EXPAND) - vs->flags |= VIDMODES_FLAG_LINE_GRAPHICS_EXPAND; - else - vs->flags &= ~VIDMODES_FLAG_LINE_GRAPHICS_EXPAND; - if(vs->curs_row < 0) - vs->curs_row=0; - if(vs->curs_row >= vparams[i].rows) - vs->curs_row=vparams[i].rows-1; - if(vs->curs_col < 0) - vs->curs_col=0; - if(vs->curs_col >= vparams[i].cols) - vs->curs_col=vparams[i].cols-1; - memcpy(vs->palette, palettes[vparams[i].palette], sizeof(vs->palette)); - vs->charheight=vparams[i].charheight; - vs->charwidth=vparams[i].charwidth; - vs->mode=mode; - vs->currattr = vparams[i].default_attr; - vs->aspect_width = vparams[i].aspect_width; - vs->aspect_height = vparams[i].aspect_height; - if (vs->aspect_width == 0 || vs->aspect_height == 0) { - vs->aspect_width = vs->scrnwidth; - vs->aspect_height = vs->scrnheight; - } - if (vparams[i].xres > 0) - vs->scrnwidth = vparams[i].xres; - else - vs->scrnwidth = vs->charwidth * vs->cols; - if (vparams[i].yres > 0) - vs->scrnheight = vparams[i].yres; - else - vs->scrnheight = vs->charheight * vs->rows; - vs->forced_font = NULL; - return(0); -} diff --git a/ciolib/vidmodes.h b/ciolib/vidmodes.h deleted file mode 100644 index ebdcf38..0000000 --- a/ciolib/vidmodes.h +++ /dev/null @@ -1,142 +0,0 @@ -/* $Id: vidmodes.h,v 1.33 2020/06/27 00:04:45 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _VIDMODES_H_ -#define _VIDMODES_H_ - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" - -#define TOTAL_DAC_SIZE 274 - -/* Entry type for the DAC table. */ -struct dac_colors { - unsigned char red; - unsigned char green; - unsigned char blue; -}; - -struct video_params { - int mode; - int palette; - int cols; - int rows; - int curs_start; - int curs_end; - int charheight; - int charwidth; - int default_attr; - int flags; - int aspect_width; - int aspect_height; - int xres; - int yres; -}; - -struct vstat_vmem { - unsigned refcount; - struct vmem_cell *vmem; -}; - -struct video_stats { - int rows; - int cols; - int curs_row; - int curs_col; - int curs_start; - int curs_end; - int curs_blinks; - int curs_visible; - int default_curs_start; - int default_curs_end; - int mode; - int charheight; - int charwidth; - int bright_background; - int blink; - int curs_blink; - int no_bright; - int no_blink; - int bright_altcharset; - int blink_altcharset; - int currattr; - int scaling; - int scrnwidth; - int scrnheight; - int winwidth; - int winheight; - int aspect_width; - int aspect_height; - uint32_t flags; -#define VIDMODES_FLAG_PALETTE_VMEM 1 -#define VIDMODES_FLAG_EXPAND 2 -#define VIDMODES_FLAG_LINE_GRAPHICS_EXPAND 4 - uint32_t palette[16]; - struct vstat_vmem *vmem; - uint8_t *forced_font; -}; - -enum { - MONO_PALETTE - ,GREYSCALE_PALETTE - ,COLOUR_PALETTE - ,C64_PALETTE - ,ATARI_PALETTE -}; - -extern struct video_params vparams[56]; -#define NUMMODES (sizeof(vparams) / sizeof(struct video_params)) -extern uint32_t palettes[5][16]; -extern struct dac_colors dac_default[TOTAL_DAC_SIZE]; -extern char vga_font_bitmap[4096]; -extern char vga_font_bitmap14[3584]; -extern char vga_font_bitmap8[2048]; - -#ifdef __cplusplus -extern "C" { -#endif -int find_vmode(int mode); -struct vstat_vmem *get_vmem(struct video_stats *vs); -void release_vmem(struct vstat_vmem *vm); -int load_vmode(struct video_stats *vs, int mode); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/win32cio.c b/ciolib/win32cio.c deleted file mode 100644 index e1c4ac8..0000000 --- a/ciolib/win32cio.c +++ /dev/null @@ -1,934 +0,0 @@ -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <windows.h> /* INPUT_RECORD, etc. */ -#include <genwrap.h> -#include <stdio.h> /* stdin */ -#if defined(_WIN32) - #include <malloc.h> /* alloca() on Win32 */ -#endif - -#include "ciolib.h" -#include "vidmodes.h" -#include "win32cio.h" - -struct keyvals { - int VirtualKeyCode - ,Key - ,Shift - ,CTRL - ,ALT; -}; - -CIOLIBEXPORTVAR const struct keyvals keyval[] = -{ - {VK_BACK, 0x08, 0x08, 0x7f, 0x0e00}, - {VK_TAB, 0x09, 0x0f00, 0x9400, 0xa500}, - {VK_RETURN, 0x0d, 0x0d, 0x0a, 0xa600}, - {VK_ESCAPE, 0x1b, 0x1b, 0x1b, 0x0100}, - {VK_SPACE, 0x20, 0x20, 0x0300, 0x20,}, - {'0', '0', ')', 0, 0x8100}, - {'1', '1', '!', 0, 0x7800}, - {'2', '2', '@', 0x0300, 0x7900}, - {'3', '3', '#', 0, 0x7a00}, - {'4', '4', '$', 0, 0x7b00}, - {'5', '5', '%', 0, 0x7c00}, - {'6', '6', '^', 0x1e, 0x7d00}, - {'7', '7', '&', 0, 0x7e00}, - {'8', '8', '*', 0, 0x7f00}, - {'9', '9', '(', 0, 0x8000}, - {'A', 'a', 'A', 0x01, 0x1e00}, - {'B', 'b', 'B', 0x02, 0x3000}, - {'C', 'c', 'C', 0x03, 0x2e00}, - {'D', 'd', 'D', 0x04, 0x2000}, - {'E', 'e', 'E', 0x05, 0x1200}, - {'F', 'f', 'F', 0x06, 0x2100}, - {'G', 'g', 'G', 0x07, 0x2200}, - {'H', 'h', 'H', 0x08, 0x2300}, - {'I', 'i', 'I', 0x09, 0x1700}, - {'J', 'j', 'J', 0x0a, 0x2400}, - {'K', 'k', 'K', 0x0b, 0x2500}, - {'L', 'l', 'L', 0x0c, 0x2600}, - {'M', 'm', 'M', 0x0d, 0x3200}, - {'N', 'n', 'N', 0x0e, 0x3100}, - {'O', 'o', 'O', 0x0f, 0x1800}, - {'P', 'p', 'P', 0x10, 0x1900}, - {'Q', 'q', 'Q', 0x11, 0x1000}, - {'R', 'r', 'R', 0x12, 0x1300}, - {'S', 's', 'S', 0x13, 0x1f00}, - {'T', 't', 'T', 0x14, 0x1400}, - {'U', 'u', 'U', 0x15, 0x1600}, - {'V', 'v', 'V', 0x16, 0x2f00}, - {'W', 'w', 'W', 0x17, 0x1100}, - {'X', 'x', 'X', 0x18, 0x2d00}, - {'Y', 'y', 'Y', 0x19, 0x1500}, - {'Z', 'z', 'Z', 0x1a, 0x2c00}, - {VK_PRIOR, 0x4900, 0x4900, 0x8400, 0x9900}, - {VK_NEXT, 0x5100, 0x5100, 0x7600, 0xa100}, - {VK_END, 0x4f00, 0x4f00, 0x7500, 0x9f00}, - {VK_HOME, 0x4700, 0x4700, 0x7700, 0x9700}, - {VK_LEFT, 0x4b00, 0x4b00, 0x7300, 0x9b00}, - {VK_UP, 0x4800, 0x4800, 0x8d00, 0x9800}, - {VK_RIGHT, 0x4d00, 0x4d00, 0x7400, 0x9d00}, - {VK_DOWN, 0x5000, 0x5000, 0x9100, 0xa000}, - {VK_INSERT, CIO_KEY_IC, CIO_KEY_SHIFT_IC, CIO_KEY_CTRL_IC, CIO_KEY_ALT_IC}, - {VK_DELETE, CIO_KEY_DC, CIO_KEY_SHIFT_DC, CIO_KEY_CTRL_DC, CIO_KEY_CTRL_IC}, - {VK_NUMPAD0, '0', 0x5200, 0x9200, 0}, - {VK_NUMPAD1, '1', 0x4f00, 0x7500, 0}, - {VK_NUMPAD2, '2', 0x5000, 0x9100, 0}, - {VK_NUMPAD3, '3', 0x5100, 0x7600, 0}, - {VK_NUMPAD4, '4', 0x4b00, 0x7300, 0}, - {VK_NUMPAD5, '5', 0x4c00, 0x8f00, 0}, - {VK_NUMPAD6, '6', 0x4d00, 0x7400, 0}, - {VK_NUMPAD7, '7', 0x4700, 0x7700, 0}, - {VK_NUMPAD8, '8', 0x4800, 0x8d00, 0}, - {VK_NUMPAD9, '9', 0x4900, 0x8400, 0}, - {VK_MULTIPLY, '*', '*', 0x9600, 0x3700}, - {VK_ADD, '+', '+', 0x9000, 0x4e00}, - {VK_SUBTRACT, '-', '-', 0x8e00, 0x4a00}, - {VK_DECIMAL, '.', '.', 0x5300, 0x9300}, - {VK_DIVIDE, '/', '/', 0x9500, 0xa400}, - {VK_F1, 0x3b00, 0x5400, 0x5e00, 0x6800}, - {VK_F2, 0x3c00, 0x5500, 0x5f00, 0x6900}, - {VK_F3, 0x3d00, 0x5600, 0x6000, 0x6a00}, - {VK_F4, 0x3e00, 0x5700, 0x6100, 0x6b00}, - {VK_F5, 0x3f00, 0x5800, 0x6200, 0x6c00}, - {VK_F6, 0x4000, 0x5900, 0x6300, 0x6d00}, - {VK_F7, 0x4100, 0x5a00, 0x6400, 0x6e00}, - {VK_F8, 0x4200, 0x5b00, 0x6500, 0x6f00}, - {VK_F9, 0x4300, 0x5c00, 0x6600, 0x7000}, - {VK_F10, 0x4400, 0x5d00, 0x6700, 0x7100}, - {VK_F11, 0x8500, 0x8700, 0x8900, 0x8b00}, - {VK_F12, 0x8600, 0x8800, 0x8a00, 0x8c00}, - {0xdc, '\\', '|', 0x1c, 0x2b00}, - {0xbf, '/', '?', 0, 0x3500}, - {0xbd, '-', '_', 0x1f, 0x8200}, - {0xbb, '=', '+', 0, 0x8300}, - {0xdb, '[', '{', 0x1b, 0x1a00}, - {0xdd, ']', '}', 0x1d, 0x1b00}, - {0xba, ';', ':', 0, 0x2700}, - {0xde, '\'', '"', 0, 0x2800}, - {0xbc, ',', '<', 0, 0x3300}, - {0xbe, '.', '>', 0, 0x3400}, - {0xc0, '`', '~', 0, 0x2900}, - {0, 0, 0, 0, 0} /** END **/ -}; - -/* Mouse related stuff */ -static int domouse=1; -static DWORD last_state=0; -static int LastX=-1, LastY=-1; - -static int modeidx=3; - -#if defined(_DEBUG) -static void dputs(const char* str) -{ - char msg[1024]; - - SAFEPRINTF(msg,"%s\r\n",str); - OutputDebugString(msg); -} -#endif - -static void dprintf(const char* fmt, ...) -{ -#if defined(_DEBUG) - va_list argptr; - char sbuf[1024]; - - va_start(argptr,fmt); - vsnprintf(sbuf,sizeof(sbuf),fmt,argptr); - sbuf[sizeof(sbuf)-1]=0; - va_end(argptr); - dputs(sbuf); -#endif /* _DEBUG */ -} - -static WORD DOStoWinAttr(int newattr) -{ - WORD ret=0; - - if(newattr&0x01) - ret|=FOREGROUND_BLUE; - if(newattr&0x02) - ret|=FOREGROUND_GREEN; - if(newattr&0x04) - ret|=FOREGROUND_RED; - if(newattr&0x08) - ret|=FOREGROUND_INTENSITY; - if(newattr&0x10) - ret|=BACKGROUND_BLUE; - if(newattr&0x20) - ret|=BACKGROUND_GREEN; - if(newattr&0x40) - ret|=BACKGROUND_RED; - if(newattr&0x80) - ret|=BACKGROUND_INTENSITY; - return(ret); -} - -static unsigned char WintoDOSAttr(WORD newattr) -{ - unsigned char ret=0; - - if(newattr&FOREGROUND_BLUE) - ret|=0x01; - if(newattr&FOREGROUND_GREEN) - ret|=0x02; - if(newattr&FOREGROUND_RED) - ret|=0x04; - if(newattr&FOREGROUND_INTENSITY) - ret|=0x08; - if(newattr&BACKGROUND_BLUE) - ret|=0x10; - if(newattr&BACKGROUND_GREEN) - ret|=0x20; - if(newattr&BACKGROUND_RED) - ret|=0x40; - if(newattr&BACKGROUND_INTENSITY) - ret|=0x80; - return(ret); -} - -static int win32_getchcode(WORD code, DWORD state) -{ - int i; - - for(i=0;keyval[i].Key;i++) { - if(keyval[i].VirtualKeyCode==code) { - if(state & (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED)) - return(keyval[i].ALT); - if(state & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)) - return(keyval[i].CTRL); - if((state & (CAPSLOCK_ON)) && isalpha(keyval[i].Key)) { - if(!(state & SHIFT_PRESSED)) - return(keyval[i].Shift); - } - else { - if(state & (SHIFT_PRESSED)) - return(keyval[i].Shift); - } - return(keyval[i].Key); - } - } - return(0); -} - -static int win32_keyboardio(int isgetch) -{ - INPUT_RECORD input; - DWORD num=0; - HANDLE h; - static WORD lastch; - - if((h=GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) - return(0); - - while(1) { - if(lastch) { - if(isgetch) { - BYTE ch; - ch=lastch&0xff; - lastch>>=8; - return(ch); - } - else - return(TRUE); - } - - while(1) { - GetNumberOfConsoleInputEvents(h, &num); - if(num) - break; - if(mouse_trywait()) { - lastch=CIO_KEY_MOUSE; - break; - } - if(isgetch) - SLEEP(1); - else - return(FALSE); - } - - if(lastch) - continue; - - if(!ReadConsoleInput(h, &input, 1, &num) - || !num || (input.EventType!=KEY_EVENT && input.EventType!=MOUSE_EVENT)) - continue; - - switch(input.EventType) { - case KEY_EVENT: - -#ifdef DEBUG_KEY_EVENTS - dprintf("KEY_EVENT: KeyDown=%u" - ,input.Event.KeyEvent.bKeyDown); - dprintf(" RepeatCount=%u" - ,input.Event.KeyEvent.wRepeatCount); - dprintf(" VirtualKeyCode=0x%04hX" - ,input.Event.KeyEvent.wVirtualKeyCode); - dprintf(" VirtualScanCode=0x%04hX" - ,input.Event.KeyEvent.wVirtualScanCode); - dprintf(" uChar.AsciiChar=0x%02X (%u)" - ,(BYTE)input.Event.KeyEvent.uChar.AsciiChar - ,(BYTE)input.Event.KeyEvent.uChar.AsciiChar); - dprintf(" ControlKeyState=0x%08lX" - ,input.Event.KeyEvent.dwControlKeyState); -#endif - - if(input.Event.KeyEvent.bKeyDown) { - /* Is this an AltGr key? */ - if(((input.Event.KeyEvent.dwControlKeyState & (RIGHT_ALT_PRESSED|LEFT_CTRL_PRESSED)) == (RIGHT_ALT_PRESSED|LEFT_CTRL_PRESSED)) - && (BYTE)input.Event.KeyEvent.uChar.AsciiChar) { - lastch=(BYTE)input.Event.KeyEvent.uChar.AsciiChar; - } - /* Is this a modified char? */ - else if((input.Event.KeyEvent.dwControlKeyState & (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED|RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED|ENHANCED_KEY)) - || (input.Event.KeyEvent.wVirtualKeyCode >= VK_F1 && input.Event.KeyEvent.wVirtualKeyCode <= VK_F24) - || !input.Event.KeyEvent.uChar.AsciiChar) { - lastch=win32_getchcode(input.Event.KeyEvent.wVirtualKeyCode, input.Event.KeyEvent.dwControlKeyState); - } - /* Must be a normal char then! */ - else { - lastch=(BYTE)input.Event.KeyEvent.uChar.AsciiChar; - } - } else if(input.Event.KeyEvent.wVirtualKeyCode == VK_MENU) - lastch=(BYTE)input.Event.KeyEvent.uChar.AsciiChar; - - break; - case MOUSE_EVENT: - if(domouse) { - if(input.Event.MouseEvent.dwMousePosition.X+1 != LastX || input.Event.MouseEvent.dwMousePosition.Y+1 != LastY) { - LastX=input.Event.MouseEvent.dwMousePosition.X+1; - LastY=input.Event.MouseEvent.dwMousePosition.Y+1; - ciomouse_gotevent(CIOLIB_MOUSE_MOVE,LastX,LastY, -1, -1); - } - if (input.Event.MouseEvent.dwEventFlags == 0) { - if(last_state != input.Event.MouseEvent.dwButtonState) { - switch(input.Event.MouseEvent.dwButtonState ^ last_state) { - case FROM_LEFT_1ST_BUTTON_PRESSED: - if(input.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) - ciomouse_gotevent(CIOLIB_BUTTON_1_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - else - ciomouse_gotevent(CIOLIB_BUTTON_1_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - break; - case FROM_LEFT_2ND_BUTTON_PRESSED: - if(input.Event.MouseEvent.dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED) - ciomouse_gotevent(CIOLIB_BUTTON_2_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - else - ciomouse_gotevent(CIOLIB_BUTTON_2_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - break; - case RIGHTMOST_BUTTON_PRESSED: - if(input.Event.MouseEvent.dwButtonState & RIGHTMOST_BUTTON_PRESSED) - ciomouse_gotevent(CIOLIB_BUTTON_3_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - else - ciomouse_gotevent(CIOLIB_BUTTON_3_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - break; - } - last_state=input.Event.MouseEvent.dwButtonState; - } - } - else if (input.Event.MouseEvent.dwEventFlags == MOUSE_WHEELED) { - // If the high word of the dwButtonState member contains a positive value... ARGH! - if (input.Event.MouseEvent.dwButtonState & 0x80000000) { - ciomouse_gotevent(CIOLIB_BUTTON_5_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - } - else { - ciomouse_gotevent(CIOLIB_BUTTON_4_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - } - } - } - } - } -} - -int win32_kbhit(void) -{ - return(win32_keyboardio(FALSE)); -} - -int win32_getch(void) -{ - int ret=win32_keyboardio(TRUE); - dprintf("win32_getch = 0x%02X (%u)", (BYTE)ret, (BYTE)ret); - return(ret); -} - -#ifndef ENABLE_EXTENDED_FLAGS -#define ENABLE_INSERT_MODE 0x0020 -#define ENABLE_QUICK_EDIT_MODE 0x0040 -#define ENABLE_EXTENDED_FLAGS 0x0080 -#define ENABLE_AUTO_POSITION 0x0100 -#endif - -static DWORD orig_in_conmode=0; -static DWORD orig_out_conmode=0; -static void * win32_suspendbuf=NULL; - -#ifndef CONSOLE_FULLSCREEN_MODE -/* SetConsoleDisplayMode parameter value */ -#define CONSOLE_FULLSCREEN_MODE 1 // Text is displayed in full-screen mode. -#define CONSOLE_WINDOWED_MODE 2 // Text is displayed in a console window. -#endif - -static DWORD orig_display_mode=0; - -/*----------------------------------------------------------------------------- -NT_SetConsoleDisplayMode - Set the console display to fullscreen or windowed. - -Parameters: - hOutputHandle - Output handle of cosole, usually - "GetStdHandle(STD_OUTPUT_HANDLE)" - dwNewMode - 0=windowed, 1=fullscreen - -Returns Values: - TRUE if successful, otherwise FALSE is returned. Call GetLastError() for - extened information. - -Remarks: - This only works on NT based versions of Windows. - - If dwNewMode is anything other than 0 or 1, FALSE is returned and - GetLastError() returns ERROR_INVALID_PARAMETER. - - If dwNewMode specfies the current mode, FALSE is returned and - GetLastError() returns ERROR_INVALID_PARAMETER. Use the (documented) - function GetConsoleDisplayMode() to determine the current display mode. ------------------------------------------------------------------------------*/ -BOOL NT_SetConsoleDisplayMode(HANDLE hOutputHandle, DWORD dwNewMode) -{ - typedef BOOL (WINAPI *SCDMProc_t) (HANDLE, DWORD, LPDWORD); - SCDMProc_t SetConsoleDisplayMode; - HMODULE hKernel32; - BOOL ret; - const char KERNEL32_NAME[] = "kernel32.dll"; - - hKernel32 = LoadLibrary(KERNEL32_NAME); - if (hKernel32 == NULL) - return FALSE; - - SetConsoleDisplayMode = - (SCDMProc_t)GetProcAddress(hKernel32, "SetConsoleDisplayMode"); - if (SetConsoleDisplayMode == NULL) - { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - ret = FALSE; - } - else - { - DWORD dummy=0; - ret = SetConsoleDisplayMode(hOutputHandle, dwNewMode, &dummy); - dprintf("SetConsoleDisplayMode(%d) returned %d", dwNewMode, ret); - } - - FreeLibrary(hKernel32); - - return ret; -} - -BOOL NT_GetConsoleDisplayMode(DWORD* mode) -{ - typedef BOOL (WINAPI *GCDMProc_t) (LPDWORD); - GCDMProc_t GetConsoleDisplayMode; - HMODULE hKernel32; - BOOL ret; - const char KERNEL32_NAME[] = "kernel32.dll"; - - hKernel32 = LoadLibrary(KERNEL32_NAME); - if (hKernel32 == NULL) - return FALSE; - - GetConsoleDisplayMode = - (GCDMProc_t)GetProcAddress(hKernel32, "GetConsoleDisplayMode"); - if (GetConsoleDisplayMode == NULL) - { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - ret = FALSE; - } - else - { - ret = GetConsoleDisplayMode(mode); - dprintf("GetConsoleDisplayMode() returned %d (%d)", ret, *mode); - } - - FreeLibrary(hKernel32); - - return ret; -} - - -void RestoreDisplayMode(void) -{ - if(orig_display_mode==0) - NT_SetConsoleDisplayMode(GetStdHandle(STD_OUTPUT_HANDLE),CONSOLE_WINDOWED_MODE); -} - -void win32_suspend(void) -{ - HANDLE h; - - if((h=GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) - SetConsoleMode(h, orig_out_conmode); - if((h=GetStdHandle(STD_INPUT_HANDLE)) != INVALID_HANDLE_VALUE) - SetConsoleMode(h, orig_in_conmode); -} - -void win32_resume(void) -{ - DWORD conmode; - HANDLE h; - - conmode=ENABLE_MOUSE_INPUT|ENABLE_EXTENDED_FLAGS; - if((h=GetStdHandle(STD_INPUT_HANDLE)) != INVALID_HANDLE_VALUE) - SetConsoleMode(h, conmode); - - conmode=orig_out_conmode; - conmode&=~ENABLE_PROCESSED_OUTPUT; - conmode&=~ENABLE_WRAP_AT_EOL_OUTPUT; - if((h=GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) - SetConsoleMode(h, conmode); -} - -static BOOL WINAPI ControlHandler(unsigned long CtrlType) -{ - return TRUE; -} - -int win32_initciolib(long inmode) -{ - DWORD conmode; - HANDLE h; - CONSOLE_SCREEN_BUFFER_INFO sbuff; - - dprintf("win32_initciolib(%u)", inmode); - if(!isatty(fileno(stdin))) { - if(!AllocConsole()) - return(0); - } - - SetConsoleCtrlHandler(ControlHandler,TRUE); - if((h=GetStdHandle(STD_INPUT_HANDLE))==INVALID_HANDLE_VALUE - || !GetConsoleMode(h, &orig_in_conmode)) - return(0); - conmode=ENABLE_MOUSE_INPUT|ENABLE_EXTENDED_FLAGS; - if(!SetConsoleMode(h, conmode)) - return(0); - - if((h=GetStdHandle(STD_OUTPUT_HANDLE))==INVALID_HANDLE_VALUE - || !GetConsoleMode(h, &orig_out_conmode)) - return(0); - conmode=orig_out_conmode; - conmode&=~ENABLE_PROCESSED_OUTPUT; - conmode&=~ENABLE_WRAP_AT_EOL_OUTPUT; - if(!SetConsoleMode(h, conmode)) - return(0); - - if(GetConsoleScreenBufferInfo(h, &sbuff)==0) { - win32_textmode(C80); // TODO: This likely won't work... - } - else { - /* Switch to closest mode to current screen size */ - unsigned screenwidth = sbuff.srWindow.Right - sbuff.srWindow.Left + 1; - unsigned screenheight = sbuff.srWindow.Bottom - sbuff.srWindow.Top + 1; - if (screenwidth > 0xff) - cio_textinfo.screenwidth = 0xff; - else - cio_textinfo.screenwidth = screenwidth; - if (screenheight > 0xff) - cio_textinfo.screenheight = 0xff; - else - cio_textinfo.screenheight = screenheight; - - if(cio_textinfo.screenwidth>=132) { - if(cio_textinfo.screenheight<25) - win32_textmode(VESA_132X21); - else if(cio_textinfo.screenheight<28) - win32_textmode(VESA_132X25); - else if(cio_textinfo.screenheight<30) - win32_textmode(VESA_132X28); - else if(cio_textinfo.screenheight<34) - win32_textmode(VESA_132X30); - else if(cio_textinfo.screenheight<43) - win32_textmode(VESA_132X34); - else if(cio_textinfo.screenheight<50) - win32_textmode(VESA_132X43); - else if(cio_textinfo.screenheight<60) - win32_textmode(VESA_132X50); - else - win32_textmode(VESA_132X60); - } - else if(cio_textinfo.screenwidth>=80) { - if(cio_textinfo.screenheight<21) - win32_textmode(C80X14); - else if(cio_textinfo.screenheight<25) - win32_textmode(C80X21); - else if(cio_textinfo.screenheight<28) - win32_textmode(C80); - else if(cio_textinfo.screenheight<43) - win32_textmode(C80X28); - else if(cio_textinfo.screenheight<50) - win32_textmode(C80X43); - else if(cio_textinfo.screenheight<60) - win32_textmode(C80X50); - else - win32_textmode(C80X60); - } - else { - if(cio_textinfo.screenheight<21) - win32_textmode(C40X14); - else if(cio_textinfo.screenheight<25) - win32_textmode(C40X21); - else if(cio_textinfo.screenheight<28) - win32_textmode(C40); - else if(cio_textinfo.screenheight<43) - win32_textmode(C40X28); - else if(cio_textinfo.screenheight<50) - win32_textmode(C40X43); - else if(cio_textinfo.screenheight<60) - win32_textmode(C40X50); - else - win32_textmode(C40X60); - } - } - - NT_GetConsoleDisplayMode(&orig_display_mode); - if(inmode==CIOLIB_MODE_CONIO_FULLSCREEN) { - NT_SetConsoleDisplayMode(h,CONSOLE_FULLSCREEN_MODE); - atexit(RestoreDisplayMode); - } - cio_api.mouse=1; - cio_api.options = CONIO_OPT_BRIGHT_BACKGROUND | CONIO_OPT_CUSTOM_CURSOR | CONIO_OPT_SET_TITLE; - return(1); -} - -int win32_hidemouse(void) -{ - /* domouse=0; */ - return(0); -} - -int win32_showmouse(void) -{ - /* domouse=1; */ - return(0); -} - -void win32_textmode(int mode) -{ - int i; - HANDLE h; - COORD sz; - SMALL_RECT rc; -#if 0 - CONSOLE_SCREEN_BUFFER_INFOEX bi; -#endif - - for(i=0;i<NUMMODES;i++) { - if(vparams[i].mode==mode) - modeidx=i; - } - sz.X = cio_textinfo.screenwidth > vparams[modeidx].cols ? cio_textinfo.screenwidth : vparams[modeidx].cols; - sz.Y = cio_textinfo.screenheight > vparams[modeidx].rows ? cio_textinfo.screenheight : vparams[modeidx].rows; - rc.Left=0; - rc.Right=vparams[modeidx].cols-1; - rc.Top=0; - rc.Bottom=vparams[modeidx].rows-1; - - if ((h=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) - return; - if (!SetConsoleScreenBufferSize(h,sz)) - return; // Note: This fails and returns here with large windows (e.g. width > 255) - if (!SetConsoleWindowInfo(h,TRUE,&rc)) - return; - sz.X=vparams[modeidx].cols; - sz.Y=vparams[modeidx].rows; - if (!SetConsoleScreenBufferSize(h,sz)) - return; - - cio_textinfo.attribute=7; - cio_textinfo.normattr=7; - cio_textinfo.currmode=vparams[modeidx].mode; - cio_textinfo.screenheight=(unsigned char)sz.Y; - cio_textinfo.screenwidth=(unsigned char)sz.X; - cio_textinfo.curx=1; - cio_textinfo.cury=1; - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; -#if 0 - if (GetConsoleScreenBufferInfoEx(GetStdHandle(STD_OUTPUT_HANDLE), &bi)) { - for (i = 0; i < 16; i++) { - bi.ColorTable[] = RGB(dac_default[palettes[vparams[modeidx]][i]].red, dac_default[palettes[vparams[modeidx].palette][i]].green, dac_default[palettes[vparams[modeidx]][i]].blue); - } - if (SetConsoleScreenBufferInfoEx(GetStdHandle(STD_OUTPUT_HANDLE), &bi)) { - cio_api.options |= CONIO_OPT_PALETTE_SETTING; - } - } -#endif -} - -int win32_gettext(int left, int top, int right, int bottom, void* buf) -{ - CHAR_INFO *ci; - int x; - int y; - COORD bs; - COORD bc; - HANDLE h; - SMALL_RECT reg; - unsigned char *bu; - - bu=buf; - bs.X=right-left+1; - bs.Y=bottom-top+1; - bc.X=0; - bc.Y=0; - reg.Left=left-1; - reg.Right=right-1; - reg.Top=top-1; - reg.Bottom=bottom-1; - ci=(CHAR_INFO *)alloca(sizeof(CHAR_INFO)*(bs.X*bs.Y)); - if((h=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) - return 0; // failure - ReadConsoleOutput(h,ci,bs,bc,®); - for(y=0;y<=(bottom-top);y++) { - for(x=0;x<=(right-left);x++) { - bu[((y*bs.X)+x)*2]=ci[(y*bs.X)+x].Char.AsciiChar; - bu[(((y*bs.X)+x)*2)+1]=WintoDOSAttr(ci[(y*bs.X)+x].Attributes); - } - } - return 1; -} - -void win32_gotoxy(int x, int y) -{ - COORD cp; - HANDLE h; - static int curx=-1; - static int cury=-1; - - cio_textinfo.curx=x; - cio_textinfo.cury=y; - cp.X=cio_textinfo.winleft+x-2; - cp.Y=cio_textinfo.wintop+y-2; - if(cp.X != curx || cp.Y != cury) { - if(!hold_update && (h=GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) { - SetConsoleCursorPosition(h,cp); - curx=cp.X; - cury=cp.Y; - } - } -} - -int win32_puttext(int left, int top, int right, int bottom, void* buf) -{ - CHAR_INFO *ci; - int x; - int y; - HANDLE h; - COORD bs; - COORD bc; - SMALL_RECT reg; - unsigned char *bu; - - bu=buf; - bs.X=right-left+1; - bs.Y=bottom-top+1; - bc.X=0; - bc.Y=0; - reg.Left=left-1; - reg.Right=right-1; - reg.Top=top-1; - reg.Bottom=bottom-1; - ci=(CHAR_INFO *)alloca(sizeof(CHAR_INFO)*(bs.X*bs.Y)); - for(y=0;y<bs.Y;y++) { - for(x=0;x<bs.X;x++) { - ci[(y*bs.X)+x].Char.AsciiChar=bu[((y*bs.X)+x)*2]; - ci[(y*bs.X)+x].Attributes=DOStoWinAttr(bu[(((y*bs.X)+x)*2)+1]); - } - } - if((h=GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) - WriteConsoleOutput(h,ci,bs,bc,®); - return 1; -} - -void win32_setcursortype(int type) -{ - HANDLE h; - CONSOLE_CURSOR_INFO ci; - - switch(type) { - case _NOCURSOR: - ci.bVisible=FALSE; - ci.dwSize=1; - break; - - case _SOLIDCURSOR: - ci.bVisible=TRUE; - ci.dwSize=99; - break; - - default: /* Normal cursor */ - ci.bVisible=TRUE; - ci.dwSize=13; - break; - } - if((h=GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) - SetConsoleCursorInfo(h,&ci); -} - -void win32_settitle(const char *title) -{ - SetConsoleTitle(title); -} - -void win32_copytext(const char *text, size_t buflen) -{ - HGLOBAL clipbuf; - LPWSTR clip; - int new_buflen = MultiByteToWideChar(CP_UTF8, 0, text, buflen, NULL, 0); - - new_buflen = MultiByteToWideChar(CP_UTF8, 0, text, buflen, NULL, 0); - if (new_buflen == 0) { - return; - } - clipbuf=GlobalAlloc(GMEM_MOVEABLE, new_buflen * sizeof(WCHAR)); - if (clipbuf == NULL) { - return; - } - clip=GlobalLock(clipbuf); - if (MultiByteToWideChar(CP_UTF8, 0, text, buflen, clip, new_buflen) != new_buflen) { - GlobalUnlock(clipbuf); - GlobalFree(clipbuf); - return; - } - GlobalUnlock(clipbuf); - if(!OpenClipboard(NULL)) { - GlobalFree(clipbuf); - return; - } - EmptyClipboard(); - if (SetClipboardData(CF_UNICODETEXT, clipbuf) == NULL) { - GlobalFree(clipbuf); - } - CloseClipboard(); -} - -char *win32_getcliptext(void) -{ - HGLOBAL clipbuf; - LPWSTR clip; - char *ret = NULL; - int u8sz; - - if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) - return(NULL); - if (!OpenClipboard(NULL)) - return(NULL); - clipbuf = GetClipboardData(CF_UNICODETEXT); - if (clipbuf != NULL) { - clip = GlobalLock(clipbuf); - if (clip != NULL) { - u8sz = WideCharToMultiByte(CP_UTF8, 0, clip, -1, NULL, 0, NULL, NULL); - if (u8sz > 0) { - ret = (char *)malloc(u8sz); - if(ret != NULL) { - if (WideCharToMultiByte(CP_UTF8, 0, clip, -1, ret, u8sz, NULL, NULL) == 0) - FREE_AND_NULL(ret); - } - } - GlobalUnlock(clipbuf); - } - } - CloseClipboard(); - - return(ret); -} - -void win32_getcustomcursor(int *s, int *e, int *r, int *b, int *v) -{ - CONSOLE_CURSOR_INFO ci; - HANDLE h; - - if((h=GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) - return; - - GetConsoleCursorInfo(h, &ci); - if(s) - *s=100-ci.dwSize; - if(e) - *e=99; - if(r) - *r=100; - if(b) - *b=1; - if(v) - *v=ci.bVisible?1:0; -} - -void win32_setcustomcursor(int s, int e, int r, int b, int v) -{ - CONSOLE_CURSOR_INFO ci; - HANDLE h; - - if((h=GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) - return; - - ci.bVisible=v; - if(e>s) - ci.bVisible=0; - else { - if(r>0) - ci.dwSize=(1+e-s)/r; - else - ci.dwSize=100; - } -} - -int win32_getvideoflags(void) -{ - DWORD mode; - - if(!NT_GetConsoleDisplayMode(&mode)) - return(CIOLIB_VIDEO_BGBRIGHT); - if(mode==CONSOLE_FULLSCREEN_MODE) - return(0); - return(CIOLIB_VIDEO_BGBRIGHT); -} - -int win32_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b) -{ -#if 0 - CONSOLE_SCREEN_BUFFER_INFOEX bi; - - if (entry > 15) - return 0; - - if (!GetConsoleScreenBufferInfoEx(GetStdHandle(STD_OUTPUT_HANDLE), &bi)) - return 0; - - bi.ColorTable[entry] = RGB(r >> 8, g >> 8, b >> 8); - if (!SetConsoleScreenBufferInfoEx(GetStdHandle(STD_OUTPUT_HANDLE), &bi)) - return 0; -#endif - - return 1; -} diff --git a/ciolib/win32cio.h b/ciolib/win32cio.h deleted file mode 100644 index 79ad4be..0000000 --- a/ciolib/win32cio.h +++ /dev/null @@ -1,68 +0,0 @@ -/* $Id: win32cio.h,v 1.15 2018/07/24 01:10:58 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _WIN32CIO_H_ -#define _WIN32CIO_H_ - -#ifdef __cplusplus -extern "C" { -#endif -int win32_kbhit(void); -int win32_getch(void); -int win32_getmouse(struct cio_mouse_event *mevent); -int win32_hidemouse(void); -int win32_showmouse(void); - -int win32_gettext(int left, int top, int right, int bottom, void*); -void win32_gotoxy(int x, int y); -int win32_puttext(int left, int top, int right, int bottom, void*); -void win32_textmode(int newmode); -void win32_setcursortype(int); -int win32_getch(void); -int win32_kbhit(void); -void win32_settitle(const char *title); -int win32_initciolib(long inmode); -void win32_copytext(const char *text, size_t buflen); -char *win32_getcliptext(void); -void win32_suspend(void); -void win32_resume(void); -void win32_getcustomcursor(int *s, int *e, int *r, int *b, int *v); -void win32_setcustomcursor(int s, int e, int r, int b, int v); -int win32_getvideoflags(void); -int win32_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/x_cio.c b/ciolib/x_cio.c deleted file mode 100644 index 1146a65..0000000 --- a/ciolib/x_cio.c +++ /dev/null @@ -1,558 +0,0 @@ -/* $Id: x_cio.c,v 1.56 2020/05/07 20:26:51 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <locale.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/socket.h> - -#include <threadwrap.h> -#include <xp_dl.h> - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#include "x_cio.h" -#include "x_events.h" - -#define BITMAP_CIOLIB_DRIVER -#include "bitmap_con.h" - -int x_kbhit(void) -{ - fd_set rfd; - struct timeval tv; - - memset(&tv, 0, sizeof(tv)); - FD_ZERO(&rfd); - FD_SET(key_pipe[0], &rfd); - return(select(key_pipe[0]+1, &rfd, NULL, NULL, &tv)==1); -} - -int x_getch(void) -{ - unsigned char ch; - - while(read(key_pipe[0], &ch, 1)!=1); - return(ch); -} - -static void write_event(struct x11_local_event *ev) -{ - size_t sent = 0; - char *buf = (char *)ev; - fd_set wfd; - int rv; - - FD_ZERO(&wfd); - FD_SET(local_pipe[1], &wfd); - - while (sent < sizeof(*ev)) { - select(local_pipe[1]+1, NULL, &wfd, NULL, NULL); - rv = write(local_pipe[1], buf + sent, sizeof(*ev) - sent); - if (rv > 0) - sent += rv; - } -} - -void x_beep(void) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_BEEP; - write_event(&ev); -} - -void x_textmode(int mode) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_SETMODE; - ev.data.mode = mode; - write_event(&ev); - sem_wait(&mode_set); -} - -void x_setname(const char *name) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_SETNAME; - SAFECOPY(ev.data.name, name); - write_event(&ev); -} - -void x_settitle(const char *title) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_SETTITLE; - SAFECOPY(ev.data.title, title); - write_event(&ev); -} - -void x_seticon(const void *icon, unsigned long size) -{ - const uint32_t *icon32 = icon; - struct x11_local_event ev = {0}; - int i; - - ev.data.icon_data = malloc((size*size + 2)*sizeof(ev.data.icon_data[0])); - if (ev.data.icon_data != NULL) { - ev.type=X11_LOCAL_SETICON; - for (i = 0; i < size*size; i++) - ev.data.icon_data[i + 2] = ((icon32[i] & 0xff000000))|((icon32[i] & 0x00ff0000) >> 16)|((icon32[i] & 0x0000ff00))|((icon32[i] & 0x000000ff)<<16); - ev.data.icon_data[0] = size; - ev.data.icon_data[1] = size; - write_event(&ev); - } -} - -void x_copytext(const char *text, size_t buflen) -{ - struct x11_local_event ev = {0}; - - pthread_mutex_lock(©buf_mutex); - FREE_AND_NULL(copybuf); - - copybuf=strdup(text); - if(copybuf) { - ev.type=X11_LOCAL_COPY; - write_event(&ev); - copybuf_format = XA_STRING; - } - pthread_mutex_unlock(©buf_mutex); - return; -} - -char *x_getcliptext(void) -{ - char *ret=NULL; - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_PASTE; - write_event(&ev); - sem_wait(&pastebuf_set); - if(pastebuf!=NULL) - ret=strdup(pastebuf); - sem_post(&pastebuf_used); - return(ret); -} - -int x_get_window_info(int *width, int *height, int *xpos, int *ypos) -{ - if(width) - *width=x11_window_width; - if(height) - *height=x11_window_height; - if(xpos) - *xpos=x11_window_xpos; - if(ypos) - *ypos=x11_window_ypos; - - return(1); -} - -/* Mouse event/keyboard thread */ -void x11_mouse_thread(void *data) -{ - //uint16_t key=((CIO_KEY_MOUSE&0xFF)<<8)|((CIO_KEY_MOUSE>>8)&0xFF); - uint16_t key=CIO_KEY_MOUSE; - - SetThreadName("X11 Mouse"); - while(1) { - if(mouse_wait()) - write(key_pipe[1], &key, 2); - } -} - -int x_init(void) -{ - dll_handle dl; - const char *libnames[]={"X11",NULL}; - Status (*xit)(void); - - /* Ensure we haven't already initialized */ - if(x11_initialized) - return(0); - - /* Set up the pipe for local events */ - if(pipe(local_pipe)) - return(-1); - - /* And the keyboard pipe */ - if(pipe(key_pipe)) - return(-1); - - /* Load X11 functions */ - if((dl=xp_dlopen(libnames,RTLD_LAZY,7))==NULL) - return(-1); - if((xit=xp_dlsym(dl,XInitThreads))!=NULL) - xit(); - if((x11.XChangeGC=xp_dlsym(dl,XChangeGC))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCopyPlane=xp_dlsym(dl,XCopyPlane))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFillRectangle=xp_dlsym(dl,XFillRectangle))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XDrawPoint=xp_dlsym(dl,XDrawPoint))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFlush=xp_dlsym(dl,XFlush))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSync=xp_dlsym(dl,XSync))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XBell=xp_dlsym(dl,XBell))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XLookupString=xp_dlsym(dl,XLookupString))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XNextEvent=xp_dlsym(dl,XNextEvent))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XAllocSizeHints=xp_dlsym(dl,XAllocSizeHints))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetWMNormalHints=xp_dlsym(dl,XSetWMNormalHints))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XResizeWindow=xp_dlsym(dl,XResizeWindow))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XMapWindow=xp_dlsym(dl,XMapWindow))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFree=xp_dlsym(dl,XFree))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFreePixmap=xp_dlsym(dl,XFreePixmap))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreatePixmap=xp_dlsym(dl,XCreatePixmap))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCopyArea=xp_dlsym(dl,XCopyArea))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateBitmapFromData=xp_dlsym(dl,XCreateBitmapFromData))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XAllocColor=xp_dlsym(dl,XAllocColor))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XOpenDisplay=xp_dlsym(dl,XOpenDisplay))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCloseDisplay=xp_dlsym(dl,XCloseDisplay))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateSimpleWindow=xp_dlsym(dl,XCreateSimpleWindow))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateGC=xp_dlsym(dl,XCreateGC))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSelectInput=xp_dlsym(dl,XSelectInput))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XStoreName=xp_dlsym(dl,XStoreName))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XGetSelectionOwner=xp_dlsym(dl,XGetSelectionOwner))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XConvertSelection=xp_dlsym(dl,XConvertSelection))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XGetWindowProperty=xp_dlsym(dl,XGetWindowProperty))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XChangeProperty=xp_dlsym(dl,XChangeProperty))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSendEvent=xp_dlsym(dl,XSendEvent))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XPutImage=xp_dlsym(dl,XPutImage))==NULL) { - xp_dlclose(dl); - return(-1); - } -#ifndef XDestroyImage - if((x11.XDestroyImage=xp_dlsym(dl,XDestroyImage))==NULL) { - xp_dlclose(dl); - return(-1); - } -#endif -#ifndef XPutPixel - if((x11.XPutPixel=xp_dlsym(dl,XPutPixel))==NULL) { - xp_dlclose(dl); - return(-1); - } -#endif - if((x11.XCreateImage=xp_dlsym(dl,XCreateImage))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetSelectionOwner=xp_dlsym(dl,XSetSelectionOwner))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetIconName=xp_dlsym(dl,XSetIconName))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSynchronize=xp_dlsym(dl,XSynchronize))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XGetWindowAttributes=xp_dlsym(dl,XGetWindowAttributes))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XAllocWMHints=xp_dlsym(dl,XAllocWMHints))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetWMProperties=xp_dlsym(dl,XSetWMProperties))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetWMProtocols=xp_dlsym(dl,XSetWMProtocols))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XInternAtom=xp_dlsym(dl,XInternAtom))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFreeColors=xp_dlsym(dl,XFreeColors))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XGetVisualInfo=xp_dlsym(dl,XGetVisualInfo))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateWindow=xp_dlsym(dl,XCreateWindow))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateColormap=xp_dlsym(dl,XCreateColormap))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XAllocClassHint=xp_dlsym(dl,XAllocClassHint))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetForeground=xp_dlsym(dl,XSetForeground))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetLocaleModifiers=xp_dlsym(dl,XSetLocaleModifiers))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XOpenIM=xp_dlsym(dl,XOpenIM))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateIC=xp_dlsym(dl,XCreateIC))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XwcLookupString=xp_dlsym(dl,XwcLookupString))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetICFocus=xp_dlsym(dl,XSetICFocus))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFilterEvent=xp_dlsym(dl,XFilterEvent))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateFontCursor=xp_dlsym(dl,XCreateFontCursor))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XDefineCursor=xp_dlsym(dl,XDefineCursor))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFreeCursor=xp_dlsym(dl,XFreeCursor))==NULL) { - xp_dlclose(dl); - return(-1); - } - setlocale(LC_ALL, ""); - x11.XSetLocaleModifiers("@im=none"); - - if(sem_init(&pastebuf_set, 0, 0)) { - xp_dlclose(dl); - return(-1); - } - if(sem_init(&pastebuf_used, 0, 0)) { - xp_dlclose(dl); - sem_destroy(&pastebuf_set); - return(-1); - } - if(sem_init(&init_complete, 0, 0)) { - xp_dlclose(dl); - sem_destroy(&pastebuf_set); - sem_destroy(&pastebuf_used); - return(-1); - } - if(sem_init(&mode_set, 0, 0)) { - xp_dlclose(dl); - sem_destroy(&pastebuf_set); - sem_destroy(&pastebuf_used); - sem_destroy(&init_complete); - return(-1); - } - - if(pthread_mutex_init(©buf_mutex, 0)) { - xp_dlclose(dl); - sem_destroy(&pastebuf_set); - sem_destroy(&pastebuf_used); - sem_destroy(&init_complete); - sem_destroy(&mode_set); - return(-1); - } - - _beginthread(x11_event_thread,1<<16,NULL); - sem_wait(&init_complete); - if(!x11_initialized) { - xp_dlclose(dl); - sem_destroy(&pastebuf_set); - sem_destroy(&pastebuf_used); - sem_destroy(&init_complete); - sem_destroy(&mode_set); - pthread_mutex_destroy(©buf_mutex); - return(-1); - } - _beginthread(x11_mouse_thread,1<<16,NULL); - cio_api.options |= CONIO_OPT_SET_TITLE | CONIO_OPT_SET_NAME | CONIO_OPT_SET_ICON; - return(0); -} - -void x11_drawrect(struct rectlist *data) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_DRAWRECT; - if(x11_initialized) { - ev.data.rect=data; - write_event(&ev); - } -} - -void x11_flush(void) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_FLUSH; - if(x11_initialized) - write_event(&ev); -} - -void x_setscaling(int newval) -{ - if (newval < 1) - newval = 1; - pthread_mutex_lock(&vstatlock); - x_cvstat.scaling = vstat.scaling = newval; - pthread_mutex_unlock(&vstatlock); -} - -int x_getscaling(void) -{ - return x_cvstat.scaling; -} - -int x_mousepointer(enum ciolib_mouse_ptr type) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_MOUSEPOINTER; - if(x11_initialized) { - ev.data.ptr=type; - write_event(&ev); - return 1; - } - return 0; -} diff --git a/ciolib/x_cio.h b/ciolib/x_cio.h deleted file mode 100644 index 158d052..0000000 --- a/ciolib/x_cio.h +++ /dev/null @@ -1,84 +0,0 @@ -/* $Id: x_cio.h,v 1.27 2020/05/07 20:26:51 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifdef __unix__ -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#include "bitmap_con.h" -#include "x_events.h" - -#ifdef __cplusplus -extern "C" { -#endif -int x_puttext(int sx, int sy, int ex, int ey, void *fill); -int x_gettext(int sx, int sy, int ex, int ey, void *fill); -void x_textattr(int attr); -int x_kbhit(void); -void x_delay(long msec); -int x_wherey(void); -int x_wherex(void); -int x_putch(int ch); -void x_gotoxy(int x, int y); -int x_init(void); -void x_initciolib(long inmode); -void x_gettextinfo(struct text_info *info); -void x_setcursortype(int type); -int x_getch(void); -int x_getche(void); -void x_beep(void); -void x_textmode(int mode); -void x_setname(const char *name); -void x_settitle(const char *title); -void x_copytext(const char *text, size_t buflen); -char *x_getcliptext(void); -int x_setfont(int font, int force); -int x_getfont(void); -int x_loadfont(char *filename); -int x_get_window_info(int *width, int *height, int *xpos, int *ypos); -void x11_drawrect(struct rectlist *data); -void x11_flush(void); -void x_setscaling(int newval); -int x_getscaling(void); -void x_seticon(const void *icon, unsigned long size); -int x_mousepointer(enum ciolib_mouse_ptr type); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/x_events.c b/ciolib/x_events.c deleted file mode 100644 index bd8d1c8..0000000 --- a/ciolib/x_events.c +++ /dev/null @@ -1,1364 +0,0 @@ -/* - * This file contains ONLY the functions that are called from the - * event thread. - */ - -#include <math.h> -#include <unistd.h> -#include <stdbool.h> - -#include <fcntl.h> -#include <limits.h> -#include <locale.h> -#include <stdio.h> - -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/keysym.h> -#include <X11/Xatom.h> -#include <X11/cursorfont.h> - -#include <threadwrap.h> -#include <genwrap.h> -#include <dirwrap.h> - -#include "vidmodes.h" - -#include "ciolib.h" -#define BITMAP_CIOLIB_DRIVER -#include "bitmap_con.h" -#include "link_list.h" -#include "scale.h" -#include "x_events.h" -#include "x_cio.h" -#include "utf8_codepages.h" - -/* - * Exported variables - */ - -int local_pipe[2]; /* Used for passing local events */ -int key_pipe[2]; /* Used for passing keyboard events */ - -struct x11 x11; - -char *copybuf; -pthread_mutex_t copybuf_mutex; -char *pastebuf; -sem_t pastebuf_set; -sem_t pastebuf_used; -sem_t init_complete; -sem_t mode_set; -int x11_window_xpos; -int x11_window_ypos; -int x11_window_width; -int x11_window_height; -int x11_initialized=0; -sem_t event_thread_complete; -int terminate = 0; -Atom copybuf_format; -Atom pastebuf_format; - -/* - * Local variables - */ - -/* Sets the atom to be used for copy/paste operations */ -#define CONSOLE_CLIPBOARD XA_PRIMARY -static Atom WM_DELETE_WINDOW=0; - -static Display *dpy=NULL; -static Window win; -static Cursor curs = None; -static Visual visual; -static bool VisualIsRGB8 = false; -static XImage *xim; -static XIM im; -static XIC ic; -static unsigned int depth=0; -static int xfd; -static unsigned long black; -static unsigned long white; -static int bitmap_width=0; -static int bitmap_height=0; -static int old_scaling = 0; -struct video_stats x_cvstat; -static unsigned long base_pixel; -static int r_shift; -static int g_shift; -static int b_shift; -static struct graphics_buffer *last = NULL; - -/* Array of Graphics Contexts */ -static GC gc; - -static WORD Ascii2Scan[] = { - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x000e, 0x000f, 0xffff, 0xffff, 0xffff, 0x001c, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x0001, 0xffff, 0xffff, 0xffff, 0xffff, - 0x0039, 0x0102, 0x0128, 0x0104, 0x0105, 0x0106, 0x0108, 0x0028, - 0x010a, 0x010b, 0x0109, 0x010d, 0x0033, 0x000c, 0x0034, 0x0035, - 0x000b, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, - 0x0009, 0x000a, 0x0127, 0x0027, 0x0133, 0x000d, 0x0134, 0x0135, - 0x0103, 0x011e, 0x0130, 0x012e, 0x0120, 0x0112, 0x0121, 0x0122, - 0x0123, 0x0117, 0x0124, 0x0125, 0x0126, 0x0132, 0x0131, 0x0118, - 0x0119, 0x0110, 0x0113, 0x011f, 0x0114, 0x0116, 0x012f, 0x0111, - 0x012d, 0x0115, 0x012c, 0x001a, 0x002b, 0x001b, 0x0107, 0x010c, - 0x0029, 0x001e, 0x0030, 0x002e, 0x0020, 0x0012, 0x0021, 0x0022, - 0x0023, 0x0017, 0x0024, 0x0025, 0x0026, 0x0032, 0x0031, 0x0018, - 0x0019, 0x0010, 0x0013, 0x001f, 0x0014, 0x0016, 0x002f, 0x0011, - 0x002d, 0x0015, 0x002c, 0x011a, 0x012b, 0x011b, 0x0129, 0xffff, -}; - -static struct { - WORD base; - WORD shift; - WORD ctrl; - WORD alt; -} ScanCodes[] = { - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 0 */ - { 0x011b, 0x011b, 0x011b, 0xffff }, /* key 1 - Escape key */ - { 0x0231, 0x0221, 0xffff, 0x7800 }, /* key 2 - '1' */ - { 0x0332, 0x0340, 0x0300, 0x7900 }, /* key 3 - '2' - special handling */ - { 0x0433, 0x0423, 0xffff, 0x7a00 }, /* key 4 - '3' */ - { 0x0534, 0x0524, 0xffff, 0x7b00 }, /* key 5 - '4' */ - { 0x0635, 0x0625, 0xffff, 0x7c00 }, /* key 6 - '5' */ - { 0x0736, 0x075e, 0x071e, 0x7d00 }, /* key 7 - '6' */ - { 0x0837, 0x0826, 0xffff, 0x7e00 }, /* key 8 - '7' */ - { 0x0938, 0x092a, 0xffff, 0x7f00 }, /* key 9 - '8' */ - { 0x0a39, 0x0a28, 0xffff, 0x8000 }, /* key 10 - '9' */ - { 0x0b30, 0x0b29, 0xffff, 0x8100 }, /* key 11 - '0' */ - { 0x0c2d, 0x0c5f, 0x0c1f, 0x8200 }, /* key 12 - '-' */ - { 0x0d3d, 0x0d2b, 0xffff, 0x8300 }, /* key 13 - '=' */ - { 0x0e08, 0x0e08, 0x0e7f, 0xffff }, /* key 14 - backspace */ - { 0x0f09, 0x0f00, 0xffff, 0xffff }, /* key 15 - tab */ - { 0x1071, 0x1051, 0x1011, 0x1000 }, /* key 16 - 'Q' */ - { 0x1177, 0x1157, 0x1117, 0x1100 }, /* key 17 - 'W' */ - { 0x1265, 0x1245, 0x1205, 0x1200 }, /* key 18 - 'E' */ - { 0x1372, 0x1352, 0x1312, 0x1300 }, /* key 19 - 'R' */ - { 0x1474, 0x1454, 0x1414, 0x1400 }, /* key 20 - 'T' */ - { 0x1579, 0x1559, 0x1519, 0x1500 }, /* key 21 - 'Y' */ - { 0x1675, 0x1655, 0x1615, 0x1600 }, /* key 22 - 'U' */ - { 0x1769, 0x1749, 0x1709, 0x1700 }, /* key 23 - 'I' */ - { 0x186f, 0x184f, 0x180f, 0x1800 }, /* key 24 - 'O' */ - { 0x1970, 0x1950, 0x1910, 0x1900 }, /* key 25 - 'P' */ - { 0x1a5b, 0x1a7b, 0x1a1b, 0xffff }, /* key 26 - '[' */ - { 0x1b5d, 0x1b7d, 0x1b1d, 0xffff }, /* key 27 - ']' */ - { 0x1c0d, 0x1c0d, 0x1c0a, 0xffff }, /* key 28 - CR */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 29 - control */ - { 0x1e61, 0x1e41, 0x1e01, 0x1e00 }, /* key 30 - 'A' */ - { 0x1f73, 0x1f53, 0x1f13, 0x1f00 }, /* key 31 - 'S' */ - { 0x2064, 0x2044, 0x2004, 0x2000 }, /* key 32 - 'D' */ - { 0x2166, 0x2146, 0x2106, 0x2100 }, /* key 33 - 'F' */ - { 0x2267, 0x2247, 0x2207, 0x2200 }, /* key 34 - 'G' */ - { 0x2368, 0x2348, 0x2308, 0x2300 }, /* key 35 - 'H' */ - { 0x246a, 0x244a, 0x240a, 0x2400 }, /* key 36 - 'J' */ - { 0x256b, 0x254b, 0x250b, 0x2500 }, /* key 37 - 'K' */ - { 0x266c, 0x264c, 0x260c, 0x2600 }, /* key 38 - 'L' */ - { 0x273b, 0x273a, 0xffff, 0xffff }, /* key 39 - ';' */ - { 0x2827, 0x2822, 0xffff, 0xffff }, /* key 40 - ''' */ - { 0x2960, 0x297e, 0xffff, 0xffff }, /* key 41 - '`' */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 42 - left shift */ - { 0x2b5c, 0x2b7c, 0x2b1c, 0xffff }, /* key 43 - '' */ - { 0x2c7a, 0x2c5a, 0x2c1a, 0x2c00 }, /* key 44 - 'Z' */ - { 0x2d78, 0x2d58, 0x2d18, 0x2d00 }, /* key 45 - 'X' */ - { 0x2e63, 0x2e43, 0x2e03, 0x2e00 }, /* key 46 - 'C' */ - { 0x2f76, 0x2f56, 0x2f16, 0x2f00 }, /* key 47 - 'V' */ - { 0x3062, 0x3042, 0x3002, 0x3000 }, /* key 48 - 'B' */ - { 0x316e, 0x314e, 0x310e, 0x3100 }, /* key 49 - 'N' */ - { 0x326d, 0x324d, 0x320d, 0x3200 }, /* key 50 - 'M' */ - { 0x332c, 0x333c, 0xffff, 0xffff }, /* key 51 - ',' */ - { 0x342e, 0x343e, 0xffff, 0xffff }, /* key 52 - '.' */ - { 0x352f, 0x353f, 0xffff, 0xffff }, /* key 53 - '/' */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 54 - right shift - */ - { 0x372a, 0xffff, 0x3772, 0xffff }, /* key 55 - prt-scr - */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 56 - Alt - */ - { 0x3920, 0x3920, 0x3920, 0x3920 }, /* key 57 - space bar */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 58 - caps-lock - */ - { 0x3b00, 0x5400, 0x5e00, 0x6800 }, /* key 59 - F1 */ - { 0x3c00, 0x5500, 0x5f00, 0x6900 }, /* key 60 - F2 */ - { 0x3d00, 0x5600, 0x6000, 0x6a00 }, /* key 61 - F3 */ - { 0x3e00, 0x5700, 0x6100, 0x6b00 }, /* key 62 - F4 */ - { 0x3f00, 0x5800, 0x6200, 0x6c00 }, /* key 63 - F5 */ - { 0x4000, 0x5900, 0x6300, 0x6d00 }, /* key 64 - F6 */ - { 0x4100, 0x5a00, 0x6400, 0x6e00 }, /* key 65 - F7 */ - { 0x4200, 0x5b00, 0x6500, 0x6f00 }, /* key 66 - F8 */ - { 0x4300, 0x5c00, 0x6600, 0x7000 }, /* key 67 - F9 */ - { 0x4400, 0x5d00, 0x6700, 0x7100 }, /* key 68 - F10 */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 69 - num-lock - */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 70 - scroll-lock - */ - { 0x4700, 0x4737, 0x7700, 0xffff }, /* key 71 - home */ - { 0x4800, 0x4838, 0x8d00, 0x9800 }, /* key 72 - cursor up */ - { 0x4900, 0x4939, 0x8400, 0xffff }, /* key 73 - page up */ - { 0x4a2d, 0x4a2d, 0xffff, 0xffff }, /* key 74 - minus sign */ - { 0x4b00, 0x4b34, 0x7300, 0xffff }, /* key 75 - cursor left */ - { 0xffff, 0x4c35, 0xffff, 0xffff }, /* key 76 - center key */ - { 0x4d00, 0x4d36, 0x7400, 0xffff }, /* key 77 - cursor right */ - { 0x4e2b, 0x4e2b, 0xffff, 0xffff }, /* key 78 - plus sign */ - { 0x4f00, 0x4f31, 0x7500, 0xffff }, /* key 79 - end */ - { 0x5000, 0x5032, 0x9100, 0xa000 }, /* key 80 - cursor down */ - { 0x5100, 0x5133, 0x7600, 0xffff }, /* key 81 - page down */ - { CIO_KEY_IC, CIO_KEY_SHIFT_IC, CIO_KEY_CTRL_IC, CIO_KEY_ALT_IC}, /* key 82 - insert */ - { CIO_KEY_DC, CIO_KEY_SHIFT_DC, CIO_KEY_CTRL_DC, CIO_KEY_ALT_IC}, /* key 83 - delete */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 84 - sys key */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 85 */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 86 */ - { 0x8500, 0x5787, 0x8900, 0x8b00 }, /* key 87 - F11 */ - { 0x8600, 0x5888, 0x8a00, 0x8c00 }, /* key 88 - F12 */ -}; - -static void resize_xim(void) -{ - int width = bitmap_width * x_cvstat.scaling; - int height = bitmap_height * x_cvstat.scaling; - - aspect_correct(&width, &height, x_cvstat.aspect_width, x_cvstat.aspect_height); - if (xim) { - if (width == xim->width - && height == xim->height) { - if (last) { - release_buffer(last); - last = NULL; - } - x11.XFillRectangle(dpy, win, gc, 0, 0, x11_window_width, x11_window_height); - return; - } -#ifdef XDestroyImage - XDestroyImage(xim); -#else - x11.XDestroyImage(xim); -#endif - } - if (last) { - release_buffer(last); - last = NULL; - } - xim = x11.XCreateImage(dpy, &visual, depth, ZPixmap, 0, NULL, width, height, 32, 0); - xim->data=(char *)calloc(1, xim->bytes_per_line*xim->height); - x11.XFillRectangle(dpy, win, gc, 0, 0, x11_window_width, x11_window_height); -} - -/* Swiped from FreeBSD libc */ -static int -my_fls(unsigned long mask) -{ - int bit; - - if (mask == 0) - return (0); - for (bit = 1; mask != 1; bit++) - mask = mask >> 1; - return (bit); -} - -/* Get a connection to the X server and create the window. */ -static int init_window() -{ - XGCValues gcv; - int i; - XWMHints *wmhints; - XClassHint *classhints; - int ret; - int best=-1; - int best_depth=0; - int best_cmap=0; - XVisualInfo template = {0}; - XVisualInfo *vi; - - dpy = x11.XOpenDisplay(NULL); - if (dpy == NULL) { - return(-1); - } - xfd = ConnectionNumber(dpy); - x11.utf8 = x11.XInternAtom(dpy, "UTF8_STRING", False); - x11.targets = x11.XInternAtom(dpy, "TARGETS", False); - - template.screen = DefaultScreen(dpy); - template.class = TrueColor; - vi = x11.XGetVisualInfo(dpy, VisualScreenMask | VisualClassMask, &template, &ret); - for (i=0; i<ret; i++) { - if (vi[i].depth >= best_depth && vi[i].colormap_size >= best_cmap) { - best = i; - best_depth = vi[i].depth; - } - } - if (best != -1) { - visual = *vi[best].visual; - /* - * TODO: Set VisualIsRGB8 if appropriate... - * "appropriate" in this context means it's a sequence of - * unpadded uint32_t values in XXRRGGBB format where XX is - * ignored, and RR, GG, and BB are Red, Green, Blue values - * respectively. - */ - base_pixel = ULONG_MAX; - base_pixel &= ~visual.red_mask; - base_pixel &= ~visual.green_mask; - base_pixel &= ~visual.blue_mask; - r_shift = my_fls(visual.red_mask)-16; - g_shift = my_fls(visual.green_mask)-16; - b_shift = my_fls(visual.blue_mask)-16; - } - else { - fprintf(stderr, "Unable to find TrueColor visual\n"); - x11.XFree(vi); - return -1; - } - x11.XFree(vi); - - /* Allocate black and white */ - black=BlackPixel(dpy, DefaultScreen(dpy)); - white=WhitePixel(dpy, DefaultScreen(dpy)); - - /* Create window, but defer setting a size and GC. */ - XSetWindowAttributes wa = {0}; - wa.colormap = x11.XCreateColormap(dpy, DefaultRootWindow(dpy), &visual, AllocNone); - wa.background_pixel = black; - wa.border_pixel = black; - depth = best_depth; - win = x11.XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, - 640*x_cvstat.scaling, 400*x_cvstat.scaling, 2, depth, InputOutput, &visual, CWColormap | CWBorderPixel | CWBackPixel, &wa); - - classhints=x11.XAllocClassHint(); - if (classhints) - classhints->res_name = classhints->res_class = "CIOLIB"; - wmhints=x11.XAllocWMHints(); - if(wmhints) { - wmhints->initial_state=NormalState; - wmhints->flags = (StateHint/* | IconPixmapHint | IconMaskHint*/ | InputHint); - wmhints->input = True; - x11.XSetWMProperties(dpy, win, NULL, NULL, 0, 0, NULL, wmhints, classhints); - x11.XFree(wmhints); - } - im = x11.XOpenIM(dpy, NULL, "CIOLIB", "CIOLIB"); - if (im != NULL) { - ic = x11.XCreateIC(im, XNClientWindow, win, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, NULL); - if (ic) - x11.XSetICFocus(ic); - } - - if (classhints) - x11.XFree(classhints); - - WM_DELETE_WINDOW = x11.XInternAtom(dpy, "WM_DELETE_WINDOW", False); - - gcv.function = GXcopy; - gcv.foreground = black | 0xff000000; - gcv.background = white; - gcv.graphics_exposures = False; - gc=x11.XCreateGC(dpy, win, GCFunction | GCForeground | GCBackground | GCGraphicsExposures, &gcv); - - x11.XSelectInput(dpy, win, KeyReleaseMask | KeyPressMask | - ExposureMask | ButtonPressMask - | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask); - - x11.XStoreName(dpy, win, "SyncConsole"); - x11.XSetWMProtocols(dpy, win, &WM_DELETE_WINDOW, 1); - - return(0); -} - -/* - * Actually maps (shows) the window - */ -static void map_window() -{ - XSizeHints *sh; - int minwidth = bitmap_width; - int minheight = bitmap_height; - - sh = x11.XAllocSizeHints(); - if (sh == NULL) { - fprintf(stderr, "Could not get XSizeHints structure"); - exit(1); - } - - sh->base_width = bitmap_width * x_cvstat.scaling; - sh->base_height = bitmap_height * x_cvstat.scaling; - - aspect_correct(&sh->base_width, &sh->base_height, x_cvstat.aspect_width, x_cvstat.aspect_height); - aspect_correct(&minwidth, &minheight, x_cvstat.aspect_width, x_cvstat.aspect_height); - - sh->min_width = sh->width_inc = sh->min_aspect.x = sh->max_aspect.x = minwidth; - sh->min_height = sh->height_inc = sh->min_aspect.y = sh->max_aspect.y = minheight; - - sh->flags = USSize | PMinSize | PSize | PResizeInc | PAspect; - - x11.XSetWMNormalHints(dpy, win, sh); - x11.XMapWindow(dpy, win); - - x11.XFree(sh); - - return; -} - -/* Resize the window. This function is called after a mode change. */ -static void resize_window() -{ - int width = bitmap_width * x_cvstat.scaling; - int height = bitmap_height * x_cvstat.scaling; - - aspect_correct(&width, &height, x_cvstat.aspect_width, x_cvstat.aspect_height); - x11.XResizeWindow(dpy, win, width, height); - resize_xim(); - - return; -} - -static void init_mode_internal(int mode) -{ - int oldcols; - - oldcols=x_cvstat.cols; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if (last) { - release_buffer(last); - last = NULL; - } - bitmap_drv_init_mode(mode, &bitmap_width, &bitmap_height); - - /* Deal with 40 col doubling */ - if(oldcols != vstat.cols) { - if(oldcols == 40) - vstat.scaling /= 2; - if(vstat.cols == 40) - vstat.scaling *= 2; - } - if(vstat.scaling < 1) - vstat.scaling = 1; - - x_cvstat = vstat; - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - map_window(); -} - -static void check_scaling(void) -{ - if (old_scaling != x_cvstat.scaling) { - resize_window(); - old_scaling = x_cvstat.scaling; - } -} - -static int init_mode(int mode) -{ - init_mode_internal(mode); - resize_window(); - bitmap_drv_request_pixels(); - - sem_post(&mode_set); - return(0); -} - -static int video_init() -{ - /* If we are running under X, get a connection to the X server and create - an empty window of size (1, 1). It makes a couple of init functions a - lot easier. */ - if(x_cvstat.scaling<1) - x_setscaling(1); - if(init_window()) - return(-1); - - bitmap_drv_init(x11_drawrect, x11_flush); - - /* Initialize mode 3 (text, 80x25, 16 colors) */ - init_mode_internal(3); - - return(0); -} - -static void -local_draw_rect(struct rectlist *rect) -{ - int x, y, xoff = 0, yoff = 0; - unsigned int r, g, b; - unsigned long pixel; - int cleft; - int cright = -100; - int ctop; - int cbottom = -1; - int idx; - uint32_t last_pixel = 0x55555555; - struct graphics_buffer *source; - - if (bitmap_width != rect->rect.width || bitmap_height != rect->rect.height) { - bitmap_drv_free_rect(rect); - return; - } - - xoff = (x11_window_width - xim->width) / 2; - if (xoff < 0) - xoff = 0; - yoff = (x11_window_height - xim->height) / 2; - if (yoff < 0) - yoff = 0; - - // Scale... - source = do_scale(rect, x_cvstat.scaling, x_cvstat.scaling, x_cvstat.aspect_width, x_cvstat.aspect_height); - bitmap_drv_free_rect(rect); - if (source == NULL) - return; - cleft = source->w; - ctop = source->h; - - xoff = (x11_window_width - source->w) / 2; - if (xoff < 0) - xoff = 0; - yoff = (x11_window_height - source->h) / 2; - if (yoff < 0) - yoff = 0; - - if (last && (last->w != source->w || last->h != source->h)) { - release_buffer(last); - last = NULL; - } - - /* TODO: Translate into local colour depth */ - idx = 0; - - for (y = 0; y < source->h; y++) { - for (x = 0; x < source->w; x++) { - if (last) { - if (last->data[idx] != source->data[idx]) { - if (x < cleft) - cleft = x; - if (x > cright) - cright = x; - if (y < ctop) - ctop = y; - if (y > cbottom) - cbottom = y; - } - else { - idx++; - continue; - } - } - if (VisualIsRGB8) { - pixel = source->data[idx]; - ((uint32_t*)xim->data)[idx] = pixel; - } - else { - if (last_pixel != source->data[idx]) { - last_pixel = source->data[idx]; - r = source->data[idx] >> 16 & 0xff; - g = source->data[idx] >> 8 & 0xff; - b = source->data[idx] & 0xff; - r = (r<<8)|r; - g = (g<<8)|g; - b = (b<<8)|b; - pixel = base_pixel; - if (r_shift >= 0) - pixel |= (r << r_shift) & visual.red_mask; - else - pixel |= (r >> (0-r_shift)) & visual.red_mask; - if (g_shift >= 0) - pixel |= (g << g_shift) & visual.green_mask; - else - pixel |= (g >> (0-g_shift)) & visual.green_mask; - if (b_shift >= 0) - pixel |= (b << b_shift) & visual.blue_mask; - else - pixel |= (b >> (0-b_shift)) & visual.blue_mask; - } -#ifdef XPutPixel - XPutPixel(xim, x, y, pixel); -#else - x11.XPutPixel(xim, x, y, pixel); -#endif - } - idx++; - } - /* This line was changed */ - // TODO: Previously this did one update per display line... - if (last && cright >= 0 && (cbottom != y || y == source->h - 1)) { - x11.XPutImage(dpy, win, gc, xim, cleft, ctop - , cleft + xoff, ctop + yoff - , (cright - cleft + 1), (cbottom - ctop + 1)); - cleft = source->w; - cright = cbottom = -100; - ctop = source->h; - } - } - - if (last == NULL) - x11.XPutImage(dpy, win, gc, xim, 0, 0, xoff, yoff, source->w, source->h); - else - release_buffer(last); - last = source; -} - -static void handle_resize_event(int width, int height) -{ - int newFSH=1; - int newFSW=1; - - aspect_fix(&width, &height, x_cvstat.aspect_width, x_cvstat.aspect_height); - newFSH=width / bitmap_width; - newFSW=height / bitmap_height; - if(newFSW<1) - newFSW=1; - if(newFSH<1) - newFSH=1; - if(newFSH<newFSW) - x_setscaling(newFSH); - else - x_setscaling(newFSW); - old_scaling = x_cvstat.scaling; - if(x_cvstat.scaling > 16) - x_setscaling(16); - - /* - * We only need to resize if the width/height are not even multiples, - * or if the two axis don't scale the same way. - * Otherwise, we can simply resend everything - */ - if (newFSH != newFSW) - resize_window(); - else - resize_xim(); - bitmap_drv_request_pixels(); -} - -static void expose_rect(int x, int y, int width, int height) -{ - int sx,sy,ex,ey; - int xoff=0, yoff=0; - - xoff = (x11_window_width - xim->width) / 2; - if (xoff < 0) - xoff = 0; - yoff = (x11_window_height - xim->height) / 2; - if (yoff < 0) - yoff = 0; - - if (xoff > 0 || yoff > 0) { - if (x < xoff || y < yoff || x + width > xoff + xim->width || y + height > yoff + xim->height) { - x11.XFillRectangle(dpy, win, gc, 0, 0, x11_window_width, yoff); - x11.XFillRectangle(dpy, win, gc, 0, yoff, xoff, yoff + xim->height); - x11.XFillRectangle(dpy, win, gc, xoff+xim->width, yoff, x11_window_width, yoff + xim->height); - x11.XFillRectangle(dpy, win, gc, 0, yoff + xim->height, x11_window_width, x11_window_height); - } - } - - sx=(x-xoff)/x_cvstat.scaling; - sy=(y-yoff)/(x_cvstat.scaling); - if (sx < 0) - sx = 0; - if (sy < 0) - sy = 0; - - ex=(x-xoff)+width-1; - ey=(y-yoff)+height-1; - if (ex < 0) - ex = 0; - if (ey < 0) - ey = 0; - if((ex+1)%x_cvstat.scaling) { - ex += x_cvstat.scaling-(ex%x_cvstat.scaling); - } - if((ey+1)%(x_cvstat.scaling)) { - ey += x_cvstat.scaling-(ey%(x_cvstat.scaling)); - } - ex=ex/x_cvstat.scaling; - ey=ey/(x_cvstat.scaling); - - /* Since we're exposing, we *have* to redraw */ - if (last) { - release_buffer(last); - last = NULL; - bitmap_drv_request_some_pixels(sx, sy, ex-sx+1, ey-sy+1); - } - // Do nothing... - if (sx == ex || sy == ey) - return; - bitmap_drv_request_some_pixels(sx, sy, ex-sx+1, ey-sy+1); -} - -static bool -xlat_mouse_xy(int *x, int *y) -{ - int xoff, yoff; - - xoff = (x11_window_width - xim->width) / 2; - if (xoff < 0) - xoff = 0; - yoff = (x11_window_height - xim->height) / 2; - if (yoff < 0) - yoff = 0; - - if (*x < xoff) - return false; - if (*y < yoff) - return false; - *x -= xoff; - *y -= yoff; - if (*x >= xim->width) - return false; - if (*y >= xim->height) - return false; - *x *= x_cvstat.scrnwidth; - *y *= x_cvstat.scrnheight; - *x /= xim->width; - *y /= xim->height; - return true; -} - -static int x11_event(XEvent *ev) -{ - if (x11.XFilterEvent(ev, win)) - return 0; - switch (ev->type) { - case ClientMessage: - if (ev->xclient.format == 32 && ev->xclient.data.l[0] == WM_DELETE_WINDOW) { - uint16_t key=CIO_KEY_QUIT; - write(key_pipe[1], &key, 2); - } - break; - /* Graphics related events */ - case ConfigureNotify: { - int width, height; - - if (x11_window_xpos != ev->xconfigure.x || x11_window_ypos != ev->xconfigure.y) { - x11_window_xpos=ev->xconfigure.x; - x11_window_ypos=ev->xconfigure.y; - } - if (x11_window_width != ev->xconfigure.width || x11_window_height != ev->xconfigure.height) { - x11_window_width=ev->xconfigure.width; - x11_window_height=ev->xconfigure.height; - handle_resize_event(ev->xconfigure.width, ev->xconfigure.height); - break; - } - width = bitmap_width * x_cvstat.scaling; - height = bitmap_height * x_cvstat.scaling; - - aspect_correct(&width, &height, x_cvstat.aspect_width, x_cvstat.aspect_height); - if (ev->xconfigure.width != width || ev->xconfigure.height != height) { - // We can't have the size we requested... accept the size we got. - int newFSH=1; - int newFSW=1; - - width = ev->xconfigure.width; - height = ev->xconfigure.height; - aspect_fix(&width, &height, x_cvstat.aspect_width, x_cvstat.aspect_height); - newFSH=width / bitmap_width; - newFSW=height / bitmap_height; - if(newFSW<1) - newFSW=1; - if(newFSH<1) - newFSH=1; - if(newFSH<newFSW) - x_setscaling(newFSH); - else - x_setscaling(newFSW); - old_scaling = x_cvstat.scaling; - if(x_cvstat.scaling > 16) - x_setscaling(16); - - resize_xim(); - bitmap_drv_request_pixels(); - } - break; - } - case NoExpose: - break; - case GraphicsExpose: - expose_rect(ev->xgraphicsexpose.x, ev->xgraphicsexpose.y, ev->xgraphicsexpose.width, ev->xgraphicsexpose.height); - break; - case Expose: - expose_rect(ev->xexpose.x, ev->xexpose.y, ev->xexpose.width, ev->xexpose.height); - break; - - /* Copy/Paste events */ - case SelectionClear: - { - XSelectionClearEvent *req; - - req=&(ev->xselectionclear); - pthread_mutex_lock(©buf_mutex); - if(req->selection==CONSOLE_CLIPBOARD) - FREE_AND_NULL(copybuf); - pthread_mutex_unlock(©buf_mutex); - } - break; - case SelectionNotify: - { - int format; - unsigned long len, bytes_left, dummy; - - if(ev->xselection.selection != CONSOLE_CLIPBOARD) - break; - if(ev->xselection.requestor!=win) - break; - if(ev->xselection.property) { - x11.XGetWindowProperty(dpy, win, ev->xselection.property, 0, 0, True, AnyPropertyType, &pastebuf_format, &format, &len, &bytes_left, (unsigned char **)(&pastebuf)); - if(bytes_left > 0 && format==8) { - x11.XGetWindowProperty(dpy, win, ev->xselection.property, 0, bytes_left, True, AnyPropertyType, &pastebuf_format, &format, &len, &dummy, (unsigned char **)&pastebuf); - if (x11.utf8 && pastebuf_format == x11.utf8) { - char *opb = pastebuf; - pastebuf = (char *)utf8_to_cp(CIOLIB_ISO_8859_1, (uint8_t *)pastebuf, '?', strlen(pastebuf), NULL); - if (pastebuf == NULL) - pastebuf = opb; - else - x11.XFree(opb); - } - } - else - pastebuf=NULL; - } - else - pastebuf=NULL; - - /* Set paste buffer */ - sem_post(&pastebuf_set); - sem_wait(&pastebuf_used); - if (x11.utf8 && pastebuf_format == x11.utf8) - free(pastebuf); - else - x11.XFree(pastebuf); - pastebuf=NULL; - } - break; - case SelectionRequest: - { - XSelectionRequestEvent *req; - XEvent respond; - Atom supported[3]; - int count = 0; - - req=&(ev->xselectionrequest); - pthread_mutex_lock(©buf_mutex); - if (x11.targets == 0) - x11.targets = x11.XInternAtom(dpy, "TARGETS", False); - respond.xselection.property=None; - if(copybuf!=NULL) { - if(req->target==XA_STRING) { - char *cpstr = utf8_to_cp(CIOLIB_ISO_8859_1, (uint8_t *)copybuf, '?', strlen(copybuf), NULL); - if (cpstr != NULL) { - x11.XChangeProperty(dpy, req->requestor, req->property, XA_STRING, 8, PropModeReplace, (uint8_t *)cpstr, strlen((char *)cpstr)); - respond.xselection.property=req->property; - free(cpstr); - } - } - else if(req->target == x11.utf8) { - x11.XChangeProperty(dpy, req->requestor, req->property, x11.utf8, 8, PropModeReplace, (uint8_t *)copybuf, strlen((char *)copybuf)); - respond.xselection.property=req->property; - } - else if(req->target == x11.targets) { - if (x11.utf8 == 0) - x11.utf8 = x11.XInternAtom(dpy, "UTF8_STRING", False); - - supported[count++] = x11.targets; - supported[count++] = XA_STRING; - if (x11.utf8) - supported[count++] = x11.utf8; - x11.XChangeProperty(dpy, req->requestor, req->property, XA_ATOM, 32, PropModeReplace, (unsigned char *)supported, count); - respond.xselection.property=req->property; - } - } - respond.xselection.requestor=req->requestor; - respond.xselection.selection=req->selection; - respond.xselection.time=req->time; - respond.xselection.target=req->target; - respond.xselection.type=SelectionNotify; - respond.xselection.display=req->display; - x11.XSendEvent(dpy,req->requestor,0,0,&respond); - x11.XFlush(dpy); - pthread_mutex_unlock(©buf_mutex); - } - break; - - /* Mouse Events */ - case MotionNotify: - { - XMotionEvent *me = (XMotionEvent *)ev; - if (!xlat_mouse_xy(&me->x, &me->y)) - break; - int x_res = me->x; - int y_res = me->y; - - me->x /= x_cvstat.charwidth; - me->y /= x_cvstat.charheight; - me->x++; - me->y++; - if(me->x<1) - me->x=1; - if(me->y<1) - me->y=1; - if(me->x>x_cvstat.cols) - me->x=x_cvstat.cols; - if(me->y>x_cvstat.rows+1) - me->y=x_cvstat.rows+1; - ciomouse_gotevent(CIOLIB_MOUSE_MOVE,me->x,me->y, x_res, y_res); - } - break; - case ButtonRelease: - { - XButtonEvent *be = (XButtonEvent *)ev; - if (!xlat_mouse_xy(&be->x, &be->y)) - break; - int x_res = be->x; - int y_res = be->y; - - be->x/=x_cvstat.charwidth; - be->y/=x_cvstat.charheight; - be->x++; - be->y++; - if(be->x<1) - be->x=1; - if(be->y<1) - be->y=1; - if(be->x>x_cvstat.cols) - be->x=x_cvstat.cols; - if(be->y>x_cvstat.rows+1) - be->y=x_cvstat.rows+1; - if (be->button <= 3) { - ciomouse_gotevent(CIOLIB_BUTTON_RELEASE(be->button),be->x,be->y, x_res, y_res); - } - } - break; - case ButtonPress: - { - XButtonEvent *be = (XButtonEvent *)ev; - if (!xlat_mouse_xy(&be->x, &be->y)) - break; - int x_res = be->x; - int y_res = be->y; - - be->x/=x_cvstat.charwidth; - be->y/=x_cvstat.charheight; - be->x++; - be->y++; - if(be->x<1) - be->x=1; - if(be->y<1) - be->y=1; - if(be->x>x_cvstat.cols) - be->x=x_cvstat.cols; - if(be->y>x_cvstat.rows+1) - be->y=x_cvstat.rows+1; - if (be->button <= 5) { - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(be->button),be->x,be->y, x_res, y_res); - } - } - break; - - /* Keyboard Events */ - case KeyPress: - { - static char buf[128]; - static wchar_t wbuf[128]; - KeySym ks; - int nlock = 0; - WORD scan = 0xffff; - Status lus = 0; - int cnt; - int i; - uint8_t ch; - - if (ic) - cnt = x11.XwcLookupString(ic, (XKeyPressedEvent *)ev, wbuf, sizeof(wbuf)/sizeof(wbuf[0]), &ks, &lus); - else { - cnt = x11.XLookupString((XKeyEvent *)ev, buf, sizeof(buf), &ks, NULL); - lus = XLookupKeySym; - } - - switch(lus) { - case XLookupNone: - ks = 0xffff; - break; - case XLookupBoth: - case XLookupChars: - if (lus == XLookupChars || ((ev->xkey.state & (Mod1Mask | ControlMask)) == 0)) { - for (i = 0; i < cnt; i++) { - if (wbuf[i] < 127) - ch = wbuf[i]; - else - ch = cpchar_from_unicode_cpoint(getcodepage(), wbuf[i], 0); - if (ch) { - write(key_pipe[1], &ch, 1); - } - } - break; - } - // Fallthrough - case XLookupKeySym: - switch (ks) { - case XK_Escape: - scan = 1; - goto docode; - - case XK_Tab: - case XK_ISO_Left_Tab: - scan = 15; - goto docode; - - case XK_Return: - case XK_KP_Enter: - scan = 28; - goto docode; - - case XK_Print: - scan = 55; - goto docode; - - case XK_F1: - case XK_F2: - case XK_F3: - case XK_F4: - case XK_F5: - case XK_F6: - case XK_F7: - case XK_F8: - case XK_F9: - case XK_F10: - scan = ks - XK_F1 + 59; - goto docode; - - case XK_KP_7: - nlock = 1; - case XK_Home: - case XK_KP_Home: - scan = 71; - goto docode; - - case XK_KP_8: - nlock = 1; - case XK_Up: - case XK_KP_Up: - scan = 72; - goto docode; - - case XK_KP_9: - nlock = 1; - case XK_Prior: - case XK_KP_Prior: - scan = 73; - goto docode; - - case XK_KP_Subtract: - scan = 74; - goto docode; - - case XK_KP_4: - nlock = 1; - case XK_Left: - case XK_KP_Left: - if (ev->xkey.state & Mod1Mask) { - if (x_cvstat.scaling > 1) - x_cvstat.scaling--; - } - scan = 75; - goto docode; - - case XK_KP_5: - nlock = 1; - case XK_Begin: - case XK_KP_Begin: - scan = 76; - goto docode; - - case XK_KP_6: - nlock = 1; - case XK_Right: - case XK_KP_Right: - scan = 77; - if (ev->xkey.state & Mod1Mask) { - if (x_cvstat.scaling < 7) - x_cvstat.scaling++; - } - goto docode; - - case XK_KP_Add: - scan = 78; - goto docode; - - case XK_KP_1: - nlock = 1; - case XK_End: - case XK_KP_End: - scan = 79; - goto docode; - - case XK_KP_2: - nlock = 1; - case XK_Down: - case XK_KP_Down: - scan = 80; - goto docode; - - case XK_KP_3: - nlock = 1; - case XK_Next: - case XK_KP_Next: - scan = 81; - goto docode; - - case XK_KP_0: - nlock = 1; - case XK_Insert: - case XK_KP_Insert: - scan = 82; - goto docode; - - case XK_KP_Decimal: - nlock = 1; - scan = 83; - goto docode; - - case XK_Delete: - case XK_KP_Delete: - /* scan = flipdelete ? 14 : 83; */ - scan = 83; - goto docode; - - case XK_BackSpace: - /* scan = flipdelete ? 83 : 14; */ - scan = 14; - goto docode; - - case XK_F11: - scan = 87; - goto docode; - case XK_F12: - scan = 88; - goto docode; - - - case XK_KP_Divide: - scan = Ascii2Scan['/']; - goto docode; - - case XK_KP_Multiply: - scan = Ascii2Scan['*']; - goto docode; - - default: - if (ks < ' ' || ks > '~') - break; - scan = Ascii2Scan[ks]; - docode: - if (nlock) - scan |= 0x100; - - if ((scan & ~0x100) > 88) { - scan = 0xffff; - break; - } - - if (ev->xkey.state & Mod1Mask) { - scan = ScanCodes[scan & 0xff].alt; - } else if ((ev->xkey.state & ShiftMask) || (scan & 0x100)) { - scan = ScanCodes[scan & 0xff].shift; - } else if (ev->xkey.state & ControlMask) { - scan = ScanCodes[scan & 0xff].ctrl; - } else - scan = ScanCodes[scan & 0xff].base; - - break; - } - if (scan != 0xffff) { - uint16_t key=scan; - write(key_pipe[1], &key, (scan&0xff)?1:2); - } - break; - } - return(1); - } - default: - break; - } - return(0); -} - -static void x11_terminate_event_thread(void) -{ - terminate = 1; - sem_wait(&event_thread_complete); -} - -static void readev(struct x11_local_event *lev) -{ - fd_set rfd; - int ret; - int rcvd = 0; - char *buf = (char *)lev; - - FD_ZERO(&rfd); - FD_SET(local_pipe[0], &rfd); - - while (rcvd < sizeof(*lev)) { - select(local_pipe[0]+1, &rfd, NULL, NULL, NULL); - ret = read(local_pipe[0], buf+rcvd, sizeof(*lev) - rcvd); - if (ret > 0) - rcvd += ret; - } -} - -void x11_event_thread(void *args) -{ - int x; - int high_fd; - fd_set fdset; - XEvent ev; - static struct timeval tv; - - SetThreadName("X11 Events"); - if(video_init()) { - sem_post(&init_complete); - return; - } - sem_init(&event_thread_complete, 0, 0); - atexit(x11_terminate_event_thread); - - if(local_pipe[0] > xfd) - high_fd=local_pipe[0]; - else - high_fd=xfd; - - x11.XSync(dpy, False); - x11_initialized=1; - sem_post(&init_complete); - for (;!terminate;) { - check_scaling(); - - tv.tv_sec=0; - tv.tv_usec=54925; /* was 54925 (was also 10) */ - - /* - * Handle any events just sitting around... - */ - while (QLength(dpy) > 0) { - x11.XNextEvent(dpy, &ev); - x11_event(&ev); - } - - FD_ZERO(&fdset); - FD_SET(xfd, &fdset); - FD_SET(local_pipe[0], &fdset); - - x = select(high_fd+1, &fdset, 0, 0, &tv); - - switch (x) { - case -1: - /* - * Errno might be wrong, so we just select again. - * This could cause a problem if something really - * was wrong with select.... - */ - - /* perror("select"); */ - break; - case 0: - /* Timeout */ - break; - default: - if (FD_ISSET(xfd, &fdset)) { - // This blocks for the event... - x11.XNextEvent(dpy, &ev); - x11_event(&ev); - // And this reads anything else from the queue. - while (QLength(dpy) > 0) { - x11.XNextEvent(dpy, &ev); - x11_event(&ev); - } - } - if(FD_ISSET(local_pipe[0], &fdset)) { - struct x11_local_event lev; - - readev(&lev); - switch(lev.type) { - case X11_LOCAL_SETMODE: - init_mode(lev.data.mode); - break; - case X11_LOCAL_SETNAME: - x11.XSetIconName(dpy, win, lev.data.name); - x11.XFlush(dpy); - break; - case X11_LOCAL_SETTITLE: - x11.XStoreName(dpy, win, lev.data.title); - x11.XFlush(dpy); - break; - case X11_LOCAL_COPY: - x11.XSetSelectionOwner(dpy, CONSOLE_CLIPBOARD, win, CurrentTime); - break; - case X11_LOCAL_PASTE: - { - Window sowner=None; - - sowner=x11.XGetSelectionOwner(dpy, CONSOLE_CLIPBOARD); - if(sowner==win) { - /* Get your own primary selection */ - if(copybuf==NULL) - pastebuf=NULL; - else { - pastebuf=strdup(copybuf); - pastebuf_format = copybuf_format; - } - /* Set paste buffer */ - sem_post(&pastebuf_set); - sem_wait(&pastebuf_used); - FREE_AND_NULL(pastebuf); - } - else if(sowner!=None) { - x11.XConvertSelection(dpy, CONSOLE_CLIPBOARD, x11.utf8 ? x11.utf8 : XA_STRING, x11.utf8 ? x11.utf8 : XA_STRING, win, CurrentTime); - } - else { - /* Set paste buffer */ - pastebuf=NULL; - sem_post(&pastebuf_set); - sem_wait(&pastebuf_used); - } - } - break; - case X11_LOCAL_DRAWRECT: - local_draw_rect(lev.data.rect); - break; - case X11_LOCAL_FLUSH: - x11.XFlush(dpy); - break; - case X11_LOCAL_BEEP: - x11.XBell(dpy, 100); - break; - case X11_LOCAL_SETICON: { - Atom wmicon = x11.XInternAtom(dpy, "_NET_WM_ICON", False); - if (wmicon) { - x11.XChangeProperty(dpy, win, wmicon, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)lev.data.icon_data, lev.data.icon_data[0] * lev.data.icon_data[1] + 2); - x11.XFlush(dpy); - } - free(lev.data.icon_data); - break; - } - case X11_LOCAL_MOUSEPOINTER: { - unsigned shape = UINT_MAX; - Cursor oc = curs; - switch (lev.data.ptr) { - case CIOLIB_MOUSEPTR_ARROW: - // Use default - break; - case CIOLIB_MOUSEPTR_BAR: - shape = XC_xterm; - break; - } - if (shape == UINT_MAX) - x11.XDefineCursor(dpy, win, None); - else { - curs = x11.XCreateFontCursor(dpy, shape); - x11.XDefineCursor(dpy, win, curs); - } - if (oc != None && oc != curs) - x11.XFreeCursor(dpy, oc); - break; - } - } - } - } - } - x11.XCloseDisplay(dpy); - sem_post(&event_thread_complete); -} diff --git a/ciolib/x_events.h b/ciolib/x_events.h deleted file mode 100644 index eb44f6c..0000000 --- a/ciolib/x_events.h +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef _X_EVENTS_H_ -#define _X_EVENTS_H_ - -#include <X11/Xlib.h> -#include <X11/Xresource.h> -#include <X11/Xutil.h> -#include <X11/keysym.h> -#include <X11/Xatom.h> - -enum x11_local_events { - X11_LOCAL_SETMODE - ,X11_LOCAL_SETNAME - ,X11_LOCAL_SETTITLE - ,X11_LOCAL_COPY - ,X11_LOCAL_PASTE - ,X11_LOCAL_DRAWRECT - ,X11_LOCAL_FLUSH - ,X11_LOCAL_BEEP - ,X11_LOCAL_SETICON - ,X11_LOCAL_MOUSEPOINTER -}; - -struct x11_local_event { - enum x11_local_events type; - union { - int mode; - char name[81]; - char title[81]; - struct rectlist *rect; - unsigned long *icon_data; - enum ciolib_mouse_ptr ptr; - } data; -}; - -/* X functions */ -struct x11 { - int (*XChangeGC) (Display*, GC, unsigned long, XGCValues*); - int (*XCopyPlane) (Display*, Drawable, Drawable, GC, int, int, unsigned int, unsigned int, int, int, unsigned long); - int (*XFillRectangle) (Display*, Drawable, GC, int, int, unsigned int, unsigned int); - int (*XDrawPoint) (Display*, Drawable, GC, int, int); - int (*XFlush) (Display*); - int (*XSync) (Display*, Bool); - int (*XBell) (Display*, int); - int (*XLookupString)(XKeyEvent*, char*, int, KeySym*, XComposeStatus*); - int (*XNextEvent) (Display*, XEvent *); - XSizeHints* (*XAllocSizeHints)(void); - void (*XSetWMNormalHints) (Display*, Window, XSizeHints*); - int (*XResizeWindow)(Display*, Window, unsigned int, unsigned int); - int (*XMapWindow) (Display*, Window); - int (*XFree) (void *data); - int (*XFreePixmap) (Display*, Pixmap); - Pixmap (*XCreatePixmap)(Display*, Drawable, unsigned int, unsigned int, unsigned int); - void (*XCopyArea) (Display*, Drawable, Drawable, GC, int, int, unsigned int, unsigned int, int, int); - Pixmap (*XCreateBitmapFromData) (Display*, Drawable, _Xconst char*, unsigned int, unsigned int); - Status (*XAllocColor) (Display*, Colormap, XColor*); - Display*(*XOpenDisplay) (_Xconst char*); - int (*XCloseDisplay) (Display*); - Window (*XCreateSimpleWindow) (Display*, Window, int, int, unsigned int, unsigned int, unsigned int, unsigned long, unsigned long); - GC (*XCreateGC) (Display*, Drawable, unsigned long, XGCValues*); - int (*XSelectInput) (Display*, Window, long); - int (*XStoreName) (Display*, Window, _Xconst char*); - Window (*XGetSelectionOwner) (Display*, Atom); - int (*XConvertSelection) (Display*, Atom, Atom, Atom, Window, Time); - int (*XGetWindowProperty) (Display*, Window, Atom, long, long, Bool, Atom, Atom*, int*, unsigned long *, unsigned long *, unsigned char **); - int (*XChangeProperty) (Display*, Window, Atom, Atom, int, int, _Xconst unsigned char*, int); - Status (*XSendEvent) (Display*, Window, Bool, long, XEvent*); - XImage* (*XCreateImage) (Display *, Visual *, unsigned int, int, int, char *,unsigned int, unsigned int, int, int); -#ifndef XPutPixel - void (*XPutPixel) (XImage*,int,int,unsigned long); -#endif - int (*XPutImage) (Display*, Drawable, GC, XImage *, int,int,int,int,unsigned int,unsigned int); -#ifndef XDestroyImage - void (*XDestroyImage)(XImage*); -#endif - int (*XSetSelectionOwner) (Display*, Atom, Window, Time); - int (*XSetIconName) (Display*, Window, _Xconst char *); - int (*XSynchronize) (Display*, Bool); - Status (*XGetWindowAttributes) (Display*,Window,XWindowAttributes*); - XWMHints* (*XAllocWMHints) (void); - void (*XSetWMProperties) (Display*, Window, XTextProperty*, XTextProperty*, char**, int, XSizeHints*, XWMHints*, XClassHint*); - Status (*XSetWMProtocols) (Display*, Window, Atom *, int); - Atom (*XInternAtom) (Display *, char *, Bool); - int (*XFreeColors) (Display*, Colormap, unsigned long *, int, unsigned long); - XVisualInfo *(*XGetVisualInfo)(Display *display, long vinfo_mask, XVisualInfo *vinfo_template, int *nitems_return); - Window (*XCreateWindow)(Display *display, Window parent, int x, int y, unsigned int width, unsigned int height, unsigned int border_width, int depth, - unsigned int class, Visual *visual, unsigned long valuemask, XSetWindowAttributes *attributes); - Colormap (*XCreateColormap)(Display *display, Window w, Visual *visual, int alloc); - XClassHint *(*XAllocClassHint)(void); - int (*XSetForeground)(Display *display, GC gc, unsigned long foreground); - char *(*XSetLocaleModifiers)(char *modifier_list); - XIM (*XOpenIM)(Display *display, XrmDatabase db, char *res_name, char *res_class); - XIC (*XCreateIC)(XIM im, ...); - int (*XwcLookupString)(XIC ic, XKeyPressedEvent *event, wchar_t *buffer_return, int wchars_buffer, KeySym *keysym_return, Status *status_return); - void (*XSetICFocus)(XIC ic); - Bool (*XFilterEvent)(XEvent *event, Window w); - Cursor (*XCreateFontCursor)(Display *display, unsigned int shape); - int (*XDefineCursor)(Display *display, Window w, Cursor cursor); - int (*XFreeCursor)(Display *display, Cursor cursor); - Atom utf8; - Atom targets; -}; - -extern int local_pipe[2]; /* Used for passing local events */ -extern int key_pipe[2]; /* Used for passing keyboard events */ - -extern struct x11 x11; - -extern char *copybuf; -extern pthread_mutex_t copybuf_mutex; -extern char *pastebuf; -extern sem_t pastebuf_set; -extern sem_t pastebuf_used; -extern Atom copybuf_format; -extern Atom pastebuf_format; -extern sem_t init_complete; -extern sem_t mode_set; -extern sem_t event_thread_complete; -extern int terminate; -extern int x11_window_xpos; -extern int x11_window_ypos; -extern int x11_window_width; -extern int x11_window_height; -extern int x11_initialized; -extern struct video_stats x_cvstat; - -void x11_event_thread(void *args); - -#endif diff --git a/ciolib/xbr.c b/ciolib/xbr.c deleted file mode 100644 index a7f02ed..0000000 --- a/ciolib/xbr.c +++ /dev/null @@ -1,299 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * Copyright (c) 2011, 2012 Hyllian/Jararaca <sergiogdb@gmail.com> - * Copyright (c) 2014 Arwa Arif <arwaarif1994@gmail.com> - * - * FFmpeg 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 2.1 of the License, or (at your option) any later version. - * - * FFmpeg 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 FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file - * XBR Filter is used for depixelization of image. - * This is based on Hyllian's xBR shader. - * - * @see https://forums.libretro.com/t/xbr-algorithm-tutorial/123 - * @see https://github.com/yoyofr/iFBA/blob/master/fba_src/src/intf/video/scalers/xbr.cpp - */ - -#include <inttypes.h> -#include <stdlib.h> -#include "scale.h" - -#define LB_MASK 0x00FEFEFE -#define RED_BLUE_MASK 0x00FF00FF -#define GREEN_MASK 0x0000FF00 - -#ifdef PI -#undef PI -#endif - -static uint32_t pixel_diff(uint32_t x, uint32_t y) -{ -#define YMASK 0xff0000 -#define UMASK 0x00ff00 -#define VMASK 0x0000ff -#define ABSDIFF(a,b) (abs((int)(a)-(int)(b))) - - uint32_t yuv1 = r2y[x & 0xffffff]; - - uint32_t yuv2 = r2y[y & 0xffffff]; - - return (ABSDIFF(yuv1 & YMASK, yuv2 & YMASK) >> 16) + - (ABSDIFF(yuv1 & UMASK, yuv2 & UMASK) >> 8) + - ABSDIFF(yuv1 & VMASK, yuv2 & VMASK); -} - -#define ALPHA_BLEND_128_W(a, b) ((((a) & LB_MASK) >> 1) + (((b) & LB_MASK) >> 1)) -#define ALPHA_BLEND_BASE(a, b, m, s) ( (RED_BLUE_MASK & (((a) & RED_BLUE_MASK) + (((((b) & RED_BLUE_MASK) - ((a) & RED_BLUE_MASK)) * (m)) >> (s)))) \ - | (GREEN_MASK & (((a) & GREEN_MASK) + (((((b) & GREEN_MASK) - ((a) & GREEN_MASK)) * (m)) >> (s))))) -#define ALPHA_BLEND_32_W(a, b) ALPHA_BLEND_BASE(a, b, 1, 3) -#define ALPHA_BLEND_64_W(a, b) ALPHA_BLEND_BASE(a, b, 1, 2) -#define ALPHA_BLEND_192_W(a, b) ALPHA_BLEND_BASE(a, b, 3, 2) -#define ALPHA_BLEND_224_W(a, b) ALPHA_BLEND_BASE(a, b, 7, 3) - -#define df(A, B) pixel_diff(A, B) -#define eq(A, B) (df(A, B) < 155) - -#define FILT2(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \ - N0, N1, N2, N3) do { \ - if (PE != PH && PE != PF) { \ - const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \ - const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \ - if (e <= i) { \ - const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \ - if ((e < i) && ((!eq(PF,PB) && !eq(PH,PD)) || (eq(PE,PI) \ - && (!eq(PF,I4) && !eq(PH,I5))) \ - || eq(PE,PG) || eq(PE,PC))) { \ - const unsigned ke = df(PF,PG); \ - const unsigned ki = df(PH,PC); \ - const int left = ke<<1 <= ki && PE != PG && PD != PG; \ - const int up = ke >= ki<<1 && PE != PC && PB != PC; \ - if (left && up) { \ - E[N3] = ALPHA_BLEND_224_W(E[N3], px); \ - E[N2] = ALPHA_BLEND_64_W( E[N2], px); \ - E[N1] = E[N2]; \ - } else if (left) { \ - E[N3] = ALPHA_BLEND_192_W(E[N3], px); \ - E[N2] = ALPHA_BLEND_64_W( E[N2], px); \ - } else if (up) { \ - E[N3] = ALPHA_BLEND_192_W(E[N3], px); \ - E[N1] = ALPHA_BLEND_64_W( E[N1], px); \ - } else { /* diagonal */ \ - E[N3] = ALPHA_BLEND_128_W(E[N3], px); \ - } \ - } else { \ - E[N3] = ALPHA_BLEND_128_W(E[N3], px); \ - } \ - } \ - } \ -} while (0) - -#define FILT3(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \ - N0, N1, N2, N3, N4, N5, N6, N7, N8) do { \ - if (PE != PH && PE != PF) { \ - const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \ - const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \ - if (e <= i) { \ - const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \ - if (e < i && ((!eq(PF,PB) && !eq(PF,PC)) || (!eq(PH,PD) && !eq(PH,PG)) || (eq(PE,PI) \ - && ((!eq(PF,F4) && !eq(PF,I4)) || (!eq(PH,H5) && !eq(PH,I5)))) \ - || eq(PE,PG) || eq(PE,PC))) { \ - const unsigned ke = df(PF,PG); \ - const unsigned ki = df(PH,PC); \ - const int left = ke<<1 <= ki && PE != PG && PD != PG; \ - const int up = ke >= ki<<1 && PE != PC && PB != PC; \ - if (left && up) { \ - E[N7] = ALPHA_BLEND_192_W(E[N7], px); \ - E[N6] = ALPHA_BLEND_64_W( E[N6], px); \ - E[N5] = E[N7]; \ - E[N2] = E[N6]; \ - E[N8] = px; \ - } else if (left) { \ - E[N7] = ALPHA_BLEND_192_W(E[N7], px); \ - E[N5] = ALPHA_BLEND_64_W( E[N5], px); \ - E[N6] = ALPHA_BLEND_64_W( E[N6], px); \ - E[N8] = px; \ - } else if (up) { \ - E[N5] = ALPHA_BLEND_192_W(E[N5], px); \ - E[N7] = ALPHA_BLEND_64_W( E[N7], px); \ - E[N2] = ALPHA_BLEND_64_W( E[N2], px); \ - E[N8] = px; \ - } else { /* diagonal */ \ - E[N8] = ALPHA_BLEND_224_W(E[N8], px); \ - E[N5] = ALPHA_BLEND_32_W( E[N5], px); \ - E[N7] = ALPHA_BLEND_32_W( E[N7], px); \ - } \ - } else { \ - E[N8] = ALPHA_BLEND_128_W(E[N8], px); \ - } \ - } \ - } \ -} while (0) - -#define FILT4(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \ - N15, N14, N11, N3, N7, N10, N13, N12, N9, N6, N2, N1, N5, N8, N4, N0) do { \ - if (PE != PH && PE != PF) { \ - const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \ - const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \ - if (e <= i) { \ - const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \ - if (e < i && ((!eq(PF,PB) && !eq(PH,PD)) || (eq(PE,PI) \ - && (!eq(PF,I4) && !eq(PH,I5))) \ - || eq(PE,PG) || eq(PE,PC))) { \ - const unsigned ke = df(PF,PG); \ - const unsigned ki = df(PH,PC); \ - const int left = ke<<1 <= ki && PE != PG && PD != PG; \ - const int up = ke >= ki<<1 && PE != PC && PB != PC; \ - if (left && up) { \ - E[N13] = ALPHA_BLEND_192_W(E[N13], px); \ - E[N12] = ALPHA_BLEND_64_W( E[N12], px); \ - E[N15] = E[N14] = E[N11] = px; \ - E[N10] = E[N3] = E[N12]; \ - E[N7] = E[N13]; \ - } else if (left) { \ - E[N11] = ALPHA_BLEND_192_W(E[N11], px); \ - E[N13] = ALPHA_BLEND_192_W(E[N13], px); \ - E[N10] = ALPHA_BLEND_64_W( E[N10], px); \ - E[N12] = ALPHA_BLEND_64_W( E[N12], px); \ - E[N14] = px; \ - E[N15] = px; \ - } else if (up) { \ - E[N14] = ALPHA_BLEND_192_W(E[N14], px); \ - E[N7 ] = ALPHA_BLEND_192_W(E[N7 ], px); \ - E[N10] = ALPHA_BLEND_64_W( E[N10], px); \ - E[N3 ] = ALPHA_BLEND_64_W( E[N3 ], px); \ - E[N11] = px; \ - E[N15] = px; \ - } else { /* diagonal */ \ - E[N11] = ALPHA_BLEND_128_W(E[N11], px); \ - E[N14] = ALPHA_BLEND_128_W(E[N14], px); \ - E[N15] = px; \ - } \ - } else { \ - E[N15] = ALPHA_BLEND_128_W(E[N15], px); \ - } \ - } \ - } \ -} while (0) - -#define CLAMP(x) do { \ - if (x < 0) \ - x = 0; \ - else if (x > 255) \ - x = 255; \ -} while(0) - -void -xbr_filter(uint32_t *data, uint32_t *out, int width, int height, int n) -{ - int x, y; - const int nl = width * n; - const int nl1 = nl + nl; - const int nl2 = nl1 + nl; - - for (y = 0; y < height; y++) { - - uint32_t *E = out + y * width * n * n; - const uint32_t *sa2 = (data + y * width - 2); /* center */ - const uint32_t *sa1 = sa2 - (width); /* up x1 */ - const uint32_t *sa0 = sa1 - (width); /* up x2 */ - const uint32_t *sa3 = sa2 + (width); /* down x1 */ - const uint32_t *sa4 = sa3 + (width); /* down x2 */ - - if (y <= 1) { - sa0 = sa1; - if (y == 0) { - sa0 = sa1 = sa2; - } - } - - if (y >= height - 2) { - sa4 = sa3; - if (y == height - 1) { - sa4 = sa3 = sa2; - } - } - - for (x = 0; x < width; x++) { - const uint32_t B1 = sa0[2]; - const uint32_t PB = sa1[2]; - const uint32_t PE = sa2[2]; - const uint32_t PH = sa3[2]; - const uint32_t H5 = sa4[2]; - - const int pprev = 2 - (x > 0); - const uint32_t A1 = sa0[pprev]; - const uint32_t PA = sa1[pprev]; - const uint32_t PD = sa2[pprev]; - const uint32_t PG = sa3[pprev]; - const uint32_t G5 = sa4[pprev]; - - const int pprev2 = pprev - (x > 1); - const uint32_t A0 = sa1[pprev2]; - const uint32_t D0 = sa2[pprev2]; - const uint32_t G0 = sa3[pprev2]; - - const int pnext = 3 - (x == width - 1); - const uint32_t C1 = sa0[pnext]; - const uint32_t PC = sa1[pnext]; - const uint32_t PF = sa2[pnext]; - const uint32_t PI = sa3[pnext]; - const uint32_t I5 = sa4[pnext]; - - const int pnext2 = pnext + 1 - (x >= width - 2); - const uint32_t C4 = sa1[pnext2]; - const uint32_t F4 = sa2[pnext2]; - const uint32_t I4 = sa3[pnext2]; - - if (n == 2) { - E[0] = E[1] = // 0, 1 - E[nl] = E[nl + 1] = PE; // 2, 3 - - FILT2(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, 0, 1, nl, nl+1); - FILT2(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, nl, 0, nl+1, 1); - FILT2(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, nl+1, nl, 1, 0); - FILT2(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, 1, nl+1, 0, nl); - } else if (n == 3) { - E[0] = E[1] = E[2] = // 0, 1, 2 - E[nl] = E[nl+1] = E[nl+2] = // 3, 4, 5 - E[nl1] = E[nl1+1] = E[nl1+2] = PE; // 6, 7, 8 - - FILT3(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, 0, 1, 2, nl, nl+1, nl+2, nl1, nl1+1, nl1+2); - FILT3(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, nl1, nl, 0, nl1+1, nl+1, 1, nl1+2, nl+2, 2); - FILT3(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, nl1+2, nl1+1, nl1, nl+2, nl+1, nl, 2, 1, 0); - FILT3(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, 2, nl+2, nl1+2, 1, nl+1, nl1+1, 0, nl, nl1); - } else if (n == 4) { - E[0] = E[1] = E[2] = E[3] = // 0, 1, 2, 3 - E[nl] = E[nl+1] = E[nl+2] = E[nl+3] = // 4, 5, 6, 7 - E[nl1] = E[nl1+1] = E[nl1+2] = E[nl1+3] = // 8, 9, 10, 11 - E[nl2] = E[nl2+1] = E[nl2+2] = E[nl2+3] = PE; // 12, 13, 14, 15 - - FILT4(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, nl2+3, nl2+2, nl1+3, 3, nl+3, nl1+2, nl2+1, nl2, nl1+1, nl+2, 2, 1, nl+1, nl1, nl, 0); - FILT4(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, 3, nl+3, 2, 0, 1, nl+2, nl1+3, nl2+3, nl1+2, nl+1, nl, nl1, nl1+1, nl2+2, nl2+1, nl2); - FILT4(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, 0, 1, nl, nl2, nl1, nl+1, 2, 3, nl+2, nl1+1, nl2+1, nl2+2, nl1+2, nl+3, nl1+3, nl2+3); - FILT4(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, nl2, nl1, nl2+1, nl2+3, nl2+2, nl1+1, nl, 0, nl+1, nl1+2, nl1+3, nl+3, nl+2, 1, 2, 3); - } - - sa0 += 1; - sa1 += 1; - sa2 += 1; - sa3 += 1; - sa4 += 1; - - E += n; - } - } -} diff --git a/ciolib/xbr.h b/ciolib/xbr.h deleted file mode 100644 index c8c32ae..0000000 --- a/ciolib/xbr.h +++ /dev/null @@ -1,4 +0,0 @@ -#include <inttypes.h> - -void xbr_filter(uint32_t *data, uint32_t *out, int width, int height, int n); - diff --git a/comio/CMakeLists.txt b/comio/CMakeLists.txt deleted file mode 100644 index 5212bed..0000000 --- a/comio/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -project (COMIO C) - -cmake_minimum_required(VERSION 3.11) - -set(SOURCE - comio.c -) - -set(HEADER - comio.h -) - -if(WIN32) - list(APPEND SOURCE comio_win32.c) -else() - list(APPEND SOURCE comio_nix.c) -endif() - -add_library(comio OBJECT ${SOURCE}) -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - target_compile_definitions(comio PRIVATE SPEED_MACROS_ONLY) -endif() -target_include_directories(comio PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -target_link_libraries(comio xpdev) diff --git a/comio/comio.c b/comio/comio.c deleted file mode 100644 index 2901527..0000000 --- a/comio/comio.c +++ /dev/null @@ -1,72 +0,0 @@ -/* comio.c */ - -/* Synchronet Serial Communications I/O Library Common Functions */ - -/* $Id: comio.c,v 1.4 2020/06/26 19:33:08 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "comio.h" -#include "genwrap.h" /* msclock */ - -size_t comReadBuf(COM_HANDLE handle, char* buf, size_t buflen, const char* terminators, int timeout) -{ - BYTE ch; - size_t len=0; - msclock_t start=msclock(); - - while(len < buflen) { - if(!comReadByte(handle, &ch)) { - if(msclock()-start >= timeout) - break; - YIELD(); - continue; - } - if(len && terminators!=NULL && strchr(terminators, ch)!=NULL) - break; - buf[len++]=ch; - } - - return len; -} - -size_t comReadLine(COM_HANDLE handle, char* buf, size_t buflen, int timeout) -{ - size_t len; - - len=comReadBuf(handle, buf, buflen-1, "\n", timeout); - - buf[len]=0; - - return len; -} - diff --git a/comio/comio.h b/comio/comio.h deleted file mode 100644 index 557381b..0000000 --- a/comio/comio.h +++ /dev/null @@ -1,142 +0,0 @@ -/* comio.h */ - -/* Synchronet Serial Communications (COM) I/O Library */ - -/* $Id: comio.h,v 1.15 2020/06/26 19:56:48 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _COMIO_H -#define _COMIO_H - -#include <gen_defs.h> /* BOOL */ - -#define COM_ERROR -1 - -#ifdef _WIN32 - #if defined(COMIO_IMPORTS) || defined(COMIO_EXPORTS) - #if defined(COMIO_IMPORTS) - #define COMIOEXPORT __declspec( dllimport ) - #else - #define COMIOEXPORT __declspec( dllexport ) - #endif - #else /* self-contained executable */ - #define COMIOEXPORT - #endif -#else - #define COMIOEXPORT -#endif - -#ifdef _WIN32 - #include <windows.h> - - #define COM_HANDLE HANDLE - #define COM_HANDLE_INVALID INVALID_HANDLE_VALUE - #define COM_ERROR_VALUE GetLastError() -/* Modem Status bits */ - #define COM_CTS MS_CTS_ON - #define COM_DSR MS_DSR_ON - #define COM_RING MS_RING_ON - #define COM_DCD MS_RLSD_ON -#else - #include <termios.h> - - #define COM_HANDLE int - #define COM_HANDLE_INVALID -1 - #define COM_ERROR_VALUE errno - -/* Stuff we apparently don't care about... - * - * TIOCM_LE Line Enable. - * TIOCM_DTR Data Terminal Ready. - * TIOCM_RTS Request To Send. - * TIOCM_ST Secondary Transmit. - * TIOCM_SR Secondary Receive. - */ - - #define COM_CTS TIOCM_CTS /* Clear To Send. */ -#ifdef TIOCM_CAR - #define COM_DCD TIOCM_CAR /* Carrier Detect. */ -#else - #define COM_DCD TIOCM_CD /* Carrier Detect (synonym). */ -#endif -#ifdef TIOCM_RNG - #define COM_RING TIOCM_RNG /* Ring Indication. */ -#else - #define COM_RING TIOCM_RI /* Ring Indication (synonym). */ -#endif - #define COM_DSR TIOCM_DSR /* Data Set Ready. */ - -#endif - -#define COM_FLOW_CONTROL_NONE 0 -#define COM_FLOW_CONTROL_RTS_CTS (1<<0) -#define COM_FLOW_CONTROL_DTR_DSR (1<<1) -#define COM_FLOW_CONTROL_XON_OFF (1<<2) - -/**************/ -/* Prototypes */ -/**************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -COMIOEXPORT char* comVersion(char* str, size_t len); -COMIOEXPORT COM_HANDLE comOpen(const char* device); -COMIOEXPORT BOOL comClose(COM_HANDLE); -COMIOEXPORT long comGetBaudRate(COM_HANDLE); -COMIOEXPORT BOOL comSetBaudRate(COM_HANDLE, ulong rate); -COMIOEXPORT int comGetFlowControl(COM_HANDLE); -COMIOEXPORT BOOL comSetFlowControl(COM_HANDLE, int); -COMIOEXPORT int comGetModemStatus(COM_HANDLE); -COMIOEXPORT int comRaiseDTR(COM_HANDLE); -COMIOEXPORT int comLowerDTR(COM_HANDLE); -COMIOEXPORT int comRaiseRTS(COM_HANDLE); -COMIOEXPORT int comLowerRTS(COM_HANDLE); -COMIOEXPORT BOOL comWriteByte(COM_HANDLE, BYTE); -COMIOEXPORT int comWriteBuf(COM_HANDLE, const BYTE*, size_t buflen); -COMIOEXPORT int comWriteString(COM_HANDLE, const char*); -COMIOEXPORT BOOL comReadByte(COM_HANDLE, BYTE*); -COMIOEXPORT size_t comReadBuf(COM_HANDLE, char* buf, size_t buflen - ,const char* terminators, int timeout /* in milliseconds */); -COMIOEXPORT size_t comReadLine(COM_HANDLE, char* buf, size_t buflen - ,int timeout /* in milliseconds */); -COMIOEXPORT BOOL comPurgeInput(COM_HANDLE); -COMIOEXPORT BOOL comPurgeOutput(COM_HANDLE); - -#if defined(__cplusplus) -} -#endif - - -#endif /* Don't add anything after this #endif statement */ diff --git a/comio/comio_nix.c b/comio/comio_nix.c deleted file mode 100644 index 03f33d4..0000000 --- a/comio/comio_nix.c +++ /dev/null @@ -1,413 +0,0 @@ -/* comio_nix.c */ - -/* Synchronet Serial Communications I/O Library Functions for *nix */ - -/* $Id: comio_nix.c,v 1.19 2020/06/27 08:23:39 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <sys/ioctl.h> -#include <sys/file.h> -#include <fcntl.h> // O_NONBLOCK -#include "comio.h" -#include "genwrap.h" - -#if defined(CCTS_OFLOW) && defined(CRTS_IFLOW) - #define CTSRTS_FLOW_CFLAGS (CCTS_OFLOW | CRTS_IFLOW) -#elif defined(CRTSCTS) - #define CTSRTS_FLOW_CFLAGS (CRTSCTS) -#else - #error No way to control CTS/RTS flow control -#endif - -#if defined(IXON) && defined (IXOFF) - #define XONXOFF_FLOW_IFLAGS (IXON | IXOFF) -#else - #error No way to control XON/XOFF flow control -#endif - -#ifdef SPEED_MACROS_ONLY - -#define SUPPORTED_SPEED(x) \ - if (speed <= (x)) \ - return B##x - -speed_t rate_to_macro(unsigned long speed) -{ - // Standard values - SUPPORTED_SPEED(0); - SUPPORTED_SPEED(50); - SUPPORTED_SPEED(75); - SUPPORTED_SPEED(110); - SUPPORTED_SPEED(134); - SUPPORTED_SPEED(150); - SUPPORTED_SPEED(200); - SUPPORTED_SPEED(300); - SUPPORTED_SPEED(600); - SUPPORTED_SPEED(1200); - SUPPORTED_SPEED(1800); - SUPPORTED_SPEED(2400); - SUPPORTED_SPEED(4800); - SUPPORTED_SPEED(9600); - SUPPORTED_SPEED(19200); - SUPPORTED_SPEED(38400); - - // Non-POSIX -#ifdef B57600 - SUPPORTED_SPEED(57600); -#endif -#ifdef B115200 - SUPPORTED_SPEED(115200); -#endif -#ifdef B230400 - SUPPORTED_SPEED(230400); -#endif -#ifdef B460800 - SUPPORTED_SPEED(460800); -#endif -#ifdef B500000 - SUPPORTED_SPEED(500000); -#endif -#ifdef B576000 - SUPPORTED_SPEED(576000); -#endif -#ifdef B921600 - SUPPORTED_SPEED(921600); -#endif -#ifdef B1000000 - SUPPORTED_SPEED(1000000); -#endif -#ifdef B1152000 - SUPPORTED_SPEED(1152000); -#endif -#ifdef B1500000 - SUPPORTED_SPEED(1500000); -#endif -#ifdef B2000000 - SUPPORTED_SPEED(2000000); -#endif -#ifdef B2500000 - SUPPORTED_SPEED(2500000); -#endif -#ifdef B3000000 - SUPPORTED_SPEED(3000000); -#endif -#ifdef B3500000 - SUPPORTED_SPEED(3500000); -#endif -#ifdef B4000000 - SUPPORTED_SPEED(4000000); -#endif - return B0; -} -#undef SUPPORTED_SPEED -#define SUPPORTED_SPEED(x) \ - if (speed == B##x) \ - return x; - -unsigned long macro_to_rate(speed_t speed) -{ - // Standard values - SUPPORTED_SPEED(0); - SUPPORTED_SPEED(50); - SUPPORTED_SPEED(75); - SUPPORTED_SPEED(110); - SUPPORTED_SPEED(134); - SUPPORTED_SPEED(150); - SUPPORTED_SPEED(200); - SUPPORTED_SPEED(300); - SUPPORTED_SPEED(600); - SUPPORTED_SPEED(1200); - SUPPORTED_SPEED(1800); - SUPPORTED_SPEED(2400); - SUPPORTED_SPEED(4800); - SUPPORTED_SPEED(9600); - SUPPORTED_SPEED(19200); - SUPPORTED_SPEED(38400); - - // Non-POSIX -#ifdef B57600 - SUPPORTED_SPEED(57600); -#endif -#ifdef B115200 - SUPPORTED_SPEED(115200); -#endif -#ifdef B230400 - SUPPORTED_SPEED(230400); -#endif -#ifdef B460800 - SUPPORTED_SPEED(460800); -#endif -#ifdef B500000 - SUPPORTED_SPEED(500000); -#endif -#ifdef B576000 - SUPPORTED_SPEED(576000); -#endif -#ifdef B921600 - SUPPORTED_SPEED(921600); -#endif -#ifdef B1000000 - SUPPORTED_SPEED(1000000); -#endif -#ifdef B1152000 - SUPPORTED_SPEED(1152000); -#endif -#ifdef B1500000 - SUPPORTED_SPEED(1500000); -#endif -#ifdef B2000000 - SUPPORTED_SPEED(2000000); -#endif -#ifdef B2500000 - SUPPORTED_SPEED(2500000); -#endif -#ifdef B3000000 - SUPPORTED_SPEED(3000000); -#endif -#ifdef B3500000 - SUPPORTED_SPEED(3500000); -#endif -#ifdef B4000000 - SUPPORTED_SPEED(4000000); -#endif - return 0; -} -#undef SUPPORTED_SPEED - -#else -#define rate_to_macro(x) (x) -#define macro_to_rate(x) (x) -#endif - -char* comVersion(char* str, size_t len) -{ - char revision[16]; - - sscanf("$Revision: 1.19 $", "%*s %s", revision); - - safe_snprintf(str,len,"Synchronet Communications I/O Library for "PLATFORM_DESC" v%s", revision); - return str; -} - -COM_HANDLE comOpen(const char* device) -{ - COM_HANDLE handle; - struct termios t; - - if((handle=open(device, O_NONBLOCK|O_RDWR))==COM_HANDLE_INVALID) - return COM_HANDLE_INVALID; - - if(tcgetattr(handle, &t)==-1) { - close(handle); - return COM_HANDLE_INVALID; - } - - t.c_iflag = ( - IGNBRK /* ignore BREAK condition */ - | IGNPAR /* ignore (discard) parity errors */ - ); - t.c_oflag = 0; /* No output processing */ - t.c_cflag = ( - CS8 /* 8 bits */ - | CREAD /* enable receiver */ -/* -Fun snippet from the FreeBSD manpage: - - If CREAD is set, the receiver is enabled. Otherwise, no character is - received. Not all hardware supports this bit. In fact, this flag is - pretty silly and if it were not part of the termios specification it - would be omitted. -*/ - | HUPCL /* hang up on last close */ - | CLOCAL /* ignore modem status lines */ - | CTSRTS_FLOW_CFLAGS - ); - t.c_lflag = 0; /* No local modes */ - if(tcsetattr(handle, TCSANOW, &t)==-1) { - close(handle); - return COM_HANDLE_INVALID; - } - - return handle; -} - -BOOL comClose(COM_HANDLE handle) -{ - return (!close(handle)); -} - -long comGetBaudRate(COM_HANDLE handle) -{ - struct termios t; - speed_t in; - speed_t out; - - if(tcgetattr(handle, &t)) - return COM_ERROR; - - /* - * We actually have TWO speeds available... - * return the biggest one - */ - in = macro_to_rate(cfgetispeed(&t)); - out = macro_to_rate(cfgetospeed(&t)); - return ((long)(in>out?in:out)); -} - -BOOL comSetBaudRate(COM_HANDLE handle, unsigned long rate) -{ - struct termios t; - - if(tcgetattr(handle, &t)) - return FALSE; - - cfsetispeed(&t, rate_to_macro(rate)); - cfsetospeed(&t, rate_to_macro(rate)); - if(tcsetattr(handle, TCSANOW, &t)==-1) - return FALSE; - - return TRUE; -} - -int comGetFlowControl(COM_HANDLE handle) -{ - int ret = 0; - struct termios t; - - if(tcgetattr(handle, &t)==-1) - return FALSE; - - if ((t.c_cflag & CTSRTS_FLOW_CFLAGS) == CTSRTS_FLOW_CFLAGS) - ret |= COM_FLOW_CONTROL_RTS_CTS; - if ((t.c_iflag & XONXOFF_FLOW_IFLAGS) == XONXOFF_FLOW_IFLAGS) - ret |= COM_FLOW_CONTROL_XON_OFF; - - return ret; -} - -BOOL comSetFlowControl(COM_HANDLE handle, int modes) -{ - struct termios t; - - if(tcgetattr(handle, &t)==-1) - return FALSE; - - if (modes & COM_FLOW_CONTROL_RTS_CTS) - t.c_cflag |= CTSRTS_FLOW_CFLAGS; - else - t.c_cflag &= ~CTSRTS_FLOW_CFLAGS; - - if (modes & COM_FLOW_CONTROL_XON_OFF) - t.c_iflag |= XONXOFF_FLOW_IFLAGS; - else - t.c_iflag &= ~XONXOFF_FLOW_IFLAGS; - - if(tcsetattr(handle, TCSANOW, &t)==-1) - return FALSE; - - return TRUE; -} - -int comGetModemStatus(COM_HANDLE handle) -{ - int status; - - if(ioctl(handle, TIOCMGET, &status)==-1) - return COM_ERROR; - - return status; -} - -static BOOL comSetFlags(COM_HANDLE handle, int flags, BOOL set) -{ - int cmd = set ? TIOCMBIS : TIOCMBIC; - - return (ioctl(handle, cmd, &flags) == 0); -} - -BOOL comRaiseDTR(COM_HANDLE handle) -{ - return comSetFlags(handle, TIOCM_DTR, TRUE); -} - -BOOL comLowerDTR(COM_HANDLE handle) -{ - return comSetFlags(handle, TIOCM_DTR, FALSE); -} - -BOOL comRaiseRTS(COM_HANDLE handle) -{ - return comSetFlags(handle, TIOCM_RTS, TRUE); -} - -BOOL comLowerRTS(COM_HANDLE handle) -{ - return comSetFlags(handle, TIOCM_RTS, FALSE); -} -BOOL comWriteByte(COM_HANDLE handle, BYTE ch) -{ - return(write(handle, &ch, 1)==1); -} - -int comWriteBuf(COM_HANDLE handle, const BYTE* buf, size_t buflen) -{ - return write(handle, buf, buflen); -} - -/* - * TODO: This seem kinda dangerous for short writes... - */ -int comWriteString(COM_HANDLE handle, const char* str) -{ - return comWriteBuf(handle, (BYTE*)str, strlen(str)); -} - -BOOL comReadByte(COM_HANDLE handle, BYTE* ch) -{ - return(read(handle, ch, 1)==1); -} - -BOOL comPurgeInput(COM_HANDLE handle) -{ - return(tcflush(handle, TCIFLUSH)==0); -} - -BOOL comPurgeOutput(COM_HANDLE handle) -{ - return(tcflush(handle, TCOFLUSH)==0); -} - -BOOL comDrainOutput(COM_HANDLE handle) -{ - return(tcdrain(handle)==0); -} diff --git a/comio/comio_win32.c b/comio/comio_win32.c deleted file mode 100644 index b539dd7..0000000 --- a/comio/comio_win32.c +++ /dev/null @@ -1,228 +0,0 @@ -/* comio_win32.c */ - -/* Synchronet Serial Communications I/O Library Functions for Win32 */ - -/* $Id: comio_win32.c,v 1.13 2020/06/26 19:56:48 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "comio.h" -#include "genwrap.h" - -char* comVersion(char* str, size_t len) -{ - char revision[16]; - - sscanf("$Revision: 1.13 $", "%*s %s", revision); - - safe_snprintf(str,len,"Synchronet Communications I/O Library for "PLATFORM_DESC" v%s", revision); - return str; -} - -COM_HANDLE comOpen(const char* device) -{ - COM_HANDLE handle; - COMMTIMEOUTS timeouts; - DCB dcb; - - if((handle=CreateFile(device - ,GENERIC_READ|GENERIC_WRITE /* Access */ - ,0 /* Share mode */ - ,NULL /* Security attributes */ - ,OPEN_EXISTING /* Create access */ - ,FILE_ATTRIBUTE_NORMAL /* File attributes */ - ,NULL /* Template */ - ))==INVALID_HANDLE_VALUE) - return COM_HANDLE_INVALID; - - - if(GetCommTimeouts(handle, &timeouts)) { - timeouts.ReadIntervalTimeout=MAXDWORD; - timeouts.ReadTotalTimeoutMultiplier=0; - timeouts.ReadTotalTimeoutConstant=0; // No-wait read timeout - timeouts.WriteTotalTimeoutMultiplier=0; - timeouts.WriteTotalTimeoutConstant=5000; // 5 seconds - SetCommTimeouts(handle,&timeouts); - } - - /* Force N-8-1 mode: */ - if(GetCommState(handle, &dcb)==TRUE) { - dcb.ByteSize = 8; - dcb.Parity = NOPARITY; - dcb.StopBits = ONESTOPBIT; - SetCommState(handle, &dcb); - } - - return handle; -} - -BOOL comClose(COM_HANDLE handle) -{ - return CloseHandle(handle); -} - -long comGetBaudRate(COM_HANDLE handle) -{ - DCB dcb; - - if(GetCommState(handle, &dcb)!=TRUE) - return COM_ERROR; - - return dcb.BaudRate; -} - -BOOL comSetBaudRate(COM_HANDLE handle, unsigned long rate) -{ - DCB dcb; - - if(GetCommState(handle, &dcb)!=TRUE) - return FALSE; - - dcb.BaudRate=rate; - - return SetCommState(handle, &dcb); -} - -int comGetFlowControl(COM_HANDLE handle) -{ - DCB dcb; - int result = 0; - - if(GetCommState(handle, &dcb) != TRUE) - return COM_ERROR; - - if(dcb.fOutxCtsFlow) - result |= COM_FLOW_CONTROL_RTS_CTS; - if(dcb.fOutxDsrFlow) - result |= COM_FLOW_CONTROL_DTR_DSR; - if(dcb.fInX && dcb.fOutX) - result |= COM_FLOW_CONTROL_XON_OFF; - return result; -} - -BOOL comSetFlowControl(COM_HANDLE handle, int type) -{ - DCB dcb; - - if(GetCommState(handle, &dcb) != TRUE) - return FALSE; - - dcb.fOutxCtsFlow = 0; - dcb.fRtsControl = RTS_CONTROL_DISABLE; // This is questionable - dcb.fOutxDsrFlow = 0; - dcb.fDsrSensitivity = 0; - dcb.fInX = 0; - dcb.fOutX = 0; - if(type&COM_FLOW_CONTROL_RTS_CTS) { - dcb.fOutxCtsFlow = 1; - dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; - } - if(type&COM_FLOW_CONTROL_DTR_DSR) { - dcb.fOutxDsrFlow = 1; - dcb.fDsrSensitivity = 1; - } - if(type&COM_FLOW_CONTROL_XON_OFF) { - dcb.fInX = 1; - dcb.fOutX = 1; - } - return SetCommState(handle, &dcb); -} - -int comGetModemStatus(COM_HANDLE handle) -{ - DWORD status=0; - - if(GetCommModemStatus(handle, &status)) - return status; - else - return COM_ERROR; -} - -BOOL comRaiseDTR(COM_HANDLE handle) -{ - return EscapeCommFunction(handle, SETDTR); -} - -BOOL comLowerDTR(COM_HANDLE handle) -{ - return EscapeCommFunction(handle, CLRDTR); -} - -BOOL comRaiseRTS(COM_HANDLE handle) -{ - return EscapeCommFunction(handle, SETRTS); -} - -BOOL comLowerRTS(COM_HANDLE handle) -{ - return EscapeCommFunction(handle, CLRRTS); -} - -BOOL comWriteByte(COM_HANDLE handle, BYTE ch) -{ - DWORD wr=0; - - return WriteFile(handle, &ch, sizeof(ch), &wr, NULL) && wr==sizeof(BYTE); -} - -int comWriteBuf(COM_HANDLE handle, const BYTE* buf, size_t buflen) -{ - DWORD wr=0; - - if(!WriteFile(handle, buf, buflen, &wr, NULL)) - return COM_ERROR; - - return wr; -} - -int comWriteString(COM_HANDLE handle, const char* str) -{ - return comWriteBuf(handle, str, strlen(str)); -} - -BOOL comReadByte(COM_HANDLE handle, BYTE* ch) -{ - DWORD rd; - - return ReadFile(handle, ch, sizeof(BYTE), &rd, NULL) && rd==sizeof(BYTE); -} - -BOOL comPurgeInput(COM_HANDLE handle) -{ - return PurgeComm(handle, PURGE_RXCLEAR); -} - -BOOL comPurgeOutput(COM_HANDLE handle) -{ - return PurgeComm(handle, PURGE_TXCLEAR); -} - diff --git a/encode/CMakeLists.txt b/encode/CMakeLists.txt deleted file mode 100644 index 2e2be23..0000000 --- a/encode/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# not currently used - -project (Encode C) - -cmake_minimum_required(VERSION 3.11) - -set(SOURCE - base64.c - hex.c - lzh.c - utf8.c - uucode.c - yenc.c -) - -set(HEADER - base64.h - lzh.h - utf8.h - uucode.h - yenc.h -) - -add_library(encode OBJECT ${SOURCE}) -target_compile_features(encode PUBLIC c_std_99) -target_include_directories(encode PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(encode xpdev) diff --git a/encode/README.md b/encode/README.md deleted file mode 100644 index bbc7dab..0000000 --- a/encode/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Synchronet library project: encoders and decoders - -This directory contains code and data for various data encoders / decoders: -e.g. base64, uuencode, yenc, UTF-8, etc. - -One-way/lossy encoders (e.g. checksum/hash/digest) do not belong here. diff --git a/encode/base64.c b/encode/base64.c deleted file mode 100644 index d7043e4..0000000 --- a/encode/base64.c +++ /dev/null @@ -1,174 +0,0 @@ -/* Base64 encoding/decoding routines */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> -#include <string.h> -#include "base64.h" -#include "gen_defs.h" - -static const char * base64alphabet = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - -ssize_t b64_decode(char *target, size_t tlen, const char *source, size_t slen) -{ - const char *inp; - char *outp; - char *outend; - const char *inend; - int bits=0; - int working=0; - char * i; - - if(slen==0) - slen=strlen(source); - outp=target; - inp=source; - outend=target+tlen; - inend=source+slen; - for(;outp<outend && inp<inend;inp++) { - if(isspace(*inp)) - continue; - working<<=6; - i=strchr(base64alphabet,(char)*inp); - if(i==NULL) { - return(-1); - } - if(*i=='=') { /* pad char */ - if((working&0xFF) != 0) - return(-1); - break; - } - bits+=6; - working |= (i-base64alphabet); - if(bits>=8) { - *(outp++)=(char)((working&(0xFF<<(bits-8)))>>(bits-8)); - bits-=8; - } - } - if(outp == outend) { - *(--outp)=0; - return(-1); - } - *outp=0; - return(outp-target); -} - -static int add_char(char *pos, char ch, int done, char *end) -{ - if(pos>=end) { - return(1); - } - if(done) - *pos=base64alphabet[64]; - else - *pos=base64alphabet[(int)ch]; - return(0); -} - -ssize_t b64_encode(char *target, size_t tlen, const char *source, size_t slen) { - const char *inp; - char *outp; - char *outend; - const char *inend; - char *tmpbuf=NULL; - int done=0; - char enc; - int buf; - - inp=source; - if(source==target) { - tmpbuf=(char *)malloc(tlen); - if(tmpbuf==NULL) - return(-1); - outp=tmpbuf; - } - else - outp=target; - - outend=outp+tlen; - inend=inp+slen; - for(;(inp < inend) && !done;) { - enc=*(inp++); - buf=(enc & 0x03)<<4; - enc=(enc&0xFC)>>2; - if(add_char(outp++, enc, done, outend)) { - FREE_AND_NULL(tmpbuf); - return(-1); - } - if (inp>=inend) - enc=buf; - else - enc=buf|((*inp & 0xF0) >> 4); - if(add_char(outp++, enc, done, outend)) { - FREE_AND_NULL(tmpbuf); - return(-1); - } - if(inp==inend) - done=1; - if (!done) { - buf=(*(inp++)<<2)&0x3C; - if (inp == inend) - enc=buf; - else - enc=buf|((*inp & 0xC0)>>6); - } - if(add_char(outp++, enc, done, outend)) { - FREE_AND_NULL(tmpbuf); - return(-1); - } - if(inp==inend) - done=1; - if (!done) - enc=((int)*(inp++))&0x3F; - if(add_char(outp++, enc, done, outend)) { - FREE_AND_NULL(tmpbuf); - return(-1); - } - if(inp==inend) - done=1; - } - if(outp<outend) - *outp=0; - int result; - if(source==target) { - memcpy(target,tmpbuf,tlen); - result = outp - tmpbuf; - free(tmpbuf); - } else - result = outp - target; - - return result; -} - -#ifdef BASE64_TEST -int main(int argc, char**argv) -{ - int i,j; - char buf[512]; - - for(i=1;i<argc;i++) { - j=b64_decode(buf,sizeof(buf),argv[i],0); - printf("%s (%d)\n",buf,j); - } - - return 0; -} -#endif diff --git a/encode/base64.h b/encode/base64.h deleted file mode 100644 index 9f6c19e..0000000 --- a/encode/base64.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Base64 encoding/decoding exported function prototypes */ - -/* $Id: base64.h,v 1.8 2019/03/22 21:29:12 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "gen_defs.h" // ssize_t - -#ifndef _base64_h_ -#define _base64_h_ - -#if defined(_WIN32) && (defined(B64_IMPORTS) || defined(B64_EXPORTS)) - #if defined(B64_IMPORTS) - #define B64EXPORT __declspec(dllimport) - #else - #define B64EXPORT __declspec(dllexport) - #endif -#else /* !_WIN32 */ - #define B64EXPORT -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -B64EXPORT ssize_t b64_encode(char *target, size_t tlen, const char *source, size_t slen); -B64EXPORT ssize_t b64_decode(char *target, size_t tlen, const char *source, size_t slen); - -#ifdef __cplusplus -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/encode/hex.c b/encode/hex.c deleted file mode 100644 index 5cf4c4d..0000000 --- a/encode/hex.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Hexadecimal encode/decode (e.g. URL encode/decode) functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "hex.h" -#include "genwrap.h" -#include "gen_defs.h" - -char* hex_encode(char esc, const char* src, char* chars, char* dest, size_t size) -{ - char* result = dest; - char* end = dest + (size - 1); - - while(*src != '\0' && dest < end) { - if((*src == esc || strchr(chars, *src) != NULL) && dest + 3 < end) - dest += sprintf(dest, "%c%2X", esc, *src); - else - *(dest++) = *src; - src++; - } - *end = '\0'; - return result; -} - -char* hex_decode(char esc, char* str) -{ - char* src = str; - char* dest = str; - while(*src != '\0') { - if(*src == esc && IS_HEXDIGIT(*(src + 1)) && IS_HEXDIGIT(*(src + 2))) { - src++; - *dest = HEX_CHAR_TO_INT(*src) << 4; - src++; - *dest |= HEX_CHAR_TO_INT(*src); - } else - *dest = *src; - src++; - dest++; - } - *dest = '\0'; - return str; -} diff --git a/encode/hex.h b/encode/hex.h deleted file mode 100644 index 9765bca..0000000 --- a/encode/hex.h +++ /dev/null @@ -1,38 +0,0 @@ -/* Hex encode/decode (e.g. URL encode/decode) functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef hex_h_ -#define hex_h_ - -#include <stdlib.h> // size_t - -#ifdef __cplusplus -extern "C" { -#endif - -char* hex_encode(char esc, const char* src, char* chars, char* dest, size_t size); -char* hex_decode(char esc, char* str); - -#ifdef __cplusplus -} -#endif - -#endif /* Don't add anything after this line */ \ No newline at end of file diff --git a/encode/lzh.c b/encode/lzh.c deleted file mode 100644 index ac86335..0000000 --- a/encode/lzh.c +++ /dev/null @@ -1,781 +0,0 @@ -/* lzh.c */ - -/* Synchronet LZH compression library */ - -/* $Id: lzh.c,v 1.16 2020/04/17 14:08:11 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Rob Swindell's conversion of 1988 LZH (LHarc) encoding functions * - * Based on Japanese version 29-NOV-1988 * - * LZSS coded by Haruhiko Okumura * - * Adaptive Huffman Coding coded by Haruyasu Yoshizaki * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> - -/* FreeBSD's malloc.h is deprecated, it drops a warning and */ -/* #includes <stdlib.h>, which is already here. */ -#if !defined(__unix__) - #include <malloc.h> -#endif - -#include "lzh.h" - -#define REALLOC realloc -#define LMALLOC malloc -#define MALLOC malloc -#define LFREE free -#define FREE free - - - -/* LZSS Parameters */ - -#define LZH_N 4096 /* Size of string buffer */ -#define LZH_F 60 /* Size of look-ahead buffer */ -#define LZH_THRESHOLD 2 -#define LZH_NIL LZH_N /* End of tree's node */ - -/* Huffman coding parameters */ - -#define LZH_N_CHAR (256 - LZH_THRESHOLD + LZH_F) - /* character code (= 0..LZH_N_CHAR-1) */ -#define LZH_T (LZH_N_CHAR * 2 - 1) /* Size of table */ -#define LZH_R (LZH_T - 1) /* root position */ -#define MAX_FREQ 0x8000 - /* update when cumulative frequency */ - /* reaches to this value */ - -/* Converted from global variables to struct Apr-21-2003 */ -typedef struct { - -#ifdef LZH_DYNAMIC_BUF - - unsigned char* text_buf; - short int match_position, match_length, - *lson, *rson, *dad; - - unsigned short* freq; /* cumulative freq table */ - - /* - * pointing parent nodes. - * area [LZH_T..(LZH_T + LZH_N_CHAR - 1)] are pointers for leaves - */ - short int* prnt; - - /* pointing children nodes (son[], son[] + 1)*/ - short int* son; - -#else /* STATIC */ - - unsigned char text_buf[LZH_N + LZH_F - 1]; - short int match_position, match_length, - lson[LZH_N + 1], rson[LZH_N + 257], dad[LZH_N + 1]; - - unsigned short freq[LZH_T + 1]; /* cumulative freq table */ - short int prnt[LZH_T + LZH_N_CHAR]; - short int son[LZH_T + 1]; /* bug fixed by Digital Dynamics */ - -#endif - - unsigned short getbuf; /* Was just "unsigned" fixed 04/12/95 */ - uint8_t getlen; - unsigned putbuf; - uint8_t putlen; - - unsigned short code, len; - -} lzh_t; - -static void lzh_init_tree(lzh_t* lzh) /* Initializing tree */ -{ - short int i; - - for (i = LZH_N + 1; i <= LZH_N + 256; i++) - lzh->rson[i] = LZH_NIL; /* root */ - for (i = 0; i < LZH_N; i++) - lzh->dad[i] = LZH_NIL; /* node */ -} - -/******************************/ -/* Inserting node to the tree */ -/* Only used during encoding */ -/******************************/ -static void lzh_insert_node(lzh_t* lzh, short int r) -{ - short int i, p, cmp; - unsigned char *key; - unsigned c; - - cmp = 1; - key = lzh->text_buf+r; - p = LZH_N + 1 + key[0]; - lzh->rson[r] = lzh->lson[r] = LZH_NIL; - lzh->match_length = 0; - for ( ; ; ) { - if (cmp >= 0) { - if (lzh->rson[p] != LZH_NIL) - p = lzh->rson[p]; - else { - lzh->rson[p] = r; - lzh->dad[r] = p; - return; - } - } else { - if (lzh->lson[p] != LZH_NIL) - p = lzh->lson[p]; - else { - lzh->lson[p] = r; - lzh->dad[r] = p; - return; - } - } - for (i = 1; i < LZH_F; i++) - if ((cmp = key[i] - lzh->text_buf[p + i]) != 0) - break; - if (i > LZH_THRESHOLD) { - if (i > lzh->match_length) { - lzh->match_position = ((r - p) & (LZH_N - 1)) - 1; - if ((lzh->match_length = i) >= LZH_F) - break; - } - if (i == lzh->match_length) { - if ((c = ((r - p) & (LZH_N - 1)) - 1) - < (unsigned)lzh->match_position) { - lzh->match_position = c; - } - } - } - } - lzh->dad[r] = lzh->dad[p]; - lzh->lson[r] = lzh->lson[p]; - lzh->rson[r] = lzh->rson[p]; - lzh->dad[lzh->lson[p]] = r; - lzh->dad[lzh->rson[p]] = r; - if (lzh->rson[lzh->dad[p]] == p) - lzh->rson[lzh->dad[p]] = r; - else - lzh->lson[lzh->dad[p]] = r; - lzh->dad[p] = LZH_NIL; /* remove p */ -} - -static void lzh_delete_node(lzh_t* lzh, short int p) /* Deleting node from the tree */ -{ - short int q; - - if (lzh->dad[p] == LZH_NIL) - return; /* unregistered */ - if (lzh->rson[p] == LZH_NIL) - q = lzh->lson[p]; - else - if (lzh->lson[p] == LZH_NIL) - q = lzh->rson[p]; - else { - q = lzh->lson[p]; - if (lzh->rson[q] != LZH_NIL) { - do { - q = lzh->rson[q]; - } while (lzh->rson[q] != LZH_NIL); - lzh->rson[lzh->dad[q]] = lzh->lson[q]; - lzh->dad[lzh->lson[q]] = lzh->dad[q]; - lzh->lson[q] = lzh->lson[p]; - lzh->dad[lzh->lson[p]] = q; - } - lzh->rson[q] = lzh->rson[p]; - lzh->dad[lzh->rson[p]] = q; - } - lzh->dad[q] = lzh->dad[p]; - if (lzh->rson[lzh->dad[p]] == p) - lzh->rson[lzh->dad[p]] = q; - else - lzh->lson[lzh->dad[p]] = q; - lzh->dad[p] = LZH_NIL; -} - -/* - * Tables for encoding/decoding upper 6 bits of - * sliding dictionary pointer - */ -/* encoder table */ -static uint8_t lzh_p_len[64] = { - 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 -}; - -static uint8_t lzh_p_code[64] = { - 0x00, 0x20, 0x30, 0x40, 0x50, 0x58, 0x60, 0x68, - 0x70, 0x78, 0x80, 0x88, 0x90, 0x94, 0x98, 0x9C, - 0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC, - 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, - 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE, - 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, - 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -}; - -/* decoder table */ -static uint8_t lzh_d_code[256] = { - 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, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, - 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, - 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, - 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, - 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, - 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, - 0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, - 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F, - 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, - 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, - 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, - 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, -}; - -static uint8_t lzh_d_len[256] = { - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -}; - - -static int lzh_getbit(lzh_t* lzh, uint8_t *inbuf, int32_t *incnt, long inlen) /* get one bit */ -{ - short int i; - - while (lzh->getlen <= 8) { - if((*incnt)>=inlen) - i=0; - else - i=inbuf[(*incnt)++]; - lzh->getbuf |= i << (8 - lzh->getlen); - lzh->getlen += 8; - } - i = lzh->getbuf; - lzh->getbuf <<= 1; - lzh->getlen--; - return (i < 0); -} - -static short int lzh_getbyte(lzh_t* lzh, uint8_t *inbuf, int32_t *incnt, long inlen) /* get a byte */ -{ - unsigned short i; - - while (lzh->getlen <= 8) { - if((*incnt)>=inlen) - i=0; - else - i=inbuf[(*incnt)++]; - lzh->getbuf |= i << (8 - lzh->getlen); - lzh->getlen += 8; - } - i = lzh->getbuf; - lzh->getbuf <<= 8; - lzh->getlen -= 8; - return i >> 8; -} - - -/* output c bits */ -static void lzh_putcode(lzh_t* lzh, short int l, unsigned short c, uint8_t *outbuf, int32_t *outlen) -{ - lzh->putbuf |= c >> lzh->putlen; - if ((lzh->putlen += l) >= 8) { - outbuf[(*outlen)++]=(lzh->putbuf >> 8); - if ((lzh->putlen -= 8) >= 8) { - outbuf[(*outlen)++]=lzh->putbuf; - lzh->putlen -= 8; - lzh->putbuf = c << (l - lzh->putlen); - } else { - lzh->putbuf <<= 8; - } - } -} - - -/* initialize freq tree */ - -static void lzh_start_huff(lzh_t* lzh) -{ - short int i, j; - - for (i = 0; i < LZH_N_CHAR; i++) { - lzh->freq[i] = 1; - lzh->son[i] = i + LZH_T; - lzh->prnt[i + LZH_T] = i; - } - i = 0; j = LZH_N_CHAR; - while (j <= LZH_R) { - lzh->freq[j] = lzh->freq[i] + lzh->freq[i + 1]; - lzh->son[j] = i; - lzh->prnt[i] = lzh->prnt[i + 1] = j; - i += 2; j++; - } - lzh->freq[LZH_T] = 0xffff; - lzh->prnt[LZH_R] = 0; -} - - -/* reconstruct freq tree */ - -static void lzh_reconst(lzh_t* lzh) -{ - short int i, j, k; - unsigned short f, l; - - /* halven cumulative freq for leaf nodes */ - j = 0; - for (i = 0; i < LZH_T; i++) { - if (lzh->son[i] >= LZH_T) { - lzh->freq[j] = (lzh->freq[i] + 1) / 2; - lzh->son[j] = lzh->son[i]; - j++; - } - } - /* make a tree : first, connect children nodes */ - for (i = 0, j = LZH_N_CHAR; j < LZH_T; i += 2, j++) { - k = i + 1; - f = lzh->freq[j] = lzh->freq[i] + lzh->freq[k]; - for (k = j - 1; f < lzh->freq[k]; k--); - k++; - l = (j - k) * 2; - - /* movmem() is Turbo-C dependent - rewritten to memmove() by Kenji */ - - /* movmem(&lzh->freq[k], &lzh->freq[k + 1], l); */ - (void)memmove(lzh->freq+k+1,lzh->freq+k, l); - lzh->freq[k] = f; - /* movmem(&lzh->son[k], &lzh->son[k + 1], l); */ - (void)memmove(lzh->son+k+1,lzh->son+k, l); - lzh->son[k] = i; - } - /* connect parent nodes */ - for (i = 0; i < LZH_T; i++) { - if ((k = lzh->son[i]) >= LZH_T) { - lzh->prnt[k] = i; - } else { - lzh->prnt[k] = lzh->prnt[k + 1] = i; - } - } -} - -/* update freq tree */ - -static void lzh_update(lzh_t* lzh, short int c) -{ - short int i, j, k, l; - - if (lzh->freq[LZH_R] == MAX_FREQ) { - lzh_reconst(lzh); - } - c = lzh->prnt[c + LZH_T]; - do { - k = ++lzh->freq[c]; - - /* swap nodes to keep the tree freq-ordered */ - if (((unsigned)k) > ((unsigned)lzh->freq[l = c + 1])) { - while (l < (sizeof(lzh->freq) / sizeof(lzh->freq[0]) - 1) && k > lzh->freq[++l]); - l--; - lzh->freq[c] = lzh->freq[l]; - lzh->freq[l] = k; - - i = lzh->son[c]; - lzh->prnt[i] = l; - if (i < LZH_T) lzh->prnt[i + 1] = l; - - j = lzh->son[l]; - lzh->son[l] = i; - - lzh->prnt[j] = c; - if (j < LZH_T) lzh->prnt[j + 1] = c; - lzh->son[c] = j; - - c = l; - } - } while (((c = lzh->prnt[c]) != 0) && c < ((sizeof(lzh->son)/sizeof(lzh->son[0]))-1)); /* do it until reaching the root */ -} - -static void lzh_encode_char(lzh_t* lzh, unsigned short c, uint8_t *outbuf, int32_t *outlen) -{ - unsigned short i; - short int j, k; - - i = 0; - j = 0; - k = lzh->prnt[c + LZH_T]; - - /* search connections from leaf node to the root */ - do { - i >>= 1; - - /* - if node's address is odd, output 1 - else output 0 - */ - if (k & 1) i += 0x8000; - - j++; - } while ((k = lzh->prnt[k]) != LZH_R); - lzh_putcode(lzh, j, i, outbuf, outlen); - lzh->code = i; - lzh->len = j; - lzh_update(lzh,c); -} - -static void lzh_encode_position(lzh_t* lzh, unsigned short c, uint8_t *outbuf, int32_t *outlen) -{ - unsigned short i; - - /* output upper 6 bits with encoding */ - i = c >> 6; - lzh_putcode(lzh, lzh_p_len[i], (unsigned short)(lzh_p_code[i] << 8), outbuf, outlen); - - /* output lower 6 bits directly */ - lzh_putcode(lzh, 6, (unsigned short)((c & 0x3f) << 10), outbuf, outlen); -} - -static void lzh_encode_end(lzh_t* lzh, uint8_t *outbuf, int32_t *outlen) -{ - if (lzh->putlen) { - outbuf[(*outlen)++]=(lzh->putbuf >> 8); - } -} - -static short int lzh_decode_char(lzh_t* lzh, uint8_t *inbuf, int32_t *incnt, long inlen) -{ - unsigned short c; - - c = lzh->son[LZH_R]; - - /* - * start searching tree from the root to leaves. - * choose node #(lzh.son[]) if input bit == 0 - * else choose #(lzh.son[]+1) (input bit == 1) - */ - while (c < LZH_T) { - c += lzh_getbit(lzh,inbuf,incnt,inlen); - c = lzh->son[c]; - } - c -= LZH_T; - lzh_update(lzh,c); - return c; -} - -static short int lzh_decode_position(lzh_t* lzh, uint8_t *inbuf, int32_t *incnt, long inlen) -{ - unsigned short i, j, c; - - /* decode upper 6 bits from given table */ - i = lzh_getbyte(lzh,inbuf,incnt,inlen); - c = (unsigned)lzh_d_code[i] << 6; - j = lzh_d_len[i]; - - /* input lower 6 bits directly */ - j -= 2; - while (j--) { - i = (i << 1) + lzh_getbit(lzh,inbuf,incnt,inlen); - } - return c | (i & 0x3f); -} - -/* Compression */ - -/* Encoding/Compressing */ -/* Returns length of outbuf */ -int32_t lzh_encode(uint8_t *inbuf, int32_t inlen, uint8_t *outbuf) -{ - short int i, c, len, r, s, last_match_length; - int32_t incnt,outlen; /* textsize=0; */ - lzh_t lzh; - memset(&lzh,0,sizeof(lzh)); - -#ifdef LZH_DYNAMIC_BUF - - if((lzh.text_buf=(uint8_t *)malloc(LZH_N + LZH_F - 1))==NULL) - return(-1); - if((lzh.freq=(unsigned short*)malloc((LZH_T + 1)*sizeof(unsigned short)))==NULL) { - free(lzh.text_buf); - return(-1); } - if((lzh.prnt=(short *)malloc((LZH_T + LZH_N_CHAR)*sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.freq); - return(-1); } - if((lzh.son=(short *)malloc((LZH_T + 1) * sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - return(-1); } - if((lzh.lson=(short *)malloc((LZH_N + 1)*sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); - return(-1); } - if((lzh.rson=(short *)malloc((LZH_N + 257)*sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); - free(lzh.lson); - return(-1); } - if((lzh.dad=(short *)malloc((LZH_N + 1)*sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); - free(lzh.lson); - free(lzh.rson); - return(-1); } -#endif - - incnt=0; - memcpy(outbuf,&inlen,sizeof(inlen)); - outlen=sizeof(inlen); - if(!inlen) { -#ifdef LZH_DYNAMIC_BUF - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); - free(lzh.lson); - free(lzh.rson); - free(lzh.dad); -#endif - return(outlen); } - lzh_start_huff(&lzh); - lzh_init_tree(&lzh); - s = 0; - r = LZH_N - LZH_F; - for (i = s; i < r; i++) - lzh.text_buf[i] = ' '; - for (len = 0; len < LZH_F && incnt<inlen; len++) - lzh.text_buf[r + len] = inbuf[incnt++]; - /* textsize = len; */ - for (i = 1; i <= LZH_F; i++) - lzh_insert_node(&lzh,(short)(r - i)); - lzh_insert_node(&lzh,r); - do { - if (lzh.match_length > len) - lzh.match_length = len; - if (lzh.match_length <= LZH_THRESHOLD) { - lzh.match_length = 1; - lzh_encode_char(&lzh,lzh.text_buf[r],outbuf,&outlen); - } else { - lzh_encode_char(&lzh,(unsigned short)(255 - LZH_THRESHOLD + lzh.match_length) - ,outbuf,&outlen); - lzh_encode_position(&lzh,lzh.match_position - ,outbuf,&outlen); - } - last_match_length = lzh.match_length; - for (i = 0; i < last_match_length && incnt<inlen; i++) { - lzh_delete_node(&lzh,s); - c=inbuf[incnt++]; - lzh.text_buf[s] = (uint8_t)c; - if (s < LZH_F - 1) - lzh.text_buf[s + LZH_N] = (uint8_t)c; - s = (s + 1) & (LZH_N - 1); - r = (r + 1) & (LZH_N - 1); - lzh_insert_node(&lzh,r); - } -/*** - if ((textsize += i) > printcount) { - printf("%12ld\r", textsize); - printcount += 1024; - } -***/ - while (i++ < last_match_length) { - lzh_delete_node(&lzh,s); - s = (s + 1) & (LZH_N - 1); - r = (r + 1) & (LZH_N - 1); - if (--len) lzh_insert_node(&lzh,r); - } - } while (len > 0); - lzh_encode_end(&lzh,outbuf,&outlen); -/* - printf("input: %ld (%ld) bytes\n", inlen,textsize); - printf("output: %ld bytes\n", outlen); - printf("output/input: %.3f\n", (double)outlen / inlen); -*/ - -#ifdef LZH_DYNAMIC_BUF - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); - free(lzh.lson); - free(lzh.rson); - free(lzh.dad); -#endif - - return(outlen); -} - -/* Decoding/Uncompressing */ -/* Returns length of outbuf */ -int32_t lzh_decode(uint8_t *inbuf, int32_t inlen, uint8_t *outbuf) -{ - short int i, j, k, r, c; - uint32_t count; - int32_t incnt,textsize; - lzh_t lzh; - - memset(&lzh,0,sizeof(lzh)); -#ifdef LZH_DYNAMIC_BUF - - if((lzh.text_buf=(uint8_t *)malloc((LZH_N + LZH_F - 1)*2))==NULL) - return(-1); - if((lzh.freq=(unsigned short *)malloc((LZH_T + 1)*sizeof(unsigned short))) - ==NULL) { - free(lzh.text_buf); - return(-1); } - if((lzh.prnt=(short *)malloc((LZH_T + LZH_N_CHAR)*sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.freq); - return(-1); } - if((lzh.son=(short *)malloc((LZH_T + 1) * sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - return(-1); } - -#endif - - incnt=0; - memcpy(&textsize,inbuf,sizeof(textsize)); - incnt+=sizeof(textsize); - if (textsize == 0) { -#ifdef LZH_DYNAMIC_BUF - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); -#endif - return(textsize); } - lzh_start_huff(&lzh); - for (i = 0; i < LZH_N - LZH_F; i++) - *(lzh.text_buf+i) = ' '; - r = LZH_N - LZH_F; - for (count = 0; count < (unsigned long)textsize; ) { - c = lzh_decode_char(&lzh,inbuf,&incnt,inlen); - if (c < 256) { - outbuf[count]=(uint8_t)c; -#if 0 - if(r>(LZH_N + LZH_F - 1) || r<0) { - printf("Overflow! (%d)\n",r); - getch(); - exit(-1); } -#endif - *(lzh.text_buf+r) = (uint8_t)c; - r++; - r &= (LZH_N - 1); - count++; - } else { - i = (r - lzh_decode_position(&lzh,inbuf,&incnt,inlen) - 1) - & (LZH_N - 1); - j = c - 255 + LZH_THRESHOLD; - for (k = 0; k < j && count<(unsigned long)textsize; k++) { - c = lzh.text_buf[(i + k) & (LZH_N - 1)]; - outbuf[count]=(uint8_t)c; -#if 0 - if(r>(LZH_N + LZH_F - 1) || r<0) { - printf("Overflow! (%d)\n",r); - exit(-1); } -#endif - *(lzh.text_buf+r) = (uint8_t)c; - r++; - r &= (LZH_N - 1); - count++; - } - } - } -/*** - printf("%12ld\n", count); -***/ - -#ifdef LZH_DYNAMIC_BUF - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); -#endif - -return(count); -} - - diff --git a/encode/lzh.h b/encode/lzh.h deleted file mode 100644 index 9776651..0000000 --- a/encode/lzh.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Synchronet LZH compression library */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Rob Swindell's conversion of 1988 LZH (LHarc) encoding functions * - * Based on Japanese version 29-NOV-1988 * - * LZSS coded by Haruhiko Okumura * - * Adaptive Huffman Coding coded by Haruyasu Yoshizaki * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _LZH_H_ -#define _LZH_H_ - -#ifdef LZHEXPORT - #undef LZHEXPORT -#endif - -#ifdef _WIN32 - #ifdef LZHDLL /* LZH functions in DLL */ - #ifdef LZH_EXPORTS - #define LZHEXPORT __declspec( dllexport ) - #else - #define LZHEXPORT __declspec( dllimport ) - #endif - #else /* self-contained executable */ - #define LZHEXPORT - #endif -#else /* !_WIN32 */ - #define LZHEXPORT -#endif - -#include "gen_defs.h" - -#ifdef __cplusplus -extern "C" { -#endif -LZHEXPORT int32_t lzh_encode(uint8_t *inbuf, int32_t inlen, uint8_t *outbuf); -LZHEXPORT int32_t lzh_decode(uint8_t *inbuf, int32_t inlen, uint8_t *outbuf); -#ifdef __cplusplus -} -#endif - -#ifdef __WATCOMC__ /* Use MSC standard (prepended underscore) */ -#pragma aux lzh_encode "_*" -#pragma aux lzh_decode "_*" -#endif - -#endif /* Do not add anything after this line */ diff --git a/encode/utf8.c b/encode/utf8.c deleted file mode 100644 index 94c6d7d..0000000 --- a/encode/utf8.c +++ /dev/null @@ -1,524 +0,0 @@ -/* Synchronet UTF-8 encode/decode/translate functions */ - -/* $Id: utf8.c,v 1.9 2019/08/03 08:05:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "utf8.h" -#include "unicode.h" -#include <stdbool.h> -#include <string.h> - -char* utf8_normalize_str(char* str) -{ - char* dest = str; - - for(char* src = str; *src != 0; src++) { - if(*src == '\xC2' && *(src + 1) == '\xA0') { // NO-BREAK SPACE - src++; - *dest++ = ' '; - continue; - } - if(*src == '\xE2') { - if(*(src + 1) == '\x80') { - switch(*(src + 2)) { - case '\x82': // EN SPACE - case '\x83': // EM SPACE - src += 2; - *dest++ = ' '; - continue; - case '\x8B': // ZERO WIDTH SPACE - case '\x8C': // ZERO WIDTH NON-JOINER - case '\x8D': // ZERO WIDTH JOINER - src += 2; - continue; - case '\x90': // HYPHEN - case '\x91': // NON-BREAKING HYPHEN - case '\x92': // FIGURE DASH - case '\x93': // EN DASH - src += 2; - *dest++ = '-'; - continue; - case '\x98': // LEFT SINGLE QUOTATION MARK - src += 2; - *dest++ = '`'; - continue; - case '\x99': // RIGHT SINGLE QUOTATION MARK - case '\xB2': // PRIME - src += 2; - *dest++ = '\''; - continue; - case '\x9C': // LEFT DOUBLE QUOTATION MARK - case '\x9D': // RIGHT DOUBLE QUOTATION MARK - src += 2; - *dest++ = '"'; - continue; - case '\xA6': // HORIZONTAL ELLIPSIS -> ASCII periods (3) - src += 2; - for(int i = 0; i < 3; i++) - *dest++ = '.'; - continue; - } - } - else if(*(src + 1) == '\x81') { - switch(*(src + 2)) { - case '\x83': // HYPEN BULLET - src += 2; - *dest++ = '-'; - continue; - case '\x84': // FRACTION SLASH - src += 2; - *dest++ = '/'; - continue; - } - } - else if(*(src + 1) == '\x88') { - switch(*(src + 2)) { - case '\x92': // MINUS SIGN - src += 2; - *dest++ = '-'; - continue; - } - } - } - else if(*src == '\xEF') { - if(*(src + 1) == '\xBB' && *(src + 2) == '\xBF') { - // Zero Width No-Break Space (BOM, ZWNBSP) - src += 2; - continue; - } - if(*(src + 1) == '\xBC') { - if(*(src + 2) >= '\x81' && *(src + 2) <= '\xBF') { // FULLWIDTH EXCLAMATION MARK through FULLWIDTH LOW LINE - src += 2; - *src -= '\x81'; - *dest++ = '!' + *src; - continue; - } - } - else if(*(src + 1) == '\xBD') { - if(*(src + 2) >= '\x80' && *(src + 2) <= '\x9E') { // FULLWIDTH GRAVE ACCENT through FULLWIDTH TILDE - src += 2; - *src -= '\x80'; - *dest++ = '`' + *src; - continue; - } - } - } - *dest++ = *src; - } - *dest = 0; - return str; -} - -/* Replace all multi-byte UTF-8 sequences with 'ch' or 'zwch' (when non-zero) */ -/* When ch and zwch are 0, effectively strips all multi-byte UTF-8 codepoints from str */ -char* utf8_replace_chars(char* str, char (*lookup)(enum unicode_codepoint), char unsupported_ch, char unsupported_zwch, char error_ch) -{ - char* end = str + strlen(str); - char* dest = str; - - int len ; - for(char* src= str; src < end; src += len) { - if(!(*src & 0x80)) { - *dest++ = *src; - len = 1; - continue; - } - enum unicode_codepoint codepoint = 0; - len = utf8_getc(src, end - src, &codepoint); - if(len < 2) { - if(error_ch) - *dest++ = error_ch; - len = 1; - continue; - } - if(lookup != NULL) { - char ch = lookup(codepoint); - if(ch) { - *dest++ = ch; - continue; - } - } - if(unicode_width(codepoint) == 0) { - if(unsupported_zwch) - *dest++ = unsupported_zwch; - } - else if(unsupported_ch) - *dest++ = unsupported_ch; - } - *dest = 0; - return str; -} - -bool utf8_str_is_valid(const char* str) -{ - const char* end = str + strlen(str); - while (str < end) { - int len = utf8_getc(str, end - str, NULL); - if (len < 1) - return false; - str += len; - } - return true; -} - -// Return the total printed-width of UTF-8 string (str) accounting for zero/half/full-width codepoints -size_t utf8_str_total_width(const char* str) -{ - size_t count = 0; - const char* end = str + strlen(str); - while (str < end) { - enum unicode_codepoint codepoint = 0; - int len = utf8_getc(str, end - str, &codepoint); - if (len < 1) - break; - count += unicode_width(codepoint); - str += len; - } - return count; -} - -// Return the count of codepoints within the specified width range in UTF-8 string (str) -size_t utf8_str_count_width(const char* str, size_t min_width, size_t max_width) -{ - size_t count = 0; - const char* end = str + strlen(str); - while (str < end) { - enum unicode_codepoint codepoint = 0; - int len = utf8_getc(str, end - str, &codepoint); - if (len < 1) - break; - size_t width = unicode_width(codepoint); - if(width >= min_width && width <= max_width) - count++; - str += len; - } - return count; -} - -int cp437_to_utf8_str(const char* str, char* dest, size_t maxlen, unsigned char minval, size_t *outlen) -{ - int retval = 0; - size_t lcl_outlen; - if (outlen == NULL) - outlen = &lcl_outlen; - *outlen = 0; - for(const unsigned char* p = (const unsigned char*)str; *p != 0; p++) { - if(*outlen >= maxlen) { - retval = -1; - break; - } - enum unicode_codepoint codepoint = 0; - if(*p >= minval) - codepoint = cp437_unicode_tbl[*p]; - if(codepoint) { - retval = utf8_putc(dest + *outlen, maxlen - *outlen, codepoint); - if(retval < 1) - break; - *outlen += retval; - } else { - *(dest + *outlen) = *p; - (*outlen)++; - } - } - *(dest + *outlen) = 0; - return retval; -} - -int utf8_to_cp437_str(const char *src, char *dest, size_t maxlen, unsigned char minval, size_t *outlen) -{ - int retval = 0; - size_t lcl_outlen; - unsigned char ch; - if (outlen == NULL) - outlen = &lcl_outlen; - *outlen = 0; - for(const char* p = src; *p != 0; p += retval) { - if(*outlen >= maxlen) { - retval = -1; - break; - } - enum unicode_codepoint codepoint; - retval = utf8_getc(p, maxlen - *outlen, &codepoint); - if (retval < 1) - break; - ch = unicode_to_cp437(codepoint); - if (ch) { - *(dest + *outlen) = ch; - (*outlen)++; - } - } - *(dest + *outlen) = 0; - return retval; -} - -int latin1_to_utf8_str(const char* str, char* dest, size_t maxlen, unsigned char minval, size_t *outlen) -{ - int retval = 0; - size_t lcl_outlen; - if (outlen == NULL) - outlen = &lcl_outlen; - *outlen = 0; - for(const unsigned char* p = (const unsigned char *)str; *p != 0; p++) { - if(*outlen >= maxlen) { - retval = -1; - break; - } - enum unicode_codepoint codepoint = 0; - if(*p >= minval) - codepoint = *p; - if(codepoint) { - retval = utf8_putc(dest + *outlen, maxlen - *outlen, codepoint); - if(retval < 1) - break; - *outlen += retval; - } else { - *(dest + *outlen) = *p; - (*outlen)++; - } - } - *(dest + *outlen) = 0; - return retval; -} - -int utf8_to_latin1_str(const char *src, char *dest, size_t maxlen, unsigned char minval, size_t *outlen) -{ - int retval = 0; - size_t lcl_outlen; - unsigned char ch; - if (outlen == NULL) - outlen = &lcl_outlen; - *outlen = 0; - for(const char* p = src; *p != 0; p += retval) { - if(*outlen >= maxlen) { - retval = -1; - break; - } - enum unicode_codepoint codepoint; - retval = utf8_getc(p, maxlen - *outlen, &codepoint); - if (retval < 1) - break; - ch = unicode_to_latin1(codepoint); - if (ch) { - *(dest + *outlen) = ch; - (*outlen)++; - } - } - *(dest + *outlen) = 0; - return retval; -} - -// From openssl/crypto/asn1/a_utf8.c: -/* - * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* UTF8 utilities */ - -/*- - * This parses a UTF8 string one codepoint at a time. It is passed a pointer - * to the string and the size of the string (in bytes). It sets 'value' to - * the value of the current codepoint. It returns the number of bytes read - * or a negative error code: - * -1 = string too short - * -2 = illegal character - * -3 = subsequent characters not of the form 10xxxxxx - * -4 = character encoded incorrectly (not minimal length). - */ - -int utf8_getc(const char *str, size_t len, enum unicode_codepoint* val) -{ - const unsigned char *p; - unsigned long value; - int ret; - if (len <= 0) - return 0; - p = (const unsigned char*)str; - - /* Check syntax and work out the encoded value (if correct) */ - if ((*p & 0x80) == 0) { - value = *p++ & 0x7f; - ret = 1; - } else if ((*p & 0xe0) == 0xc0) { - if (len < 2) - return -1; - if ((p[1] & 0xc0) != 0x80) - return -3; - value = (*p++ & 0x1f) << 6; - value |= *p++ & 0x3f; - if (value < 0x80) - return -4; - ret = 2; - } else if ((*p & 0xf0) == 0xe0) { - if (len < 3) - return -1; - if (((p[1] & 0xc0) != 0x80) - || ((p[2] & 0xc0) != 0x80)) - return -3; - value = (*p++ & 0xf) << 12; - value |= (*p++ & 0x3f) << 6; - value |= *p++ & 0x3f; - if (value < 0x800) - return -4; - ret = 3; - } else if ((*p & 0xf8) == 0xf0) { - if (len < 4) - return -1; - if (((p[1] & 0xc0) != 0x80) - || ((p[2] & 0xc0) != 0x80) - || ((p[3] & 0xc0) != 0x80)) - return -3; - value = ((unsigned long)(*p++ & 0x7)) << 18; - value |= (*p++ & 0x3f) << 12; - value |= (*p++ & 0x3f) << 6; - value |= *p++ & 0x3f; - if (value < 0x10000) - return -4; - ret = 4; - } else if ((*p & 0xfc) == 0xf8) { - if (len < 5) - return -1; - if (((p[1] & 0xc0) != 0x80) - || ((p[2] & 0xc0) != 0x80) - || ((p[3] & 0xc0) != 0x80) - || ((p[4] & 0xc0) != 0x80)) - return -3; - value = ((unsigned long)(*p++ & 0x3)) << 24; - value |= ((unsigned long)(*p++ & 0x3f)) << 18; - value |= ((unsigned long)(*p++ & 0x3f)) << 12; - value |= (*p++ & 0x3f) << 6; - value |= *p++ & 0x3f; - if (value < 0x200000) - return -4; - ret = 5; - } else if ((*p & 0xfe) == 0xfc) { - if (len < 6) - return -1; - if (((p[1] & 0xc0) != 0x80) - || ((p[2] & 0xc0) != 0x80) - || ((p[3] & 0xc0) != 0x80) - || ((p[4] & 0xc0) != 0x80) - || ((p[5] & 0xc0) != 0x80)) - return -3; - value = ((unsigned long)(*p++ & 0x1)) << 30; - value |= ((unsigned long)(*p++ & 0x3f)) << 24; - value |= ((unsigned long)(*p++ & 0x3f)) << 18; - value |= ((unsigned long)(*p++ & 0x3f)) << 12; - value |= (*p++ & 0x3f) << 6; - value |= *p++ & 0x3f; - if (value < 0x4000000) - return -4; - ret = 6; - } else - return -2; - if(val != NULL) - *val = value; - return ret; -} - -/* - * This takes a codepoint 'value' and writes the UTF8 encoded sequence in 'str' - * where 'str' is a buffer of 'len' bytes. Returns the number of bytes written - * or -1 if 'len' is too small. 'str' can be set to NULL in which case it just - * returns the number of bytes. It will need at most 6 bytes. - */ - -int utf8_putc(char *str, size_t len, unsigned value) -{ - if (!str) - len = 6; /* Maximum we will need */ - else if (len <= 0) - return -1; - if (value < 0x80) { - if (str) - *str = (unsigned char)value; - return 1; - } - if (value < 0x800) { - if (len < 2) - return -1; - if (str) { - *str++ = (unsigned char)(((value >> 6) & 0x1f) | 0xc0); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 2; - } - if (value < 0x10000) { - if (len < 3) - return -1; - if (str) { - *str++ = (unsigned char)(((value >> 12) & 0xf) | 0xe0); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 3; - } - if (value < 0x200000) { - if (len < 4) - return -1; - if (str) { - *str++ = (unsigned char)(((value >> 18) & 0x7) | 0xf0); - *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 4; - } - if (value < 0x4000000) { - if (len < 5) - return -1; - if (str) { - *str++ = (unsigned char)(((value >> 24) & 0x3) | 0xf8); - *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 5; - } - if (len < 6) - return -1; - if (str) { - *str++ = (unsigned char)(((value >> 30) & 0x1) | 0xfc); - *str++ = (unsigned char)(((value >> 24) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 6; -} diff --git a/encode/utf8.h b/encode/utf8.h deleted file mode 100644 index 2cbe6b9..0000000 --- a/encode/utf8.h +++ /dev/null @@ -1,90 +0,0 @@ -/* Synchronet UTF-8 translation functions */ - -/* $Id: utf8.h,v 1.6 2019/08/03 08:05:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef UTF8_H_ -#define UTF8_H_ - -#include <stdbool.h> -#include <stdlib.h> -#include "unicode_defs.h" - -#define UTF8_MAX_LEN 6 // Longest possible UTF-8 sequence - -#if defined(__cplusplus) -extern "C" { -#endif - -// Returns true if the string is valid UTF-8 -bool utf8_str_is_valid(const char*); - -// Returns the fixed printed-width of the UTF-8 string -size_t utf8_str_total_width(const char*); - -// Return the count of codepoints within the specified width range in UTF-8 string (str) -size_t utf8_str_count_width(const char*, size_t min_width, size_t max_width); - -// Normalizes (to ASCII) chars in UTF-8 string 'str', in-place, resulting in string <= original in length -char* utf8_normalize_str(char* str); - -// Replace or strip UTF-8 sequences in str (in-place) -// 'lookup' is a Unicode codepoint look-up function (optional) -// 'unsupported_ch' is the byte used to replace unsupported Unicode codepoints (optional) -// 'unsupported_zwch' is the byte used to replace unsupported zero-width Unicode codepoints (optional) -// 'error_ch' is the byte used to replace invalid UTF-8 sequence bytes (optional) -char* utf8_replace_chars(char* str, char (*lookup)(enum unicode_codepoint), char unsupported_ch, char unsupported_zwch, char error_ch); - -// Convert a CP437 char string (src) to UTF-8 string (dest) up to 'maxlen' bytes long (sans NUL-terminator) -// 'minval' can be used to limit the range of converted chars. On return, *outlen is set to the number -// of bytes written to dest unless it is NULL -int cp437_to_utf8_str(const char* src, char* dest, size_t maxlen, unsigned char minval, size_t *outlen); -int utf8_to_cp437_str(const char *src, char *dest, size_t maxlen, unsigned char minval, size_t *outlen); - -// Convert a Latin1 char string (src) to UTF-8 string (dest) up to 'maxlen' bytes long (sans NUL-terminator) -// 'minval' can be used to limit the range of converted chars. On return, *outlen is set to the number -// of bytes written to dest unless it is NULL -int latin1_to_utf8_str(const char* str, char* dest, size_t maxlen, unsigned char minval, size_t *outlen); -int utf8_to_latin1_str(const char *src, char *dest, size_t maxlen, unsigned char minval, size_t *outlen); - -// Decode a UTF-8 sequence to a UNICODE code point -int utf8_getc(const char* str, size_t len, enum unicode_codepoint* codepoint); - -// Encode a UNICODE code point into a UTF-8 sequence (str) -int utf8_putc(char* str, size_t len, unsigned codepoint); - -#if defined(__cplusplus) -} -#endif - -#endif // Don't add anything after this line diff --git a/encode/uucode.c b/encode/uucode.c deleted file mode 100644 index 8c985ae..0000000 --- a/encode/uucode.c +++ /dev/null @@ -1,248 +0,0 @@ -/* uucode.c */ - -/* Unix-to-unix encoding/decoding routines */ - -/* $Id: uucode.c,v 1.6 2019/07/18 03:10:54 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include "uucode.h" - -ssize_t uudecode(char *target, size_t tlen, const char *source, size_t slen) -{ - int i; - char ch; - size_t rd=0; - size_t wr=0; - size_t block; - size_t len; - unsigned char cell[4]; - - if(slen==0) - slen=strlen(source); - while(rd<slen && wr<tlen) { - ch=source[rd++]; - if(ch<' ') - continue; - len=(ch-' ')&0x3f; - if(len<=0 || rd>=slen) - break; - block=0; - while(block<len && wr<tlen && rd<slen) { - memset(cell,0,sizeof(cell)); - /* Remove space bias */ - for(i=0;i<sizeof(cell) && rd<slen;i++) { - cell[i]=source[rd++]; - if(cell[i]>=' ') cell[i]-=' '; - } - /* Convert block of 4 6-bit chars into 3 8-bit chars */ - target[wr]=(cell[0]&0x3f)<<2; /* lower 6 (s1) to upper 6 (d1) */ - target[wr++]|=(cell[1]&0x30)>>4; /* upper 2 (s2) to lower 2 (d1) */ - target[wr]=(cell[1]&0x0f)<<4; /* lower 4 (s2) to upper 4 (d2) */ - target[wr++]|=(cell[2]&0x3c)>>2; /* upper 4 (s3) to lower 4 (d2) */ - target[wr]=(cell[2]&0x03)<<6; /* lower 2 (s3) to upper 2 (d3) */ - target[wr++]|=cell[3]&0x3f; /* lower 6 (s4) to lower 6 (d3) */ - block+=3; - } -#if 0 - if(block!=len) { - fprintf(stderr,"block (%d) != len (%d)\n",block,len); - return(-1); - } -#endif - while(rd<slen && source[rd]>' ') - rd++; /* find whitespace (line termination) */ - while(rd<slen && source[rd]!=0 && source[rd]<=' ') - rd++; /* skip whitespace separating blocks/lines */ - } - - return(wr); -} - -#define BIAS(b) if((b)==0) (b)='`'; else (b)+=' '; - -ssize_t uuencode(char *target, size_t tlen, const char *source, size_t slen) -{ - size_t rd=0; - size_t wr=0; - size_t block; - size_t len; - - if(slen==0) - slen=strlen(source); - - if(tlen<3) - return(-1); - tlen-=3; /* reserve room for terminator */ - while(rd<=slen && wr<tlen) { - len=45; - if(rd+len>slen) - len=slen-rd; - BIAS(len); - target[wr++]=(char)len; - - block=0; - while(block<len && wr<tlen && rd<slen) { - target[wr]=source[rd]>>2; /* upper 6 (s1) to lower 6 (d1) */ - BIAS(target[wr]); wr++; - target[wr]=(source[rd++]&0x03)<<4; /* lower 2 (s1) to upper 2 (d2) */ - target[wr]|=source[rd]>>4; /* upper 4 (s2) to lower 4 (d2) */ - BIAS(target[wr]); wr++; - target[wr]=(source[rd++]&0x0f)<<2; /* lower 4 (s2) to upper 4 (d3) */ - target[wr]|=source[rd]>>6; /* upper 2 (s3) to lower 2 (d3) */ - BIAS(target[wr]); wr++; - target[wr]=source[rd++]&0x3f; /* lower 6 (s3) to lower 6 (d4) */ - BIAS(target[wr]); wr++; - block+=3; - } - if(wr<tlen) { - target[wr++]='\r'; - target[wr++]='\n'; - } - if(rd>=slen) - break; - } - - if(wr<tlen) - target[wr++]=0; - return(wr); -} - -#ifdef UUDECODE_TEST - -static char* truncstr(char* str, const char* set) -{ - char* p; - - p=strpbrk(str,set); - if(p!=NULL) - *p=0; - - return(p); -} - -int main(int argc, char**argv) -{ - char str[1024]; - char buf[256]; - char* p; - FILE* in; - FILE* out=NULL; - int len; - int line; - - if(argc<2) { - fprintf(stderr,"usage: uudecode infile\n"); - return 1; - } - - if((in=fopen(argv[1],"rb"))==NULL) { - perror(argv[1]); - return 1; - } - - while(!feof(in)) { - memset(str,0,sizeof(str)); - if(fgets(str,sizeof(str),in)==NULL) - break; - truncstr(str,"\r\n"); - if(strncmp(str,"begin ",6)==0) { - p=str+7; - while(*p && isdigit(*p)) p++; /* skip mode */ - while(*p && *p<=' ') p++; - if((out=fopen(p,"wb"))==NULL) { - perror(p); - return 1; - } - fprintf(stderr,"Creating %s\n",p); - line=1; - continue; - } - if(strcmp(str,"end")==0) { - if(out!=NULL) { - fclose(out); - out=NULL; - } - continue; - } - if(out==NULL) - continue; - len=uudecode(buf,sizeof(buf),str,0); - if(len<0) { - fprintf(stderr,"!Error decoding: %s\n",str); - break; - } - fwrite(buf,len,1,out); - line++; - } - - return 0; -} -#elif defined(UUENCODE_TEST) - -int main(int argc, char**argv) -{ - char str[1024]; - char buf[256]; - FILE* in; - int len; - - if(argc<2) { - fprintf(stderr,"usage: uuencode infile\n"); - return 1; - } - - if((in=fopen(argv[1],"rb"))==NULL) { - perror(argv[1]); - return 1; - } - - while(!feof(in)) { - len=fread(buf,1,45,in); - if(len<0) - break; - len=uuencode(str,sizeof(str),buf,len); - if(len<1) - break; - printf("%.*s",len,str); - } - - return 0; -} - -#endif - - diff --git a/encode/uucode.h b/encode/uucode.h deleted file mode 100644 index 2f506f9..0000000 --- a/encode/uucode.h +++ /dev/null @@ -1,49 +0,0 @@ -/* uucode.c */ - -/* Unix-to-Unix encoding/decoding exported function prototypes */ - -/* $Id: uucode.h,v 1.2 2018/07/24 01:11:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "gen_defs.h" // ssize_t - -#ifdef __cplusplus -extern "C" { -#endif - -ssize_t uuencode(char *target, size_t tlen, const char *source, size_t slen); -ssize_t uudecode(char *target, size_t tlen, const char *source, size_t slen); - -#ifdef __cplusplus -} -#endif diff --git a/encode/yenc.c b/encode/yenc.c deleted file mode 100644 index 9cba43e..0000000 --- a/encode/yenc.c +++ /dev/null @@ -1,203 +0,0 @@ -/* yenc.c */ - -/* yEnc encoding/decoding routines */ - -/* $Id: yenc.c,v 1.2 2018/02/20 11:57:13 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include "yenc.h" - -#define YENC_BIAS 42 -#define YENC_ESCAPE_CHAR '=' -#define YENC_ESCAPE_BIAS 64 - -ssize_t ydecode(char *target, size_t tlen, const char *source, size_t slen) -{ - char ch; - size_t rd=0; - size_t wr=0; - - if(slen==0) - slen=strlen(source); - while(rd<slen && wr<tlen) { - ch=source[rd++]; - if(ch==YENC_ESCAPE_CHAR && rd<slen) - ch=source[rd++]-YENC_ESCAPE_BIAS; - ch-=YENC_BIAS; - target[wr++]=ch; - } - - return(wr); -} - -ssize_t yencode(char *target, size_t tlen, const char *source, size_t slen) -{ - char ch; - size_t rd=0; - size_t wr=0; - int done=0; - - if(slen==0) - slen=strlen(source); - while(rd<=slen && wr<tlen && !done) { - ch=source[rd++]; - ch+=YENC_BIAS; - switch(ch) { - case 0: - case '\r': - case '\n': - case YENC_ESCAPE_CHAR: - if(wr+1>=tlen) { /* no room for escaped char */ - done=1; - continue; - } - ch+=YENC_ESCAPE_BIAS; - target[wr++]=YENC_ESCAPE_CHAR; - break; - } - target[wr++]=ch; - } - - if(wr<tlen) - target[wr++]=0; - return(wr); -} - -#if defined(YDECODE_TEST) - -static char* truncstr(char* str, const char* set) -{ - char* p; - - p=strpbrk(str,set); - if(p!=NULL) - *p=0; - - return(p); -} - -int main(int argc, char**argv) -{ - char str[1024]; - char buf[256]; - char* p; - FILE* in; - FILE* out=NULL; - int len; - int line; - - if(argc<2) { - fprintf(stderr,"usage: %s infile\n",argv[0]); - return 1; - } - - if((in=fopen(argv[1],"rb"))==NULL) { - perror(argv[1]); - return 1; - } - - while(!feof(in)) { - memset(str,0,sizeof(str)); - if(fgets(str,sizeof(str),in)==NULL) - break; - truncstr(str,"\r\n"); - if(strncmp(str,"=ybegin ",8)==0) { - p=strstr(str,"name="); - p+=5; - if((out=fopen(p,"wb"))==NULL) { - perror(p); - return 1; - } - fprintf(stderr,"Creating %s\n",p); - line=1; - continue; - } - if(strncmp(str,"=yend ",6)==0) { - if(out!=NULL) { - fclose(out); - out=NULL; - } - continue; - } - if(out==NULL) - continue; - len=ydecode(buf,sizeof(buf),str,0); - if(len<0) { - fprintf(stderr,"!Error decoding: %s\n",str); - break; - } - fwrite(buf,len,1,out); - line++; - } - - return 0; -} -#elif defined(YENCODE_TEST) - -int main(int argc, char**argv) -{ - char str[1024]; - char buf[256]; - FILE* in; - int len; - - if(argc<2) { - fprintf(stderr,"usage: %s infile\n",argv[0]); - return 1; - } - - if((in=fopen(argv[1],"rb"))==NULL) { - perror(argv[1]); - return 1; - } - - while(!feof(in)) { - len=fread(buf,1,45,in); - if(len<0) - break; - len=yencode(str,sizeof(str),buf,len); - if(len<1) - break; - printf("%.*s",len,str); - } - - return 0; -} - -#endif - - diff --git a/encode/yenc.h b/encode/yenc.h deleted file mode 100644 index 2e31d25..0000000 --- a/encode/yenc.h +++ /dev/null @@ -1,49 +0,0 @@ -/* yenc.c */ - -/* yEnc encoding/decoding exported function prototypes */ - -/* $Id: yenc.h,v 1.2 2018/07/24 01:11:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "gen_defs.h" // ssize_t - -#ifdef __cplusplus -extern "C" { -#endif - -ssize_t yencode(char *target, size_t tlen, const char *source, size_t slen); -ssize_t ydecode(char *target, size_t tlen, const char *source, size_t slen); - -#ifdef __cplusplus -} -#endif diff --git a/hash/CMakeLists.txt b/hash/CMakeLists.txt deleted file mode 100644 index 8303fff..0000000 --- a/hash/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -project (Hash C) -find_package(XPDev QUIET CONFIG PATHS lib/cmake/XPDev) - -cmake_minimum_required(VERSION 3.11) - -set(SOURCE - crc16.c - crc32.c - md5.c - sha1.c -) - -set(HEADER - crc16.h - crc32.h - md5.h - sha1.h -) - -add_library(hash OBJECT ${SOURCE}) -target_include_directories(hash PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(hash xpdev) diff --git a/hash/README.md b/hash/README.md deleted file mode 100644 index 5f4b0c0..0000000 --- a/hash/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Synchronet project: hash library - -This directory contains code and data for various one-way hash functions -e.g. checksums, CRCs, digests, etc. - diff --git a/hash/crc16.c b/hash/crc16.c deleted file mode 100644 index c95801d..0000000 --- a/hash/crc16.c +++ /dev/null @@ -1,81 +0,0 @@ -/* CCITT 16-bit CRC table and calculation function */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> /* strlen */ -#include "crc16.h" - -uint16_t crc16tbl[] = { -0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, -0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, -0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, -0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, -0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, -0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, -0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, -0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, -0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, -0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, -0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, -0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, -0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, -0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, -0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, -0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, -0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, -0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, -0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, -0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, -0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, -0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, -0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, -0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, -0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, -0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, -0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, -0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, -0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, -0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, -0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, -0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 -}; - -uint16_t crc16(const char* data, size_t len) -{ - uint16_t crc = 0; - size_t l; - - if(len==0 && data!=NULL) - len=strlen(data); - for(l=0;l<len;l++) - crc = ucrc16(data[l],crc); - - return crc; -} - -uint16_t icrc16(uint16_t crc, const char* data, size_t len) -{ - size_t l; - - for(l=0; l<len; l++) - crc = ucrc16(data[l], crc); - - return crc; -} diff --git a/hash/crc16.h b/hash/crc16.h deleted file mode 100644 index bca8a90..0000000 --- a/hash/crc16.h +++ /dev/null @@ -1,42 +0,0 @@ -/* CCITT 16-bit CRC table and calculation macro */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _CRC16_H_ -#define _CRC16_H_ - -#include "gen_defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern uint16_t crc16tbl[]; - -uint16_t crc16(const char* data, size_t len); -uint16_t icrc16(uint16_t crc, const char* data, size_t len); - -#ifdef __cplusplus -} -#endif - -#define ucrc16(ch,crc) (crc16tbl[((crc>>8)&0xff)^(unsigned char)ch]^(crc << 8)) - -#endif /* Don't add anything after this line */ diff --git a/hash/crc32.c b/hash/crc32.c deleted file mode 100644 index 2ad0843..0000000 --- a/hash/crc32.c +++ /dev/null @@ -1,89 +0,0 @@ -/* IEEE 802.3 32-bit CRC table and convenience functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> /* strlen */ -#include "crc32.h" - -int32_t crc32tbl[]={ /* CRC polynomial 0xedb88320 */ -0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, -0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, -0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, -0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, -0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, -0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, -0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, -0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, -0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, -0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, -0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, -0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, -0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, -0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, -0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, -0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, -0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, -0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, -0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, -0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, -0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, -0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, -0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, -0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, -0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, -0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, -0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, -0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, -0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, -0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -/****************************************************************************/ -/* Returns CRC-32 of sequence of bytes (binary or ASCIIZ) */ -/* Pass len of 0 to auto-determine ASCIIZ string length */ -/* or non-zero for arbitrary binary data */ -/****************************************************************************/ -uint32_t crc32i(uint32_t crc, const char *buf, size_t len) -{ - size_t l; - - if(len==0 && buf!=NULL) - len=strlen(buf); - for(l=0;l<len;l++) - crc=ucrc32(buf[l],crc); - return ~crc; -} - -uint32_t fcrc32(FILE* fp, size_t len) -{ - int ch; - uint32_t crc=0xffffffff; - size_t l; - - rewind(fp); - for(l=0;(len==0 || l<len) && !feof(fp);l++) { - if((ch=fgetc(fp))==EOF) - break; - crc=ucrc32(ch,crc); - } - return ~crc; -} diff --git a/hash/crc32.h b/hash/crc32.h deleted file mode 100644 index b7b7ba4..0000000 --- a/hash/crc32.h +++ /dev/null @@ -1,44 +0,0 @@ -/* 32-bit CRC table and calculation macro */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _CRC32_H_ -#define _CRC32_H_ - -#include <stdio.h> /* FILE */ -#include "gen_defs.h" /* uint32_t */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int32_t crc32tbl[]; - -uint32_t crc32i(uint32_t crc, const char* buf, size_t); -uint32_t fcrc32(FILE* fp, size_t); - -#ifdef __cplusplus -} -#endif - -#define ucrc32(ch,crc) (crc32tbl[(crc^(ch))&0xff]^(crc>>8)) -#define crc32(x,y) crc32i(0xffffffff,x,y) - -#endif /* Don't add anything after this line */ diff --git a/hash/md5.c b/hash/md5.c deleted file mode 100644 index 107ce8a..0000000 --- a/hash/md5.c +++ /dev/null @@ -1,304 +0,0 @@ -/* md5.c - RSA Data Security, Inc., MD5 Message-Digest Algorithm */ - -/* $Id: md5.c,v 1.7 2012/10/23 07:59:36 deuce Exp $ */ - -/* NOTE: Numerous changes have been made; the following notice is -included to satisfy legal requirements. - -Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All -rights reserved. - -License to copy and use this software is granted provided that it -is identified as the "RSA Data Security, Inc. MD5 Message-Digest -Algorithm" in all material mentioning or referencing this software -or this function. - -License is also granted to make and use derivative works provided -that such works are identified as "derived from the RSA Data -Security, Inc. MD5 Message-Digest Algorithm" in all material -mentioning or referencing the derived work. - -RSA Data Security, Inc. makes no representations concerning either -the merchantability of this software or the suitability of this -software for any particular purpose. It is provided "as is" -without express or implied warranty of any kind. - -These notices must be retained in any copies of any part of this -documentation and/or software. -*/ - -#include <memory.h> -#include "md5.h" - -#if !defined(BIG_ENDIAN) - #define LITTLE_ENDIAN /* Little Endian by default */ -#endif - -void MD5_open(MD5 *md5) -{ - md5->count[0] = md5->count[1] = 0; - /* Load magic initialization constants.*/ - md5->state[0] = 0x67452301; - md5->state[1] = 0xefcdab89; - md5->state[2] = 0x98badcfe; - md5->state[3] = 0x10325476; -} - -/* Constants for MD5Transform routine. */ - -#define S11 7 -#define S12 12 -#define S13 17 -#define S14 22 -#define S21 5 -#define S22 9 -#define S23 14 -#define S24 20 -#define S31 4 -#define S32 11 -#define S33 16 -#define S34 23 -#define S41 6 -#define S42 10 -#define S43 15 -#define S44 21 - -/* F, G, H and I are basic MD5 functions. */ - -#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) -#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) -#define H(x, y, z) ((x) ^ (y) ^ (z)) -#define I(x, y, z) ((y) ^ ((x) | (~z))) - -/* ROTATE_LEFT rotates x left n bits. */ - -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) - -/* Round1, Round2, Round3, and Round4 transformations for rounds 1, 2, 3, and 4. - Rotation is separate from addition to prevent recomputation. -*/ - -#define Round1(a, b, c, d, x, s, ac) { \ - (a) += F((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } -#define Round2(a, b, c, d, x, s, ac) { \ - (a) += G((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } -#define Round3(a, b, c, d, x, s, ac) { \ - (a) += H((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } -#define Round4(a, b, c, d, x, s, ac) { \ - (a) += I((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } - - -/* MD5 basic transformation. Transforms state based on block. */ - -static void MD5Transform(uint32_t state[4], const BYTE block[64]) -{ - uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[MD5_DIGEST_SIZE]; - /* Move contents of block to x, putting bytes in little-endian order. */ - #ifdef LITTLE_ENDIAN - memcpy(x, block, 64); - #else - { - unsigned int i, j; - for (i = j = 0; i < MD5_DIGEST_SIZE; i++, j+= 4) - { - x[i] = (uint32_t) block[j] | (uint32_t) block[j+1] << 8 | - (uint32_t) block[j+2] << 16 | (uint32_t) block[j+3] << 24; - } - } - #endif - /* Round 1 */ - Round1(a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ - Round1(d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ - Round1(c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ - Round1(b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ - Round1(a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ - Round1(d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ - Round1(c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ - Round1(b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ - Round1(a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ - Round1(d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ - Round1(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ - Round1(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ - Round1(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ - Round1(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ - Round1(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ - Round1(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ - /* Round 2 */ - Round2(a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ - Round2(d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ - Round2(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ - Round2(b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ - Round2(a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ - Round2(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ - Round2(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ - Round2(b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ - Round2(a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ - Round2(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ - Round2(c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ - Round2(b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ - Round2(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ - Round2(d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ - Round2(c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ - Round2(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ - /* Round 3 */ - Round3(a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ - Round3(d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ - Round3(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ - Round3(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ - Round3(a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ - Round3(d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ - Round3(c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ - Round3(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ - Round3(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ - Round3(d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ - Round3(c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ - Round3(b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ - Round3(a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ - Round3(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ - Round3(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ - Round3(b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ - /* Round 4 */ - Round4(a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ - Round4(d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ - Round4(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ - Round4(b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ - Round4(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ - Round4(d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ - Round4(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ - Round4(b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ - Round4(a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ - Round4(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ - Round4(c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ - Round4(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ - Round4(a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ - Round4(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ - Round4(c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ - Round4(b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - /* Zeroize sensitive information. */ - memset(x, 0, sizeof(x)); -} - -void MD5_digest(MD5 *md5, const void *input, size_t inputLen) -{ - unsigned int i, index, partLen; - /* Compute number of bytes mod 64 */ - index = (unsigned int)((md5->count[0] >> 3) & 0x3F); - /* Update number of bits */ - if ((md5->count[0] += ((uint32_t)inputLen << 3)) < ((uint32_t)inputLen << 3)) - md5->count[1]++; - md5->count[1] += ((uint32_t)inputLen >> 29); - partLen = 64 - index; - /* Transform as many times as possible.*/ - if (inputLen >= partLen) - { - memcpy(&md5->buffer[index], input, partLen); - MD5Transform(md5->state, md5->buffer); - for (i = partLen; i + 63 < inputLen; i += 64) - MD5Transform(md5->state, (BYTE *) input + i); - index = 0; - } - else - i = 0; - /* Buffer remaining input */ - memcpy(&md5->buffer[index], (char *) input + i, inputLen-i); -} - -/* ENCODE packs a 32-bit unsigned integer into 4 bytes in little-endian - order. -*/ - -#ifdef LITTLE_ENDIAN -#define ENCODE(p,n) *(uint32_t *)(p) = n -#else -#define ENCODE(p,n) (p)[0]=n,(p)[1]=n>>8,(p)[2]=n>>16,(p)[3]=n>>24 -#endif - -void MD5_close(MD5 *md5, BYTE digest[MD5_DIGEST_SIZE]) -{ - BYTE bits[8]; - unsigned int index, padLen; - static BYTE PADDING[64] = - { - 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - /* Save number of bits */ - ENCODE(bits, md5->count[0]); - ENCODE(bits+4, md5->count[1]); - /* Pad out to 56 mod 64. */ - index = (unsigned int)((md5->count[0] >> 3) & 0x3f); - padLen = (index < 56) ? (56 - index) : (120 - index); - MD5_digest(md5, PADDING, padLen); - /* Append length (before padding) */ - MD5_digest(md5, bits, 8); - /* Store state in digest */ - ENCODE(digest, md5->state[0]); - ENCODE(digest+4, md5->state[1]); - ENCODE(digest+8, md5->state[2]); - ENCODE(digest+12, md5->state[3]); - /* Zeroize sensitive information. */ - memset(md5, 0, sizeof(MD5)); -} - -BYTE* MD5_calc(BYTE digest[MD5_DIGEST_SIZE], const void* buf, size_t len) -{ - MD5 ctx; - - MD5_open(&ctx); - MD5_digest(&ctx,buf,len); - MD5_close(&ctx,digest); - - return(digest); -} - -/* conversion for 16 character binary md5 to hex */ - -char* MD5_hex(char* to, const BYTE digest[MD5_DIGEST_SIZE]) -{ - BYTE const* from = digest; - const char *hexdigits = "0123456789abcdef"; - const BYTE *end = digest + MD5_DIGEST_SIZE; - char *d = to; - - while (from < end) { - *d++ = hexdigits[(*from >> 4)]; - *d++ = hexdigits[(*from & 0x0F)]; - from++; - } - *d = '\0'; - return to; -} - -#ifdef MD5_TEST - -int main(int argc, char**argv) -{ - int i; - char hexbuf[(MD5_DIGEST_SIZE*2)+1]; - BYTE digest[MD5_DIGEST_SIZE]; - - for(i=1;i<argc;i++) - printf("%s\n" - ,MD5_hex(hexbuf,MD5_calc(digest,argv[i],strlen(argv[i])))); - - return 0; -} - -#endif diff --git a/hash/md5.h b/hash/md5.h deleted file mode 100644 index c23a4a1..0000000 --- a/hash/md5.h +++ /dev/null @@ -1,75 +0,0 @@ -/* md5.h - header file for md5.c */ - -/* $Id: md5.h,v 1.7 2019/03/22 21:29:12 rswindell Exp $ */ - -/* RSA Data Security, Inc., MD5 Message-Digest Algorithm */ - -/* NOTE: Numerous changes have been made; the following notice is -included to satisfy legal requirements. - -Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All -rights reserved. - -License to copy and use this software is granted provided that it -is identified as the "RSA Data Security, Inc. MD5 Message-Digest -Algorithm" in all material mentioning or referencing this software -or this function. - -License is also granted to make and use derivative works provided -that such works are identified as "derived from the RSA Data -Security, Inc. MD5 Message-Digest Algorithm" in all material -mentioning or referencing the derived work. - -RSA Data Security, Inc. makes no representations concerning either -the merchantability of this software or the suitability of this -software for any particular purpose. It is provided "as is" -without express or implied warranty of any kind. - -These notices must be retained in any copies of any part of this -documentation and/or software. -*/ - -#ifndef H__MD5 -#define H__MD5 - -#include <stddef.h> /* size_t */ -#include <gen_defs.h> /* uint32_t */ - -#define MD5_DIGEST_SIZE 16 - -#ifndef BYTE - typedef unsigned char BYTE; -#endif - -typedef struct -{ - uint32_t state[4]; - uint32_t count[2]; - BYTE buffer[64]; -} MD5; - -#if defined(_WIN32) && (defined(MD5_IMPORTS) || defined(MD5_EXPORTS)) - #if defined(MD5_IMPORTS) - #define MD5EXPORT __declspec(dllimport) - #else - #define MD5EXPORT __declspec(dllexport) - #endif -#else /* !_WIN32 */ - #define MD5EXPORT -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -MD5EXPORT void MD5_open(MD5* ctx); -MD5EXPORT void MD5_digest(MD5* ctx, const void* buf, size_t len); -MD5EXPORT void MD5_close(MD5* ctx, BYTE digest[MD5_DIGEST_SIZE]); -MD5EXPORT BYTE* MD5_calc(BYTE digest[MD5_DIGEST_SIZE], const void* buf, size_t len); -MD5EXPORT char* MD5_hex(char* dest, const BYTE digest[MD5_DIGEST_SIZE]); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/hash/sha1.c b/hash/sha1.c deleted file mode 100644 index a9dc3a5..0000000 --- a/hash/sha1.c +++ /dev/null @@ -1,311 +0,0 @@ -/* -SHA-1 in C -By Steve Reid <steve@edmweb.com> -100% Public Domain - -Test Vectors (from FIPS PUB 180-1) -"abc" - A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D -"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" - 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 -A million repetitions of "a" - 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F -*/ - -/* #define LITTLE_ENDIAN * This should be #define'd already, if true. */ -/* #define SHA1HANDSOFF * Copies data before messing with it. */ - -#define SHA1HANDSOFF - -#include <stdio.h> -#include <string.h> - -/* for uint32_t */ -#include <stdint.h> - -#include "sha1.h" - - -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) - -/* blk0() and blk() perform the initial expand. */ -/* I got the idea of expanding during the round function from SSLeay */ -#if BYTE_ORDER == LITTLE_ENDIAN -#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ - |(rol(block->l[i],8)&0x00FF00FF)) -#elif BYTE_ORDER == BIG_ENDIAN -#define blk0(i) block->l[i] -#else -#error "Endianness not defined!" -#endif -#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ - ^block->l[(i+2)&15]^block->l[i&15],1)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); -#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); -#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); - - -/* Hash a single 512-bit block. This is the core of the algorithm. */ - -void SHA1Transform( - uint32_t state[5], - const uint8_t buffer[64] -) -{ - uint32_t a, b, c, d, e; - - typedef union - { - uint8_t c[64]; - uint32_t l[16]; - } CHAR64LONG16; - -#ifdef SHA1HANDSOFF - CHAR64LONG16 block[1]; /* use array to appear as a pointer */ - - memcpy(block, buffer, 64); -#else - /* The following had better never be used because it causes the - * pointer-to-const buffer to be cast into a pointer to non-const. - * And the result is written through. I threw a "const" in, hoping - * this will cause a diagnostic. - */ - CHAR64LONG16 *block = (const CHAR64LONG16 *) buffer; -#endif - /* Copy context->state[] to working vars */ - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a, b, c, d, e, 0); - R0(e, a, b, c, d, 1); - R0(d, e, a, b, c, 2); - R0(c, d, e, a, b, 3); - R0(b, c, d, e, a, 4); - R0(a, b, c, d, e, 5); - R0(e, a, b, c, d, 6); - R0(d, e, a, b, c, 7); - R0(c, d, e, a, b, 8); - R0(b, c, d, e, a, 9); - R0(a, b, c, d, e, 10); - R0(e, a, b, c, d, 11); - R0(d, e, a, b, c, 12); - R0(c, d, e, a, b, 13); - R0(b, c, d, e, a, 14); - R0(a, b, c, d, e, 15); - R1(e, a, b, c, d, 16); - R1(d, e, a, b, c, 17); - R1(c, d, e, a, b, 18); - R1(b, c, d, e, a, 19); - R2(a, b, c, d, e, 20); - R2(e, a, b, c, d, 21); - R2(d, e, a, b, c, 22); - R2(c, d, e, a, b, 23); - R2(b, c, d, e, a, 24); - R2(a, b, c, d, e, 25); - R2(e, a, b, c, d, 26); - R2(d, e, a, b, c, 27); - R2(c, d, e, a, b, 28); - R2(b, c, d, e, a, 29); - R2(a, b, c, d, e, 30); - R2(e, a, b, c, d, 31); - R2(d, e, a, b, c, 32); - R2(c, d, e, a, b, 33); - R2(b, c, d, e, a, 34); - R2(a, b, c, d, e, 35); - R2(e, a, b, c, d, 36); - R2(d, e, a, b, c, 37); - R2(c, d, e, a, b, 38); - R2(b, c, d, e, a, 39); - R3(a, b, c, d, e, 40); - R3(e, a, b, c, d, 41); - R3(d, e, a, b, c, 42); - R3(c, d, e, a, b, 43); - R3(b, c, d, e, a, 44); - R3(a, b, c, d, e, 45); - R3(e, a, b, c, d, 46); - R3(d, e, a, b, c, 47); - R3(c, d, e, a, b, 48); - R3(b, c, d, e, a, 49); - R3(a, b, c, d, e, 50); - R3(e, a, b, c, d, 51); - R3(d, e, a, b, c, 52); - R3(c, d, e, a, b, 53); - R3(b, c, d, e, a, 54); - R3(a, b, c, d, e, 55); - R3(e, a, b, c, d, 56); - R3(d, e, a, b, c, 57); - R3(c, d, e, a, b, 58); - R3(b, c, d, e, a, 59); - R4(a, b, c, d, e, 60); - R4(e, a, b, c, d, 61); - R4(d, e, a, b, c, 62); - R4(c, d, e, a, b, 63); - R4(b, c, d, e, a, 64); - R4(a, b, c, d, e, 65); - R4(e, a, b, c, d, 66); - R4(d, e, a, b, c, 67); - R4(c, d, e, a, b, 68); - R4(b, c, d, e, a, 69); - R4(a, b, c, d, e, 70); - R4(e, a, b, c, d, 71); - R4(d, e, a, b, c, 72); - R4(c, d, e, a, b, 73); - R4(b, c, d, e, a, 74); - R4(a, b, c, d, e, 75); - R4(e, a, b, c, d, 76); - R4(d, e, a, b, c, 77); - R4(c, d, e, a, b, 78); - R4(b, c, d, e, a, 79); - /* Add the working vars back into context.state[] */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - /* Wipe variables */ - a = b = c = d = e = 0; -#ifdef SHA1HANDSOFF - memset(block, '\0', sizeof(block)); -#endif -} - - -/* SHA1Init - Initialize new context */ - -void SHA1Init( - SHA1_CTX * context -) -{ - /* SHA1 initialization constants */ - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; - context->count[0] = context->count[1] = 0; -} - - -/* Run your data through this. */ - -void SHA1Update( - SHA1_CTX * context, - const void * buf, - size_t len -) -{ - uint32_t i; - uint32_t j; - uint8_t* data = (uint8_t*)buf; - - j = context->count[0]; - if ((context->count[0] += len << 3) < j) - context->count[1]++; - context->count[1] += (len >> 29); - j = (j >> 3) & 63; - if ((j + len) > 63) - { - memcpy(&context->buffer[j], data, (i = 64 - j)); - SHA1Transform(context->state, context->buffer); - for (; i + 63 < len; i += 64) - { - SHA1Transform(context->state, &data[i]); - } - j = 0; - } - else - i = 0; - memcpy(&context->buffer[j], &data[i], len - i); -} - - -/* Add padding and return the message digest. */ - -void SHA1Final( - SHA1_CTX * context, - uint8_t digest[SHA1_DIGEST_SIZE] -) -{ - unsigned i; - - uint8_t finalcount[8]; - - uint8_t c; - -#if 0 /* untested "improvement" by DHR */ - /* Convert context->count to a sequence of bytes - * in finalcount. Second element first, but - * big-endian order within element. - * But we do it all backwards. - */ - uint8_t *fcp = &finalcount[8]; - - for (i = 0; i < 2; i++) - { - uint32_t t = context->count[i]; - - int j; - - for (j = 0; j < 4; t >>= 8, j++) - *--fcp = (uint8_t) t} -#else - for (i = 0; i < 8; i++) - { - finalcount[i] = (uint8_t) ((context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */ - } -#endif - c = 0200; - SHA1Update(context, &c, 1); - while ((context->count[0] & 504) != 448) - { - c = 0000; - SHA1Update(context, &c, 1); - } - SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ - for (i = 0; i < 20; i++) - { - digest[i] = (uint8_t) - ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); - } - /* Wipe variables */ - memset(context, '\0', sizeof(*context)); - memset(&finalcount, '\0', sizeof(finalcount)); -} - -void SHA1_calc( - uint8_t *hash_out, - const void *data, - size_t len) -{ - SHA1_CTX ctx; - unsigned int ii; - - SHA1Init(&ctx); - for (ii=0; ii<len; ii+=1) - SHA1Update(&ctx, (const char*)data + ii, 1); - SHA1Final(&ctx, hash_out); -} - -/* conversion for 20 byte binary sha1 to hex */ -char* SHA1_hex(char* to, const uint8_t digest[SHA1_DIGEST_SIZE]) -{ - uint8_t const* from = digest; - const char *hexdigits = "0123456789abcdef"; - const uint8_t *end = digest + SHA1_DIGEST_SIZE; - char *d = to; - - while (from < end) { - *d++ = hexdigits[(*from >> 4)]; - *d++ = hexdigits[(*from & 0x0F)]; - from++; - } - *d = '\0'; - return to; -} diff --git a/hash/sha1.h b/hash/sha1.h deleted file mode 100644 index 852585c..0000000 --- a/hash/sha1.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef SHA1_H -#define SHA1_H - -/* - SHA-1 in C - By Steve Reid <steve@edmweb.com> - 100% Public Domain - */ - -#include <stddef.h> /* size_t */ -#include <gen_defs.h> /* uint32_t */ - -#define SHA1_DIGEST_SIZE 20 - -typedef struct -{ - uint32_t state[5]; - uint32_t count[2]; - uint8_t buffer[64]; -} SHA1_CTX; - -#ifdef __cplusplus -extern "C" { -#endif - -void SHA1Transform( - uint32_t state[5], - const uint8_t buffer[64] - ); - -void SHA1Init( - SHA1_CTX * context - ); - -void SHA1Update( - SHA1_CTX * context, - const void * data, - size_t len - ); - -void SHA1Final( - SHA1_CTX * context, - uint8_t digest[SHA1_DIGEST_SIZE] - ); - -void SHA1_calc( - uint8_t *hash_out, - const void *str, - size_t len); - -char* SHA1_hex(char* to, const uint8_t digest[SHA1_DIGEST_SIZE]); - -#ifdef __cplusplus -} -#endif - -#endif /* SHA1_H */ diff --git a/uifc/CMakeLists.txt b/uifc/CMakeLists.txt deleted file mode 100644 index a6ddccd..0000000 --- a/uifc/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -project (UIfC C) - -cmake_minimum_required(VERSION 3.11) - -INCLUDE (FindThreads) - -set(SOURCE - filepick.c - uifc32.c - uifcx.c -) - -set(HEADER - filepick.h - uifc.h -) - -add_library(uifc OBJECT ${SOURCE}) -target_include_directories(uifc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -target_link_libraries(uifc ciolib xpdev) diff --git a/uifc/filepick.c b/uifc/filepick.c deleted file mode 100644 index c960d50..0000000 --- a/uifc/filepick.c +++ /dev/null @@ -1,721 +0,0 @@ -#include <ctype.h> - -#include "dirwrap.h" -#include "uifc.h" -#include "ciolib.h" - -#include "filepick.h" - -enum { - DIR_LIST - ,FILE_LIST - ,MASK_FIELD - ,CURRENT_PATH - ,FIELD_LIST_TERM -}; - -void drawfpwindow(uifcapi_t *api) -{ - struct vmem_cell lbuf[512]; - int i; - int j; - int listheight=0; - int height; - int width; - struct vmem_cell shade[512]; - - width=SCRN_RIGHT-SCRN_LEFT+1; - - height=api->scrn_len-3; - /* Make sure it's odd */ - if(!(width%2)) - width--; - - listheight=height-7; - - i=0; - set_vmem(&lbuf[i++], '\xc9', api->hclr|(api->bclr<<4), 0); - for(j=1;j<width-1;j++) - set_vmem(&lbuf[i++], '\xcd', api->hclr|(api->bclr<<4), 0); - if(api->mode&UIFC_MOUSE && width>6) { - set_vmem(&lbuf[1], '[', api->hclr|(api->bclr<<4), 0); - set_vmem(&lbuf[2], '\xfe', api->lclr|(api->bclr<<4), 0); - set_vmem(&lbuf[3], ']', api->hclr|(api->bclr<<4), 0); - set_vmem(&lbuf[4], '[', api->hclr|(api->bclr<<4), 0); - set_vmem(&lbuf[5], '?', api->lclr|(api->bclr<<4), 0); - set_vmem(&lbuf[6], ']', api->hclr|(api->bclr<<4), 0); - api->buttony=SCRN_TOP; - api->exitstart=SCRN_LEFT+1; - api->exitend=SCRN_LEFT+3; - api->helpstart=SCRN_LEFT+4; - api->helpend=SCRN_LEFT+6; - } - set_vmem(&lbuf[i++], '\xbb', api->hclr|(api->bclr<<4), 0); - vmem_puttext(SCRN_LEFT,SCRN_TOP,SCRN_LEFT+width-1,SCRN_TOP,lbuf); - set_vmem_attr(&lbuf[2], api->hclr|(api->bclr<<4)); - set_vmem_attr(&lbuf[5], api->hclr|(api->bclr<<4)); - for(j=1;j<7;j++) - lbuf[j].ch='\xcd'; - lbuf[0].ch='\xc8'; - lbuf[(width-1)].ch='\xbc'; - vmem_puttext(SCRN_LEFT,SCRN_TOP+height-1 - ,SCRN_LEFT+width-1,SCRN_TOP+height-1,lbuf); - lbuf[0].ch='\xcc'; - lbuf[(width-1)].ch='\xb9'; - lbuf[(width-1)/2].ch='\xcb'; - vmem_puttext(SCRN_LEFT,SCRN_TOP+2,SCRN_LEFT+width-1,SCRN_TOP+2,lbuf); - lbuf[(width-1)/2].ch='\xca'; - vmem_puttext(SCRN_LEFT,SCRN_TOP+3+listheight - ,SCRN_LEFT+width-1,SCRN_TOP+3+listheight,lbuf); - lbuf[0].ch='\xba'; - lbuf[(width-1)].ch='\xba'; - for(j=1;j<(width-1);j++) - lbuf[j].ch=' '; - vmem_puttext(SCRN_LEFT,SCRN_TOP+1, - SCRN_LEFT+width-1,SCRN_TOP+1,lbuf); - vmem_puttext(SCRN_LEFT,SCRN_TOP+height-2, - SCRN_LEFT+width-1,SCRN_TOP+height-2,lbuf); - vmem_puttext(SCRN_LEFT,SCRN_TOP+height-3, - SCRN_LEFT+width-1,SCRN_TOP+height-3,lbuf); - lbuf[(width-1)/2].ch='\xba'; - for(j=0;j<listheight;j++) - vmem_puttext(SCRN_LEFT,SCRN_TOP+3+j - ,SCRN_LEFT+width-1,SCRN_TOP+3+j,lbuf); - - /* Shadow */ - if(api->bclr==BLUE) { - vmem_gettext(SCRN_LEFT+width,SCRN_TOP+1,SCRN_LEFT+width+1 - ,SCRN_TOP+(height-1),shade); - for(j=0;j<512;j++) - set_vmem_attr(&shade[j], DARKGRAY); - vmem_puttext(SCRN_LEFT+width,SCRN_TOP+1,SCRN_LEFT+width+1 - ,SCRN_TOP+(height-1),shade); - vmem_gettext(SCRN_LEFT+2,SCRN_TOP+height,SCRN_LEFT+width+1 - ,SCRN_TOP+height,shade); - for(j=0;j<width;j++) - set_vmem_attr(&shade[j], DARKGRAY); - vmem_puttext(SCRN_LEFT+2,SCRN_TOP+height,SCRN_LEFT+width+1 - ,SCRN_TOP+height,shade); - } -} - -void free_opt_list(char ***opts) -{ - char **p; - - if(*opts==NULL) - return; - for(p=*opts; *p && (*p)[0]; p++) { - if(*p) - FREE_AND_NULL((*p)); - } - FREE_AND_NULL(*opts); -} - -char *insensitive_mask(char *mask) -{ -#ifdef __unix__ - char *in; - char *out; - static char nmask[MAX_PATH*4+1]; - - out=nmask; - for(in=mask; *in; in++) { - if(isalpha(*in)) { - *(out++)='['; - *(out++)=tolower(*in); - *(out++)=toupper(*in); - *(out++)=']'; - } - else - *(out++)=*in; - } - *out=0; - return(nmask); -#else - return(mask); -#endif -} - -char **get_file_opt_list(char **fns, int files, int dirsonly, int root) -{ - char **opts; - int i; - int j=0; - - opts=(char **)malloc((files+2)*sizeof(char *)); - if(opts==NULL) - return(NULL); - memset(opts, 0, (files+2)*sizeof(char *)); - if(dirsonly) { - if(!root) - opts[j++]=strdup(".."); - } - for(i=0;i<files;i++) { - if(isdir(fns[i])) { - if(dirsonly) - opts[j++]=strdup(getdirname(fns[i])); - } - else { - if(!dirsonly) - opts[j++]=strdup(getfname(fns[i])); - } - } - opts[j]=""; - return(opts); -} - -void display_current_path(uifcapi_t *api, char *path) -{ - char dpath[MAX_PATH+2]; - size_t width; - int height; -#ifdef _WIN32 - char *p; -#endif - - height=api->scrn_len-3; - width=SCRN_RIGHT-SCRN_LEFT-3; - SAFECOPY(dpath, path); - while(strlen(dpath) > width) { - /* Just remove paths from the start. */ - dpath[0]='.'; - dpath[1]='.'; - dpath[2]='.'; - memmove(dpath+3, dpath+(strlen(dpath)-width+4), width-1); - } - /* For Win32, convert all "confusing" / to \\ */ -#ifdef _WIN32 - for(p=dpath; *p; p++) { - if(*p=='/') - *p='\\'; - } - if (strncmp(dpath, "\\\\?\\", 4)==0) - memmove(dpath, dpath+4, strlen(dpath+3)); -#endif - - api->printf(SCRN_LEFT+2, SCRN_TOP+height-2, api->lclr|(api->bclr<<4), "%-*s", width, dpath); -} - -int mousetofield(int currfield, int opts, int height, int width, int listheight, int listwidth, int *dcur, int *dbar, int *fcur, int *fbar) -{ - int newfield; - int bardif; - struct mouse_event mevnt; - - newfield=currfield; - if(getmouse(&mevnt)==0) { - if(mevnt.endx >= SCRN_LEFT + 1 - && mevnt.endx <= SCRN_LEFT + listwidth - && mevnt.endy >= SCRN_TOP + 3 - && mevnt.endy <= SCRN_TOP + 2 + listheight) { - newfield = DIR_LIST; - if(mevnt.endx == SCRN_LEFT + 1) - ungetmouse(&mevnt); - else { - bardif = (mevnt.starty - SCRN_TOP - 3) - *dbar; - *dbar += bardif; - *dcur += bardif; - } - } - if(mevnt.endx >= SCRN_LEFT + 1 + listwidth + 1 - && mevnt.endx <= SCRN_LEFT + 1 + listwidth * 2 - && mevnt.endy >= SCRN_TOP + 3 - && mevnt.endy <= SCRN_TOP + 2 + listheight) { - newfield = FILE_LIST; - if(mevnt.endx == SCRN_LEFT + 1 + listwidth + 1) - ungetmouse(&mevnt); - else { - bardif = (mevnt.starty - SCRN_TOP - 3) - *fbar; - *fbar += bardif; - *fcur += bardif; - } - } - if(!(opts & UIFC_FP_MSKNOCHG) - && (mevnt.endx >= SCRN_LEFT + 1 - && mevnt.endx <= SCRN_LEFT + width - 2 - && mevnt.endy == SCRN_TOP + height - 3)) { - newfield = MASK_FIELD; - ungetmouse(&mevnt); - } - if(opts & UIFC_FP_ALLOWENTRY - && mevnt.endx >= SCRN_LEFT + 1 - && mevnt.endx <= SCRN_LEFT + width - 2 - && mevnt.endy == SCRN_TOP + height - 2) { - newfield = CURRENT_PATH; - ungetmouse(&mevnt); - } - } - return(newfield); -} - -int filepick(uifcapi_t *api, char *title, struct file_pick *fp, char *dir, char *msk, int opts) -{ - char cfile[MAX_PATH*8+1]; /* Current full path to file */ - char cpath[(MAX_PATH<<2)+1]; /* Current path */ - char drive[3]; - char tdir[MAX_PATH+1]; - char fname[MAX_PATH+1]; - char ext[MAX_PATH+1]; - char cmsk[MAX_PATH*4+1]; /* Current file mask */ - char cglob[MAX_PATH*4+1]; /* File glob patter */ - char dglob[MAX_PATH*4+2]; /* Directory glob pattern */ - char *p; - glob_t fgl; /* Files */ - glob_t dgl; /* Directories */ - int dircur=0; - int dirbar=0; - int filecur=0; - int filebar=0; - int listwidth; - char **dir_list=NULL; - char **file_list=NULL; - int currfield; - int lastfield; - int i; - int root=0; /* Is this the root of the file system? */ - /* On *nix, this just means no .. on Win32, - * Something should be done about drive letters. */ - int reread=FALSE; - int lbclr; - char *lastpath=NULL; - char *tmplastpath=NULL; - char *tmppath=NULL; - int width; - int height; - char *YesNo[]={"Yes", "No", ""}; - int finished=FALSE; - int retval=0; - int fieldmove; - int oldhu=hold_update; - int oldx=wherex(); - int oldy=wherey(); - - height=api->scrn_len-3; - width=SCRN_RIGHT-SCRN_LEFT-3; - - lbclr=api->lbclr; - - /* No struct passed */ - if(fp==NULL) - return(-1); - - /* Illegal options */ - if((opts & UIFC_FP_MULTI)==UIFC_FP_MULTI && (opts & (UIFC_FP_ALLOWENTRY|UIFC_FP_OVERPROMPT|UIFC_FP_CREATPROMPT))) - return(-1); - - if (opts & UIFC_FP_DIRSEL) - currfield = lastfield = DIR_LIST; - else - currfield = lastfield = FILE_LIST; - - fp->files=0; - fp->selected=NULL; - - /* No initial path specified */ - if(dir==NULL || !dir[0]) - SAFECOPY(cpath,"."); - - FULLPATH(cpath,((dir==NULL||dir[0]==0)?".":dir),sizeof(cpath)); - backslash(cpath); - - if(msk==NULL || msk[0]==0) { - SAFECOPY(cmsk,"*"); - } - else { - SAFECOPY(cmsk,msk); - } - sprintf(cfile,"%s%s",cpath,cmsk); - listwidth=SCRN_RIGHT-SCRN_LEFT+1; - listwidth-=listwidth%2; - listwidth-=3; - listwidth/=2; - /* Draw the file picker itself... */ - hold_update = TRUE; - drawfpwindow(api); - /* Display the title centered */ - i=strlen(title); - if(i>width-4) - i=width-4; - api->printf(SCRN_LEFT+2, SCRN_TOP+1, api->hclr|(api->bclr<<4), "%*s%-*s", (width-i)/2-2, "", i, title); - api->printf(SCRN_LEFT+2, SCRN_TOP+height-3, api->hclr|(api->bclr<<4), "Mask: "); - while(!finished) { - hold_update = TRUE; - api->printf(SCRN_LEFT+8, SCRN_TOP+height-3, api->lclr|(api->bclr<<4), "%-*s", width-7, cmsk); - tmppath=strdup(cpath); - if(tmppath != NULL) { -#ifdef _WIN32 - if (tmppath[0] == 0 || (tmppath[5]==0 && tmppath[3]=='.' && tmppath[4]=='.' && tmppath[1]==':' && IS_PATH_DELIM(tmppath[2]))) - strcpy(cpath, "\\\\?\\"); - else if(strncmp(tmppath, "\\\\?\\", 4)==0 && tmppath[4]) - strcpy(cpath, tmppath+4); - else -#endif - { - FULLPATH(cpath,tmppath,sizeof(cpath)); - } - } - FREE_AND_NULL(tmppath); - -#ifdef __unix__ - if(cpath[0]==0) { - cpath[0]='/'; - cpath[1]=0; - } -#endif - backslash(cpath); - sprintf(cglob,"%s%s",cpath,(opts&UIFC_FP_MSKCASE)?cmsk:insensitive_mask(cmsk)); - sprintf(dglob,"%s*",cpath); - switch(currfield) { - case DIR_LIST: - if(lastfield==DIR_LIST) - sprintf(cfile,"%s%s",cpath,cmsk); - break; - } - -#ifdef __unix__ - if(cpath[0]==0) { - cpath[0]='/'; - cpath[1]=0; - } - if(cpath[1]==0) - root=TRUE; - else - root=FALSE; -#endif - -#ifdef _WIN32 - if (strcmp(cpath, "\\\\?\\")==0) - root = TRUE; - else - root = FALSE; -#endif - -#ifdef _WIN32 - // Hack together some hawtness - if (root) { - unsigned long drives = _getdrives(); - int j; - char path[4]; - - memset(&dgl, 0, sizeof(dgl)); - strcpy(path, "A:\\"); - dgl.gl_pathv=malloc(sizeof(char *)*('Z'-'A'+2)); - for (j=0; j<='Z'-'A'; j++) { - if(drives & (1<<j)) { - path[0]='A'+j; - dgl.gl_pathv[dgl.gl_pathc++]=strdup(path); - } - } - } - else -#endif - { - if(glob(dglob, GLOB_MARK, NULL, &dgl)!=0 && !isdir(cpath)) { - if(lastpath==NULL) { - fp->files=0; - retval=-1; - goto cleanup; - } - hold_update=FALSE; - api->msg("Cannot read directory!"); - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - SAFECOPY(cpath, lastpath); - FREE_AND_NULL(lastpath); - currfield=lastfield; - continue; - } - } - if(glob(cglob, 0, NULL, &fgl)!=0) - fgl.gl_pathc=0; - api->list_height=api->scrn_len-3-7; - dir_list=get_file_opt_list(dgl.gl_pathv, dgl.gl_pathc, TRUE, root); - file_list=get_file_opt_list(fgl.gl_pathv, fgl.gl_pathc, FALSE, root); - globfree(&dgl); - globfree(&fgl); - reread=FALSE; - dircur=dirbar=filecur=filebar=0; - while(!reread) { - hold_update=TRUE; - display_current_path(api, cfile); - api->lbclr=api->lclr|(api->bclr<<4); - api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_IMM|WIN_REDRAW,1,3,listwidth,&dircur,&dirbar,NULL,dir_list); - api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_IMM|WIN_REDRAW,1+listwidth+1,3,listwidth,&filecur,&filebar,NULL,file_list); - api->lbclr=lbclr; - lastfield=currfield; - fieldmove=0; - hold_update = FALSE; - switch(currfield) { - case DIR_LIST: - i=api->list(WIN_DYN|WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_EXTKEYS|WIN_UNGETMOUSE|WIN_REDRAW,1,3,listwidth,&dircur,&dirbar,NULL,dir_list); - if(i==-1) { /* ESC */ - retval=fp->files=0; - goto cleanup; - } - if(i==-2-'\t' || i==-2-CIO_KEY_RIGHT) /* TAB */ - fieldmove=1; - if(i==-3842) /* Backtab */ - fieldmove=-1; - if(i==-2-CIO_KEY_MOUSE) - currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar); - if(i>=0) { - FREE_AND_NULL(lastpath); - lastpath=strdup(cpath); - strcat(cpath,dir_list[i]); - reread=TRUE; - sprintf(cfile,"%s%s",cpath,cmsk); - } - break; - case FILE_LIST: - i=api->list(WIN_DYN|WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_EXTKEYS|WIN_UNGETMOUSE|WIN_REDRAW,1+listwidth+1,3,listwidth,&filecur,&filebar,NULL,file_list); - if(i==-1) { - retval=fp->files=0; - goto cleanup; - } - if(i>=0) { - sprintf(cfile,"%s%s",cpath,file_list[i]); - if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI) { - retval=fp->files=1; - fp->selected=(char **)malloc(sizeof(char *)); - if(fp->selected==NULL) { - fp->files=0; - retval=-1; - goto cleanup; - } - fp->selected[0]=strdup(cfile); - if(fp->selected[0]==NULL) { - FREE_AND_NULL(fp->selected); - fp->files=0; - retval=-1; - goto cleanup; - } - api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_IMM|WIN_REDRAW,1+listwidth+1,3,listwidth,&filecur,&filebar,NULL,file_list); - finished=reread=TRUE; - } - } - if(i==-2-'\t') - fieldmove=1; - if(i==-3842 || i==-2-CIO_KEY_LEFT) /* Backtab */ - fieldmove=-1; - if(i==-2-CIO_KEY_MOUSE) - currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar); - break; - case CURRENT_PATH: - FREE_AND_NULL(tmplastpath); - tmplastpath=strdup(cpath); -#ifdef _WIN32 - if (strncmp(tmplastpath, "\\\\?\\", 4)==0) - memmove(tmplastpath, tmplastpath+4, strlen(tmplastpath+3)); - if (strncmp(cfile, "\\\\?\\", 4)==0) - memmove(cfile, cfile+4, strlen(cfile+3)); -#endif - api->getstrxy(SCRN_LEFT+2, SCRN_TOP+height-2, width-1, cfile, sizeof(cfile)-1, K_EDIT|K_TABEXIT|K_MOUSEEXIT, &i); - if(i==ESC) { - retval=fp->files=0; - goto cleanup; - } - if((opts & (UIFC_FP_FILEEXIST|UIFC_FP_PATHEXIST)) && !fexist(cfile)) { -#ifdef _WIN32 - if (cfile[0]) // Allow zero-length path to mean "Drive list" -#endif - { - FREE_AND_NULL(tmplastpath); - api->msg("No such path/file!"); - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - continue; - } - } - if(isdir(cfile) && cfile[0]) - backslash(cfile); - _splitpath(cfile, drive, tdir, fname, ext); - sprintf(cpath,"%s%s",drive,tdir); - if(!isdir(cpath)) { -#ifdef _WIN32 - if (cfile[0] && strcmp(cfile, cmsk)) // Allow zero-length path to mean "Drive list" -#endif - { - FREE_AND_NULL(tmplastpath); - api->msg("No such path!"); - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - continue; - } - } - if(i==CIO_KEY_MOUSE) - currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar); - if(i==3840) - fieldmove=-1; - else { - if(currfield == CURRENT_PATH) - fieldmove=1; - } - sprintf(cfile,"%s%s%s%s",drive,tdir,fname,ext); - if(strchr(fname,'*') !=NULL || strchr(fname,'?') !=NULL - || strchr(ext,'*') !=NULL || strchr(ext,'?') !=NULL - || ((isdir(cfile) || cfile[0]==0) && !(opts & UIFC_FP_DIRSEL) && (i=='\r' || i=='\n')) - || (!isdir(cfile) && i!='\r' && i!='\n')) { - if(opts & UIFC_FP_MSKNOCHG) { - sprintf(cfile,"%s%s%s",drive,tdir,cmsk); - FREE_AND_NULL(tmplastpath); - api->msg("File mask cannot be changed"); - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - continue; - } - else { - if((!isdir(cfile)) && cpath[0] != 0) - sprintf(cmsk, "%s%s", fname, ext); - reread=TRUE; - } - break; - } - else { - if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI && (i=='\r' || i!='\n')) - fieldmove=0; - } - if((currfield != CURRENT_PATH) || fieldmove) - break; - if(isdir(cfile)) { - if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI && i!='\t' && i != 3840) { - if(opts & UIFC_FP_DIRSEL) { - finished=reread=TRUE; - retval=fp->files=1; - fp->selected=(char **)malloc(sizeof(char *)); - if(fp->selected==NULL) { - fp->files=0; - retval=-1; - goto cleanup; - } - fp->selected[0]=strdup(cfile); - if(fp->selected[0]==NULL) { - free(fp->selected); - fp->files=0; - retval=-1; - goto cleanup; - } - } - } - SAFECOPY(cpath, cfile); - backslash(cfile); - strcat(cfile,cmsk); - } - if(tmplastpath != NULL) { - if(strcmp(tmplastpath, cpath)) { - reread=TRUE; - FREE_AND_NULL(lastpath); - lastpath=tmplastpath; - tmplastpath=NULL; - } - } - FREE_AND_NULL(tmplastpath); - if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI && i!='\t' && i!=3840 && cpath[0]) { - retval=fp->files=1; - fp->selected=(char **)malloc(sizeof(char *)); - if(fp->selected==NULL) { - fp->files=0; - retval=-1; - goto cleanup; - } - fp->selected[0]=strdup(cfile); - if(fp->selected[0]==NULL) { - FREE_AND_NULL(fp->selected); - fp->files=0; - retval=-1; - goto cleanup; - } - finished=reread=TRUE; - } - break; - case MASK_FIELD: - p=strdup(cmsk); - api->getstrxy(SCRN_LEFT+8, SCRN_TOP+height-3, width-7, cmsk, sizeof(cmsk)-1, K_EDIT|K_TABEXIT|K_MOUSEEXIT, &i); - if(i==CIO_KEY_MOUSE) - currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar); - if(i==ESC || i==CIO_KEY_QUIT || (api->exit_flags & UIFC_XF_QUIT)) { - FREE_AND_NULL(p); - retval=fp->files=0; - goto cleanup; - } - if(strcmp(cmsk, p)) { - sprintf(cfile,"%s%s",cpath,cmsk); - reread=TRUE; - } - FREE_AND_NULL(p); - if(i==3840) - fieldmove=-1; - else - fieldmove=1; - break; - } - currfield+=fieldmove; - if(currfield<0) - currfield=FIELD_LIST_TERM-1; - while(1) { - if(currfield==MASK_FIELD && (opts & UIFC_FP_MSKNOCHG)) { - currfield+=fieldmove; - continue; - } - if(currfield==CURRENT_PATH && !(opts & UIFC_FP_ALLOWENTRY)) { - currfield+=fieldmove; - continue; - } - break; - } - if(currfield==FIELD_LIST_TERM) - currfield=DIR_LIST; - } - free_opt_list(&file_list); - free_opt_list(&dir_list); - if(finished) { - if((opts & UIFC_FP_OVERPROMPT) && fexist(cfile)) { - if(api->list(WIN_MID|WIN_SAV, 0,0,0, &i, NULL, "File exists, overwrite?", YesNo)!=0) { - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - finished=FALSE; - } - } - if((opts & UIFC_FP_CREATPROMPT) && !fexist(cfile)) { - if(api->list(WIN_MID|WIN_SAV, 0,0,0, &i, NULL, "File does not exist, create?", YesNo)!=0) { - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - finished=FALSE; - } - } - } - } - -cleanup: /* Cleans up allocated variables returns from function */ - hold_update=oldhu; - gotoxy(oldx,oldy); - FREE_AND_NULL(lastpath); - FREE_AND_NULL(tmppath); - FREE_AND_NULL(tmplastpath); - free_opt_list(&file_list); - free_opt_list(&dir_list); - return(retval); -} - -int filepick_free(struct file_pick *fp) -{ - int i; - - for(i=0; i<fp->files; i++) { - FREE_AND_NULL(fp->selected[i]); - } - FREE_AND_NULL(fp->selected); - return(0); -} diff --git a/uifc/filepick.h b/uifc/filepick.h deleted file mode 100644 index 2d1285a..0000000 --- a/uifc/filepick.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _FILEPICK_H_ -#define _FILEPICK_H_ - -#include "dirwrap.h" -#include "uifc.h" - -#define UIFC_FP_MSKNOCHG (1<<0) /* Don't allow user to change the file mask */ -#define UIFC_FP_MSKCASE (1<<1) /* Make the mask case-sensitive */ -#define UIFC_FP_UNIXSORT (1<<2) /* ToDo: Sort upper-case first, then lower-case */ -#define UIFC_FP_DIRSEL (1<<3) /* ToDo: Select directory, not file */ -#define UIFC_FP_PATHEXIST (1<<4) /* Do not allow selection of non-existant paths */ -#define UIFC_FP_FILEEXIST (1<<5) /* File must exist */ -#define UIFC_FP_SHOWHIDDEN (1<<6) /* Show hidden files */ -#define UIFC_FP_MULTI ((1<<7)|UIFC_FP_PATHEXIST|UIFC_FP_FILEEXIST) - /* ToDo: Allow multiple files to be chosen */ - -/* The following can NOT be used with multi selects (Returns an error) */ -#define UIFC_FP_ALLOWENTRY (1<<8) /* Allow user to type a file/path name */ -#define UIFC_FP_OVERPROMPT (1<<9) /* Prompt "Overwrite?" if file exists */ -#define UIFC_FP_CREATPROMPT (1<<10) /* Prompt "Create?" if file does not exist */ - -struct file_pick { - int files; - char **selected; -}; - -int filepick(uifcapi_t *api, char *title, struct file_pick *, char *initial_dir, char *default_mask, int opts); -int filepick_free(struct file_pick *); - -#endif diff --git a/uifc/uifc.h b/uifc/uifc.h deleted file mode 100644 index 6eeffa3..0000000 --- a/uifc/uifc.h +++ /dev/null @@ -1,535 +0,0 @@ -/* Text-mode User Interface Library (inspired by Novell SYSCON look & feel) */ - -/* $Id: uifc.h,v 1.97 2020/08/16 20:37:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _UIFC_H_ -#define _UIFC_H_ - -#include <time.h> -#include <fcntl.h> -#include <ctype.h> -#include <stdio.h> -#include <string.h> -#include <stdarg.h> -#include <stdlib.h> -/* OS Specific */ -#if defined(_WIN32) - #include <windows.h> -#endif -#if defined(__unix__) - #include <sys/param.h> /* PATH_MAX */ -#endif - -#ifdef _WIN32 - #if defined(UIFC_IMPORTS) || defined(UIFC_EXPORTS) - #if defined(UIFC_IMPORTS) - #define UIFCEXPORT __declspec( dllimport ) - #define UIFCEXPORTVAR __declspec( dllimport ) - #else - #define UIFCEXPORT __declspec( dllexport ) - #define UIFCEXPORTVAR __declspec( dllexport ) - #endif - #else /* self-contained executable */ - #define UIFCEXPORT - #define UIFCEXPORTVAR extern - #endif -#else - #define UIFCEXPORT - #define UIFCEXPORTVAR extern -#endif - -#if defined(__unix__) && !defined(stricmp) - #define stricmp strcasecmp - #define strnicmp strncasecmp -#endif - -#if !defined(FREE_AND_NULL) - #define FREE_AND_NULL(x) if(x!=NULL) { free(x); x=NULL; } -#endif - -#if !defined(MAX_PATH) /* maximum path length */ - #if defined MAXPATHLEN - #define MAX_PATH MAXPATHLEN /* clib.h */ - #elif defined PATH_MAX - #define MAX_PATH PATH_MAX - #elif defined _MAX_PATH - #define MAX_PATH _MAX_PATH - #else - #define MAX_PATH 260 - #endif -#endif - -#define MAX_OPTS 100000 -#define MSK_ON 0xf0000000 -#define MSK_OFF 0x0fffffff -#define MSK_INS 0x10000000 -#define MSK_DEL 0x20000000 -#define MSK_COPY 0x30000000 -#define MSK_CUT 0x40000000 -#define MSK_PASTE 0x50000000 /* Overwrite selected item with previously copied item */ -#define MSK_EDIT 0x60000000 - -/* Legacy terms (get/put instead of copy/paste) */ -#define MSK_GET MSK_COPY -#define MSK_PUT MSK_PASTE - -/* Don't forget, negative return values are used for extended keys (if WIN_EXTKEYS used)! */ -#define MAX_OPLN 75 /* Maximum length of each option per menu call */ -#define MAX_BUFS 7 /* Maximum number of screen buffers to save */ -#define MIN_LINES 14 /* Minimum number of screen lines supported */ -#define MAX_LINES 255 /* Maximum number of screen lines supported (ciolib screenheight is a uchar) */ -#define MAX_COLS 255 /* Maximum number of screen columns supported (ciolib screenwidth is a uchar) */ -#define MAX_BFLN (MAX_COLS*MAX_LINES*2) /* Maximum size of screen buffers, char + attr */ - -#ifndef uint -#define uint unsigned int -#endif - - /**************************/ - /* Bits in uifcapi_t.mode */ - /**************************/ -#define UIFC_INMSG (1<<0) /* Currently in Message Routine non-recursive */ -#define UIFC_MOUSE (1<<1) /* Mouse installed and available */ -#define UIFC_MONO (1<<2) /* Force monochrome mode */ -#define UIFC_COLOR (1<<3) /* Force color mode */ -#define UIFC_IBM (1<<4) /* Force use of IBM charset */ -#define UIFC_NOCTRL (1<<5) /* Don't allow usage of CTRL keys for movement - * etc in menus (Still available in text boxes) */ -#define UIFC_NHM (1<<6) /* Don't hide the mouse pointer */ -#define UIFC_NOMOUSE (1<<7) /* Don't enable/use the mouse */ - - /*******************************/ - /* Bits in uifcapi_t.list mode */ - /*******************************/ -#define WIN_ORG (1<<0) /* Original menu - destroy valid screen area */ -#define WIN_SAV (1<<1) /* Save existing text and replace when finished */ -#define WIN_ACT (1<<2) /* Menu remains active after a selection */ -#define WIN_L2R (1<<3) /* Center the window based on 'width' */ -#define WIN_T2B (1<<4) /* Center the window based on 'height' */ -#define WIN_INS (1<<5) /* Allows user to use insert key */ -#define WIN_INSACT (1<<6) /* Remains active after insert key */ -#define WIN_DEL (1<<7) /* Allows user to use delete key */ -#define WIN_DELACT (1<<8) /* Remains active after delete key */ -#define WIN_ESC (1<<9) /* Screen is active when escape is hit */ -#define WIN_RHT (1<<10) /* Place window against right side of screen */ -#define WIN_BOT (1<<11) /* Place window against bottom of screen */ -#define WIN_COPY (1<<12) /* Allows F5 to Get (copy) a menu item */ -#define WIN_PASTE (1<<13) /* Allows F6 to Put (paste) a menu item */ -#define WIN_CHE (1<<14) /* Stay active after escape if changes */ -#define WIN_XTR (1<<15) /* Add extra line at end for inserting at end */ -#define WIN_DYN (1<<16) /* Dynamic window - return at least every second */ -#define WIN_CUT (1<<17) /* Allow ^X (cut) a menu item */ -#define WIN_HLP (1<<17) /* Parse 'Help codes' - showbuf() */ -#define WIN_PACK (1<<18) /* Pack text in window (No padding) - showbuf() */ -#define WIN_IMM (1<<19) /* Draw window and return immediately */ -#define WIN_FAT (1<<20) /* Do not pad outside borders */ -#define WIN_REDRAW (1<<21) /* Force redraw on dynamic window */ -#define WIN_NODRAW (1<<22) /* Force not to redraw on dynamic window */ -#define WIN_EXTKEYS (1<<23) /* Return on any keypress... if it's not handled internally - * Return value is -2 - keyvalue */ -#define WIN_NOBRDR (1<<24) /* Do not draw a border around the window */ -#define WIN_FIXEDHEIGHT (1<<25) /* Use list_height from uifc struct */ -#define WIN_UNGETMOUSE (1<<26) /* If the mouse is clicked outside the window, */ - /* Put the mouse event back into the event queue */ -#define WIN_EDIT (1<<27) /* Allow F2 to edit a menu item */ -#define WIN_PASTEXTR (1<<28) /* Allow paste into extra (blank) item */ -#define WIN_INACT (1<<29) /* Draw window inactive... intended for use with WIN_IMM */ -#define WIN_POP (1<<30) /* Exit the list. Act as though ESC was pressed. */ - /* Intended for use after a WIN_EXTKEYS or WIN_DYN */ -#define WIN_SEL (1<<31) /* Exit the list. Act as though ENTER was pressed. */ - /* Intended for use after a WIN_EXTKEYS or WIN_DYN */ - -#define WIN_MID WIN_L2R|WIN_T2B /* Place window in middle of screen */ -#define WIN_GET WIN_COPY -#define WIN_PUT WIN_PASTE - -#define SCRN_TOP 3 -#define SCRN_LEFT 5 -#define SCRN_RIGHT ((int)api->scrn_width-4) - - /* Bits in 'mode' for getkey and getstr */ -#define K_UPPER (1L<<0) /* Converts all letters to upper case */ -#define K_UPRLWR (1L<<1) /* Upper/Lower case automatically */ -#define K_NUMBER (1L<<2) /* Allow numbers only */ -#define K_WRAP (1L<<3) /* Allows word wrap */ -#define K_MSG (1L<<4) /* Allows ANSI, ^N ^A ^G */ -#define K_SPIN (1L<<5) /* Spinning cursor (same as SPIN) */ -#define K_LINE (1L<<6) /* Input line (inverse color) */ -#define K_EDIT (1L<<7) /* Edit string passed */ -#define K_CHAT (1L<<8) /* In chat multi-chat */ -#define K_NOCRLF (1L<<9) /* Don't print CRLF after string input */ -#define K_ALPHA (1L<<10) /* Only allow alphabetic characters */ -#define K_SCANNING (1L<<11) /* UPC Scanner is active... return on '%' */ -#define K_TABEXIT (1L<<12) /* Return on TAB or BACKTAB */ -#define K_DECIMAL (1L<<13) /* Allow floating point numbers only */ -#define K_DEUCEEXIT (1L<<14) /* Return whenever Deuce wants to exit */ - /* Returns on up/down/F2 */ -#define K_MOUSEEXIT (1L<<15) /* Returns when mouse is clicked outside of */ - /* Input area (NOT outside of window!) */ - /* And ungets the mouse event. */ -#define K_PASSWORD (1L<<16) /* Does not display text while editing */ -#define K_FIND (1L<<17) /* Don't set the "changes" flag */ - - - /* Extra exit flags */ -#define UIFC_XF_QUIT (1<<0) /* Returned -1 due to CIO_KEY_QUIT */ - -#define HELPBUF_SIZE 4000 - -#ifndef _GEN_DEFS_H - /* Control characters */ -#define STX 0x02 /* Start of text ^B */ -#define ETX 0x03 /* End of text ^C */ -#define BS '\b' /* Back space ^H */ -#define TAB '\t' /* Horizontal tabulation ^I */ -#define LF '\n' /* Line feed ^J */ -#define FF 0x0c /* Form feed ^L */ -#define CR '\r' /* Carriage return ^M */ -#define ESC 0x1b /* Escape ^[ */ -#define DEL 0x7f /* Delete ^BS */ - -enum { - CTRL_A=1 - ,CTRL_B - ,CTRL_C - ,CTRL_D - ,CTRL_E - ,CTRL_F - ,CTRL_G - ,CTRL_H - ,CTRL_I - ,CTRL_J - ,CTRL_K - ,CTRL_L - ,CTRL_M - ,CTRL_N - ,CTRL_O - ,CTRL_P - ,CTRL_Q - ,CTRL_R - ,CTRL_S - ,CTRL_T - ,CTRL_U - ,CTRL_V - ,CTRL_W - ,CTRL_X - ,CTRL_Y - ,CTRL_Z -}; - -#endif - -#ifndef uchar /* Short-hand for unsigned data types */ -#define uchar unsigned char -#endif -#ifndef uint -#define uint unsigned int -#endif -#ifndef ulong -#define ulong unsigned long -#endif - -#ifndef BOOL -#define BOOL int -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif -#endif - -typedef struct { - int left,top,right,bot; - int *cur,*bar; - uchar* buf; -} win_t; - -typedef struct { - char background; - char help_char; - char close_char; - char up_arrow; - char down_arrow; - char button_left; - char button_right; - - char list_top_left; - char list_top; - char list_top_right; - char list_separator_left; - char list_separator_right; - char list_horizontal_separator; - char list_left; - char list_right; - char list_bottom_left; - char list_bottom_right; - char list_bottom; - char list_scrollbar_separator; - - char input_top_left; - char input_top; - char input_top_right; - char input_left; - char input_right; - char input_bottom_left; - char input_bottom_right; - char input_bottom; - - char popup_top_left; - char popup_top; - char popup_top_right; - char popup_left; - char popup_right; - char popup_bottom_left; - char popup_bottom_right; - char popup_bottom; - - char help_top_left; - char help_top; - char help_top_right; - char help_left; - char help_right; - char help_bottom_left; - char help_bottom_right; - char help_bottom; - char help_titlebreak_left; - char help_titlebreak_right; - char help_hitanykey_left; - char help_hitanykey_right; -} uifc_graphics_t; - -typedef struct { -/****************************************************************************/ -/* Size of the structure (for version compatibility verification). */ -/****************************************************************************/ - size_t size; -/****************************************************************************/ -/* Controls general UIFC library behavior. */ -/****************************************************************************/ - long mode; -/****************************************************************************/ -/* Set to TRUE when changes to data have been made by input function. */ -/****************************************************************************/ - BOOL changes; -/****************************************************************************/ -/* Set to TRUE to enable insert mode by default (not overwrite) */ -/****************************************************************************/ - BOOL insert_mode; -/****************************************************************************/ -/* The overlapped-window save buffer number. */ -/****************************************************************************/ - uint savnum; -/****************************************************************************/ -/* The current overlapped-window save buffer depth. */ -/****************************************************************************/ - uint savdepth; -/****************************************************************************/ -/* Screen length */ -/****************************************************************************/ - uint scrn_len; -/****************************************************************************/ -/* Screen Width */ -/****************************************************************************/ - uint scrn_width; -/****************************************************************************/ -/* ESC key delay for curses */ -/****************************************************************************/ - uint esc_delay; -/****************************************************************************/ -/* Alternative method of setting current help text. */ -/****************************************************************************/ - char* helpbuf; -/****************************************************************************/ -/* Location of the help data and index files. */ -/****************************************************************************/ - char helpdatfile[MAX_PATH+1]; - char helpixbfile[MAX_PATH+1]; - BOOL help_available; -/****************************************************************************/ -/* Help and exit button locations for current/last window */ -/****************************************************************************/ - int buttony; - int exitstart; - int exitend; - int helpstart; - int helpend; -/****************************************************************************/ -/* List height for WIN_FIXEDHEIGHT lists. */ -/****************************************************************************/ - int list_height; - -/****************************************************************************/ -/* Colours for the various bits */ -/****************************************************************************/ - uchar hclr,lclr,bclr,cclr,lbclr; - -/****************************************************************************/ -/* Have we initialized successfully? */ -/****************************************************************************/ - BOOL initialized; - -/****************************************************************************/ -/* UIFC_XF_* bits for extra exit status */ -/****************************************************************************/ - uint exit_flags; - -/****************************************************************************/ -/* Custom drawing characters */ -/****************************************************************************/ - uifc_graphics_t *chars; - -/****************************************************************************/ -/* Allow application override */ -/****************************************************************************/ - char** yesNoOpts; - -/****************************************************************************/ -/* Exit/uninitialize function. */ -/****************************************************************************/ - void (*bail) (void); -/****************************************************************************/ -/* Fill the screen with the appropriate background attribute. */ -/* str is the title for the application banner. */ -/* Returns 0 on success, non-zero on failure. */ -/****************************************************************************/ - int (*scrn) (const char* str); -/****************************************************************************/ -/* Popup a message, maybe wait for the user to hit a key or click button. */ -/****************************************************************************/ - int (*msg) (const char* str); - int (*msgf) (char* fmt, ...); - BOOL (*deny) (char* fmt, ...); - BOOL (*confirm) (char* fmt, ...); -/****************************************************************************/ -/* Popup/down a status message. */ -/* str is the message to display on popup. */ -/* if str==NULL, then the the status is to be cleared (popdown). */ -/****************************************************************************/ - void (*pop) (const char* str); -/****************************************************************************/ -/* General menu function. */ -/* mode contains WIN_* flags to control display and functionality. */ -/* left, top and width specify desired screen locations and window size. */ -/* cur is a pointer to the current (default) option. */ -/* bar is a pointer to the current location of the lightbar (which used). */ -/* title is the caption for the menu. */ -/* Menus can centered left to right and top to bottom automatically. */ -/* mode bits are set with macros WIN_*. */ -/* option is an array of char arrays, first element of last char array */ -/* must be NULL. */ -/* Returns the 0-based selected option number, -1 for ESC, or the selected */ -/* option number OR'd with MSK_INS, MSK_DEL, MSK_GET, MSK_PUT, or MSK_EDIT. */ -/****************************************************************************/ - int (*list) (int mode, int left, int top, int width, int* dflt - ,int* bar, const char *title, char** option); -/****************************************************************************/ -/* Windowed string input routine. */ -/* mode contains WIN_* flags to control display and functionality. */ -/* left and top specify desired screen location. */ -/* prompt is displayed before the input is requested. */ -/* str is the string to input or edit. */ -/* len is the maximum length of the string. */ -/* kmode contains flags that control the string input (K_* macros). */ -/* This function sets uifcapi_t.changes to TRUE if the string is modified. */ -/* Returns the length of the string or -1 on escape/abort. */ -/****************************************************************************/ - int (*input)(int mode, int left, int top, const char* prompt, char* str - ,int len, int kmode); -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ - void (*sethelp)(int line, char* file); - -/****************************************************************************/ -/* Shows the current help text */ -/****************************************************************************/ - void (*showhelp)(void); - -/****************************************************************************/ -/* Shows a scrollable text buffer - optionally parsing "help markup codes" */ -/****************************************************************************/ - void (*showbuf)(int mode, int left, int top, int width, int height - ,const char *title, const char *hbuf, int *curp, int *barp); - -/****************************************************************************/ -/* Updates time in upper left corner of screen with current time in ASCII/ */ -/* Unix format */ -/****************************************************************************/ - void (*timedisplay)(BOOL force); - -/****************************************************************************/ -/* Displays the bottom line using the WIN_* mode flags */ -/****************************************************************************/ - void (*bottomline)(int mode); - -/****************************************************************************/ -/* String input/exit box at a specified position */ -/****************************************************************************/ - int (*getstrxy)(int left, int top, int width, char *outstr, int max - ,long mode, int *lastkey); - -/****************************************************************************/ -/* Formatted print with attribute */ -/****************************************************************************/ - int (*printf)(int x, int y, unsigned attr, char *fmat, ...); - -} uifcapi_t; - -#ifdef __cplusplus -extern "C" { -#endif - -/* Return value from uifc_api.list() when uifcYesNoOpts is used */ -enum { - uifcYes=0, - uifcNo=1 -}; - -UIFCEXPORTVAR char* uifcYesNoOpts[]; - -/****************************************************************************/ -/* Initialization routines for each UIFC implementation. */ -/* Returns 0 on success, non-zero on failure. */ -/****************************************************************************/ -int uifcini(uifcapi_t*); /* Original implementation based on conio */ -UIFCEXPORT int uifcinix(uifcapi_t*); /* Standard I/O implementation */ -UIFCEXPORT int uifcini32(uifcapi_t*); /* modern implementation */ -/****************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif /* Don't add anything after this line! */ diff --git a/uifc/uifc32.c b/uifc/uifc32.c deleted file mode 100644 index bf2d263..0000000 --- a/uifc/uifc32.c +++ /dev/null @@ -1,3077 +0,0 @@ -/* Modern implementation of UIFC (user interface) library based on uifc.c */ -// vi: tabstop=4 - -/* $Id: uifc32.c,v 1.268 2020/08/16 20:37:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifdef __unix__ - #include <stdio.h> - #include <unistd.h> - #ifdef __QNX__ - #include <strings.h> - #endif - #define mswait(x) delay(x) -#elif defined(_WIN32) - #include <share.h> - #include <windows.h> - #define mswait(x) Sleep(x) -#endif -#include <genwrap.h> // for alloca() -#include <datewrap.h> // localtime_r() -#include "xpprintf.h" - -#include "ciolib.h" -#include "uifc.h" -#define MAX_GETSTR 5120 - -#define BLINK 128 - -static int cursor; -static char* helpfile=0; -static uint helpline=0; -static size_t blk_scrn_len; -static struct vmem_cell *blk_scrn; -static struct vmem_cell *tmp_buffer; -static struct vmem_cell *tmp_buffer2; -static win_t sav[MAX_BUFS]; -static uifcapi_t* api; - -/* Prototypes */ -static int uprintf(int x, int y, unsigned attr, char *fmt,...); -static void bottomline(int line); -static char *utimestr(time_t *intime); -static void help(void); -static int ugetstr(int left, int top, int width, char *outstr, int max, long mode, int *lastkey); -static void timedisplay(BOOL force); - -/* API routines */ -static void uifcbail(void); -static int uscrn(const char *str); -static int ulist(int mode, int left, int top, int width, int *dflt, int *bar - ,const char *title, char **option); -static int uinput(int imode, int left, int top, const char *prompt, char *str - ,int len ,int kmode); -static int umsg(const char *str); -static int umsgf(char *fmt, ...); -static BOOL confirm(char *fmt, ...); -static BOOL deny(char *fmt, ...); -static void upop(const char *str); -static void sethelp(int line, char* file); -static void showbuf(int mode, int left, int top, int width, int height, const char *title - , const char *hbuf, int *curp, int *barp); - -/* Dynamic menu support */ -static int *last_menu_cur=NULL; -static int *last_menu_bar=NULL; -static int save_menu_cur=-1; -static int save_menu_bar=-1; -static int save_menu_opts=-1; - -char* uifcYesNoOpts[]={"Yes","No",NULL}; - -static void reset_dynamic(void) { - last_menu_cur=NULL; - last_menu_bar=NULL; - save_menu_cur=-1; - save_menu_bar=-1; - save_menu_opts=-1; -} - -static uifc_graphics_t cp437_chars = { - .background=0xb0, - .help_char='?', - .close_char=0xfe, - .up_arrow=30, - .down_arrow=31, - .button_left='[', - .button_right=']', - - .list_top_left=0xc9, - .list_top=0xcd, - .list_top_right=0xbb, - .list_separator_left=0xcc, - .list_separator_right=0xb9, - .list_horizontal_separator=0xcd, - .list_left=0xba, - .list_right=0xba, - .list_bottom_left=0xc8, - .list_bottom_right=0xbc, - .list_bottom=0xcd, - .list_scrollbar_separator=0xb3, - - .input_top_left=0xc9, - .input_top=0xcd, - .input_top_right=0xbb, - .input_left=0xba, - .input_right=0xba, - .input_bottom_left=0xc8, - .input_bottom_right=0xbc, - .input_bottom=0xcd, - - .popup_top_left=0xda, - .popup_top=0xc4, - .popup_top_right=0xbf, - .popup_left=0xb3, - .popup_right=0xb3, - .popup_bottom_left=0xc0, - .popup_bottom_right=0xd9, - .popup_bottom=0xc4, - - .help_top_left=0xda, - .help_top=0xc4, - .help_top_right=0xbf, - .help_left=0xb3, - .help_right=0xb3, - .help_bottom_left=0xc0, - .help_bottom_right=0xd9, - .help_bottom=0xc4, - .help_titlebreak_left=0xb4, - .help_titlebreak_right=0xc3, - .help_hitanykey_left=0xb4, - .help_hitanykey_right=0xc3, -}; - -/****************************************************************************/ -/* Initialization function, see uifc.h for details. */ -/* Returns 0 on success. */ -/****************************************************************************/ - -void uifc_mouse_enable(void) -{ - ciomouse_setevents(0); - ciomouse_addevent(CIOLIB_BUTTON_1_DRAG_START); - ciomouse_addevent(CIOLIB_BUTTON_1_DRAG_MOVE); - ciomouse_addevent(CIOLIB_BUTTON_1_DRAG_END); - ciomouse_addevent(CIOLIB_BUTTON_1_CLICK); - ciomouse_addevent(CIOLIB_BUTTON_2_CLICK); - ciomouse_addevent(CIOLIB_BUTTON_3_CLICK); - ciomouse_addevent(CIOLIB_BUTTON_4_PRESS); - ciomouse_addevent(CIOLIB_BUTTON_5_PRESS); - mousepointer(CIOLIB_MOUSEPTR_BAR); - showmouse(); -} - -void uifc_mouse_disable(void) -{ - ciomouse_setevents(0); - hidemouse(); -} - -int kbwait(void) { - int timeout=0; - while(timeout++<50) { - if(kbhit()) - return(TRUE); - mswait(1); - } - return(FALSE); -} - -int inkey(void) -{ - int c; - - c=getch(); - if(!c || c==0xe0) - c|=(getch()<<8); - return(c); -} - -int uifcini32(uifcapi_t* uifcapi) -{ - unsigned i; - struct text_info txtinfo; - - if(uifcapi==NULL || uifcapi->size!=sizeof(uifcapi_t)) - return(-1); - - api=uifcapi; - if (api->chars == NULL) - api->chars = &cp437_chars; - - if (api->yesNoOpts == NULL) - api->yesNoOpts = uifcYesNoOpts; - - /* install function handlers */ - api->bail=uifcbail; - api->scrn=uscrn; - api->msg=umsg; - api->msgf=umsgf; - api->confirm=confirm; - api->deny=deny; - api->pop=upop; - api->list=ulist; - api->input=uinput; - api->sethelp=sethelp; - api->showhelp=help; - api->showbuf=showbuf; - api->timedisplay=timedisplay; - api->bottomline=bottomline; - api->getstrxy=ugetstr; - api->printf=uprintf; - - if(api->scrn_len!=0) { - switch(api->scrn_len) { - case 14: - textmode(C80X14); - break; - case 21: - textmode(C80X21); - break; - case 25: - textmode(C80); - break; - case 28: - textmode(C80X28); - break; - case 43: - textmode(C80X43); - break; - case 50: - textmode(C80X50); - break; - case 60: - textmode(C80X60); - break; - default: - textmode(C4350); - break; - } - } - -#if 0 - clrscr(); -#endif - - gettextinfo(&txtinfo); - /* unsupported mode? */ - if(txtinfo.screenheight<MIN_LINES -/* || txtinfo.screenheight>MAX_LINES */ - || txtinfo.screenwidth<40) { - textmode(C80); /* set mode to 80x25*/ - gettextinfo(&txtinfo); - } - window(1,1,txtinfo.screenwidth,txtinfo.screenheight); - - api->scrn_len=txtinfo.screenheight; - if(api->scrn_len<MIN_LINES) { - uifcbail(); - printf("\r\nUIFC: Screen length (%u) must be %d lines or greater\r\n" - ,api->scrn_len,MIN_LINES); - return(-2); - } - api->scrn_len--; /* account for status line */ - - if(txtinfo.screenwidth<40) { - uifcbail(); - printf("\r\nUIFC: Screen width (%u) must be at least 40 characters\r\n" - ,txtinfo.screenwidth); - return(-3); - } - api->scrn_width=txtinfo.screenwidth; - - if(!(api->mode&UIFC_COLOR) - && (api->mode&UIFC_MONO - || txtinfo.currmode==MONO || txtinfo.currmode==BW40 || txtinfo.currmode==BW80 - || txtinfo.currmode==MONO14 || txtinfo.currmode==BW40X14 || txtinfo.currmode==BW80X14 - || txtinfo.currmode==MONO21 || txtinfo.currmode==BW40X21 || txtinfo.currmode==BW80X21 - || txtinfo.currmode==MONO28 || txtinfo.currmode==BW40X28 || txtinfo.currmode==BW80X28 - || txtinfo.currmode==MONO43 || txtinfo.currmode==BW40X43 || txtinfo.currmode==BW80X43 - || txtinfo.currmode==MONO50 || txtinfo.currmode==BW40X50 || txtinfo.currmode==BW80X50 - || txtinfo.currmode==MONO60 || txtinfo.currmode==BW40X60 || txtinfo.currmode==BW80X60 - || txtinfo.currmode==ATARI_40X24 || txtinfo.currmode==ATARI_80X25)) - { - api->bclr=BLACK; - api->hclr=WHITE; - api->lclr=LIGHTGRAY; - api->cclr=LIGHTGRAY; - api->lbclr=BLACK|(LIGHTGRAY<<4); /* lightbar color */ - } else { - api->bclr=BLUE; - api->hclr=YELLOW; - api->lclr=WHITE; - api->cclr=CYAN; - api->lbclr=BLUE|(LIGHTGRAY<<4); /* lightbar color */ - } - - blk_scrn_len=api->scrn_width*api->scrn_len; - if((blk_scrn=(struct vmem_cell *)malloc(blk_scrn_len * sizeof(*blk_scrn)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,blk_scrn_len * sizeof(*blk_scrn)); - return(-1); - } - if((tmp_buffer=(struct vmem_cell *)malloc(blk_scrn_len * sizeof(*blk_scrn)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,blk_scrn_len * sizeof(*blk_scrn)); - return(-1); - } - if((tmp_buffer2=(struct vmem_cell *)malloc(blk_scrn_len * sizeof(*blk_scrn)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,blk_scrn_len * sizeof(*blk_scrn)); - return(-1); - } - for(i=0;i<blk_scrn_len;i++) { - blk_scrn[i].legacy_attr = api->cclr|(api->bclr<<4); - blk_scrn[i].ch = api->chars->background; - blk_scrn[i].font = 0; - attr2palette(blk_scrn[i].legacy_attr, &blk_scrn[i].fg, &blk_scrn[i].bg); - } - - cursor=_NOCURSOR; - _setcursortype(cursor); - - if(cio_api.mouse && !(api->mode&UIFC_NOMOUSE)) { - api->mode|=UIFC_MOUSE; - uifc_mouse_enable(); - } - - /* A esc_delay of less than 10 is stupid... silently override */ - if(api->esc_delay < 10) - api->esc_delay=25; - - if(cio_api.escdelay) - *(cio_api.escdelay)=api->esc_delay; - - for(i=0; i<MAX_BUFS; i++) - sav[i].buf=NULL; - api->savnum=0; - - api->initialized=TRUE; - - return(0); -} - -void docopy(void) -{ - int key; - struct mouse_event mevent; - struct ciolib_screen *screen; - struct ciolib_screen *sbuffer; - int sbufsize; - int x,y,startx,starty,endx,endy,lines; - int outpos; - char *copybuf; - uint32_t bg0; - uint32_t bg1; - uint32_t bg6; - uint32_t fg8; - - attr2palette(0x08, &fg8, &bg0); - attr2palette(0x10, NULL, &bg1); - attr2palette(0x60, NULL, &bg6); - screen=ciolib_savescreen(); - sbuffer=ciolib_savescreen(); - freepixels(sbuffer->pixels); - sbuffer->pixels = NULL; - sbufsize=screen->text_info.screenwidth * screen->text_info.screenheight * sizeof(screen->vmem[0]); - while(1) { - key=getch(); - if(key==0 || key==0xe0) - key|=getch()<<8; - switch(key) { - case CIO_KEY_MOUSE: - getmouse(&mevent); - if(mevent.startx<mevent.endx) { - startx=mevent.startx; - endx=mevent.endx; - } - else { - startx=mevent.endx; - endx=mevent.startx; - } - if(mevent.starty<mevent.endy) { - starty=mevent.starty; - endy=mevent.endy; - } - else { - starty=mevent.endy; - endy=mevent.starty; - } - switch(mevent.event) { - case CIOLIB_BUTTON_1_DRAG_MOVE: - memcpy(sbuffer->vmem,screen->vmem,sbufsize); - for(y=starty-1;y<endy;y++) { - for(x=startx-1;x<endx;x++) { - int pos=y*api->scrn_width+x; - - if (sbuffer->vmem[pos].bg != bg1) - sbuffer->vmem[pos].bg = bg1; - else - sbuffer->vmem[pos].bg = bg6; - if (sbuffer->vmem[pos].bg == sbuffer->vmem[pos].fg) - attr2palette(sbuffer->vmem[pos].legacy_attr | 0x08, &sbuffer->vmem[pos].fg, &sbuffer->vmem[pos].bg); - if ((sbuffer->vmem[pos].legacy_attr & 0x70) != 0x10) - sbuffer->vmem[pos].legacy_attr = (sbuffer->vmem[pos].legacy_attr & 0x8f) | 0x10; - else - sbuffer->vmem[pos].legacy_attr = (sbuffer->vmem[pos].legacy_attr & 0x8f) | 0x60; - if (((sbuffer->vmem[pos].legacy_attr & 0x70) >> 4) == (sbuffer->vmem[pos].legacy_attr & 0x08)) - sbuffer->vmem[pos].legacy_attr |= 0x08; - } - } - restorescreen(sbuffer); - break; - case CIOLIB_BUTTON_1_DRAG_END: - lines=abs(mevent.endy-mevent.starty)+1; - copybuf=malloc(((endy-starty+1)*(endx-startx+1)+1+lines*2)*4); - outpos=0; - for(y=starty-1;y<endy;y++) { - for(x=startx-1;x<endx;x++) { - size_t outlen; - uint8_t *utf8str; - char ch; - - ch = screen->vmem[(y*api->scrn_width+x)].ch ? screen->vmem[(y*api->scrn_width+x)].ch : ' '; - utf8str = cp_to_utf8(conio_fontdata[screen->vmem[(y*api->scrn_width+x)].font].cp, &ch, 1, &outlen); - if (utf8str == NULL) - continue; - memcpy(copybuf + outpos, utf8str, outlen); - outpos += outlen; - } - #ifdef _WIN32 - copybuf[outpos++]='\r'; - #endif - copybuf[outpos++]='\n'; - } - copybuf[outpos]=0; - copytext(copybuf, strlen(copybuf)); - free(copybuf); - restorescreen(screen); - freescreen(screen); - freescreen(sbuffer); - return; - } - break; - default: - restorescreen(screen); - freescreen(screen); - freescreen(sbuffer); - ungetch(key); - return; - } - } -} - -static int uifc_getmouse(struct mouse_event *mevent) -{ - mevent->startx=0; - mevent->starty=0; - mevent->event=0; - if(api->mode&UIFC_MOUSE) { - getmouse(mevent); - if(mevent->event==CIOLIB_BUTTON_3_CLICK) - return(ESC); - if(mevent->event==CIOLIB_BUTTON_1_DRAG_START) { - docopy(); - return(0); - } - if(mevent->starty==api->buttony) { - if(mevent->startx>=api->exitstart - && mevent->startx<=api->exitend - && mevent->event==CIOLIB_BUTTON_1_CLICK) { - return(ESC); - } - if(mevent->startx>=api->helpstart - && mevent->startx<=api->helpend - && mevent->event==CIOLIB_BUTTON_1_CLICK) { - return(CIO_KEY_F(1)); - } - } - if (mevent->event == CIOLIB_BUTTON_4_PRESS) - return(CIO_KEY_UP); - if (mevent->event == CIOLIB_BUTTON_5_PRESS) - return(CIO_KEY_DOWN); - return(0); - } - return(-1); -} - -void uifcbail(void) -{ - int i; - - _setcursortype(_NORMALCURSOR); - textattr(LIGHTGRAY); - uifc_mouse_disable(); - suspendciolib(); - FREE_AND_NULL(blk_scrn); - FREE_AND_NULL(tmp_buffer); - FREE_AND_NULL(tmp_buffer2); - api->initialized=FALSE; - for(i=0; i< MAX_BUFS; i++) - FREE_AND_NULL(sav[i].buf); -} - -/****************************************************************************/ -/* Clear screen, fill with background attribute, display application title. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uscrn(const char *str) -{ - textattr(api->bclr|(api->cclr<<4)); - gotoxy(1,1); - clreol(); - gotoxy(3,1); - cputs(str); - if(!vmem_puttext(1,2,api->scrn_width,api->scrn_len,blk_scrn)) - return(-1); - gotoxy(1,api->scrn_len+1); - clreol(); - reset_dynamic(); - setname(str); - return(0); -} - -/****************************************************************************/ -/****************************************************************************/ -static void scroll_text(int x1, int y1, int x2, int y2, int down) -{ - vmem_gettext(x1,y1,x2,y2,tmp_buffer2); - if(down) - vmem_puttext(x1,y1+1,x2,y2,tmp_buffer2); - else - vmem_puttext(x1,y1,x2,y2-1,tmp_buffer2+(((x2-x1)+1))); -} - -/****************************************************************************/ -/* Updates time in upper left corner of screen with current time in ASCII/ */ -/* Unix format */ -/****************************************************************************/ -static void timedisplay(BOOL force) -{ - static time_t savetime; - static int savemin; - time_t now; - struct tm gm; - int old_hold; - - now=time(NULL); - localtime_r(&now, &gm); - if(force || savemin != gm.tm_min || difftime(now,savetime)>=60) { - old_hold=hold_update; - hold_update=FALSE; - uprintf(api->scrn_width-25,1,api->bclr|(api->cclr<<4),utimestr(&now)); - hold_update=old_hold; - savetime=now; - savemin = gm.tm_min; - } -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' */ -/****************************************************************************/ -static void truncspctrl(char *str) -{ - uint c; - - c=strlen(str); - while(c && (uchar)str[c-1]<=' ') c--; - if(str[c]!=0) /* don't write to string constants */ - str[c]=0; -} - -static void -inactive_win(struct vmem_cell *buf, int left, int top, int right, int bottom, int y, int hbrdrsize, uchar cclr, uchar lclr, uchar hclr, int btop) -{ - int width = right - left + 1; - int height = bottom - top + 1; - int i, j; - - vmem_gettext(left, top, right, bottom, buf); - for (i=0; i < (width * height); i++) - set_vmem_attr(&buf[i], lclr | (cclr<<4)); - j=(((y-btop)*width))+3+((width-hbrdrsize-2)); - for(i=(((y-btop)*width))+3;i<j;i++) - set_vmem_attr(&buf[i], hclr|(cclr<<4)); - - vmem_puttext(left, top, right, bottom, buf); -} - -/****************************************************************************/ -/* General menu function, see uifc.h for details. */ -/****************************************************************************/ -int ulist(int mode, int left, int top, int width, int *cur, int *bar - , const char *initial_title, char **option) -{ - struct vmem_cell *ptr, *win, shade[MAX_LINES*2], line[MAX_COLS]; - static char search[MAX_OPLN] = ""; - int height,y; - int i,j,opts=0,s=0; /* s=search index into options */ - int is_redraw=0; - int s_top=SCRN_TOP; - int s_left=SCRN_LEFT; - int s_right=SCRN_RIGHT; - int s_bottom=api->scrn_len-3; - int hbrdrsize=2; - int lbrdrwidth=1; - int rbrdrwidth=1; - int vbrdrsize=4; - int tbrdrwidth=3; - int bbrdrwidth=1; - int title_len; - int tmpcur=0; - struct mouse_event mevnt; - char *title=NULL; - int a,b,c,longopt; - int optheight=0; - int gotkey; - uchar hclr,lclr,bclr,cclr,lbclr; - - if(cur==NULL) cur=&tmpcur; - api->exit_flags = 0; - hclr=api->hclr; - lclr=api->lclr; - bclr=api->bclr; - cclr=api->cclr; - lbclr=api->lbclr; - if(mode & WIN_INACT) { - bclr=api->cclr; - hclr=api->lclr; - lclr=api->lclr; - cclr=api->cclr; - lbclr=(api->cclr<<4)|api->hclr; - } - title=strdup(initial_title==NULL?"":initial_title); - - if(!(api->mode&UIFC_NHM)) - uifc_mouse_disable(); - - title_len=strlen(title); - - if(mode&WIN_FAT) { - s_top=1; - s_left=2; - s_right=api->scrn_width-3; /* Leave space for the shadow */ - s_bottom=api->scrn_len-1; /* Leave one for the shadow */ - } - if(mode&WIN_NOBRDR) { - hbrdrsize=0; - vbrdrsize=0; - lbrdrwidth=0; - rbrdrwidth=0; - tbrdrwidth=0; - bbrdrwidth=0; - } - /* Count the options */ - while (option != NULL && opts < MAX_OPTS) { - if (option[opts] == NULL || option[opts][0] == 0) - break; - else opts++; - } - if (mode&WIN_XTR && opts<MAX_OPTS) - opts++; - - /* Sanity-check the savnum */ - if(mode&WIN_SAV && api->savnum>=MAX_BUFS-1) - putch(7); - - api->help_available = (api->helpbuf!=NULL || api->helpixbfile[0]!=0); - - /* Create the status bar/bottom-line */ - int bline = mode; - if (api->bottomline != NULL) { - if ((mode&(WIN_XTR | WIN_PASTEXTR)) == WIN_XTR && (*cur) == opts - 1) - api->bottomline(bline & ~WIN_PASTE); - else - api->bottomline(bline); - } - optheight=opts+vbrdrsize; - height=optheight; - if(mode&WIN_FIXEDHEIGHT) { - height=api->list_height; - } - if(top+height>s_bottom) - height=(s_bottom)-top; - if(optheight>height) - optheight=height; - if(!width || width<title_len+hbrdrsize+2) { - width=title_len+hbrdrsize+2; - for(i=0;i<opts;i++) { - if(option[i]!=NULL) { - truncspctrl(option[i]); - if((j=strlen(option[i])+hbrdrsize+2+1)>width) - width=j; - } - } - } - /* Determine minimum widths here to accommodate mouse "icons" in border */ - if(!(mode&WIN_NOBRDR) && api->mode&UIFC_MOUSE) { - if(api->help_available && width<8) - width=8; - else if(width<5) - width=5; - } - if(width>(s_right+1)-s_left) { - width=(s_right+1)-s_left; - if(title_len>(width-hbrdrsize-2)) { - *(title+width-hbrdrsize-2-3)='.'; - *(title+width-hbrdrsize-2-2)='.'; - *(title+width-hbrdrsize-2-1)='.'; - *(title+width-hbrdrsize-2)=0; - title_len=strlen(title); - } - } - if(mode&WIN_L2R) - left=(s_right-s_left-width+1)/2; - else if(mode&WIN_RHT) - left=s_right-(width+hbrdrsize+2+left); - if(mode&WIN_T2B) - top=(api->scrn_len-height+1)/2-2; - else if(mode&WIN_BOT) - top=s_bottom-height-top; - if(left<0) - left=0; - if(top<0) - top=0; - - /* Dynamic Menus */ - if(mode&WIN_DYN - && cur != NULL - && bar != NULL - && last_menu_cur==cur - && last_menu_bar==bar - && save_menu_cur==*cur - && save_menu_bar==*bar - && save_menu_opts==opts) { - is_redraw=1; - } - - if(mode&WIN_DYN && mode&WIN_REDRAW) - is_redraw=1; - if(mode&WIN_DYN && mode&WIN_NODRAW) - is_redraw=0; - - if(mode&WIN_ORG && !(mode&WIN_SAV)) { /* Clear all save buffers on WIN_ORG */ - for(i=0; i< MAX_BUFS; i++) - FREE_AND_NULL(sav[i].buf); - api->savnum=0; - } - - if(mode&WIN_SAV) { - /* Check if this screen (by cur/bar) is already saved */ - for(i=0; i<MAX_BUFS; i++) { - if(sav[i].buf!=NULL) { - if(cur==sav[i].cur && bar==sav[i].bar) { - /* Yes, it is... */ - for(j=api->savnum-1; j>i; j--) { - /* Restore old screens */ - vmem_puttext(sav[j].left,sav[j].top,sav[j].right,sav[j].bot - ,(void *)sav[j].buf); /* put original window back */ - FREE_AND_NULL(sav[j].buf); - } - api->savnum=i; - } - } - } - /* savnum not the next one - must be a dynamic window or we popped back up the stack */ - if(sav[api->savnum].buf != NULL) { - /* Is this even the right window? */ - if(sav[api->savnum].cur==cur - && sav[api->savnum].bar==bar) { - if((sav[api->savnum].left!=s_left+left - || sav[api->savnum].top!=s_top+top - || sav[api->savnum].right!=s_left+left+width+1 - || sav[api->savnum].bot!=s_top+top+height)) { /* dimensions have changed */ - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); /* put original window back */ - FREE_AND_NULL(sav[api->savnum].buf); - if ((sav[api->savnum].buf = malloc((width + 3) * (height + 2) * sizeof(struct vmem_cell)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,(width+3)*(height+2)*sizeof(struct vmem_cell)); - free(title); - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - return(-1); - } - vmem_gettext(s_left+left,s_top+top,s_left+left+width+1 - ,s_top+top+height,(void *)sav[api->savnum].buf); /* save again */ - sav[api->savnum].left=s_left+left; - sav[api->savnum].top=s_top+top; - sav[api->savnum].right=s_left+left+width+1; - sav[api->savnum].bot=s_top+top+height; - sav[api->savnum].cur=cur; - sav[api->savnum].bar=bar; - } - } - else { - /* Find something available... */ - while(sav[api->savnum].buf!=NULL) - api->savnum++; - } - } - else { - if((sav[api->savnum].buf=malloc((width+3)*(height+2)*sizeof(struct vmem_cell)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,(width+3)*(height+2)*sizeof(struct vmem_cell)); - free(title); - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - return(-1); - } - vmem_gettext(s_left+left,s_top+top,s_left+left+width+1 - ,s_top+top+height,(void *)sav[api->savnum].buf); - sav[api->savnum].left=s_left+left; - sav[api->savnum].top=s_top+top; - sav[api->savnum].right=s_left+left+width+1; - sav[api->savnum].bot=s_top+top+height; - sav[api->savnum].cur=cur; - sav[api->savnum].bar=bar; - } - } - - if(!is_redraw) { - if(mode&WIN_ORG) { /* Clear around menu */ - if(top) - vmem_puttext(1,2,api->scrn_width,s_top+top-1,blk_scrn); - if((unsigned)(s_top+height+top)<=api->scrn_len) - vmem_puttext(1,s_top+height+top,api->scrn_width,api->scrn_len,blk_scrn); - if(left) - vmem_puttext(1,s_top+top,s_left+left-1,s_top+height+top - ,blk_scrn); - if(s_left+left+width<=s_right) - vmem_puttext(s_left+left+width,s_top+top,/* s_right+2 */api->scrn_width - ,s_top+height+top,blk_scrn); - } - ptr=tmp_buffer; - if(!(mode&WIN_NOBRDR)) { - set_vmem(ptr++, api->chars->list_top_left, hclr|(bclr<<4), 0); - - if(api->mode&UIFC_MOUSE) { - set_vmem(ptr++, api->chars->button_left, hclr|(bclr<<4), 0); - /* *(ptr++)='�'; */ - set_vmem(ptr++, api->chars->close_char, lclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->button_right, hclr|(bclr<<4), 0); - i=3; - if(api->help_available) { - set_vmem(ptr++, api->chars->button_left, hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->help_char, lclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->button_right, hclr|(bclr<<4), 0); - i+=3; - } - api->buttony=s_top+top; - api->exitstart=s_left+left+1; - api->exitend=s_left+left+3; - api->helpstart=s_left+left+4; - api->helpend=s_left+left+6; - } - else - i=0; - - for(;i<width-2;i++) - set_vmem(ptr++, api->chars->list_top, hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_top_right, hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_left, hclr|(bclr<<4), 0); - a=title_len; - b=(width-a-1)/2; - for(i=0;i<b;i++) { - set_vmem(ptr++, ' ', hclr|(bclr<<4), 0); - } - for(i=0;i<a;i++) - set_vmem(ptr++, title[i], hclr|(bclr<<4), 0); - for(i=0;i<width-(a+b)-2;i++) - set_vmem(ptr++, ' ', hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_right, hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_separator_left, hclr|(bclr<<4), 0); - for(i=0;i<width-2;i++) - set_vmem(ptr++, api->chars->list_horizontal_separator, hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_separator_right, hclr|(bclr<<4), 0); - } - - if((*cur)>=opts) - (*cur)=opts-1; /* returned after scrolled */ - - if(!bar) { - if((*cur)>height-vbrdrsize-1) - (*cur)=height-vbrdrsize-1; - if((*cur)>opts-1) - (*cur)=opts-1; - i=0; - } - else { - if((*bar)>=opts) - (*bar)=opts-1; - if((*bar)>height-vbrdrsize-1) - (*bar)=height-vbrdrsize-1; - if((*cur)==opts-1) - (*bar)=height-vbrdrsize-1; - if((*bar)>opts-1) - (*bar)=opts-1; - if((*bar)<0) - (*bar)=0; - i=(*cur)-(*bar); - if (i < 0) { - *bar += i; - i = 0; - } - if(i+(height-vbrdrsize-1)>=opts) { - (*bar)=(height-vbrdrsize); - if (*bar > *cur) - *bar = *cur; - i=(*cur)-(*bar)+1; - } - } - if((*cur)<0) - (*cur)=0; - - j=0; - if(i<0) i=0; - longopt=0; - while(j<height-vbrdrsize) { - if(!(mode&WIN_NOBRDR)) - set_vmem(ptr++, api->chars->list_left, hclr|(bclr<<4), 0); - set_vmem(ptr++, ' ', hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_scrollbar_separator, lclr|(bclr<<4), 0); - if(i==(*cur)) - a=lbclr; - else - a=lclr|(bclr<<4); - if(i<opts && option[i]!=NULL) { - b=strlen(option[i]); - if(b>longopt) - longopt=b; - if(b+hbrdrsize+2>width) - b=width-hbrdrsize-2; - for(c=0;c<b;c++) - set_vmem(ptr++, option[i][c], a, 0); - } - else - c=0; - while(c<width-hbrdrsize-2) { - set_vmem(ptr++, ' ', a, 0); - c++; - } - if(!(mode&WIN_NOBRDR)) - set_vmem(ptr++, api->chars->list_right, hclr|(bclr<<4), 0); - i++; - j++; - } - if(!(mode&WIN_NOBRDR)) { - set_vmem(ptr++, api->chars->list_bottom_left, hclr|(bclr<<4), 0); - for(i=0;i<width-2;i++) - set_vmem(ptr++, api->chars->list_bottom, hclr|(bclr<<4), 0); - set_vmem(ptr, api->chars->list_bottom_right, hclr|(bclr<<4), 0); /* Not incremented to shut up BCC */ - } - vmem_puttext(s_left+left,s_top+top,s_left+left+width-1 - ,s_top+top+height-1,tmp_buffer); - if(bar) - y=top+tbrdrwidth+(*bar); - else - y=top+tbrdrwidth+(*cur); - if(opts+vbrdrsize>height && ((!bar && (*cur)!=opts-1) - || (bar && ((*cur)-(*bar))+(height-vbrdrsize)<opts))) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - textattr(lclr|(bclr<<4)); - putch(api->chars->down_arrow); /* put down arrow */ - textattr(hclr|(bclr<<4)); - } - - if(bar && (*bar)!=(*cur)) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - textattr(hclr|(bclr<<4)); - } - - if(!(mode&WIN_NOBRDR)) { - /* Shadow */ - if(api->bclr==BLUE) { - vmem_gettext(s_left+left+width,s_top+top+1,s_left+left+width+1 - ,s_top+top+height-1,shade); - for(i=0;i<height*2;i++) - set_vmem_attr(&shade[i], DARKGRAY); - vmem_puttext(s_left+left+width,s_top+top+1,s_left+left+width+1 - ,s_top+top+height-1,shade); - vmem_gettext(s_left+left+2,s_top+top+height,s_left+left+width+1 - ,s_top+top+height,shade); - for(i=0;i<width;i++) - set_vmem_attr(&shade[i], DARKGRAY); - vmem_puttext(s_left+left+2,s_top+top+height,s_left+left+width+1 - ,s_top+top+height,shade); - } - } - } - else { /* Is a redraw */ - if(bar) - y=top+tbrdrwidth+(*bar); - else - y=top+tbrdrwidth+(*cur); - i=(*cur)+(top+tbrdrwidth-y); - j=tbrdrwidth-1; - - longopt=0; - while(j<height-bbrdrwidth-1) { - ptr=tmp_buffer; - if(i==(*cur)) - a=lbclr; - else - a=lclr|(bclr<<4); - if(i<opts && option[i]!=NULL) { - b=strlen(option[i]); - if(b>longopt) - longopt=b; - if(b+hbrdrsize+2>width) - b=width-hbrdrsize-2; - for(c=0;c<b;c++) - set_vmem(ptr++, option[i][c], a, 0); - } - else - c=0; - while(c<width-hbrdrsize-2) { - set_vmem(ptr++, ' ', a, 0); - c++; - } - i++; - j++; - vmem_puttext(s_left+left+lbrdrwidth+2,s_top+top+j,s_left+left+width-rbrdrwidth-1 - ,s_top+top+j,tmp_buffer); - } - } - free(title); - - last_menu_cur=cur; - last_menu_bar=bar; - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - - if(mode&WIN_IMM) { - return(-2); - } - - if(mode&WIN_ORG) { - if(api->timedisplay != NULL) - api->timedisplay(/* force? */TRUE); - } - - while(1) { - #if 0 /* debug */ - struct text_info txtinfo; - gettextinfo(&txtinfo); - gotoxy(30,1); - cprintf("y=%2d h=%2d c=%2d b=%2d s=%2d o=%2d w=%d/%d h=%d/%d" - ,y,height,*cur,bar ? *bar :0xff,api->savnum,opts,txtinfo.screenwidth, api->scrn_width, txtinfo.screenheight, api->scrn_len); - #endif - if(api->timedisplay != NULL) - api->timedisplay(/* force? */FALSE); - gotkey=0; - textattr(((api->lbclr)&0x0f)|((api->lbclr >> 4)&0x0f)); - gotoxy(s_left+lbrdrwidth+2+left, s_top+y); - if((api->exit_flags & UIFC_XF_QUIT) || kbwait() || (mode&(WIN_POP|WIN_SEL))) { - if(api->exit_flags & UIFC_XF_QUIT) - gotkey = CIO_KEY_QUIT; - else if(mode&WIN_POP) - gotkey=ESC; - else if(mode&WIN_SEL) - gotkey=CR; - else - gotkey=inkey(); - if(gotkey==CIO_KEY_MOUSE) { - if((gotkey=uifc_getmouse(&mevnt))==0) { - /* Clicked in menu */ - if(mevnt.startx>=s_left+left+lbrdrwidth+2 - && mevnt.startx<=s_left+left+width-rbrdrwidth-1 - && mevnt.starty>=s_top+top+tbrdrwidth - && mevnt.starty<=(s_top+top+optheight)-bbrdrwidth-1 - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - - (*cur)=((mevnt.starty)-(s_top+top+tbrdrwidth))+(*cur+(top+tbrdrwidth-y)); - if(bar) - (*bar)=(*cur); - y=top+tbrdrwidth+((mevnt.starty)-(s_top+top+tbrdrwidth)); - - if(!opts) - continue; - - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_ACT) { - if(!(api->mode&UIFC_NHM)) - uifc_mouse_disable(); - if((win=malloc((width+3)*(height+2)*sizeof(*win)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,(width+3)*(height+2)*sizeof(*win)); - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - return(-1); - } - inactive_win(win, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); - free(win); - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - } - else if(mode&WIN_SAV) { - api->savnum--; - if(!(api->mode&UIFC_NHM)) - uifc_mouse_disable(); - if(sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - FREE_AND_NULL(sav[api->savnum].buf); - } - if(mode&WIN_XTR && (*cur)==opts-1) - return(MSK_INS|*cur); - return(*cur); - } - /* Clicked Scroll Up */ - else if(mevnt.startx==s_left+left+lbrdrwidth - && mevnt.starty==s_top+top+tbrdrwidth - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - gotkey=CIO_KEY_PPAGE; - } - /* Clicked Scroll Down */ - else if(mevnt.startx==s_left+left+lbrdrwidth - && mevnt.starty==(s_top+top+height)-bbrdrwidth-1 - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - gotkey=CIO_KEY_NPAGE; - } - /* Clicked Outside of Window */ - else if((mevnt.startx<s_left+left - || mevnt.startx>s_left+left+width-1 - || mevnt.starty<s_top+top - || mevnt.starty>s_top+top+height-1) - && (mevnt.event==CIOLIB_BUTTON_1_CLICK - || mevnt.event==CIOLIB_BUTTON_3_CLICK)) { - if(mode&WIN_UNGETMOUSE) { - ungetmouse(&mevnt); - gotkey=CIO_KEY_MOUSE; - } - else { - gotkey=ESC; - } - } - } - } - /* For compatibility with terminals lacking special keys */ - switch(gotkey) { - case '\b': - gotkey=ESC; - break; - case '+': - gotkey=CIO_KEY_IC; /* insert */ - break; - case '-': - case DEL: - gotkey=CIO_KEY_DC; /* delete */ - break; - case CTRL_B: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_HOME; - break; - case CTRL_C: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_F(5); /* copy */ - break; - case CTRL_D: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_NPAGE; - break; - case CTRL_E: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_END; - break; - case CTRL_U: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_PPAGE; - break; - case CTRL_V: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_F(6); /* paste */ - break; - case CTRL_X: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_SHIFT_DC; /* cut */ - break; - case CTRL_Z: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_F(1); /* help */ - break; - case CIO_KEY_ABORTED: - gotkey=ESC; - break; - case CIO_KEY_QUIT: - api->exit_flags |= UIFC_XF_QUIT; - gotkey=ESC; - break; - } - if(gotkey>255) { - s=0; - switch(gotkey) { - /* ToDo extended keys */ - case CIO_KEY_HOME: /* home */ - if(!opts) - break; - if(opts+vbrdrsize>optheight) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(' '); /* Delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(api->chars->down_arrow); /* put the down arrow */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[0]); - for(i=1;i<optheight-vbrdrsize;i++) /* re-display options */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - (*cur)=0; - if(bar) - (*bar)=0; - y=top+tbrdrwidth; - break; - } - vmem_gettext(s_left+left+lbrdrwidth+2,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<width;i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+left+lbrdrwidth+2,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - (*cur)=0; - if(bar) - (*bar)=0; - y=top+tbrdrwidth; - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<width;i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - break; - case CIO_KEY_UP: /* up arrow */ - if(!opts) - break; - if(!(*cur) && opts+vbrdrsize>optheight) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); /* like end */ - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(' '); /* delete the down arrow */ - for(i=(opts+vbrdrsize)-optheight,j=0;i<opts;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==opts-1 ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - (*cur)=opts-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - y=top+optheight-bbrdrwidth-1; - break; - } - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<width;i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - if(!(*cur)) { - y=top+optheight-bbrdrwidth-1; - (*cur)=opts-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - } - else { - (*cur)--; - y--; - if(bar && *bar) - (*bar)--; - } - if(y<top+tbrdrwidth) { /* scroll */ - if(!(*cur)) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(' '); /* delete the up arrow */ - } - if((*cur)+optheight-vbrdrsize==opts-1) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - textattr(lclr|(bclr<<4)); - putch(api->chars->down_arrow); /* put the dn arrow */ - } - y++; - scroll_text(s_left+left+lbrdrwidth+1,s_top+top+tbrdrwidth - ,s_left+left+width-rbrdrwidth-1,s_top+top+height-bbrdrwidth-1,1); - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[*cur]); - } - else { - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<width;i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - } - break; - case CIO_KEY_PPAGE: /* PgUp */ - if(!opts) - break; - *cur -= (optheight-vbrdrsize-1); - if(*cur<0) - *cur = 0; - if(bar) - *bar=0; - y=top+tbrdrwidth; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - if(*cur) /* Scroll mode */ - putch(api->chars->up_arrow); /* put the up arrow */ - else - putch(' '); /* delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - if(opts >= height-tbrdrwidth && *cur + height - vbrdrsize < opts) - putch(api->chars->down_arrow); /* put the down arrow */ - else - putch(' '); /* delete the down arrow */ - for(i=*cur,j=0;i<=*cur-vbrdrsize-1+optheight;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==*cur ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - break; - case CIO_KEY_NPAGE: /* PgDn */ - if(!opts) - break; - *cur += (height-vbrdrsize-1); - if(*cur>opts-1) - *cur = opts-1; - if(bar) - *bar = optheight-vbrdrsize-1; - y=top+optheight-bbrdrwidth-1; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - if(*cur>height-vbrdrsize-1) /* Scroll mode */ - putch(api->chars->up_arrow); /* put the up arrow */ - else - putch(' '); /* delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - if(*cur < opts-1) - putch(api->chars->down_arrow); /* put the down arrow */ - else - putch(' '); /* delete the down arrow */ - for(i=*cur+vbrdrsize+1-optheight,j=0;i<=*cur;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==*cur ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - break; - case CIO_KEY_END: /* end */ - if(!opts) - break; - if(opts+vbrdrsize>height) { /* Scroll mode */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(' '); /* delete the down arrow */ - for(i=(opts+vbrdrsize)-height,j=0;i<opts;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==opts-1 ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - (*cur)=opts-1; - y=top+optheight-bbrdrwidth-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - break; - } - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<width;i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - (*cur)=opts-1; - y=top+optheight-bbrdrwidth-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<74;i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - break; - case CIO_KEY_DOWN: /* dn arrow */ - if(!opts) - break; - if((*cur)==opts-1 && opts+vbrdrsize>height) { /* like home */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(' '); /* Delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(api->chars->down_arrow); /* put the down arrow */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[0]); - for(i=1;i<height-vbrdrsize;i++) /* re-display options */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - (*cur)=0; - y=top+tbrdrwidth; - if(bar) - (*bar)=0; - break; - } - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0; i < width; i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - if((*cur)==opts-1) { - (*cur)=0; - y=top+tbrdrwidth; - if(bar) { - /* gotoxy(1,1); cprintf("bar=%08lX ",bar); */ - (*bar)=0; - } - } - else { - (*cur)++; - y++; - if(bar && (*bar)<height-vbrdrsize-1) { - /* gotoxy(1,1); cprintf("bar=%08lX ",bar); */ - (*bar)++; - } - } - if(y==top+height-bbrdrwidth) { /* scroll */ - if(*cur==opts-1) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - textattr(lclr|(bclr<<4)); - putch(' '); /* delete the down arrow */ - } - if((*cur)+vbrdrsize==height) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - } - y--; - /* gotoxy(1,1); cprintf("\rdebug: %4d ",__LINE__); */ - scroll_text(s_left+left+lbrdrwidth+1,s_top+top+tbrdrwidth - ,s_left+left+width-rbrdrwidth-1,s_top+top+height-bbrdrwidth-1,0); - /* gotoxy(1,1); cprintf("\rdebug: %4d ",__LINE__); */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+height-bbrdrwidth-1 - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[*cur]); - } - else { - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y - ,line); - for(i=0; i < width; i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y - ,line); - } - break; - case CIO_KEY_F(1): /* F1 - Help */ - { - struct vmem_cell *save = malloc(width*height*sizeof(*save)); - if(save != NULL) { - vmem_gettext(s_left+left,s_top+top,s_left - +left+width-1,s_top+top+height-1,save); - struct vmem_cell *copy = malloc(width*height*sizeof(*copy)); - if(copy != NULL) { - inactive_win(copy, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); - free(copy); - } - } - api->showhelp(); - if(save != NULL) { - vmem_puttext(s_left+left,s_top+top,s_left - +left+width-1,s_top+top+height-1,save); - free(save); - } - break; - } - case CIO_KEY_F(2): /* F2 - Edit */ - if(mode&WIN_XTR && (*cur)==opts-1) /* can't edit */ - break; /* extra line */ - if(mode&WIN_EDIT) { - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_ACT) - inactive_win(tmp_buffer, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); - else if(mode&WIN_SAV) { - api->savnum--; - if(sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); - } - return((*cur)|MSK_EDIT); - } - break; - case CIO_KEY_F(5): /* F5 - Copy */ - case CIO_KEY_CTRL_IC: /* Ctrl-Insert */ - if(mode&WIN_COPY && !(mode&WIN_XTR && (*cur)==opts-1)) - return((*cur) | MSK_COPY); - break; - case CIO_KEY_SHIFT_DC: /* Shift-Del: Cut */ - if(mode&WIN_CUT && !(mode&WIN_XTR && (*cur) == opts - 1)) - return((*cur) | MSK_CUT); - break; - case CIO_KEY_SHIFT_IC: /* Shift-Insert: Paste */ - case CIO_KEY_F(6): /* F6 - Paste */ - if(mode&WIN_PASTE && (mode&WIN_PASTEXTR || !(mode&WIN_XTR && (*cur)==opts-1))) - return((*cur)|MSK_PASTE); - break; - case CIO_KEY_IC: /* insert */ - if(mode&WIN_INS) { - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_INSACT) - inactive_win(tmp_buffer, s_left+left,s_top+top,s_left+left+width-1,s_top+top+height-1,y, hbrdrsize, cclr, lclr, hclr, top); - else if(mode&WIN_SAV) { - api->savnum--; - if(sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); - } - if(!opts) { - return(MSK_INS); - } - return((*cur)|MSK_INS); - } - break; - case CIO_KEY_DC: /* delete */ - if(mode&WIN_XTR && (*cur)==opts-1) /* can't delete */ - break; /* extra line */ - if(mode&WIN_DEL) { - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_DELACT) - inactive_win(tmp_buffer, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); - else if(mode&WIN_SAV) { - api->savnum--; - if (sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); - } - return((*cur)|MSK_DEL); - } - break; - default: - if(mode&WIN_EXTKEYS) - return(-2-gotkey); - break; - } - } - else { - gotkey&=0xff; - if(isalnum(gotkey) && opts>1 && option[0][0]) { - search[s]=gotkey; - search[s+1]=0; - for(j=(*cur)+1,a=b=0;a<2;j++) { /* a = search count */ - if(j==opts) { /* j = option count */ - j=-1; /* b = letter count */ - continue; - } - if(j==(*cur)) { - b++; - continue; - } - if(b>=longopt) { - b=0; - a++; - } - if(a==1 && !s) - break; - if(option[j]!=NULL - && strlen(option[j])>(size_t)b - && ((!a && s && !strnicmp(option[j]+b,search,s+1)) - || ((a || !s) && toupper(option[j][b])==toupper(gotkey)))) { - if(a) s=0; - else s++; - if(y+(j-(*cur))+2>height+top) { - (*cur)=j; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - if((*cur)==opts-1) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(' '); /* delete the down arrow */ - } - for(i=((*cur)+vbrdrsize+1)-height,j=0;i<(*cur)+1;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==(*cur) ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - y=top+height-bbrdrwidth-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - break; - } - if(y-((*cur)-j)<top+tbrdrwidth) { - (*cur)=j; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - if(!(*cur)) - putch(' '); /* Delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(api->chars->down_arrow); /* put the down arrow */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[(*cur)]); - for(i=1;i<height-vbrdrsize;i++) /* re-display options */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2 - ,option[(*cur)+i]); - y=top+tbrdrwidth; - if(bar) - (*bar)=0; - break; - } - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0; i<width; i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - if((*cur)>j) - y-=(*cur)-j; - else - y+=j-(*cur); - if(bar) { - if((*cur)>j) - (*bar)-=(*cur)-j; - else - (*bar)+=j-(*cur); - } - (*cur)=j; - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0; i < width; i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - break; - } - } - if(a==2) - s=0; - } - else - switch(gotkey) { - case CR: - if(!opts) - break; - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_ACT) - inactive_win(tmp_buffer, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); - else if(mode&WIN_SAV) { - api->savnum--; - if (sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); - } - if(mode&WIN_XTR && (*cur)==opts-1) - return(MSK_INS|*cur); - return(*cur); - case 3: - case ESC: - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_ESC || (mode&WIN_CHE && api->changes)) { - vmem_gettext(s_left+left,s_top+top,s_left - +left+width-1,s_top+top+height-1,tmp_buffer); - for(i=0; i < (width * height);i++) - set_vmem_attr(&tmp_buffer[i], lclr|(cclr<<4)); - vmem_puttext(s_left+left,s_top+top,s_left - +left+width-1,s_top+top+height-1,tmp_buffer); - } - else if(mode&WIN_SAV) { - api->savnum--; - if (sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); - } - return(-1); - case CTRL_F: /* find */ - case CTRL_G: - if(/*!(api->mode&UIFC_NOCTRL)*/1) { // No no, *this* control key is fine! - if (gotkey == CTRL_G || api->input(WIN_MID|WIN_SAV, 0, 0, "Find", search, sizeof(search), K_EDIT|K_FIND) > 0) { - for (j = (*cur) + 1; j != *cur; j++, j = (j >= opts) ? 0 : j) { - if (option[j] == NULL || j >= opts) - continue; - if (strcasestr(option[j], search) != NULL) { - // Copy/pasted from search above. - if(y+(j-(*cur))+2>height+top) { - (*cur)=j; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - if((*cur)==opts-1) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(' '); /* delete the down arrow */ - } - for(i=((*cur)+vbrdrsize+1)-height,j=0;i<(*cur)+1;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==(*cur) ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - y=top+height-bbrdrwidth-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - break; - } - if(y-((*cur)-j)<top+tbrdrwidth) { - (*cur)=j; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - if(!(*cur)) - putch(' '); /* Delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(api->chars->down_arrow); /* put the down arrow */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[(*cur)]); - for(i=1;i<height-vbrdrsize;i++) /* re-display options */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2 - ,option[(*cur)+i]); - y=top+tbrdrwidth; - if(bar) - (*bar)=0; - break; - } - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0; i<width; i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - if((*cur)>j) - y-=(*cur)-j; - else - y+=j-(*cur); - if(bar) { - if((*cur)>j) - (*bar)-=(*cur)-j; - else - (*bar)+=j-(*cur); - } - (*cur)=j; - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0; i < width; i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - break; - } - } - } - } - break; - default: - if(mode&WIN_EXTKEYS) - return(-2-gotkey); - } - } - /* Update the status bar to reflect the Put/Paste option applicability */ - if (bline&WIN_PASTE && api->bottomline != NULL) { - if ((mode&(WIN_XTR | WIN_PASTEXTR)) == WIN_XTR && (*cur) == opts - 1) - api->bottomline(bline & ~WIN_PASTE); - else - api->bottomline(bline); - } - } - else - mswait(1); - if(mode&WIN_DYN) { - save_menu_cur=*cur; - save_menu_bar=*bar; - save_menu_opts=opts; - return(-2-gotkey); - } - } -} - - -/*************************************************************************/ -/* This function is a windowed input string input routine. */ -/*************************************************************************/ -int uinput(int mode, int left, int top, const char *inprompt, char *str, - int max, int kmode) -{ - struct vmem_cell shade[MAX_COLS], save_buf[MAX_COLS*4], in_win[MAX_COLS*3]; - int width; - int height=3; - int i,plen,slen,j; - int iwidth; - int l; - char *prompt; - int s_top=SCRN_TOP; - int s_left=SCRN_LEFT; - int s_right=SCRN_RIGHT; - int s_bottom=api->scrn_len-3; - int hbrdrsize=2; - int tbrdrwidth=1; - - reset_dynamic(); - - if(mode&WIN_FAT) { - s_top=1; - s_left=2; - s_right=api->scrn_width-3; /* Leave space for the shadow */ - } - if(mode&WIN_NOBRDR) { - hbrdrsize=0; - tbrdrwidth=0; - height=1; - } - - prompt=strdup(inprompt==NULL ? "":inprompt); - plen=strlen(prompt); - if(!plen) - slen=2+hbrdrsize; - else - slen=4+hbrdrsize; - - width=plen+slen+max; - if(width>(s_right-s_left+1)) - width=(s_right-s_left+1); - if(mode&WIN_T2B) - top=(api->scrn_len-height+1)/2-2; - else if(mode&WIN_BOT) - top=s_bottom-height-top; - if(mode&WIN_L2R) - left=(s_right-s_left-width+1)/2; - if(left<=-(s_left)) - left=-(s_left)+1; - if(top<0) - top=0; - if(mode&WIN_SAV) - vmem_gettext(s_left+left,s_top+top,s_left+left+width+1 - ,s_top+top+height,save_buf); - if(mode&WIN_ORG) { /* Clear around menu */ - if(top) - vmem_puttext(1,2,api->scrn_width,s_top+top-1,blk_scrn); - if((unsigned)(s_top+height+top)<=api->scrn_len) - vmem_puttext(1,s_top+height+top,api->scrn_width,api->scrn_len,blk_scrn); - if(left) - vmem_puttext(1,s_top+top,s_left+left-1,s_top+height+top - ,blk_scrn); - if(s_left+left+width<=s_right) - vmem_puttext(s_left+left+width,s_top+top,/* s_right+2 */api->scrn_width - ,s_top+height+top,blk_scrn); - } - - iwidth=width-plen-slen; - while(iwidth<1 && plen>4) { - plen=strlen(prompt); - prompt[plen-1]=0; - prompt[plen-2]='.'; - prompt[plen-3]='.'; - prompt[plen-4]='.'; - plen--; - iwidth=width-plen-slen; - } - - i=0; - if(!(mode&WIN_NOBRDR)) { - set_vmem(&in_win[i++], api->chars->input_top_left, api->hclr|(api->bclr<<4), 0); - for(j=1;j<width-1;j++) - set_vmem(&in_win[i++], api->chars->input_top, api->hclr|(api->bclr<<4), 0); - if(api->mode&UIFC_MOUSE && width>6) { - j=1; - set_vmem(&in_win[j++], api->chars->button_left, api->hclr|(api->bclr<<4), 0); - /* in_win[4]='�'; */ - set_vmem(&in_win[j++], api->chars->close_char, api->lclr|(api->bclr<<4), 0); - set_vmem(&in_win[j++], api->chars->button_right, api->hclr|(api->bclr<<4), 0); - l=3; - if(api->helpbuf!=NULL || api->helpixbfile[0]!=0) { - set_vmem(&in_win[j++], api->chars->button_left, api->hclr|(api->bclr<<4), 0); - set_vmem(&in_win[j++], api->chars->help_char, api->lclr|(api->bclr<<4), 0); - set_vmem(&in_win[j++], api->chars->button_right, api->hclr|(api->bclr<<4), 0); - l+=3; - } - api->buttony=s_top+top; - api->exitstart=s_left+left+1; - api->exitend=s_left+left+3; - api->helpstart=s_left+left+4; - api->helpend=s_left+left+l; - } - - set_vmem(&in_win[i++], api->chars->input_top_right, api->hclr|(api->bclr<<4), 0); - set_vmem(&in_win[i++], api->chars->input_right, api->hclr|(api->bclr<<4), 0); - } - - if(plen) - set_vmem(&in_win[i++], ' ', api->lclr|(api->bclr<<4), 0); - - for(j=0;prompt[j];j++) - set_vmem(&in_win[i++], prompt[j], api->lclr|(api->bclr<<4), 0); - - if(plen) - set_vmem(&in_win[i++], ':', api->lclr|(api->bclr<<4), 0); - - for(j=0;j<iwidth+2;j++) { - set_vmem(&in_win[i++], ' ', api->lclr|(api->bclr<<4), 0); - } - - if(!(mode&WIN_NOBRDR)) { - set_vmem(&in_win[i++], api->chars->input_right, api->hclr|(api->bclr<<4), 0); - set_vmem(&in_win[i++], api->chars->input_bottom_left, api->hclr|(api->bclr<<4), 0); - for(j=1;j<width-1;j++) - set_vmem(&in_win[i++], api->chars->input_bottom, api->hclr|(api->bclr<<4), 0); - set_vmem(&in_win[i], api->chars->input_bottom_right, api->hclr|(api->bclr<<4), 0); /* I is not incremented to shut up BCC */ - } - vmem_puttext(s_left+left,s_top+top,s_left+left+width-1 - ,s_top+top+height-1,in_win); - - if(!(mode&WIN_NOBRDR)) { - /* Shadow */ - if(api->bclr==BLUE) { - vmem_gettext(s_left+left+width,s_top+top+1,s_left+left+width+1 - ,s_top+top+(height-1),shade); - for(j=0;j<6;j++) - set_vmem_attr(&shade[j], DARKGRAY); - vmem_puttext(s_left+left+width,s_top+top+1,s_left+left+width+1 - ,s_top+top+(height-1),shade); - vmem_gettext(s_left+left+2,s_top+top+3,s_left+left+width+1 - ,s_top+top+height,shade); - for(j=0;j<width;j++) - set_vmem_attr(&shade[j], DARKGRAY); - vmem_puttext(s_left+left+2,s_top+top+3,s_left+left+width+1 - ,s_top+top+height,shade); - } - } - - if(api->bottomline != NULL) - api->bottomline(WIN_COPY|WIN_CUT|WIN_PASTE); - textattr(api->lclr|(api->bclr<<4)); - if(!plen) - i=ugetstr(s_left+left+2,s_top+top+tbrdrwidth,iwidth,str,max,kmode,NULL); - else - i=ugetstr(s_left+left+plen+4,s_top+top+tbrdrwidth,iwidth,str,max,kmode,NULL); - if(mode&WIN_SAV) - vmem_puttext(s_left+left,s_top+top,s_left+left+width+1 - ,s_top+top+height,save_buf); - free(prompt); - return(i); -} - -/****************************************************************************/ -/* Displays the message 'str' and waits for the user to select "OK" */ -/****************************************************************************/ -int umsg(const char *str) -{ - int i=0; - char *ok[2]={"OK",""}; - - if(api->mode&UIFC_INMSG) /* non-cursive */ - return -1; - api->mode|=UIFC_INMSG; - i = ulist(WIN_SAV|WIN_MID,0,0,0,&i,0,str,ok); - api->mode&=~UIFC_INMSG; - return i; -} - -/* Same as above, using printf-style varargs */ -int umsgf(char* fmt, ...) -{ - int retval = -1; - va_list va; - char* buf = NULL; - - va_start(va, fmt); - vasprintf(&buf, fmt, va); - va_end(va); - if(buf != NULL) { - retval = umsg(buf); - free(buf); - } - return retval; -} - -static int yesno(int dflt, char* fmt, va_list va) -{ - int retval; - char* buf = NULL; - - vasprintf(&buf, fmt, va); - if(buf == NULL) - return dflt; - retval = ulist(WIN_SAV|WIN_MID,0,0,0,&dflt,0,buf,api->yesNoOpts); - free(buf); - return retval; -} - -static BOOL confirm(char* fmt, ...) -{ - int retval; - - va_list va; - va_start(va, fmt); - retval = yesno(0, fmt, va); - va_end(va); - return retval == 0; -} - -static BOOL deny(char* fmt, ...) -{ - int retval; - - va_list va; - va_start(va, fmt); - retval = yesno(1, fmt, va); - va_end(va); - return retval != 0; -} - -/***************************************/ -/* Private sub - updates a ugetstr box */ -/***************************************/ -void getstrupd(int left, int top, int width, char *outstr, int cursoffset, int *scrnoffset, int mode) -{ - _setcursortype(_NOCURSOR); - if(cursoffset<*scrnoffset) - *scrnoffset=cursoffset; - - if(*scrnoffset+width < cursoffset) - *scrnoffset=cursoffset-width; - - gotoxy(left,top); - if(mode&K_PASSWORD) - // This typecast is to suppress a clang warning "adding 'unsigned long' to a string does not append to the string [-Wstring-plus-int]" - cprintf("%-*.*s",width,width,((char *)"********************************************************************************")+(80-strlen(outstr+*scrnoffset))); - else - cprintf("%-*.*s",width,width,outstr+*scrnoffset); - gotoxy(left+(cursoffset-*scrnoffset),top); - _setcursortype(cursor); -} - -/****************************************************************************/ -/* Gets a string of characters from the user. Turns cursor on. Allows */ -/* Different modes - K_* macros. ESC aborts input. */ -/****************************************************************************/ -int ugetstr(int left, int top, int width, char *outstr, int max, long mode, int *lastkey) -{ - char *str; - int ch; - int i,j,k,f=0; /* i=offset, j=length */ - BOOL gotdecimal=FALSE; - int soffset=0; - struct mouse_event mevnt; - char *pastebuf=NULL; - unsigned char *pb=NULL; - - api->exit_flags = 0; - if((str=alloca(max+1))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes\r\n" - ,__LINE__,(max+1)); - _setcursortype(cursor); - return(-1); - } - gotoxy(left,top); - _setcursortype(cursor = api->insert_mode ? _SOLIDCURSOR : _NORMALCURSOR); - str[0]=0; - if(mode&K_EDIT && outstr[0]) { - /*** - truncspctrl(outstr); - ***/ - outstr[max]=0; - i=j=strlen(outstr); - textattr(api->lbclr); - getstrupd(left, top, width, outstr, i, &soffset, mode); - textattr(api->lclr|(api->bclr<<4)); - if(strlen(outstr)<(size_t)width) { - k=wherex(); - f=wherey(); - cprintf("%*s",width-strlen(outstr),""); - gotoxy(k,f); - } - strcpy(str,outstr); -#if 0 - while(kbwait()==0) { - mswait(1); - } -#endif - f=inkey(); - if(f==CIO_KEY_QUIT) { - api->exit_flags |= UIFC_XF_QUIT; - return -1; - } - - if(f==CIO_KEY_MOUSE) { - f=uifc_getmouse(&mevnt); - if(f==0 || (f==ESC && mevnt.event==CIOLIB_BUTTON_3_CLICK)) { - if(mode & K_MOUSEEXIT - && (mevnt.starty != top - || mevnt.startx > left+width - || mevnt.startx < left) - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - if(lastkey) - *lastkey=CIO_KEY_MOUSE; - ungetmouse(&mevnt); - return(j); - } - if(mevnt.startx>=left - && mevnt.startx<=left+width - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - i=mevnt.startx-left+soffset; - if(i>j) - i=j; - } - if(mevnt.starty == top - && mevnt.startx>=left - && mevnt.startx<=left+width - && (mevnt.event==CIOLIB_BUTTON_2_CLICK - || mevnt.event==CIOLIB_BUTTON_3_CLICK)) { - i=mevnt.startx-left+soffset; - if(i>j) - i=j; - pb=(uint8_t *)getcliptext(); - if (pb) { - pastebuf = utf8_to_cp(CIOLIB_CP437, pb, '?', strlen((char *)pb), NULL); - free(pb); - pb=(unsigned char *)pastebuf; - } - else { - free(pastebuf); - pastebuf = NULL; - } - f=0; - } - } - } - - if(f == CR - || (f >= 0xff && f != CIO_KEY_DC) - || (f == 3840 && mode&K_TABEXIT) // Backtab - || (f == '\t' && mode&K_TABEXIT) - || (f == '%' && mode&K_SCANNING) - || f==CTRL_B - || f==CTRL_E - || f==CTRL_Z - || f==CTRL_X /* Cut */ - || f==CTRL_C /* Copy */ - || f==0) - { - getstrupd(left, top, width, str, i, &soffset, mode); - } - else - { - getstrupd(left, top, width, str, i, &soffset, mode); - i=j=0; - } - } - else - i=j=0; - - ch=0; - while(ch!=CR) - { - if(i>j) j=i; - str[j]=0; - getstrupd(left, top, width, str, i, &soffset, mode); - if(f || pb!=NULL || (ch=inkey())!=0) - { - if(f) { - ch=f; - f=0; - } - else if(pb!=NULL) { - ch=*(pb++); - if(!*pb) { - free(pastebuf); - pastebuf=NULL; - pb=NULL; - } - } - if(ch==CIO_KEY_MOUSE) { - ch=uifc_getmouse(&mevnt); - if(ch==0 || (ch==ESC && mevnt.event==CIOLIB_BUTTON_3_CLICK)) { - if(mode & K_MOUSEEXIT - && (mevnt.starty != top - || mevnt.startx > left+width - || mevnt.startx < left) - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - if(lastkey) - *lastkey=CIO_KEY_MOUSE; - ungetmouse(&mevnt); - ch=CR; - continue; - } - if(mevnt.starty == top - && mevnt.startx>=left - && mevnt.startx<=left+width - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - i=mevnt.startx-left+soffset; - if(i>j) - i=j; - } - if(mevnt.starty == top - && mevnt.startx>=left - && mevnt.startx<=left+width - && (mevnt.event==CIOLIB_BUTTON_2_CLICK - || mevnt.event==CIOLIB_BUTTON_3_CLICK)) { - i=mevnt.startx-left+soffset; - if(i>j) - i=j; - pb=(uint8_t *)getcliptext(); - if (pb) { - pastebuf = utf8_to_cp(CIOLIB_CP437, pb, '?', strlen((char *)pb), NULL); - free(pb); - pb=(unsigned char *)pastebuf; - } - else { - free(pastebuf); - pastebuf = NULL; - } - ch=0; - } - } - } - if(lastkey != NULL) - *lastkey=ch; - switch(ch) - { - case CTRL_Z: - case CIO_KEY_F(1): /* F1 Help */ - api->showhelp(); - if(api->exit_flags & UIFC_XF_QUIT) - f = CIO_KEY_QUIT; - continue; - case CIO_KEY_LEFT: /* left arrow */ - if(i) - { - i--; - } - continue; - case CIO_KEY_RIGHT: /* right arrow */ - if(i<j) - { - i++; - } - continue; - case CTRL_B: - case CIO_KEY_HOME: /* home */ - if(i) - { - i=0; - } - continue; - case CTRL_E: - case CIO_KEY_END: /* end */ - if(i<j) - { - i=j; - } - continue; - case CTRL_V: - case CIO_KEY_SHIFT_IC: /* Shift-Insert: Paste */ - pb=(uint8_t *)getcliptext(); - if (pb) { - pastebuf = utf8_to_cp(CIOLIB_CP437, pb, '?', strlen((char *)pb), NULL); - free(pb); - pb=(unsigned char *)pastebuf; - } - else { - free(pastebuf); - pastebuf = NULL; - } - continue; - case CIO_KEY_IC: /* insert */ - api->insert_mode = !api->insert_mode; - _setcursortype(cursor = api->insert_mode ? _SOLIDCURSOR : _NORMALCURSOR); - continue; - case BS: - if(i) - { - if(i==j) - { - j--; - i--; - } - else { - i--; - j--; - if(str[i]=='.') - gotdecimal=FALSE; - for(k=i;k<=j;k++) - str[k]=str[k+1]; - } - if (soffset > 0) - soffset--; - continue; - } - break; - case CIO_KEY_DC: /* delete */ - case DEL: /* sdl_getch() is returning 127 when keypad "Del" is hit */ - if(i<j) - { - if(str[i]=='.') - gotdecimal=FALSE; - for(k=i;k<j;k++) - str[k]=str[k+1]; - j--; - } - continue; - case CIO_KEY_QUIT: - api->exit_flags |= UIFC_XF_QUIT; - /* Fall-through */ - case CIO_KEY_ABORTED: - case ESC: - { - cursor=_NOCURSOR; - _setcursortype(cursor); - if(pastebuf!=NULL) { - free(pastebuf); - pastebuf = NULL; - } - return(-1); - } - case CR: - break; - case 3840: /* Backtab */ - case '\t': - if(mode&K_TABEXIT) - ch=CR; - break; - case '%': /* '%' indicates that a UPC is coming next */ - if(mode&K_SCANNING) - ch=CR; - break; - case CIO_KEY_F(2): - case CIO_KEY_UP: - case CIO_KEY_DOWN: - if(mode&K_DEUCEEXIT) { - ch=CR; - break; - } - continue; - case CTRL_C: - case CIO_KEY_CTRL_IC: /* Ctrl-Insert */ - { - size_t sz; - uint8_t *utf8 = cp_to_utf8(CIOLIB_CP437, str, j, &sz); - copytext((char *)utf8, sz); - free(utf8); - continue; - } - case CTRL_X: - case CIO_KEY_SHIFT_DC: - if(j) - { - size_t sz; - uint8_t *utf8 = cp_to_utf8(CIOLIB_CP437, str, j, &sz); - copytext((char *)utf8, sz); - free(utf8); - i=j=0; - } - continue; - case CTRL_Y: - if(i<j) - { - j=i; - } - continue; - } - if(mode&K_NUMBER && !isdigit(ch)) - continue; - if(mode&K_DECIMAL && !isdigit(ch)) { - if(ch!='.') - continue; - if(gotdecimal) - continue; - gotdecimal=TRUE; - } - if(mode&K_ALPHA && !isalpha(ch)) - continue; - if((ch>=' ' || (ch==1 && mode&K_MSG)) && i<max && (!api->insert_mode || j<max) && ch < 256) - { - if(mode&K_UPPER) - ch=toupper(ch); - if(api->insert_mode) - { - for(k=++j;k>i;k--) - str[k]=str[k-1]; - } - str[i++]=ch; - } - } - } - - - str[j]=0; - if(mode&K_EDIT) - { - truncspctrl(str); - if(!(mode&K_FIND) && strcmp(outstr,str)) - api->changes=1; - } - else - { - if(!(mode&K_FIND) && j) - api->changes=1; - } - strcpy(outstr,str); - cursor=_NOCURSOR; - _setcursortype(cursor); - if(pastebuf!=NULL) - free(pastebuf); - return(j); -} - -/****************************************************************************/ -/* Performs printf() through puttext() routine */ -/****************************************************************************/ -static int uprintf(int x, int y, unsigned attr, char *fmat, ...) -{ - va_list argptr; - char str[MAX_COLS+1]; - struct vmem_cell buf[MAX_COLS]; - int i; - - va_start(argptr,fmat); - vsprintf(str,fmat,argptr); - va_end(argptr); - for(i = 0; str[i]; i++) - set_vmem(&buf[i], str[i], attr, 0); - vmem_puttext(x,y,x+(i-1),y,buf); - return(i); -} - - -/****************************************************************************/ -/* Display bottom line of screen in inverse */ -/****************************************************************************/ -void bottomline(int mode) -{ - int i=1; - - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4)," "); - if(api->help_available) { - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"F1 "); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Help "); - } - if(mode&WIN_EDIT) { - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"F2 "); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Edit Item "); - } - if(mode&WIN_COPY) { - if(api->mode&UIFC_NOCTRL) { - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"F5 "); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Copy "); - } else { - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"^C"); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"opy "); - } - } - if(mode&WIN_CUT) { - if(api->mode&UIFC_NOCTRL) - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"Shift-DEL "); - else - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"^X "); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Cut "); - } - if(mode&WIN_PASTE) { - if(api->mode&UIFC_NOCTRL) - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"F6 "); - else - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"^V "); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Paste "); - } - if(mode&WIN_INS) { -#ifdef __DARWIN__ - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"+/"); -#endif - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"INS"); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"ert Item "); - } - if(mode&WIN_DEL) { -#ifdef __DARWIN__ - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"fn-"); -#endif - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"DEL"); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"ete Item "); - } - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"ESC "); /* Backspace is no good no way to abort editing */ - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Exit"); - gotoxy(i,api->scrn_len+1); - if (wherex() == i && wherey() == api->scrn_len+1) { - textattr(BLACK|(api->cclr<<4)); - clreol(); - } -} - -/*****************************************************************************/ -/* Generates a 24 character ASCII string that represents the time_t pointer */ -/* Used as a replacement for ctime() */ -/*****************************************************************************/ -char *utimestr(time_t *intime) -{ - static char str[25]; - const char* wday=""; - const char* mon=""; - const char* mer= ""; - int hour; - struct tm *gm; - - gm=localtime(intime); - switch(gm->tm_wday) { - case 0: - wday = "Sun"; - break; - case 1: - wday = "Mon"; - break; - case 2: - wday = "Tue"; - break; - case 3: - wday = "Wed"; - break; - case 4: - wday = "Thu"; - break; - case 5: - wday = "Fri"; - break; - case 6: - wday = "Sat"; - break; - } - switch(gm->tm_mon) { - case 0: - mon = "Jan"; - break; - case 1: - mon = "Feb"; - break; - case 2: - mon = "Mar"; - break; - case 3: - mon = "Apr"; - break; - case 4: - mon = "May"; - break; - case 5: - mon = "Jun"; - break; - case 6: - mon = "Jul"; - break; - case 7: - mon = "Aug"; - break; - case 8: - mon = "Sep"; - break; - case 9: - mon = "Oct"; - break; - case 10: - mon = "Nov"; - break; - case 11: - mon = "Dec"; - break; - } - if(gm->tm_hour>=12) { - mer = "pm"; - hour=gm->tm_hour; - if (hour > 12) - hour-=12; - } - else { - if(!gm->tm_hour) - hour=12; - else - hour=gm->tm_hour; - mer = "am"; - } - safe_snprintf(str, sizeof(str), "%s %s %02d %4d %02d:%02d %s",wday,mon,gm->tm_mday,1900+gm->tm_year - ,hour,gm->tm_min,mer); - return(str); -} - -/****************************************************************************/ -/* Status popup/down function, see uifc.h for details. */ -/****************************************************************************/ -void upop(const char *str) -{ - static struct vmem_cell sav[80*3], buf[80*3]; - int i,j,k; - static int width; - - if(str == NULL) { - vmem_puttext((api->scrn_width-width+1)/2+1,(api->scrn_len-3+1)/2+1 - ,(api->scrn_width+width-1)/2+1,(api->scrn_len+3-1)/2+1,sav); - return; - } - - width = strlen(str); - if(!width) - return; - width += 7; - vmem_gettext((api->scrn_width-width+1)/2+1,(api->scrn_len-3+1)/2+1 - ,(api->scrn_width+width-1)/2+1,(api->scrn_len+3-1)/2+1,sav); - for(i=0; i < width*3; i++) - set_vmem(&buf[i], ' ', api->hclr|(api->bclr<<4), 0); - set_vmem(&buf[0], api->chars->popup_top_left, api->hclr|(api->bclr<<4), 0); - for(i=1;i<(width-1);i++) - set_vmem(&buf[i], api->chars->popup_top, api->hclr|(api->bclr<<4), 0); - set_vmem(&buf[i++], api->chars->popup_top_right, api->hclr|(api->bclr<<4), 0); - set_vmem(&buf[i++], api->chars->popup_left, api->hclr|(api->bclr<<4), 0); - k=strlen(str); - i+=((((width-3)-k)/2)); - for(j=0;j<k;j++,i++) - set_vmem(&buf[i], str[j], api->hclr|(api->bclr<<4)|BLINK, 0); - i=(((width-1)*2)+1); - set_vmem(&buf[i++], api->chars->popup_right, api->hclr|(api->bclr<<4), 0); - set_vmem(&buf[i++], api->chars->popup_bottom_left, api->hclr|(api->bclr<<4), 0); - for(;i<((width*3)-1);i++) - set_vmem(&buf[i], api->chars->popup_bottom, api->hclr|(api->bclr<<4), 0); - set_vmem(&buf[i], api->chars->popup_bottom_right, api->hclr|(api->bclr<<4), 0); - - vmem_puttext((api->scrn_width-width+1)/2+1,(api->scrn_len-3+1)/2+1 - ,(api->scrn_width+width-1)/2+1,(api->scrn_len+3-1)/2+1,buf); -} - -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ -void sethelp(int line, char* file) -{ - helpline=line; - helpfile=file; -} - -/****************************************************************************/ -/* Shows a scrollable text buffer - optionally parsing "help markup codes" */ -/****************************************************************************/ -void showbuf(int mode, int left, int top, int width, int height, const char *title, const char *hbuf, int *curp, int *barp) -{ - char inverse=0,high=0; - struct vmem_cell *textbuf; - struct vmem_cell *p; - const char *pc; - struct vmem_cell *oldp=NULL; - int i,j,k,len; - int lines; - int pad=1; - int is_redraw=0; - uint title_len=0; - struct mouse_event mevnt; - - api->exit_flags = 0; - _setcursortype(_NOCURSOR); - - title_len=strlen(title); - if(api->mode&UIFC_MOUSE) - title_len+=6; - - if((unsigned)(top+height)>=api->scrn_len) - height = api->scrn_len - top; - if(!width || (unsigned)width<title_len+6) - width=title_len+6; - if((unsigned)(width + left) > api->scrn_width) - width = api->scrn_width - left + 1; - if(mode&WIN_L2R) - left=(api->scrn_width-width+2)/2; - else if(mode&WIN_RHT) - left=SCRN_RIGHT-(width+4+left); - if(mode&WIN_T2B) - top=(api->scrn_len-height+1)/2; - else if(mode&WIN_BOT) - top=api->scrn_len-height-3-top; - if(left<0) - left=0; - if(top<0) - top=0; - - if(mode&WIN_PACK) - pad=0; - - /* Dynamic Menus */ - if(mode&WIN_DYN - && curp != NULL - && barp != NULL - && last_menu_cur==curp - && last_menu_bar==barp - && save_menu_cur==*curp - && save_menu_bar==*barp) - is_redraw=1; - if(mode&WIN_DYN && mode&WIN_REDRAW) - is_redraw=1; - if(mode&WIN_DYN && mode&WIN_NODRAW) - is_redraw=0; - - vmem_gettext(1,1,api->scrn_width,api->scrn_len,tmp_buffer); - - if(!is_redraw) { - for(i=0; i<width*height; i++) - set_vmem(&tmp_buffer2[i], ' ', api->hclr|(api->bclr<<4), 0); - tmp_buffer2[0].ch=api->chars->help_top_left; - j=title_len; - if(j>width-6) { - j=width-6; - title_len = j; - } - for(i=1;i<(width-j)/2;i++) - tmp_buffer2[i].ch=api->chars->help_top; - if((api->mode&UIFC_MOUSE) && (!(mode&WIN_DYN))) { - set_vmem(&tmp_buffer2[1], api->chars->button_left, api->hclr|(api->bclr<<4), 0); - /* tmp_buffer2[4]='�'; */ - set_vmem(&tmp_buffer2[2], api->chars->close_char, api->lclr|(api->bclr<<4), 0); - set_vmem(&tmp_buffer2[3], api->chars->button_right, api->hclr|(api->bclr<<4), 0); - /* Buttons are ignored - leave it this way to not confuse stuff from help() */ - } - tmp_buffer2[i].ch = api->chars->help_titlebreak_left; - i+=2; - for(j=0,pc=title;j<title_len&&*pc;j++,pc++) { - tmp_buffer2[i].ch=*pc; - i++; - } - i++; - tmp_buffer2[i].ch=api->chars->help_titlebreak_right; - i++; - for(;i<((width-1));i++) - tmp_buffer2[i].ch=api->chars->help_top; - tmp_buffer2[i].ch=api->chars->help_top_right; - i++; - j=i; /* leave i alone */ - for(k=0;k<(height-2);k++) { /* the sides of the box */ - tmp_buffer2[j].ch=api->chars->help_left; - j++; - j+=((width-2)); - tmp_buffer2[j].ch=api->chars->help_right; - j++; - } - tmp_buffer2[j].ch = api->chars->help_bottom_left; - j++; - if(!(mode&WIN_DYN) && (width>31)) { - for(k=j;k<j+(((width-4)/2-13));k++) - tmp_buffer2[k].ch=api->chars->help_bottom; - tmp_buffer2[k].ch = api->chars->help_hitanykey_left; k+=2; - tmp_buffer2[k].ch='H'; k++; - tmp_buffer2[k].ch='i'; k++; - tmp_buffer2[k].ch='t'; k+=2; - tmp_buffer2[k].ch='a'; k++; - tmp_buffer2[k].ch='n'; k++; - tmp_buffer2[k].ch='y'; k+=2; - tmp_buffer2[k].ch='k'; k++; - tmp_buffer2[k].ch='e'; k++; - tmp_buffer2[k].ch='y'; k+=2; - tmp_buffer2[k].ch='t'; k++; - tmp_buffer2[k].ch='o'; k+=2; - tmp_buffer2[k].ch='c'; k++; - tmp_buffer2[k].ch='o'; k++; - tmp_buffer2[k].ch='n'; k++; - tmp_buffer2[k].ch='t'; k++; - tmp_buffer2[k].ch='i'; k++; - tmp_buffer2[k].ch='n'; k++; - tmp_buffer2[k].ch='u'; k++; - tmp_buffer2[k].ch='e'; k+=2; - tmp_buffer2[k].ch=api->chars->help_hitanykey_right; k++; - for(j=k;j<k+(((width-4)/2-12))+(width&1);j++) - tmp_buffer2[j].ch=api->chars->help_bottom; - } - else { - for(k=j;k<j+((width-2));k++) - tmp_buffer2[k].ch=api->chars->help_bottom; - j=k; - } - tmp_buffer2[j].ch=api->chars->help_bottom_right; - if(!(mode&WIN_DYN)) { - tmp_buffer2[j-1].ch=api->chars->button_right; - tmp_buffer2[j-2].ch=' '; - tmp_buffer2[j-3].ch=' '; - tmp_buffer2[j-4].ch=api->chars->button_left; -#define SCROLL_UP_BUTTON_X left + (width - 4) -#define SCROLL_UP_BUTTON_Y top + height -#define SCROLL_DN_BUTTON_X left + (width - 3) -#define SCROLL_DN_BUTTON_Y top + height - } - vmem_puttext(left,top+1,left+width-1,top+height,tmp_buffer2); - } - len=strlen(hbuf); - - lines=0; - k=0; - for(j=0;j<len;j++) { - if(mode&WIN_HLP && (hbuf[j]==2 || hbuf[j]=='~' || hbuf[j]==1 || hbuf[j]=='`')) - continue; - if(hbuf[j]==CR) - continue; - k++; - if((hbuf[j]==LF) || (k>=width-2-pad-pad && (hbuf[j+1]!='\n' && hbuf[j+1]!='\r'))) { - k=0; - lines++; - } - } - if(k) - lines++; - if(lines < height-2-pad-pad) - lines=height-2-pad-pad; - - if((textbuf=(struct vmem_cell *)malloc((width-2-pad-pad)*lines*sizeof(*textbuf)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes\r\n" - ,__LINE__,(width-2-pad-pad)*lines*sizeof(*textbuf)); - _setcursortype(cursor); - return; - } - for(i=0; i < (width - 2 - pad - pad) * lines;i++) - set_vmem(&textbuf[i], ' ', (api->hclr|(api->bclr<<4)), 0); - for(j=i=0; j < len; j++, i++) { - if(hbuf[j]==LF) { - i++; - while(i%((width-2-pad-pad))) - i++; - i--; - } - else if(mode&WIN_HLP && (hbuf[j]==2 || hbuf[j]=='~')) { /* Ctrl-b toggles inverse */ - inverse=!inverse; - i--; - } - else if(mode&WIN_HLP && (hbuf[j]==1 || hbuf[j]=='`')) { /* Ctrl-a toggles high intensity */ - high=!high; - i--; - } - else if(hbuf[j]!=CR) { - set_vmem(&textbuf[i], hbuf[j], inverse ? (api->bclr|(api->cclr<<4)) : high ? (api->hclr|(api->bclr<<4)) : (api->lclr|(api->bclr<<4)), 0); - if(((i+1)%((width-2-pad-pad))==0 && (hbuf[j+1]==LF)) || (hbuf[j+1]==CR && hbuf[j+2]==LF)) - i--; - } - else - i--; - } - i=0; - p=textbuf; - struct vmem_cell * textend = textbuf + (lines-(height-2-pad-pad))*(width-2-pad-pad); - if(mode&WIN_DYN) { - vmem_puttext(left+1+pad,top+2+pad,left+width-2-pad,top+height-1-pad,p); - } - else { - while(i==0) { - if(p!=oldp) { - if(p > textend) - p=textend; - if(p<textbuf) - p=textbuf; - if(p!=oldp) { - vmem_puttext(left+1+pad,top+2+pad,left+width-2-pad,top+height-1-pad,p); - oldp=p; - } - gotoxy(SCROLL_UP_BUTTON_X, SCROLL_UP_BUTTON_Y); - textattr(api->lclr|(api->bclr<<4)); - putch(p > textbuf ? api->chars->up_arrow : ' '); - putch(p < textend ? api->chars->down_arrow : ' '); - } - if(kbwait()) { - j=inkey(); - if(j==CIO_KEY_MOUSE) { - /* Ignores return value to avoid hitting help/exit hotspots */ - if(uifc_getmouse(&mevnt)>=0) { - /* Clicked Scroll Up */ - if(mevnt.startx>=left+pad - && mevnt.startx<=left+pad+width-3 - && mevnt.starty>=top+pad+1 - && mevnt.starty<=top+pad+(height/2)-2 - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - p -= ((width-2-pad-pad)*(height-5)); - continue; - } - if(mevnt.startx == SCROLL_UP_BUTTON_X && mevnt.starty == SCROLL_UP_BUTTON_Y - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - p -= ((width-2-pad-pad)); - continue; - } - /* Clicked Scroll Down */ - if(mevnt.startx>=left+pad - && mevnt.startx<=left+pad+width - && mevnt.starty<=top+pad+height-2 - && mevnt.starty>=top+pad+height-(height/2+1)-2 - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - p += (width-2-pad-pad)*(height-5); - continue; - } - if(mevnt.startx == SCROLL_DN_BUTTON_X && mevnt.starty == SCROLL_DN_BUTTON_Y - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - p += ((width-2-pad-pad)); - continue; - } - /* Scroll up */ - if (mevnt.event == CIOLIB_BUTTON_4_PRESS) { - p = p-((width-2-pad-pad)); - continue; - } - /* Scroll down */ - if (mevnt.event == CIOLIB_BUTTON_5_PRESS) { - p += ((width-2-pad-pad)); - continue; - } - /* Non-click events (drag, move, multiclick, etc) */ - if(mevnt.event!=CIOLIB_BUTTON_CLICK(CIOLIB_BUTTON_NUMBER(mevnt.event))) - continue; - i=1; - } - continue; - } - switch(j) { - case CIO_KEY_HOME: /* home */ - p = textbuf; - break; - - case CIO_KEY_UP: /* up arrow */ - p = p-((width-2-pad-pad)); - break; - - case CIO_KEY_PPAGE: /* PgUp */ - p = p-((width-2-pad-pad)*(height-5)); - break; - - case CIO_KEY_NPAGE: /* PgDn */ - p += (width-2-pad-pad)*(height-5); - break; - - case CIO_KEY_END: /* end */ - p = textend; - break; - - case CIO_KEY_DOWN: /* dn arrow */ - p += ((width-2-pad-pad)); - break; - - case CIO_KEY_QUIT: - api->exit_flags |= UIFC_XF_QUIT; - // Fall-through - default: - i=1; - } - } - mswait(1); - } - - vmem_puttext(1,1,api->scrn_width,api->scrn_len,tmp_buffer); - } - free(textbuf); - if(is_redraw) /* Force redraw of menu also. */ - reset_dynamic(); - _setcursortype(cursor); -} - -/************************************************************/ -/* Help (F1) key function. Uses helpbuf as the help input. */ -/************************************************************/ -static void help(void) -{ - char hbuf[HELPBUF_SIZE],str[256]; - char *p; - unsigned short line; /* This must be 16-bits */ - long l; - FILE *fp; - - api->exit_flags = 0; - if(api->helpbuf==NULL && api->helpixbfile[0]==0) - return; - - _setcursortype(_NOCURSOR); - - if(!api->helpbuf) { - if((fp=fopen(api->helpixbfile,"rb"))==NULL) - SAFEPRINTF(hbuf,"ERROR: Cannot open help index: %s" - ,api->helpixbfile); - else { - p=strrchr(helpfile,'/'); - if(p==NULL) - p=strrchr(helpfile,'\\'); - if(p==NULL) - p=helpfile; - else - p++; - l=-1L; - while(!feof(fp)) { - if(fread(str,12,1,fp)!=1) - break; - str[12]=0; - if(fread(&line,2,1,fp)!=1) - break; - if(stricmp(str,p) || line!=helpline) { - if(fseek(fp,4,SEEK_CUR)==0) - break; - continue; - } - if(fread(&l,4,1,fp)!=1) - l=-1L; - break; - } - fclose(fp); - if(l==-1L) - SAFEPRINTF3(hbuf,"ERROR: Cannot locate help key (%s:%u) in: %s" - ,p,helpline,api->helpixbfile); - else { - if((fp=fopen(api->helpdatfile,"rb"))==NULL) - SAFEPRINTF(hbuf,"ERROR: Cannot open help file: %s" - ,api->helpdatfile); - else { - if(fseek(fp,l,SEEK_SET)!=0) { - SAFEPRINTF4(hbuf,"ERROR: Cannot seek to help key (%s:%u) at %ld in: %s" - ,p,helpline,l,api->helpixbfile); - } - else { - if(fread(hbuf,1,HELPBUF_SIZE,fp)<1) { - SAFEPRINTF4(hbuf,"ERROR: Cannot read help key (%s:%u) at %ld in: %s" - ,p,helpline,l,api->helpixbfile); - } - } - fclose(fp); - } - } - } - showbuf(WIN_MID|WIN_HLP, 0, 0, 76, api->scrn_len, "Online Help", hbuf, NULL, NULL); - } - else { - showbuf(WIN_MID|WIN_HLP, 0, 0, 76, api->scrn_len, "Online Help", api->helpbuf, NULL, NULL); - } -} diff --git a/uifc/uifctest.c b/uifc/uifctest.c deleted file mode 100644 index 490ad39..0000000 --- a/uifc/uifctest.c +++ /dev/null @@ -1,187 +0,0 @@ -/* uedit.c */ - -/* Synchronet for *nix user editor */ - -/* $Id: uifctest.c,v 1.9 2020/08/16 20:37:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <signal.h> -#include <stdio.h> -/* #include "curs_fix.h" */ -#include "filepick.h" -#include "uifc.h" - -/********************/ -/* Global Variables */ -/********************/ -uifcapi_t uifc; /* User Interface (UIFC) Library API */ -char YesStr[]="Yes"; -char NoStr[]="No"; -char *ok[2]={"OK",""}; - -int main(int argc, char** argv) { - char** opt; - char** mopt; - int main_dflt=0; - int main_bar=0; - char revision[16]; - char str[256],ctrl_dir[41],*p; - char title[256]; - int i,j; - int done; - int last; - int edtuser=0; - char longtitle[1024]; - struct file_pick fper; - /******************/ - /* Ini file stuff */ - /******************/ - char ini_file[MAX_PATH+1]; - FILE* fp; - - sscanf("$Revision: 1.9 $", "%*s %s", revision); - - printf("\nSynchronet UIFC Test Suite Copyright " - "Rob Swindell\n"); - - memset(&uifc,0,sizeof(uifc)); - - uifc.esc_delay=500; - - for(i=1;i<argc;i++) { - if(argv[i][0]=='-') - switch(toupper(argv[i][1])) { - case 'C': - uifc.mode|=UIFC_COLOR; - break; - case 'L': - uifc.scrn_len=atoi(argv[i]+2); - break; - case 'E': - uifc.esc_delay=atoi(argv[i]+2); - break; - case 'I': - /* Set up ex-ascii codes */ - uifc.mode|=UIFC_IBM; - break; - default: - printf("\nusage: %s [ctrl_dir] [options]" - "\n\noptions:\n\n" - "-c = force color mode\n" - "-e# = set escape delay to #msec\n" - "-i = force IBM charset\n" - "-l# = set screen lines to #\n" - ,argv[0] - ); - exit(0); - } - if(atoi(argv[i])) - edtuser=atoi(argv[i]); - } - -#ifdef __unix__ - signal(SIGPIPE, SIG_IGN); -#endif - - uifc.size=sizeof(uifc); -#ifdef USE_CURSES - i=uifcinic(&uifc); /* curses */ -#else - i=uifcini32(&uifc); /* curses */ -#endif - if(i!=0) { - printf("uifc library init returned error %d\n",i); - exit(1); - } - - opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)); - for(i=0;i<(MAX_OPTS+1);i++) - opt[i]=(char *)malloc(MAX_OPLN); - - mopt=(char **)malloc(sizeof(char *)*MAX_OPTS); - for(i=0;i<MAX_OPTS;i++) - mopt[i]=(char *)malloc(MAX_OPLN); - - sprintf(title,"Synchronet Test Suite"); - if(uifc.scrn(title)) { - printf(" USCRN (len=%d) failed!\n",uifc.scrn_len+1); - return(1); - } - - strcpy(mopt[0],"Long Title"); - strcpy(mopt[1],"String Input"); - strcpy(mopt[2],"File picker"); - mopt[3][0]=0; - - uifc.helpbuf= "`Test Suite:`\n" - "\nToDo: Add Help"; - - while(1) { - j=uifc.list(WIN_L2R|WIN_ESC|WIN_ACT|WIN_DYN|WIN_ORG,0,5,70,&main_dflt,&main_bar - ,title,mopt); - - if(j <= -2) - continue; - - if(j==-1) { - uifc.bail(); - return(0); - } - - if(j==0) { - /* Long Title */ - strcpy(longtitle,"This is a long title..."); - for(p=strchr(longtitle,0);p<longtitle+sizeof(longtitle)-1;p++) - *p='.'; - *p=0; - done=0; - uifc.list(WIN_ORG|WIN_MID|WIN_ACT,0,0,0,&i,0,longtitle,ok); - } - if(j==1) { - /* String input */ - strcpy(longtitle,"This is a test if string input... enter/edit this field"); - uifc.input(WIN_MID|WIN_NOBRDR,0,0,"Input",longtitle,sizeof(longtitle),K_EDIT); - uifc.showbuf(WIN_MID, 0, 0, uifc.scrn_width-4, uifc.scrn_len-4, "Result:", longtitle, NULL, NULL); - } - if(j==2) { - /* File picker */ - if(filepick(&uifc, "Bob", &fper, NULL, NULL, UIFC_FP_ALLOWENTRY)!=-1) { - if(fper.files==1) { - sprintf(str,"File selected: %-.200s",fper.selected[0]); - uifc.msg(str); - } - filepick_free(&fper); - } - } - } -} diff --git a/uifc/uifcx.c b/uifc/uifcx.c deleted file mode 100644 index 766f675..0000000 --- a/uifc/uifcx.c +++ /dev/null @@ -1,524 +0,0 @@ -/* Standard I/O Implementation of UIFC (user interface) library */ - -/* $Id: uifcx.c,v 1.41 2020/08/16 20:37:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "genwrap.h" -#include "gen_defs.h" -#include "xpprintf.h" -#include "uifc.h" - -#include <sys/types.h> - -#ifdef __unix__ -/* #include <sys/time.h> why? */ - #include <unistd.h> -#endif - -static char *helpfile=0; -static uint helpline=0; -static uifcapi_t* api; - -/* Prototypes */ -static void help(void); - -/* API routines */ -static void uifcbail(void); -static int uscrn(const char *str); -static int ulist(int mode, int left, int top, int width, int *dflt, int *bar - ,const char *title, char **option); -static int uinput(int imode, int left, int top, const char *prompt, char *str - ,int len ,int kmode); -static int umsg(const char *str); -static int umsgf(char *str, ...); -static BOOL confirm(char *str, ...); -static BOOL deny(char *str, ...); -static void upop(const char *str); -static void sethelp(int line, char* file); - -/****************************************************************************/ -/****************************************************************************/ -static int uprintf(int x, int y, unsigned attr, char *fmat, ...) -{ - va_list argptr; - char str[MAX_COLS + 1]; - int i; - - va_start(argptr, fmat); - vsprintf(str, fmat, argptr); - va_end(argptr); - i = printf("%s", str); - return(i); -} - - -/****************************************************************************/ -/* Initialization function, see uifc.h for details. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uifcinix(uifcapi_t* uifcapi) -{ - static char* yesNoOpts[] = {"Yes", "No", NULL}; - - if(uifcapi==NULL || uifcapi->size!=sizeof(uifcapi_t)) - return(-1); - - api=uifcapi; - - if (api->yesNoOpts == NULL) - api->yesNoOpts = yesNoOpts; // Not currently used in this interface instance - - /* install function handlers */ - api->bail=uifcbail; - api->scrn=uscrn; - api->msg=umsg; - api->msgf=umsgf; - api->confirm=confirm; - api->deny=deny; - api->pop=upop; - api->list=ulist; - api->input=uinput; - api->sethelp=sethelp; - api->showhelp=help; - api->showbuf=NULL; - api->timedisplay=NULL; - api->printf = uprintf; - - setvbuf(stdin,NULL,_IONBF,0); - setvbuf(stdout,NULL,_IONBF,0); - api->scrn_len=24; - api->initialized=TRUE; - - return(0); -} - -/****************************************************************************/ -/* Exit/uninitialize UIFC implementation. */ -/****************************************************************************/ -void uifcbail(void) -{ - api->initialized=FALSE; -} - -/****************************************************************************/ -/* Clear screen, fill with background attribute, display application title. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uscrn(const char *str) -{ - return(0); -} - -static int getstr(char* str, int maxlen) -{ - char ch; - int len=0; -#ifdef __unix__ - int istty; - - istty=isatty(fileno(stdin)); -#endif - while(1) { - if(fread(&ch,1,1,stdin)!=1) - break; -#ifdef __unix__ - if(!istty) { - printf("%c",ch); - fflush(stdout); - } -#endif - if(ch=='\r' || ch=='\n') /* enter */ - break; - if(ch=='\b' || ch==DEL) { /* backspace */ - if(len) len--; - continue; - } - if(len<maxlen) - str[len++]=ch; - } - str[len]=0; /* we need The Terminator */ - - return(len); -} - -/****************************************************************************/ -/* Local utility function. */ -/****************************************************************************/ -static int which(char* prompt, int max) -{ - char str[41]; - int i; - - while(1) { - printf("%s which (1-%d): ",prompt,max); - str[0]=0; - getstr(str,sizeof(str)-1); - i=atoi(str); - if(i>0 && i<=max) - return(i-1); - } -} - -/****************************************************************************/ -/* General menu function, see uifc.h for details. */ -/****************************************************************************/ -int ulist(int mode, int left, int top, int width, int *cur, int *bar - , const char *title, char **option) -{ - char str[128]; - int i,opts; - int optnumlen; - int yesno=0; - int lines; - - for(opts=0;opts<MAX_OPTS;opts++) - if(option[opts]==NULL || option[opts][0]==0) - break; - - if((*cur)>=opts) - (*cur)=opts-1; /* returned after scrolled */ - - if((*cur)<0) - (*cur)=0; - - if(opts>999) - optnumlen=4; - else if(opts>99) - optnumlen=3; - else if(opts>9) - optnumlen=2; - else - optnumlen=1; - while(1) { - if(opts==2 && !stricmp(option[0],"Yes") && !stricmp(option[1],"No")) { - yesno=1; - printf("%s? ",title); - } else { - printf("\n[%s]\n",title); - lines=2; - for(i=0;i<opts;i++) { - printf("%*d: %s\n",optnumlen,i+1,option[i]); - lines++; - if(!(lines%api->scrn_len)) { - printf("More? "); - str[0]=0; - getstr(str,sizeof(str)-1); - if(toupper(*str)=='N') - break; - } - } - str[0]=0; - if(mode&WIN_COPY) - strcat(str,", Copy"); - if(mode&WIN_CUT) - strcat(str,", X-Cut"); - if(mode&WIN_PASTE) - strcat(str,", Paste"); - if(mode&WIN_INS) - strcat(str,", Add"); - if(mode&WIN_DEL) - strcat(str,", Delete"); - printf("\nWhich (Help%s or Quit): ",str); - } - str[0]=0; - getstr(str,sizeof(str)-1); - - truncsp(str); - i=atoi(str); - if(i>0 && i<=opts) { - *cur=--i; - return(*cur); - } - i=atoi(str+1); - switch(toupper(*str)) { - case 0: - case ESC: - case 'Q': - printf("Quit\n"); - return(-1); - case 'Y': - if(!yesno) - break; - printf("Yes\n"); - return(0); - case 'N': - if(!yesno) - break; - printf("No\n"); - return(1); - case 'H': - case '?': - printf("Help\n"); - help(); - break; - case 'A': /* Add/Insert */ - if(!(mode&WIN_INS)) - break; - if(!opts) - return(MSK_INS); - if(i>0 && i<=opts+1) - return((i-1)|MSK_INS); - return(which("Add before",opts+1)|MSK_INS); - case 'D': /* Delete */ - if(!(mode&WIN_DEL)) - break; - if(!opts) - break; - if(i>0 && i<=opts) - return((i-1)|MSK_DEL); - if(opts==1) - return(MSK_DEL); - return(which("Delete",opts)|MSK_DEL); - case 'C': /* Copy */ - if(!(mode&WIN_COPY)) - break; - if(!opts) - break; - if(i>0 && i<=opts) - return((i-1)|MSK_COPY); - if(opts==1) - return(MSK_COPY); - return(which("Copy",opts)|MSK_COPY); - case 'X': /* Cut */ - if(!(mode&WIN_CUT)) - break; - if(!opts) - break; - if(i>0 && i<=opts) - return((i-1)|MSK_CUT); - if(opts==1) - return(MSK_CUT); - return(which("Cut",opts)|MSK_CUT); - case 'P': /* Paste */ - if(!(mode&WIN_PASTE)) - break; - if(!opts) - break; - if(i>0 && i<=opts+1) - return((i-1)|MSK_PASTE); - if(opts==1) - return(MSK_PASTE); - return(which("Insert pasted item before",opts+1)|MSK_PASTE); - } - } -} - -/*************************************************************************/ -/* This function is a windowed input string input routine. */ -/*************************************************************************/ -int uinput(int mode, int left, int top, const char *prompt, char *outstr, - int max, int kmode) -{ - char str[256]; - - while(1) { - printf("%s (maxlen=%u): ",prompt,max); - - getstr(str,max); - truncsp(str); - if(strcmp(str,"?")) - break; - help(); - } - if(strcmp(outstr,str)) - api->changes=1; - if(kmode&K_UPPER) /* convert to uppercase? */ - strupr(str); - strcpy(outstr,str); - return(strlen(outstr)); -} - -/****************************************************************************/ -/* Displays the message 'str' and waits for the user to hit ENTER */ -/****************************************************************************/ -int umsg(const char *str) -{ - int ch; - printf("%s\nHit enter to continue:",str); - ch = getchar(); - return ch == '\r' || ch == '\n'; -} - -/* Same as above, using printf-style varargs */ -int umsgf(char* fmt, ...) -{ - int retval = -1; - va_list va; - char* buf = NULL; - - va_start(va, fmt); - vasprintf(&buf, fmt, va); - va_end(va); - if(buf != NULL) { - retval = umsg(buf); - free(buf); - } - return retval; -} - -BOOL confirm(char* fmt, ...) -{ - int ch; - va_list va; - - va_start(va, fmt); - vprintf(fmt, va); - va_end(va); - printf(" (Y/n)? "); - ch = getchar(); - return tolower(ch) != 'n' && ch != EOF; -} - -BOOL deny(char* fmt, ...) -{ - int ch; - va_list va; - - va_start(va, fmt); - vprintf(fmt, va); - va_end(va); - printf(" (N/y)? "); - ch = getchar(); - return tolower(ch) != 'y'; -} - -/****************************************************************************/ -/* Status popup/down function, see uifc.h for details. */ -/****************************************************************************/ -void upop(const char *str) -{ - static int len; - - if(str==NULL) - printf("\r%*s\r", len, ""); - else - len = printf("\r%s\r", str) - 2; -} - -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ -void sethelp(int line, char* file) -{ - helpline=line; - helpfile=file; -} - -static void uputs(char* ptr) -{ - while(*ptr) { - if(*ptr>2) - putchar(*ptr); - ptr++; - } - putchar('\n'); -} - -/****************************************************************************/ -/* Help function. */ -/****************************************************************************/ -void help() -{ - char hbuf[HELPBUF_SIZE],str[256]; - char *p; - unsigned short line; - long l; - FILE *fp; - - printf("\n"); - if(!api->helpbuf) { - if((fp=fopen(api->helpixbfile,"rb"))==NULL) - SAFEPRINTF(hbuf,"ERROR: Cannot open help index: %.128s" - ,api->helpixbfile); - else { - p=strrchr(helpfile,'/'); - if(p==NULL) - p=strrchr(helpfile,'\\'); - if(p==NULL) - p=helpfile; - else - p++; - l=-1L; - while(!feof(fp)) { - if(fread(str,12,1,fp)!=1) - break; - str[12]=0; - if(fread(&line,2,1,fp)!=1) - break; - if(stricmp(str,p) || line!=helpline) { - if(fseek(fp,4,SEEK_CUR)==0) - break; - continue; - } - if(fread(&l,4,1,fp)!=1) - l=-1L; - break; - } - fclose(fp); - if(l==-1L) - SAFEPRINTF3(hbuf,"ERROR: Cannot locate help key (%s:%u) in: %.128s" - ,p,helpline,api->helpixbfile); - else { - if((fp=fopen(api->helpdatfile,"rb"))==NULL) - SAFEPRINTF(hbuf,"ERROR: Cannot open help file: %.128s" - ,api->helpdatfile); - else { - if(fseek(fp,l,SEEK_SET)!=0) { - SAFEPRINTF4(hbuf,"ERROR: Cannot seek to help key (%s:%u) at %ld in: %.128s" - ,p,helpline,l,api->helpixbfile); - } - else { - if(fread(hbuf,1,HELPBUF_SIZE,fp)<1) { - SAFEPRINTF4(hbuf,"ERROR: Cannot read help key (%s:%u) at %ld in: %.128s" - ,p,helpline,l,api->helpixbfile); - } - hbuf[HELPBUF_SIZE-1] = 0; - } - fclose(fp); - } - } - } - uputs(hbuf); - if(strlen(hbuf)>200) { - printf("Hit enter"); - getstr(str,sizeof(str)-1); - } - } - else { - uputs(api->helpbuf); - if(strlen(api->helpbuf)>200) { - printf("Hit enter"); - getstr(str,sizeof(str)-1); - } - } -} diff --git a/xpdev/CMakeLists.txt b/xpdev/CMakeLists.txt deleted file mode 100644 index cb753fd..0000000 --- a/xpdev/CMakeLists.txt +++ /dev/null @@ -1,189 +0,0 @@ -project (XPDev C) - -cmake_minimum_required(VERSION 3.11) - -INCLUDE (CheckIncludeFiles) -INCLUDE (CheckFunctionExists) -find_package(Threads) -find_package(X11) -if(NOT WIN32) - find_package(PkgConfig) - pkg_check_modules(SDL2 sdl2) -endif() - -set(SOURCE - conwrap.c - dat_file.c - datewrap.c - dirwrap.c - filewrap.c - genwrap.c - ini_file.c - link_list.c - msg_queue.c - multisock.c - netwrap.c - semfile.c - semwrap.c - sockwrap.c - str_list.c - strwrap.c - threadwrap.c - unicode.c - xp_dl.c - xpbeep.c - xpdatetime.c - xpmap.c - xpprintf.c - xptime.c -) - -set(HEADER - conwrap.h - cp437defs.h - dat_file.h - datewrap.h - dirwrap.h - eventwrap.h - filewrap.h - gen_defs.h - genwrap.h - haproxy.h - ini_file.h - link_list.h - msg_queue.h - multisock.h - netwrap.h - petdefs.h - semfile.h - semwrap.h - sockwrap.h - str_list.h - strwrap.h - threadwrap.h - unicode_defs.h - unicode.h - wrapdll.h - xp_dl.h - xp_syslog.h - xpbeep.h - xpdatetime.h - xpendian.h - xpevent.h - xpmap.h - xpprintf.h - xpsem.h -) - -if(NOT WIN32) - list(APPEND SOURCE xpevent.c) - list(APPEND SOURCE xpsem.c) -endif() - -if(SDL2_INCLUDE_DIRS) - list(APPEND SOURCE sdlfuncs.c) - if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - list(APPEND SOURCE SDLMain.m) - endif() - if(WIN32) - list(APPEND SOURCE SDL_win32_main.c) - endif() -endif() - -add_library(xpdev OBJECT ${SOURCE}) -target_include_directories(xpdev PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(xpdev PUBLIC ${XPDevPlus_BINARY_DIR}) -target_link_libraries(xpdev ${CMAKE_DL_LIBS}) - -CHECK_INCLUDE_FILES(inttypes.h HAS_INTTYPES_H) -CHECK_INCLUDE_FILES(stdint.h HAS_STDINT_H) -set(LINK_LIST_THREADSAFE TRUE PARENT_SCOPE) - -CHECK_INCLUDE_FILES(sys/soundcard.h HAS_SYS_SOUNDCARD_H) -CHECK_INCLUDE_FILES(soundcard.h HAS_SOUNDCARD_H) -CHECK_INCLUDE_FILES(linux/inttypes.h HAS_LINUX_SOUNDCARD_H) -if(HAS_SYS_SOUNDCARD_H) - target_compile_definitions(xpdev PRIVATE SOUNDCARD_H_IN=1) -elseif(HAS_SOUNDCARD_H) - target_compile_definitions(xpdev PRIVATE SOUNDCARD_H_IN=2) -elseif(HAS_LINUX_SOUNDCARD_H) - target_compile_definitions(xpdev PRIVATE SOUNDCARD_H_IN=3) -endif() - -CHECK_INCLUDE_FILES(dev/speaker/speaker.h HAS_DEV_SPEAKER_SPEAKER_H) -if(HAS_DEV_SPEAKER_SPEAKER_H) - target_compile_definitions(xpdev PRIVATE HAS_DEV_SPEAKER_SPEAKER_H) -endif() -CHECK_INCLUDE_FILES(dev/machine/speaker.h HAS_DEV_MACHINE_SPEAKER_H) -if(HAS_DEV_MACHINE_SPEAKER_H) - target_compile_definitions(xpdev PRIVATE HAS_DEV_MACHINE_SPEAKER_H) -endif() -CHECK_INCLUDE_FILES(dev/speaker/spkr.h HAS_DEV_MACHINE_SPKR_H) -if(HAS_DEV_MACHINE_SPKR_H) - target_compile_definitions(xpdev PRIVATE HAS_DEV_MACHINE_SPKR_H) -endif() - -if(WIN32) - target_compile_definitions(xpdev PUBLIC _WIN32 _WIN32_WINNT=0x0501 WINVER=0x0501 MSVCRT_VERSION=0x0501 _WIN32_IE=0x0500) - target_link_libraries(xpdev iphlpapi ws2_32 winmm netapi32) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Haiku") - target_link_libraries(xpdev network m) -elseif(CMAKE_SYSTEM_NAME STREQUAL "NetBSD") - target_link_libraries(xpdev ossaudio m) -elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") - target_link_libraries(xpdev ossaudio m) -elseif(CMAKE_SYSTEM_NAME STREQUAL "SunOS") - target_link_libraries(xpdev socket m) -else() - target_link_libraries(xpdev m) -endif() -target_link_libraries(xpdev ${CMAKE_THREAD_LIBS_INIT}) - -if(EXISTS /dev/urandom) - target_compile_definitions(xpdev PRIVATE HAS_DEV_URANDOM URANDOM_DEV="/dev/urandom") -endif() -if(EXISTS /dev/random) - target_compile_definitions(xpdev PRIVATE HAS_DEV_RANDOM RANDOM_DEV="/dev/random") -endif() - -CHECK_FUNCTION_EXISTS(random HAS_RANDOM_FUNC) -if(HAS_RANDOM_FUNC) - target_compile_definitions(xpdev PRIVATE HAS_RANDOM_FUNC) -endif() - -CHECK_FUNCTION_EXISTS(srandomdev HAS_SRANDOMDEV_FUNC) -if(HAS_SRANDOMDEV_FUNC) - target_compile_definitions(xpdev PRIVATE HAS_SRANDOMDEV_FUNC) -endif() - -if(SDL2_INCLUDE_DIRS) - target_include_directories(xpdev PUBLIC ${SDL2_INCLUDE_DIRS}) - set(WITH_SDL_AUDIO TRUE PARENT_SCOPE) -endif() - -if(X11_FOUND) - target_include_directories(xpdev PRIVATE ${X11_INCLUDE_DIR}) -endif() - -if (PKG_CONFIG_FOUND) - pkg_check_modules(PORTAUDIO2 portaudio-2.0) - if(PORTAUDIO2_FOUND) - set(PORTAUDIO_FOUND TRUE) - set(PORTAUDIO_LIBS PORTAUDIO2_LIBS) - set(PORTAUDIO_CFLAGS PORTAUDIO2_CFLAGS) - else() - find_path(PORTAUDIO_INCLUDEDIR portaudio.h) - if(PORTAUDIO_INCLUDEDIR) - set(PORTAUDIO_FOUND TRUE) - endif() - endif() -endif() - -if(PORTAUDIO_FOUND) - target_include_directories(xpdev PRIVATE ${PORTAUDIO_INCLUDEDIR}) -endif() - -CHECK_INCLUDE_FILES(alsa/asoundlib.h USE_ALSA_SOUND) -if(USE_ALSA_SOUND) - target_compile_definitions(xpdev PRIVATE USE_ALSA_SOUND) -endif() diff --git a/xpdev/Makefile b/xpdev/Makefile deleted file mode 100644 index d6aafc6..0000000 --- a/xpdev/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# To build the .dll files, use "make [OPTIONS] DLLIBS=1 dl" - -SRC_ROOT = .. -!include $(SRC_ROOT)/build/Common.bmake - -CFLAGS = $(CFLAGS) $(XPDEV_CFLAGS) -MT_CFLAGS = $(MT_CFLAGS) $(XPDEV-MT_CFLAGS) - -#The following is necessary only when DLL-exporting wrapper functions -!ifdef DLLIBS -CFLAGS = $(CFLAGS) -DWRAPPER_EXPORTS=1 -!endif - -MT_CFLAGS = $(MT_CFLAGS) -DLINK_LIST_THREADSAFE - -!ifdef USE_SDL_AUDIO -MTOBJS = $(MTOBJS) $(MTOBJODIR)$(DIRSEP)SDL_win32_main$(OFILE) -MTOBJS = $(MTOBJS) $(MTOBJODIR)$(DIRSEP)sdlfuncs$(OFILE) -OBJS = $(OBJS) $(OBJODIR)$(DIRSEP)SDL_win32_main$(OFILE) -OBJS = $(OBJS) $(OBJODIR)$(DIRSEP)sdlfuncs$(OFILE) -!endif - -$(WRAPTEST): $(XPDEV-MT_LIB_BUILD) $(TESTOBJS) $(EXEODIR) - @echo Linking $< - $(QUIET)$(CC) $(LDFLAGS) $(MT_LDFLAGS) $(XPDEV-MT_CFLAGS) $(XPDEV-MT_LDFLAGS) -e$@ $(TESTOBJS) $(XPDEV-MT_LIBS) - -$(XPTIME): $(XPDEV_LIB_BUILD) $(OBJODIR)$(DIRSEP)xptime$(OFILE) - @echo Linking $< - $(QUIET)$(CC) $(LDFLAGS) $(XPDEV-CFLAGS) $(XPDEV-LDFLAGS) -e$@ $** $(XPDEV-LIBS) - -$(XPDEV_LIB_BUILD): $(OBJS) - @echo Creating $< ... - -$(QUIET)$(DELETE) $@ - &$(QUIET)tlib $@ +$** - -$(XPDEV_SHLIB_BUILD): $(OBJS) - @echo Linking $@ - $(QUIET)$(MKSHLIB) $(MT_LDFLAGS) -lGi -e$@ $(LDFLAGS) $(SHLIBOPTS) @&&| - $** - cw32.lib -| - -$(XPDEV-MT_LIB_BUILD): $(MTOBJS) - @echo Creating $< ... - -$(QUIET)$(DELETE) $@ - &$(QUIET)tlib $@ +$** - -$(XPDEV-MT_SHLIB_BUILD): $(MTOBJS) - @echo Linking $@ - $(QUIET)$(MKSHLIB) $(MT_LDFLAGS) -lGi -e$@ $(LDFLAGS) $(SHLIBOPTS) @&&| - $** - cw32mt.lib -| diff --git a/xpdev/SDLMain.h b/xpdev/SDLMain.h deleted file mode 100644 index 4683df5..0000000 --- a/xpdev/SDLMain.h +++ /dev/null @@ -1,11 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser <dwaliss1@purdue.edu> - Non-NIB-Code & other changes: Max Horn <max@quendi.de> - - Feel free to customize this file to suit your needs -*/ - -#import <Cocoa/Cocoa.h> - -@interface SDLMain : NSObject -@end diff --git a/xpdev/SDLMain.m b/xpdev/SDLMain.m deleted file mode 100644 index f9c6394..0000000 --- a/xpdev/SDLMain.m +++ /dev/null @@ -1,387 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser <dwaliss1@purdue.edu> - Non-NIB-Code & other changes: Max Horn <max@quendi.de> - - Feel free to customize this file to suit your needs -*/ - -#include "SDL.h" -#include "SDLMain.h" -#include <sys/param.h> /* for MAXPATHLEN */ -#include <unistd.h> - -/* For some reaon, Apple removed setAppleMenu from the headers in 10.4, - but the method still is there and works. To avoid warnings, we declare - it ourselves here. */ -@interface NSApplication(SDL_Missing_Methods) -- (void)setAppleMenu:(NSMenu *)menu; -@end - -/* Use this flag to determine whether we use SDLMain.nib or not */ -#define SDL_USE_NIB_FILE 0 - -/* Use this flag to determine whether we use CPS (docking) or not */ -#define SDL_USE_CPS 1 -#ifdef SDL_USE_CPS -/* Portions of CPS.h */ -typedef struct CPSProcessSerNum -{ - UInt32 lo; - UInt32 hi; -} CPSProcessSerNum; - -extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); -extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); -extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); - -#endif /* SDL_USE_CPS */ - -static int gArgc; -static char **gArgv; -static BOOL gFinderLaunch; -static BOOL gCalledAppMainline = FALSE; - -static NSString *getApplicationName(void) -{ - const NSDictionary *dict; - NSString *appName = 0; - - /* Determine the application name */ - dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); - if (dict) - appName = [dict objectForKey: @"CFBundleName"]; - - if (![appName length]) - appName = [[NSProcessInfo processInfo] processName]; - - return appName; -} - -#if SDL_USE_NIB_FILE -/* A helper category for NSString */ -@interface NSString (ReplaceSubString) -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; -@end -#endif - -@interface NSApplication (SDLApplication) -@end - -@implementation NSApplication (SDLApplication) -/* Invoked from the Quit menu item */ -- (void)terminate:(id)sender -{ - /* Post a SDL_QUIT event */ - SDL_Event event; - event.type = SDL_QUIT; - SDL_PushEvent(&event); -} -@end - -/* The main class of the application, the application's delegate */ -@implementation SDLMain - -/* Set the working directory to the .app's parent directory */ -- (void) setupWorkingDirectory:(BOOL)shouldChdir -{ - if (shouldChdir) - { - char parentdir[MAXPATHLEN]; - CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url); - if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, MAXPATHLEN)) { - chdir(parentdir); /* chdir to the binary app's parent */ - } - CFRelease(url); - CFRelease(url2); - } -} - -#if SDL_USE_NIB_FILE - -/* Fix menu to contain the real app name instead of "SDL App" */ -- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName -{ - NSRange aRange; - NSEnumerator *enumerator; - NSMenuItem *menuItem; - - aRange = [[aMenu title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; - - enumerator = [[aMenu itemArray] objectEnumerator]; - while ((menuItem = [enumerator nextObject])) - { - aRange = [[menuItem title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; - if ([menuItem hasSubmenu]) - [self fixMenu:[menuItem submenu] withAppName:appName]; - } -} - -#else - -static void setApplicationMenu(void) -{ - /* warning: this code is very odd */ - NSMenu *appleMenu; - NSMenuItem *menuItem; - NSString *title; - NSString *appName; - - appName = getApplicationName(); - appleMenu = [[NSMenu alloc] initWithTitle:@""]; - - /* Add menu items */ - title = [@"About " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Hide " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@""]; - - menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@""]; - [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; - - [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Quit " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@""]; - - - /* Put menu into the menubar */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; - [menuItem setSubmenu:appleMenu]; - [[NSApp mainMenu] addItem:menuItem]; - - /* Tell the application object that this is now the application menu */ - [NSApp setAppleMenu:appleMenu]; - - /* Finally give up our references to the objects */ - [appleMenu release]; - [menuItem release]; -} - -/* Create a window menu */ -static void setupWindowMenu(void) -{ - NSMenu *windowMenu; - NSMenuItem *windowMenuItem; - NSMenuItem *menuItem; - - windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; - - /* "Minimize" item */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@""]; - [windowMenu addItem:menuItem]; - [menuItem release]; - - /* Put menu into the menubar */ - windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; - [windowMenuItem setSubmenu:windowMenu]; - [[NSApp mainMenu] addItem:windowMenuItem]; - - /* Tell the application object that this is now the window menu */ - [NSApp setWindowsMenu:windowMenu]; - - /* Finally give up our references to the objects */ - [windowMenu release]; - [windowMenuItem release]; -} - -/* Replacement for NSApplicationMain */ -static void CustomApplicationMain (int argc, char **argv) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - SDLMain *sdlMain; - - /* If there's no Window Server (ie: remote headless), go in dry. */ - if (_CGSDefaultConnection() == NULL) { - XPDEV_main(argc, argv, environ); - return; - } - - /* Ensure the application object is initialised */ - [NSApplication sharedApplication]; - -#ifdef SDL_USE_CPS - { - CPSProcessSerNum PSN; - /* Tell the dock about us */ - if (!CPSGetCurrentProcess(&PSN)) - if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103)) - if (!CPSSetFrontProcess(&PSN)) - [NSApplication sharedApplication]; - } -#endif /* SDL_USE_CPS */ - - /* Set up the menubar */ - [NSApp setMainMenu:[[NSMenu alloc] init]]; - setApplicationMenu(); - setupWindowMenu(); - - /* Create SDLMain and make it the app delegate */ - sdlMain = [[SDLMain alloc] init]; - [NSApp setDelegate:sdlMain]; - - /* Start the main event loop */ - [NSApp run]; - - [sdlMain release]; - [pool release]; -} - -#endif - - -/* - * Catch document open requests...this lets us notice files when the app - * was launched by double-clicking a document, or when a document was - * dragged/dropped on the app's icon. You need to have a - * CFBundleDocumentsType section in your Info.plist to get this message, - * apparently. - * - * Files are added to gArgv, so to the app, they'll look like command line - * arguments. Previously, apps launched from the finder had nothing but - * an argv[0]. - * - * This message may be received multiple times to open several docs on launch. - * - * This message is ignored once the app's mainline has been called. - */ -- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename -{ - const char *temparg; - size_t arglen; - char *arg; - char **newargv; - - if (!gFinderLaunch) /* MacOS is passing command line args. */ - return FALSE; - - if (gCalledAppMainline) /* app has started, ignore this document. */ - return FALSE; - - temparg = [filename UTF8String]; - arglen = SDL_strlen(temparg) + 1; - arg = (char *) SDL_malloc(arglen); - if (arg == NULL) - return FALSE; - - newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2)); - if (newargv == NULL) - { - SDL_free(arg); - return FALSE; - } - gArgv = newargv; - - SDL_strlcpy(arg, temparg, arglen); - gArgv[gArgc++] = arg; - gArgv[gArgc] = NULL; - return TRUE; -} - -extern char **environ; -/* Called when the internal event loop has just started running */ -- (void) applicationDidFinishLaunching: (NSNotification *) note -{ - int status; - - /* Set the working directory to the .app's parent directory */ - [self setupWorkingDirectory:gFinderLaunch]; - -#if SDL_USE_NIB_FILE - /* Set the main menu to contain the real app name instead of "SDL App" */ - [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()]; -#endif - - /* Hand off to main application code */ - gCalledAppMainline = TRUE; - status = SDL_main_env (gArgc, gArgv, environ); - - /* We're done, thank you for playing */ - exit(status); -} -@end - - -@implementation NSString (ReplaceSubString) - -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString -{ - unsigned int bufferSize; - unsigned int selfLen = [self length]; - unsigned int aStringLen = [aString length]; - unichar *buffer; - NSRange localRange; - NSString *result; - - bufferSize = selfLen + aStringLen - aRange.length; - buffer = (unichar *)NSAllocateMemoryPages(bufferSize*sizeof(unichar)); - - /* Get first part into buffer */ - localRange.location = 0; - localRange.length = aRange.location; - [self getCharacters:buffer range:localRange]; - - /* Get middle part into buffer */ - localRange.location = 0; - localRange.length = aStringLen; - [aString getCharacters:(buffer+aRange.location) range:localRange]; - - /* Get last part into buffer */ - localRange.location = aRange.location + aRange.length; - localRange.length = selfLen - localRange.location; - [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; - - /* Build output string */ - result = [NSString stringWithCharacters:buffer length:bufferSize]; - - NSDeallocateMemoryPages(buffer, bufferSize); - - return result; -} - -@end - - - -#ifdef main -# undef main -#endif - - -/* Main entry point to executable - should *not* be SDL_main! */ -int main (int argc, char **argv) -{ - /* Copy the arguments into a global variable */ - /* This is passed if we are launched by double-clicking */ - if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { - gArgv = (char **) SDL_malloc(sizeof (char *) * 2); - gArgv[0] = argv[0]; - gArgv[1] = NULL; - gArgc = 1; - gFinderLaunch = YES; - } else { - int i; - gArgc = argc; - gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1)); - for (i = 0; i <= argc; i++) - gArgv[i] = argv[i]; - gFinderLaunch = NO; - } - -#if SDL_USE_NIB_FILE - NSApplicationMain (argc, argv); -#else - CustomApplicationMain (argc, argv); -#endif - return 0; -} - diff --git a/xpdev/SDL_win32_main.c b/xpdev/SDL_win32_main.c deleted file mode 100644 index ef9b360..0000000 --- a/xpdev/SDL_win32_main.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - SDL_main.c, placed in the public domain by Sam Lantinga 4/13/98 - - The WinMain function -- calls your program's main() function -*/ - -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include <stdlib.h> - -#include <windows.h> -#include <malloc.h> /* For _alloca() */ - -#define DIR_SEPERATOR TEXT("/") -#include <direct.h> - -/* Parse a command line buffer into arguments */ -static int ParseCommandLine(char *cmdline, char **argv) -{ - char *bufp; - int argc; - - argc = 0; - for ( bufp = cmdline; *bufp; ) { - /* Skip leading whitespace */ - while ( isspace(*bufp) ) { - ++bufp; - } - /* Skip over argument */ - if ( *bufp == '"' ) { - ++bufp; - if ( *bufp ) { - if ( argv ) { - argv[argc] = bufp; - } - ++argc; - } - /* Skip over word */ - while ( *bufp && (*bufp != '"') ) { - ++bufp; - } - } else { - if ( *bufp ) { - if ( argv ) { - argv[argc] = bufp; - } - ++argc; - } - /* Skip over word */ - while ( *bufp && ! isspace(*bufp) ) { - ++bufp; - } - } - if ( *bufp ) { - if ( argv ) { - *bufp = '\0'; - } - ++bufp; - } - } - if ( argv ) { - argv[argc] = NULL; - } - return(argc); -} - -extern int main(int argc, char **argv); - -/* This is where execution begins [console apps] */ -static int console_main(int argc, char *argv[], char **env) -{ - int n; - char *bufp, *appname; - - /* Get the class name from argv[0] */ - appname = argv[0]; - if ( (bufp=strrchr(argv[0], '\\')) != NULL ) { - appname = bufp+1; - } else - if ( (bufp=strrchr(argv[0], '/')) != NULL ) { - appname = bufp+1; - } - - if ( (bufp=strrchr(appname, '.')) == NULL ) - n = strlen(appname); - else - n = (bufp-appname); - - bufp = (char *)alloca(n+1); - if ( bufp == NULL ) { - return 1; - } - strncpy(bufp, appname, n); - bufp[n] = '\0'; - appname = bufp; - - /* Run the application main() code */ - n=main(argc, argv); - - /* Exit cleanly, calling atexit() functions */ - exit(n); - - /* Hush little compiler, don't you cry... */ - return(n); -} - -/* This is where execution begins [windowed apps] */ -int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) -{ - HINSTANCE handle; - char **argv; - int argc; - char *cmdline; - char *bufp; - - /* Start up DDHELP.EXE before opening any files, so DDHELP doesn't - keep them open. This is a hack.. hopefully it will be fixed - someday. DDHELP.EXE starts up the first time DDRAW.DLL is loaded. - */ - handle = LoadLibrary(TEXT("DDRAW.DLL")); - if ( handle != NULL ) { - FreeLibrary(handle); - } - - /* Grab the command line (use alloca() on Windows) */ - bufp = GetCommandLine(); - cmdline = (char *)alloca(strlen(bufp)+1); - if ( cmdline == NULL ) { - return 1; - } - strcpy(cmdline, bufp); - - /* Parse it into argv and argc */ - argc = ParseCommandLine(cmdline, NULL); - argv = (char **)alloca((argc+1)*(sizeof *argv)); - if ( argv == NULL ) { - return 1; - } - ParseCommandLine(cmdline, argv); - - /* Run the main program (after a little SDL initialization) */ - return(console_main(argc, argv, _environ)); -} diff --git a/xpdev/conwrap.c b/xpdev/conwrap.c deleted file mode 100644 index 01d85f9..0000000 --- a/xpdev/conwrap.c +++ /dev/null @@ -1,161 +0,0 @@ -/* conwrap.c */ - -/* DOS's kbhit and getch functions for Unix - Casey Martin 2000 */ - -/* $Id: conwrap.c,v 1.15 2018/07/24 01:13:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#if defined(__unix__) - -#include <stdlib.h> -#include <string.h> /* memcpy */ -#include <unistd.h> -#include <termios.h> - -#include <sys/time.h> -#include <sys/types.h> -#include <signal.h> - -#include "conwrap.h" /* Verify prototypes */ - -static struct termios current; /* our current term settings */ -static struct termios original; /* old termios settings */ -static int beensetup = 0; /* has _termios_setup() been called? */ -static int istty = 0; /* is stdin a tty? */ - -/* Resets the termios to its previous state */ -void _termios_reset(void) -{ - tcsetattr(STDIN_FILENO, TCSANOW, &original); -} - -/************************************************ - This pair of functions handles Ctrl-Z presses -************************************************/ -#if defined(__BORLANDC__) - #pragma argsused -#endif -void _sighandler_stop(int sig) -{ - /* clean up the terminal */ - _termios_reset(); - - /* ... and stop */ - kill(getpid(), SIGSTOP); -} -#if defined(__BORLANDC__) - #pragma argsused -#endif -void _sighandler_cont(int sig) -{ - /* restore terminal */ - tcsetattr(STDIN_FILENO, TCSANOW, ¤t); -} - - -/* Prepares termios for non-blocking action */ -void _termios_setup(void) -{ - beensetup = 1; - - tcgetattr(STDIN_FILENO, &original); - - memcpy(¤t, &original, sizeof(struct termios)); - current.c_cc[VMIN] = 1; /* read() will return with one char */ - current.c_cc[VTIME] = 0; /* read() blocks forever */ - current.c_lflag &= ~ICANON; /* character mode */ - current.c_lflag &= ~ECHO; /* turn off echoing */ - tcsetattr(STDIN_FILENO, TCSANOW, ¤t); - - /* Let's install an exit function, also. This way, we can reset - * the termios silently - */ - atexit(_termios_reset); - - /* install the Ctrl-Z handler */ - signal(SIGTSTP, _sighandler_stop); - signal(SIGCONT, _sighandler_cont); -} - -void _echo_on(void) -{ - tcgetattr(STDIN_FILENO, ¤t); - current.c_lflag |= ECHO; /* turn on echoing */ - tcsetattr(STDIN_FILENO, TCSANOW, ¤t); -} - -void _echo_off(void) -{ - tcgetattr(STDIN_FILENO, ¤t); - current.c_lflag &= ~ECHO; /* turn off echoing */ - tcsetattr(STDIN_FILENO, TCSANOW, ¤t); -} - -int kbhit(void) -{ - fd_set inp; - struct timeval timeout = {0, 0}; - - if(!istty) { - istty = isatty(STDIN_FILENO); - if(!istty) - return 0; - } - - if(!beensetup) - _termios_setup(); - - /* set up select() args */ - FD_ZERO(&inp); - FD_SET(STDIN_FILENO, &inp); - - if(select(STDIN_FILENO+1, &inp, NULL, NULL, &timeout)<1) - return 0; - return 1; -} - -int getch(void) -{ - char c; - - if(!beensetup) - _termios_setup(); - - /* get a char out of stdin */ - if(read(STDIN_FILENO, &c, 1)==-1) - return 0; - - return c; -} - -#endif /* __unix__ */ diff --git a/xpdev/conwrap.h b/xpdev/conwrap.h deleted file mode 100644 index e79c18f..0000000 --- a/xpdev/conwrap.h +++ /dev/null @@ -1,55 +0,0 @@ -/* conwrap.h */ - -/* Cross-platform local console I/O wrapppers */ - -/* $Id: conwrap.h,v 1.6 2018/07/24 01:13:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _CONWRAP_H -#define _CONWRAP_H - -#if defined(__unix__) - - void _termios_reset(void); - void _echo_on(void); - void _echo_off(void); - int kbhit(void); - int getch(void); - -#else /* DOS-Based */ - - #include <conio.h> - -#endif - -#endif /* _CONWRAP_H */ diff --git a/xpdev/cp437defs.h b/xpdev/cp437defs.h deleted file mode 100644 index 6524710..0000000 --- a/xpdev/cp437defs.h +++ /dev/null @@ -1,178 +0,0 @@ -/* Synchronet IBM Code Page 437 (CP437) definitions */ - -/* $Id: cp437defs.h,v 1.5 2019/08/30 10:47:41 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef CP437DEFS_H_ -#define CP437DEFS_H_ - -enum cp437_char { - CP437_WHITE_SMILING_FACE = '\x01', - CP437_BLACK_SMILING_FACE = '\x02', - CP437_BLACK_HEART_SUIT = '\x03', - CP437_BLACK_DIAMOND_SUIT = '\x04', - CP437_BLACK_CLUB_SUIT = '\x05', - CP437_BLACK_SPADE_SUIT = '\x06', - CP437_BULLET = '\x07', - CP437_INVERSE_BULLET = '\x08', - CP437_WHITE_CIRCLE = '\x09', - CP437_INVERSE_WHITE_CIRCLE = '\x0A', - CP437_MALE_SIGN = '\x0B', - CP437_FEMALE_SIGN = '\x0C', - CP437_EIGHTH_NOTE = '\x0D', - CP437_BEAMED_EIGHTH_NOTES = '\x0E', - CP437_WHITE_SUN_WITH_RAYS = '\x0F', - CP437_BLACK_RIGHT_POINTING_POINTER = '\x10', - CP437_BLACK_LEFT_POINTING_POINTER = '\x11', - CP437_UP_DOWN_ARROW = '\x12', - CP437_DOUBLE_EXCLAMATION_MARK = '\x13', - CP437_PILCROW_SIGN = '\x14', // Paragraph mark - CP437_SECTION_SIGN = '\x15', - CP437_BLACK_RECTANGLE = '\x16', - CP437_UP_DOWN_ARROW_WITH_BASE = '\x17', - CP437_UPWARDS_ARROW = '\x18', - CP437_DOWNWARDS_ARROW = '\x19', - CP437_RIGHTWARDS_ARROW = '\x1A', - CP437_LEFTWARDS_ARROW = '\x1B', - CP437_RIGHT_ANGLE = '\x1C', - CP437_LEFT_RIGHT_ARROW = '\x1D', - CP437_BLACK_UP_POINTING_TRIANGLE = '\x1E', - CP437_BLACK_DOWN_POINTING_TRIANGLE = '\x1F', - - // 0x20 - 0x7E are ASCII characters - - CP437_HOUSE = '\x7F', - CP437_LATIN_CAPTIAL_LETTER_C_WITH_CEDILLA = '\x80', - CP437_LATIN_SMALL_LETTER_U_WITH_DIAERESIS = '\x81', - CP437_LATIN_SMALL_LETTER_E_WITH_ACUTE = '\x82', - CP437_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX = '\x83', - CP437_LATIN_SMALL_LETTER_A_WITH_DIAERESIS = '\x84', - CP437_LATIN_SMALL_LETTER_A_WITH_GRAVE = '\x85', - CP437_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE = '\x86', - CP437_LATIN_SMALL_LETTER_C_WITH_CEDILLA = '\x87', - CP437_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX = '\x88', - CP437_LATIN_SMALL_LETTER_E_WITH_DIAERESIS = '\x89', - CP437_LATIN_SMALL_LETTER_E_WITH_GRAVE = '\x8a', - CP437_LATIN_SMALL_LETTER_I_WITH_DIAERESIS = '\x8b', - CP437_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX = '\x8c', - CP437_LATIN_SMALL_LETTER_I_WITH_GRAVE = '\x8d', - CP437_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS = '\x8e', - CP437_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE = '\x8f', - CP437_LATIN_CAPITAL_LETTER_E_WITH_ACUTE = '\x90', - CP437_LATIN_SMALL_LETTER_AE = '\x91', - CP437_LATIN_CAPITAL_LETTER_AE = '\x92', - CP437_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX = '\x93', - CP437_LATIN_SMALL_LETTER_O_WITH_DIAERESIS = '\x94', - CP437_LATIN_SMALL_LETTER_O_WITH_GRAVE = '\x95', - CP437_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX = '\x96', - CP437_LATIN_SMALL_LETTER_U_WITH_GRAVE = '\x97', - CP437_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS = '\x98', - CP437_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS = '\x99', - CP437_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS = '\x9A', - CP437_CENT_SIGN = '\x9B', - CP437_POUND_SIGN = '\x9C', - CP437_YEN_SIGN = '\x9E', - CP437_PESETA_SIGN = '\x9E', - CP437_LATIN_SMALL_LETTER_F_WITH_HOOK = '\x9F', - CP437_LATIN_SMALL_LETTER_A_WITH_ACUTE = '\xA0', - CP437_LATIN_SMALL_LETTER_I_WITH_ACUTE = '\xA1', - CP437_LATIN_SMALL_LETTER_O_WITH_ACUTE = '\xA2', - CP437_LATIN_SMALL_LETTER_U_WITH_ACUTE = '\xA3', - CP437_LATIN_SMALL_LETTER_N_WITH_TILDE = '\xA4', - CP437_LATIN_CAPITAL_LETTER_N_WITH_TILDE = '\xA5', - CP437_FEMININE_ORDINAL_INDICATOR = '\xA6', - CP437_MASCULINE_ORDINAL_INDICATOR = '\xA7', - CP437_INVERTED_QUESTION_MARK = '\xA8', - CP437_REVERSED_NOT_SIGN = '\xA9', - CP437_NOT_SIGN = '\xAA', - CP437_VULGAR_FRACTION_ONE_HALF = '\xAB', - CP437_VULGAR_FRACTION_ONE_QUARTER = '\xAC', - CP437_INVERTED_EXCLAMATION_MARK = '\xAD', - CP437_LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK = '\xAE', - CP437_RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK = '\xAF', - CP437_LIGHT_SHADE = '\xB0', - CP437_MEDIUM_SHADE = '\xB1', - CP437_DARK_SHADE = '\xB2', - CP437_BOX_DRAWINGS_LIGHT_VERTICAL = '\xB3', - CP437_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT = '\xB4', - CP437_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE = '\xB5', - CP437_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE = '\xB6', - CP437_BOX_DRAWINGS_DOUBLE_VERTICAL = '\xBA', - CP437_BOX_DRAWINGS_VERTICAL_AND_HORIZONTAL = '\xC5', - // TODO... - CP437_FULL_BLOCK = '\xDB', - CP437_LOWER_HALF_BLOCK = '\xDC', - CP437_LEFT_HALF_BLOCK = '\xDD', - CP437_RIGHT_HALF_BLOCK = '\xDE', - CP437_UPPER_HALF_BLOCK = '\xDF', - // TODO... - CP437_GREEK_SMALL_LETTER_ALPHA = '\xE0', - CP437_GREEK_SMALL_LETTER_BETA = '\xE1', - CP437_LATIN_SMALL_LETTER_SHARP_S = '\xE1', // Duplicate - CP437_GREEK_CAPITAL_LETTER_GAMMA = '\xE2', - CP437_GREEK_SMALL_LETTER_PI = '\xE3', - CP437_GREEK_CAPITAL_LETTER_SIGMA = '\xE4', - CP437_GREEK_SMALL_LETTER_SIGMA = '\xE5', - CP437_GREEK_SMALL_LETTER_MU = '\xE6', - CP437_MICRO_SIGN = '\xE6', // Duplicate - CP437_GREEK_SMALL_LETTER_TAU = '\xE7', - CP437_GREEK_CAPITAL_LETTER_PHI = '\xE8', - CP437_GREEK_SMALL_LETTER_THETA = '\xE9', - CP437_GREEK_CAPITAL_LETTER_OMEGA = '\xEA', - CP437_GREEK_SMALL_LETTER_DELTA = '\xEB', - CP437_INFINITY = '\xEC', - CP437_GREEK_SMALL_LETTER_PHI = '\xED', - CP437_GREEK_SMALL_LETTER_EPSILION = '\xEE', - CP437_INTERSECTION = '\xEF', - CP437_IDENTICAL_TO = '\xF0', - CP437_TRIPLE_BAR = '\xF0', // Duplicate - CP437_PLUS_MINUS_SIGN = '\xF1', - CP437_GREATER_THAN_OR_EQUAL_TO = '\xF2', - CP437_LESS_THAN_OR_EQUAL_TO = '\xF3', - CP437_TOP_HALF_INTEGRAL = '\xF4', - CP437_BOTTOM_HALF_INTEGRAL = '\xF5', - CP437_DIVISION_SIGN = '\xF6', - CP437_ALMOST_EQUAL_TO = '\xF7', - CP437_DEGREE_SIGN = '\xF8', - CP437_BULLET_OPERATOR = '\xF9', - CP437_MIDDLE_DOT = '\xFA', - CP437_SQUARE_ROOT = '\xFB', - CP437_CHECK_MARK = '\xFB', // Duplicate - CP437_SUPERSCRIPT_LATIN_SMALL_LETTER_N = '\xFC', - CP437_SUPERSCRIPT_TWO = '\xFD', - CP437_BLACK_SQUARE = '\xFE', - CP437_HALFWIDTH_BLACK_SQUARE = '\xFE', // Duplicate - CP437_NO_BREAK_SPACE = '\xFF' -}; - -#endif // Don't add anything after this line diff --git a/xpdev/dat_file.c b/xpdev/dat_file.c deleted file mode 100644 index 7b8e5b6..0000000 --- a/xpdev/dat_file.c +++ /dev/null @@ -1,290 +0,0 @@ -/* dat_file.c */ - -/* Functions to deal with comma (CSV) and tab-delimited files and lists */ - -/* $Id: dat_file.c,v 1.8 2018/07/24 01:13:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "dat_file.h" -#include "genwrap.h" /* lastchar */ -#include "filewrap.h" /* chsize */ -#include <stdlib.h> /* malloc */ -#include <string.h> /* strdup */ - -/***********************************/ -/* CSV (Comma Separated Value) API */ -/***********************************/ - -static char* csvEncode(char* field) -{ - char* dst; - char* src; - char* buf; - char* comma; - char* quote; - char first; - char last; - char* nl; - BOOL enclose; - - if((buf=malloc(strlen(field)*2))==NULL) - return(NULL); - - nl=strchr(field,'\n'); - comma=strchr(field,','); - quote=strchr(field,'"'); - first=field[0]; - last=*lastchar(field); - - enclose = (quote || comma || nl || first==' ' || last==' '); - - dst=buf; - if(enclose) - *(dst++)='"'; - src=field; - while(*src) { - if(*src=='"') - *(dst++)='"'; /* escape quotes */ - *(dst++)=*src++; - } - if(enclose) - *(dst++)='"'; - - *dst=0; - - return(buf); -} - -char* csvLineCreator(const str_list_t columns) -{ - char* str=NULL; - char* p; - char* val; - size_t i,len; - - if(columns==NULL) - return(NULL); - - for(i=0;columns[i]!=NULL;i++) { - len=strlen(columns[i])*2; - if(str) - len+=strlen(str); - if((p=realloc(str,len))==NULL) - break; - str=p; - if(i) strcat(str,","); - else *str=0; - if((val=csvEncode(columns[i]))==NULL) - break; - strcat(str,val); - free(val); - } - - return(str); -} - -str_list_t csvLineParser(const char* line) -{ - char* p; - char* buf; - char* tmp; - size_t count=0; - str_list_t list; - - if((list=strListInit())==NULL) - return(NULL); - - if((buf=strdup(line))==NULL) { - strListFree(&list); - return(NULL); - } - - truncsp(buf); - - for(p=strtok_r(buf,",",&tmp);p;p=strtok_r(NULL,",",&tmp)) - strListAppend(&list,p,count++); - - free(buf); - - return(list); -} - -/*********************/ -/* Tab-Delimited API */ -/*********************/ - -char* tabLineCreator(const str_list_t columns) -{ - char* str=NULL; - char* p; - size_t i,len; - - if(columns==NULL) - return(NULL); - - for(i=0;columns[i]!=NULL;i++) { - len=strlen(columns[i])*2; - if(str) - len+=strlen(str); - if((p=realloc(str,len))==NULL) - break; - str=p; - if(i) strcat(str,"\t"); - else *str=0; - strcat(str,columns[i]); - } - - return(str); -} - -str_list_t tabLineParser(const char* line) -{ - char* p; - char* buf; - char* tmp; - size_t count=0; - str_list_t list; - - if((list=strListInit())==NULL) - return(NULL); - - if((buf=strdup(line))==NULL) { - strListFree(&list); - return(NULL); - } - - for(p=strtok_r(buf,"\t",&tmp);p;p=strtok_r(NULL,"\t",&tmp)) - strListAppend(&list,p,count++); - - free(buf); - - return(list); -} - -/* Generic API */ - -str_list_t dataCreateList(const str_list_t records[], const str_list_t columns, dataLineCreator_t lineCreator) -{ - char* p; - str_list_t list; - size_t i; - size_t li=0; - - if((list=strListInit())==NULL) - return(NULL); - - if(columns!=NULL) { - p=lineCreator(columns); - strListAppend(&list,p,li++); - free(p); - } - - if(records!=NULL) - for(i=0;records[i]!=NULL;i++) { - p=lineCreator(records[i]); - strListAppend(&list,p,li++); - free(p); - } - - return(list); -} - -BOOL dataWriteFile(FILE* fp, const str_list_t records[], const str_list_t columns, const char* separator - ,dataLineCreator_t lineCreator) -{ - size_t count,total; - str_list_t list; - - rewind(fp); - - if(chsize(fileno(fp),0)!=0) /* truncate */ - return(FALSE); - - if((list=dataCreateList(records,columns,lineCreator))==NULL) - return(FALSE); - - total = strListCount(list); - count = strListWriteFile(fp,list,separator); - strListFree(&list); - - return(count == total); -} - -str_list_t* dataParseList(const str_list_t records, str_list_t* columns, dataLineParser_t lineParser) -{ - size_t ri=0; - size_t li=0; - str_list_t* list; - - if(records==NULL) - return(NULL); - - if((list=(str_list_t*)malloc(sizeof(str_list_t)*(strListCount(records)+1)))==NULL) - return(NULL); - - if(columns!=NULL) { - if((*columns=lineParser(records[ri++]))==NULL) { - free(list); - return(NULL); - } - } - - while(records[ri]!=NULL) - list[li++]=lineParser(records[ri++]); - - list[li]=NULL; /* terminate */ - - return(list); -} - -str_list_t* dataReadFile(FILE* fp, str_list_t* columns, dataLineParser_t lineParser) -{ - str_list_t* records; - str_list_t lines; - size_t i; - - rewind(fp); - - if((lines=strListReadFile(fp, NULL, 0))==NULL) - return(NULL); - - /* truncate line-feed chars off end of strings */ - for(i=0; lines[i]!=NULL; i++) - truncnl(lines[i]); - - records=dataParseList(lines,columns,lineParser); - - strListFree(&lines); - - return(records); -} diff --git a/xpdev/dat_file.h b/xpdev/dat_file.h deleted file mode 100644 index 4c45d8a..0000000 --- a/xpdev/dat_file.h +++ /dev/null @@ -1,82 +0,0 @@ -/* dat_file.h */ - -/* Functions to deal with comma (CSV) and tab-delimited files and lists */ - -/* $Id: dat_file.h,v 1.4 2018/07/24 01:13:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _DAT_FILE_H -#define _DAT_FILE_H - -#include "str_list.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -/***************/ -/* Generic API */ -/***************/ - -typedef str_list_t (*dataLineParser_t)(const char*); -typedef char* (*dataLineCreator_t)(const str_list_t); - -/* columns arguments are optional (may be NULL) */ -str_list_t* dataParseList(const str_list_t records, str_list_t* columns, dataLineParser_t); -str_list_t* dataReadFile(FILE* fp, str_list_t* columns, dataLineParser_t); - -str_list_t dataCreateList(const str_list_t records[], const str_list_t columns, dataLineCreator_t); -BOOL dataWriteFile(FILE* fp, const str_list_t records[], const str_list_t columns - ,const char* separator, dataLineCreator_t); - -/* CSV (comma separated value) API */ -char* csvLineCreator(const str_list_t); -str_list_t csvLineParser(const char* line); -#define csvParseList(list,col) dataParseList(list,col,csvLineParser) -#define csvCreateList(rec,col) dataCreateList(rec,col,csvLineCreator) -#define csvReadFile(fp,col) dataReadFile(fp,col,csvLineParser) -#define csvWriteFile(fp,rec,sep,col) dataWriteFile(fp,rec,col,sep,csvLineCreator) - -/* Tab-delimited API */ -char* tabLineCreator(const str_list_t); -str_list_t tabLineParser(const char* line); -#define tabParseList(list,col) dataParseList(list,col,tabLineParser) -#define tabCreateList(rec,col) dataCreateList(rec,col,tabLineCreator) -#define tabReadFile(fp,col) dataReadFile(fp,col,tabLineParser) -#define tabWriteFile(fp,rec,sep,col) dataWriteFile(fp,rec,col,sep,tabLineCreator) - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/datewrap.c b/xpdev/datewrap.c deleted file mode 100644 index 5f3759e..0000000 --- a/xpdev/datewrap.c +++ /dev/null @@ -1,213 +0,0 @@ -/* datewrap.c */ - -/* Wrappers for non-standard date and time functions */ - -/* $Id: datewrap.c,v 1.34 2015/08/29 10:40:15 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "string.h" /* memset */ -#include "genwrap.h" -#include "datewrap.h" - -/* Return difference (in seconds) in time() result from standard */ -time_t checktime(void) -{ - time_t t=0x2D24BD00L; /* Correct time_t value on Jan-1-1994 */ - struct tm gmt; - struct tm tm; - - memset(&tm,0,sizeof(tm)); - tm.tm_year=94; - tm.tm_mday=1; - return mktime(&tm) - mktime(gmtime_r(&t,&gmt)); -} - -/* Compensates for struct tm "weirdness" */ -time_t sane_mktime(struct tm* tm) -{ - if(tm->tm_year>=1900) - tm->tm_year-=1900; - if(tm->tm_mon) /* Month is zero-based */ - tm->tm_mon--; - tm->tm_isdst=-1; /* Auto-adjust for DST */ - - return mktime(tm); -} - -/* Compensates for struct tm "weirdness" */ -time_t sane_timegm(struct tm* tm) -{ - if(tm->tm_year>=1900) - tm->tm_year-=1900; - if(tm->tm_mon) /* Month is zero-based */ - tm->tm_mon--; - tm->tm_isdst=0; /* Don't adjust for DST */ - - return timegm(tm); -} - -time32_t time32(time32_t* tp) -{ - time_t t; - - t=time(NULL); - - if(tp!=NULL) - *tp=(time32_t)t; - - return (time32_t)t; -} - -time32_t mktime32(struct tm* tm) -{ - return (time32_t)mktime(tm); /* don't use sane_mktime since tm->tm_mon is assumed to be already zero-based */ -} - -struct tm* localtime32(const time32_t* t32, struct tm* tm) -{ - time_t t=*t32; - struct tm* tmp; - - if((tmp=localtime(&t))==NULL) - return(NULL); - - *tm = *tmp; - return(tm); -} - - -#if !defined(__BORLANDC__) - -/***********************************/ -/* Borland DOS date/time functions */ -/***********************************/ - -#if defined(_WIN32) - #include <windows.h> /* SYSTEMTIME and GetLocalTime() */ - #include <time.h> /* _mkgmtime */ -#else - #include <sys/time.h> /* stuct timeval, gettimeofday() */ -#endif - -void xp_getdate(struct date* nyd) -{ - time_t tim; - struct tm dte; - - tim=time(NULL); - localtime_r(&tim,&dte); - nyd->da_year=dte.tm_year+1900; - nyd->da_day=dte.tm_mday; - nyd->da_mon=dte.tm_mon+1; -} - -void gettime(struct time* nyt) -{ -#if defined(_WIN32) - SYSTEMTIME systime; - - GetLocalTime(&systime); - nyt->ti_hour=(unsigned char)systime.wHour; - nyt->ti_min=(unsigned char)systime.wMinute; - nyt->ti_sec=(unsigned char)systime.wSecond; - nyt->ti_hund=systime.wMilliseconds/10; -#else /* !Win32 (e.g. Unix) */ - struct tm dte; - time_t t; - struct timeval tim; - - gettimeofday(&tim, NULL); - t=tim.tv_sec; - localtime_r(&t,&dte); - nyt->ti_min=dte.tm_min; - nyt->ti_hour=dte.tm_hour; - nyt->ti_sec=dte.tm_sec; - nyt->ti_hund=tim.tv_usec/10000; -#endif -} - -#endif /* !Borland */ - -#if !defined(__unix__) - -/****************************************************************************/ -/* Win32 implementations of the recursive (thread-safe) versions of std C */ -/* time functions (gmtime, localtime, ctime, and asctime) used in Unix. */ -/* The native Win32 versions of these functions are already thread-safe. */ -/****************************************************************************/ - -struct tm* gmtime_r(const time_t* t, struct tm* tm) -{ - struct tm* tmp = gmtime(t); - - if(tmp==NULL) - return(NULL); - - *tm = *tmp; - return(tm); -} - -struct tm* localtime_r(const time_t* t, struct tm* tm) -{ - struct tm* tmp = localtime(t); - - if(tmp==NULL) - return(NULL); - - *tm = *tmp; - return(tm); -} - -char* ctime_r(const time_t *t, char *buf) -{ - char* p = ctime(t); - - if(p==NULL) - return(NULL); - - strcpy(buf,p); - return(buf); -} - -char* asctime_r(const struct tm *tm, char *buf) -{ - char* p = asctime(tm); - - if(p==NULL) - return(NULL); - - strcpy(buf,p); - return(buf); -} - -#endif /* !defined(__unix__) */ diff --git a/xpdev/datewrap.h b/xpdev/datewrap.h deleted file mode 100644 index c57cd94..0000000 --- a/xpdev/datewrap.h +++ /dev/null @@ -1,99 +0,0 @@ -/* Wrappers for non-standard date and time functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _DATEWRAP_H_ -#define _DATEWRAP_H_ - -#include "genwrap.h" /* time_t */ - -#if defined(__cplusplus) -extern "C" { -#endif - -/* Return difference (in seconds) in time() result from standard (0 on success) */ -DLLEXPORT time_t checktime(void); - -/* Implementation of mktime()/timegm() that handles common tm element conversions for you */ -DLLEXPORT time_t sane_mktime(struct tm*); -DLLEXPORT time_t sane_timegm(struct tm*); - -/* Legacy (32-bit time_t) versions of time() and mktime() */ -DLLEXPORT time32_t time32(time32_t* tp); -DLLEXPORT time32_t mktime32(struct tm*); -DLLEXPORT struct tm* localtime32(const time32_t* t, struct tm* tm); - -/*********************************************************************************/ -/* Win32 implementations of recursive (thread-safe) std C time functions on Unix */ -/*********************************************************************************/ - -#if !defined(__unix__) - - #include <time.h> /* time_t, etc. */ - - DLLEXPORT struct tm* gmtime_r(const time_t* t, struct tm* tm); - DLLEXPORT struct tm* localtime_r(const time_t* t, struct tm* tm); - DLLEXPORT char* ctime_r(const time_t *t, char *buf); - DLLEXPORT char* asctime_r(const struct tm *tm, char *buf); - -#endif - -/* Microsoft's equivalent of GLIBC/BSD timegm() */ -#if defined(_MSC_VER) || defined(__MINGW32__) - #define timegm _mkgmtime -#endif - -/***********************************/ -/* Borland DOS date/time functions */ -/***********************************/ - -#if defined(__BORLANDC__) - -/* Borland C++ doesn't come with a timegm() or mkgmtime() equivalent */ -#define timegm mktime - -#include <dos.h> - -#else - -struct date { - short da_year; - char da_day; - char da_mon; -}; - -struct time { - unsigned char ti_min; - unsigned char ti_hour; - unsigned char ti_hund; - unsigned char ti_sec; -}; - -#define getdate(x) xp_getdate(x) -DLLEXPORT void xp_getdate(struct date*); -DLLEXPORT void gettime(struct time*); - -#endif /* !Borland */ - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/dirwrap.c b/xpdev/dirwrap.c deleted file mode 100644 index 1727adf..0000000 --- a/xpdev/dirwrap.c +++ /dev/null @@ -1,1231 +0,0 @@ -/* Directory-related system-call wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> /* strrchr */ - -#if defined(_WIN32) - - #include <windows.h> /* WINAPI, etc */ - #include <io.h> /* _findfirst */ - -#elif defined __unix__ - - #include <unistd.h> /* usleep */ - #include <fcntl.h> /* O_NOCCTY */ - #include <ctype.h> /* toupper */ - #include <sys/param.h> - - #if defined(BSD) - #include <sys/mount.h> - #endif - #if defined(__FreeBSD__) - #include <sys/kbio.h> - #endif - #if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 300000000 /* NetBSD 3.0 */) - #include <sys/statvfs.h> - #endif - - #include <sys/ioctl.h> /* ioctl */ - - #if defined(__GLIBC__) /* actually, BSD, but will work for now */ - #include <sys/vfs.h> /* statfs() */ - #endif - - #if defined(__solaris__) - #include <sys/statvfs.h> - #endif - -#endif /* __unix__ */ - -#if defined(__WATCOMC__) - #include <dos.h> -#endif - -#include <sys/types.h> /* _dev_t */ - -#include <stdio.h> /* sprintf */ -#include <stdlib.h> /* rand */ -#include <errno.h> /* ENOENT definitions */ - -#include "genwrap.h" /* strupr/strlwr */ -#include "dirwrap.h" -#include "filewrap.h" /* stat */ - -#if !defined(S_ISDIR) - #define S_ISDIR(x) ((x)&S_IFDIR) -#endif - -/****************************************************************************/ -/* Return the filename portion of a full pathname */ -/****************************************************************************/ -char* getfname(const char* path) -{ - const char* fname; - const char* bslash; - - fname=strrchr(path,'/'); - bslash=strrchr(path,'\\'); - if(bslash>fname) - fname=bslash; - if(fname!=NULL) - fname++; - else - fname=(char*)path; - return((char*)fname); -} - -/****************************************************************************/ -/* Return the filename or last directory portion of a full pathname */ -/* A directory pathname is expected to end in a '/' */ -/****************************************************************************/ -char* getdirname(const char* path) -{ - char* last = lastchar(path); - if(*last == '/') { - if(last == path) - return last; - for(last--; last >= path; last--) { - if(IS_PATH_DELIM(*last)) - return last + 1; - } - return (char*)path; - } - return getfname(path); -} - -/****************************************************************************/ -/* Return a pointer to a file's extension/suffix (beginning with '.') */ -/****************************************************************************/ -char* getfext(const char* path) -{ - char *fname; - char *fext; - - fname=getfname(path); - fext=strrchr(fname,'.'); - if(fext==NULL || fext==fname) - return(NULL); - return(fext); -} - -/****************************************************************************/ -/* Break a path name into components. */ -/****************************************************************************/ -#if defined(__unix__) -void _splitpath(const char *path, char *drive, char *dir, char *fname, char *ext) -{ - char* p; - - ext[0]=0; - drive[0]=0; /* no drive letters on Unix */ - - snprintf(dir, MAX_PATH+1, "%s", path); /* Optional directory path, including trailing slash. */ - p=getfname(dir); - snprintf(fname, MAX_PATH+1, "%s", p); /* Base filename (no extension) */ - if(p==dir) - dir[0]=0; /* no directory specified in path */ - else - *p=0; /* truncate dir at filename */ - p=getfext(fname); - if(p!=NULL) { - snprintf(ext, MAX_PATH+1, "%s", p); /* Optional filename extension, including leading period (.) */ - *p=0; - } -} -#endif - -/****************************************************************************/ -/* Win32 (minimal) implementation of POSIX.2 glob() function */ -/* This code _may_ work on other DOS-based platforms (e.g. OS/2) */ -/****************************************************************************/ -#if !defined(__unix__) -static int __cdecl glob_compare( const void *arg1, const void *arg2 ) -{ - /* Compare all of both strings: */ - return strcmp( * ( char** ) arg1, * ( char** ) arg2 ); -} - -#if defined(__BORLANDC__) - #pragma argsused -#endif - -#if defined(__WATCOMC__) - -int glob(const char *pattern, int flags, void* unused, glob_t* glob) -{ - struct find_t ff; - size_t found=0; - char path[MAX_PATH+1]; - char* p; - char** new_pathv; - - if(!(flags&GLOB_APPEND)) { - glob->gl_pathc=0; - glob->gl_pathv=NULL; - } - - if(_dos_findfirst((char*)pattern,(flags&GLOB_PERIOD) ? _A_HIDDEN : _A_NORMAL,&ff)!=0) - return(GLOB_NOMATCH); - - do { - if((flags&GLOB_PERIOD || ff.name[0]!='.') && - (!(flags&GLOB_ONLYDIR) || ff.attrib&_A_SUBDIR)) { - if((new_pathv=realloc(glob->gl_pathv - ,(glob->gl_pathc+1)*sizeof(char*)))==NULL) { - globfree(glob); - return(GLOB_NOSPACE); - } - glob->gl_pathv=new_pathv; - - /* build the full pathname */ - SAFECOPY(path,pattern); - p=getfname(path); - *p=0; - strcat(path,ff.name); - - if((glob->gl_pathv[glob->gl_pathc]=malloc(strlen(path)+2))==NULL) { - globfree(glob); - return(GLOB_NOSPACE); - } - strcpy(glob->gl_pathv[glob->gl_pathc],path); - if(flags&GLOB_MARK && ff.attrib&_A_SUBDIR) - strcat(glob->gl_pathv[glob->gl_pathc],"/"); - - glob->gl_pathc++; - found++; - } - } while(_dos_findnext(&ff)==0); - _dos_findclose(&ff); - - if(found==0) - return(GLOB_NOMATCH); - - if(!(flags&GLOB_NOSORT)) { - qsort(glob->gl_pathv,found,sizeof(char*),glob_compare); - } - - return(0); /* success */ -} - -#else - -int glob(const char *pattern, int flags, void* unused, glob_t* glob) -{ - struct _finddata_t ff; - long ff_handle; - size_t found=0; - char path[MAX_PATH+1]; - char* p; - char** new_pathv; - - if(!(flags&GLOB_APPEND)) { - glob->gl_pathc=0; - glob->gl_pathv=NULL; - } - - ff_handle=_findfirst((char*)pattern,&ff); - while(ff_handle!=-1) { - if((flags&GLOB_PERIOD || (ff.name[0]!='.' && !(ff.attrib&_A_HIDDEN))) && - (!(flags&GLOB_ONLYDIR) || ff.attrib&_A_SUBDIR)) { - if((new_pathv=(char**)realloc(glob->gl_pathv - ,(glob->gl_pathc+1)*sizeof(char*)))==NULL) { - globfree(glob); - return(GLOB_NOSPACE); - } - glob->gl_pathv=new_pathv; - - /* build the full pathname */ - SAFECOPY(path,pattern); - p=getfname(path); - *p=0; - SAFECAT(path,ff.name); - - if((glob->gl_pathv[glob->gl_pathc]=(char*)malloc(strlen(path)+2))==NULL) { - globfree(glob); - return(GLOB_NOSPACE); - } - strcpy(glob->gl_pathv[glob->gl_pathc],path); - if(flags&GLOB_MARK && ff.attrib&_A_SUBDIR) - strcat(glob->gl_pathv[glob->gl_pathc],"/"); - - glob->gl_pathc++; - found++; - } - if(_findnext(ff_handle, &ff)!=0) { - _findclose(ff_handle); - ff_handle=-1; - } - } - - if(found==0) - return(GLOB_NOMATCH); - - if(!(flags&GLOB_NOSORT)) { - qsort(glob->gl_pathv,found,sizeof(char*),glob_compare); - } - - return(0); /* success */ -} - -#endif - -void globfree(glob_t* glob) -{ - size_t i; - - if(glob==NULL) - return; - - if(glob->gl_pathv!=NULL) { - for(i=0;i<glob->gl_pathc;i++) - if(glob->gl_pathv[i]!=NULL) - free(glob->gl_pathv[i]); - - free(glob->gl_pathv); - glob->gl_pathv=NULL; - } - glob->gl_pathc=0; -} - -#endif /* !defined(__unix__) */ - -/****************************************************************************/ -/* Returns number of files and/or sub-directories in directory (path) */ -/* Similar, but not identical, to getfilecount() */ -/****************************************************************************/ -long getdirsize(const char* path, BOOL include_subdirs, BOOL subdir_only) -{ - char match[MAX_PATH+1]; - glob_t g; - unsigned gi; - long count=0; - - if(!isdir(path)) - return -1; - - SAFECOPY(match,path); - backslash(match); - SAFECAT(match,ALLFILES); - if (glob(match,GLOB_MARK,NULL,&g) != 0) - return 0; - if(include_subdirs && !subdir_only) - count=g.gl_pathc; - else - for(gi=0;gi<g.gl_pathc;gi++) { - if(*lastchar(g.gl_pathv[gi])=='/') { - if(!include_subdirs) - continue; - } else - if(subdir_only) - continue; - count++; - } - globfree(&g); - return(count); -} - -/****************************************************************************/ -/* POSIX directory operations using Microsoft _findfirst/next API. */ -/****************************************************************************/ -#if defined(_MSC_VER) || defined(__DMC__) -DIR* opendir(const char* dirname) -{ - DIR* dir; - - if((dir=(DIR*)calloc(1,sizeof(DIR)))==NULL) { - errno=ENOMEM; - return(NULL); - } - sprintf(dir->filespec,"%.*s",sizeof(dir->filespec)-5,dirname); - if(*dir->filespec && dir->filespec[strlen(dir->filespec)-1]!='\\') - strcat(dir->filespec,"\\"); - strcat(dir->filespec,"*.*"); - dir->handle=_findfirst(dir->filespec,&dir->finddata); - if(dir->handle==-1) { - errno=ENOENT; - free(dir); - return(NULL); - } - return(dir); -} -struct dirent* readdir(DIR* dir) -{ - if(dir==NULL) - return(NULL); - if(dir->end==TRUE) - return(NULL); - if(dir->handle==-1) - return(NULL); - sprintf(dir->dirent.d_name,"%.*s",sizeof(struct dirent)-1,dir->finddata.name); - if(_findnext(dir->handle,&dir->finddata)!=0) - dir->end=TRUE; - return(&dir->dirent); -} -int closedir (DIR* dir) -{ - if(dir==NULL) - return(-1); - _findclose(dir->handle); - free(dir); - return(0); -} -void rewinddir(DIR* dir) -{ - if(dir==NULL) - return; - _findclose(dir->handle); - dir->end=FALSE; - dir->handle=_findfirst(dir->filespec,&dir->finddata); -} -#endif /* defined(_MSC_VER) */ - -/****************************************************************************/ -/* Returns the creation time of the file 'filename' in time_t format */ -/****************************************************************************/ -time_t fcdate(const char* filename) -{ - struct stat st; - - if(stat(filename, &st) != 0) - return -1; - - return st.st_ctime; -} - -/****************************************************************************/ -/* Returns the time/date of the file in 'filename' in time_t (unix) format */ -/****************************************************************************/ -time_t fdate(const char* filename) -{ - struct stat st; - - if(stat(filename, &st)!=0) - return(-1); - - return(st.st_mtime); -} - -/****************************************************************************/ -/* Change the access and modification times for specified filename */ -/****************************************************************************/ -int setfdate(const char* filename, time_t t) -{ - struct utimbuf ut; - - memset(&ut,0,sizeof(ut)); - - ut.actime=t; - ut.modtime=t; - - return(utime(filename,&ut)); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filename' */ -/* or -1 if the file doesn't exist */ -/****************************************************************************/ -off_t flength(const char *filename) -{ -#if defined(__BORLANDC__) && !defined(__unix__) /* stat() doesn't work right */ - - long handle; - struct _finddata_t f; - - if((handle=_findfirst((char*)filename,&f))==-1) - return(-1); - - _findclose(handle); - - return(f.size); - -#else - - struct stat st; - - if(stat(filename, &st)!=0) - return(-1); - - return(st.st_size); - -#endif -} - - -/****************************************************************************/ -/* Checks the file system for the existence of a file. */ -/* Returns TRUE if it exists, FALSE if it doesn't. */ -/* 'filename' may *NOT* contain wildcards! */ -/****************************************************************************/ -static BOOL fnameexist(const char *filename) -{ - struct stat st; - - if(stat(filename, &st) != 0) - return FALSE; - - if(S_ISDIR(st.st_mode)) - return FALSE; - - return TRUE; -} - -/****************************************************************************/ -/* Checks the file system for the existence of one or more files. */ -/* Returns TRUE if it exists, FALSE if it doesn't. */ -/* 'filespec' may contain wildcards! */ -/****************************************************************************/ -BOOL fexist(const char *filespec) -{ -#if defined(_WIN32) - - long handle; - struct _finddata_t f; - BOOL found; - - if(!strchr(filespec,'*') && !strchr(filespec,'?')) - return(fnameexist(filespec)); - - if((handle=_findfirst((char*)filespec,&f))==-1) - return(FALSE); - found=TRUE; - while(f.attrib&_A_SUBDIR) - if(_findnext(handle,&f)!=0) { - found=FALSE; - break; - } - - _findclose(handle); - - return(found); - -#else /* Unix or OS/2 */ - - /* portion by cmartin */ - - glob_t g; - int c; - - if(!strchr(filespec,'*') && !strchr(filespec,'?')) - return(fnameexist(filespec)); - - /* start the search */ - glob(filespec, GLOB_MARK | GLOB_NOSORT, NULL, &g); - - if (!g.gl_pathc) { - /* no results */ - globfree(&g); - return FALSE; - } - - /* make sure it's not a directory */ - c = g.gl_pathc; - while (c--) { - if (*lastchar(g.gl_pathv[c]) != '/') { - globfree(&g); - return TRUE; - } - } - - globfree(&g); - return FALSE; - -#endif -} - -/****************************************************************************/ -/* Fixes upper/lowercase filename for Unix file systems */ -/****************************************************************************/ -BOOL fexistcase(char *path) -{ -#if defined(_WIN32) - - char* fname; - long handle; - struct _finddata_t f; - - if(access(path, F_OK)==-1 && !strchr(path,'*') && !strchr(path,'?')) - return(FALSE); - - if((handle=_findfirst((char*)path,&f))==-1) - return(FALSE); - - _findclose(handle); - - if(f.attrib&_A_SUBDIR) - return(FALSE); - - fname=getfname(path); /* Find filename in path */ - strcpy(fname,f.name); /* Correct filename */ - - return(TRUE); - -#else /* Unix or OS/2 */ - - char globme[MAX_PATH*4+1]; - char fname[MAX_PATH+1]; - char tmp[5]; - char *p; - int i; - glob_t glb; - - if(path[0]==0) /* work around glibc bug 574274 */ - return FALSE; - - if(!strchr(path,'*') && !strchr(path,'?') && fnameexist(path)) - return(TRUE); - - SAFECOPY(globme,path); - p=getfname(globme); - SAFECOPY(fname,p); - *p=0; - for(i=0;fname[i];i++) { - if(IS_ALPHA(fname[i])) - sprintf(tmp,"[%c%c]",toupper(fname[i]),tolower(fname[i])); - else - sprintf(tmp,"%c",fname[i]); - strncat(globme,tmp,MAX_PATH*4); - } -#if 0 - if(strcspn(path,"?*")!=strlen(path)) { - sprintf(path,"%.*s",MAX_PATH,globme); - return(fexist(path)); - } -#endif - - if(glob(globme,GLOB_MARK,NULL,&glb) != 0) - return(FALSE); - - if(glb.gl_pathc>0) { - for(i=0;i<glb.gl_pathc;i++) { - if(*lastchar(glb.gl_pathv[i]) != '/') - break; - } - if(i<glb.gl_pathc) { - sprintf(path,"%.*s",MAX_PATH,glb.gl_pathv[i]); - globfree(&glb); - return TRUE; - } - } - - globfree(&glb); - return FALSE; - -#endif -} - -/****************************************************************************/ -/* Returns TRUE if the filename specified is a directory */ -/****************************************************************************/ -BOOL isdir(const char *filename) -{ - char path[MAX_PATH+1]; - char* p; - struct stat st; - - SAFECOPY(path,filename); - - p=lastchar(path); - if(p!=path && IS_PATH_DELIM(*p)) { /* chop off trailing slash */ -#if !defined(__unix__) - if(*(p-1)!=':') /* Don't change C:\ to C: */ -#endif - *p=0; - } - -#if defined(__BORLANDC__) && !defined(__unix__) /* stat() doesn't work right */ - if(stat(path, &st)!=0 || strchr(path,'*')!=NULL || strchr(path,'?')!=NULL) -#else - if(stat(path, &st)!=0) -#endif - return(FALSE); - - return(S_ISDIR(st.st_mode) ? TRUE : FALSE); -} - -/****************************************************************************/ -/* Returns the attributes (mode) for specified 'filename' or -1 on failure. */ -/* The return value on Windows is *not* compatible with chmod(). */ -/****************************************************************************/ -int getfattr(const char* filename) -{ -#if defined(_WIN32) - long handle; - struct _finddata_t finddata; - - if((handle=_findfirst((char*)filename,&finddata))==-1) { - errno=ENOENT; - return(-1); - } - _findclose(handle); - return(finddata.attrib); -#else - struct stat st; - - if(stat(filename, &st)!=0) { - errno=ENOENT; - return(-1L); - } - - return(st.st_mode); -#endif -} - -/****************************************************************************/ -/* Returns the mode / type flags for specified 'filename' */ -/* The return value *is* compatible with chmod(), or -1 upon failure. */ -/****************************************************************************/ -int getfmode(const char* filename) -{ - struct stat st; - - if(stat(filename, &st) != 0) - return -1; - - return st.st_mode; -} - - -#ifdef __unix__ -int removecase(const char *path) -{ - char inpath[MAX_PATH+1]; - char fname[MAX_PATH*4+1]; - char tmp[5]; - char *p; - int i; - - if(strchr(path,'?') || strchr(path,'*')) - return(-1); - SAFECOPY(inpath,path); - p=getfname(inpath); - fname[0]=0; - for(i=0;p[i];i++) { - if(IS_ALPHA(p[i])) - sprintf(tmp,"[%c%c]",toupper(p[i]),tolower(p[i])); - else - sprintf(tmp,"%c",p[i]); - strncat(fname,tmp,MAX_PATH*4); - } - *p=0; - - return(delfiles(inpath,fname,0) >=1 ? 0 : -1); -} -#endif - -/****************************************************************************/ -/* Deletes all files in dir 'path' that match file spec 'spec' */ -/* Optionally, keep the last so many files (sorted by name) */ -/* Returns number of files deleted or negative on error */ -/****************************************************************************/ -long delfiles(const char *inpath, const char *spec, size_t keep) -{ - char *path; - char lastch; - size_t i; - ulong files = 0; - long errors = 0; - glob_t g; - size_t inpath_len=strlen(inpath); - - if(inpath_len==0) - lastch=0; - else - lastch=inpath[inpath_len-1]; - path=(char *)malloc(inpath_len+1/*Delim*/+strlen(spec)+1/*Terminator*/); - if(path==NULL) - return -1; - if(!IS_PATH_DELIM(lastch) && lastch) - sprintf(path,"%s%c",inpath,PATH_DELIM); - else - strcpy(path,inpath); - strcat(path,spec); - glob(path,0,NULL,&g); - free(path); - if(keep >= g.gl_pathc) - return 0; - for(i = 0; i < g.gl_pathc && files < g.gl_pathc - keep; i++) { - if(isdir(g.gl_pathv[i])) - continue; - (void)CHMOD(g.gl_pathv[i],S_IWRITE); /* In case it's been marked RDONLY */ - if(remove(g.gl_pathv[i])==0) - files++; - else - errors++; - } - globfree(&g); - if(errors) - return -errors; - return files; -} - -/****************************************************************************/ -/* Returns number of files matching 'inpath' */ -/* Similar, but not identical, to getdirsize(), e.g. subdirs never counted */ -/****************************************************************************/ -ulong getfilecount(const char *inpath) -{ - char path[MAX_PATH+1]; - glob_t g; - uint gi; - ulong count = 0; - - SAFECOPY(path, inpath); - if(isdir(path)) - backslash(path); - if(IS_PATH_DELIM(*lastchar(path))) - SAFECAT(path, ALLFILES); - if(glob(path, GLOB_MARK, NULL, &g)) - return 0; - for(gi = 0; gi < g.gl_pathc; ++gi) { - if(*lastchar(g.gl_pathv[gi]) == '/') - continue; - count++; - } - globfree(&g); - return count; -} - -/****************************************************************************/ -/* Returns number of bytes used by file(s) matching 'inpath' */ -/****************************************************************************/ -uint64_t getfilesizetotal(const char *inpath) -{ - char path[MAX_PATH+1]; - glob_t g; - uint gi; - off_t size; - uint64_t total = 0; - - SAFECOPY(path, inpath); - if(isdir(path)) - backslash(path); - if(IS_PATH_DELIM(*lastchar(path))) - SAFECAT(path, ALLFILES); - if(glob(path, GLOB_MARK, NULL, &g)) - return 0; - for(gi = 0; gi < g.gl_pathc; ++gi) { - if(*lastchar(g.gl_pathv[gi]) == '/') - continue; - size = flength(g.gl_pathv[gi]); - if(size >= 1) - total += size; - } - globfree(&g); - return total; -} - -/****************************************************************************/ -/* Return free disk space in bytes (up to a maximum of 4GB) */ -/****************************************************************************/ -#if defined(_WIN32) -typedef BOOL(WINAPI * GetDiskFreeSpaceEx_t) - (LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); - -static int bit_num(ulong val) -{ - int i; - - for(i=31;i>=0;i--) - if(val&(1<<i)) - return(i); - - return(-1); -} -#endif - -/* Unit should be a power-of-2 (e.g. 1024 to report kilobytes) or 1 (to report bytes) */ -static ulong getdiskspace(const char* path, ulong unit, BOOL freespace) -{ -#if defined(_WIN32) - char root[16]; - DWORD TotalNumberOfClusters; - DWORD NumberOfFreeClusters; - DWORD BytesPerSector; - DWORD SectorsPerCluster; - ULARGE_INTEGER avail; - ULARGE_INTEGER size; - static HINSTANCE hK32; - GetDiskFreeSpaceEx_t GetDiskFreeSpaceEx; - - if(hK32 == NULL) - hK32 = LoadLibrary("KERNEL32"); - GetDiskFreeSpaceEx - = (GetDiskFreeSpaceEx_t)GetProcAddress(hK32,"GetDiskFreeSpaceExA"); - - if (GetDiskFreeSpaceEx!=NULL) { /* Windows 95-OSR2 or later */ - if(!GetDiskFreeSpaceEx( - path, /* pointer to the directory name */ - &avail, /* receives the number of bytes on disk avail to the caller */ - &size, /* receives the number of bytes on disk */ - NULL)) /* receives the free bytes on disk */ - return(0); - - if(freespace) - size=avail; - - if(unit>1) - size.QuadPart=Int64ShrlMod32(size.QuadPart,bit_num(unit)); - -#if defined(_ANONYMOUS_STRUCT) - if(size.HighPart) -#else - if(size.u.HighPart) -#endif - return(0xffffffff); /* 4GB max */ - -#if defined(_ANONYMOUS_STRUCT) - return(size.LowPart); -#else - return(size.u.LowPart); -#endif - } - - /* Windows 95 (old way), limited to 2GB */ - sprintf(root,"%.3s",path); - if(!GetDiskFreeSpace( - root, /* pointer to root path */ - (PDWORD)&SectorsPerCluster, /* pointer to sectors per cluster */ - (PDWORD)&BytesPerSector, /* pointer to bytes per sector */ - (PDWORD)&NumberOfFreeClusters, /* pointer to number of free clusters */ - (PDWORD)&TotalNumberOfClusters /* pointer to total number of clusters */ - )) - return(0); - - if(freespace) - TotalNumberOfClusters = NumberOfFreeClusters; - if(unit>1) - TotalNumberOfClusters/=unit; - return(TotalNumberOfClusters*SectorsPerCluster*BytesPerSector); - - -#elif defined(__solaris__) || (defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 300000000 /* NetBSD 3.0 */)) - - struct statvfs fs; - unsigned long blocks; - - if (statvfs(path, &fs) < 0) - return 0; - - if(freespace) - blocks=fs.f_bavail; - else - blocks=fs.f_blocks; - - if(unit>1) - blocks/=unit; - return fs.f_bsize * blocks; - -/* statfs is also used under FreeBSD (Though it *supports* statvfs() now too) */ -#elif defined(__GLIBC__) || defined(BSD) - - struct statfs fs; - unsigned long blocks; - - if(statfs(path, &fs) < 0) - return 0; - - if(freespace) - blocks=fs.f_bavail; - else - blocks=fs.f_blocks; - - if(unit>1) - blocks/=unit; - return fs.f_bsize * blocks; - -#else - - fprintf(stderr,"\n*** !Missing getfreediskspace implementation ***\n"); - return(0); - -#endif -} - -ulong getfreediskspace(const char* path, ulong unit) -{ - return getdiskspace(path, unit, /* freespace? */TRUE); -} - -ulong getdisksize(const char* path, ulong unit) -{ - return getdiskspace(path, unit, /* freespace? */FALSE); -} - -/****************************************************************************/ -/* Resolves //, /./, and /../ in a path. Should work identically to Windows */ -/****************************************************************************/ -#if defined(__unix__) -char * _fullpath(char *target, const char *path, size_t size) { - char *out; - char *p; - BOOL target_alloced=FALSE; - - if(target==NULL) { - if((target=malloc(MAX_PATH+1))==NULL) { - return(NULL); - } - target_alloced=TRUE; - } - out=target; - *out=0; - - if(*path != '/') { - if(*path == '~') { - p=getenv("HOME"); - if(p==NULL || strlen(p)+strlen(path)>=size) { - if(target_alloced) - free(target); - return(NULL); - } - strcpy(target,p); - out=strrchr(target,'\0'); - path++; - } - else { - p=getcwd(NULL,size); - if(p==NULL || strlen(p)+strlen(path)>=size) { - if(target_alloced) - free(target); - return(NULL); - } - strcpy(target,p); - free(p); - out=strrchr(target,'\0'); - *(out++)='/'; - *out=0; - out--; - } - } - strncat(target,path,size-1); - -/* if(stat(target,&sb)) - return(NULL); - if(sb.st_mode&S_IFDIR) - strcat(target,"/"); */ - - for(;*out;out++) { - while(*out=='/') { - if(*(out+1)=='/') - memmove(out,out+1,strlen(out)); - else if(*(out+1)=='.' && (*(out+2)=='/' || *(out+2)==0)) - memmove(out,out+2,strlen(out)-1); - else if(*(out+1)=='.' && *(out+2)=='.' && (*(out+3)=='/' || *(out+3)==0)) { - *out=0; - p=strrchr(target,'/'); - if(p==NULL) - p=target; - memmove(p,out+3,strlen(out+3)+1); - out=p; - } - else { - out++; - } - } - if (!*out) - break; - } - return(target); -} -#endif - -/****************************************************************************/ -/* Adds a trailing slash/backslash (path delimiter) on path strings */ -/****************************************************************************/ -char* backslash(char* path) -{ - char* p; - - p=lastchar(path); - - if(*p && !IS_PATH_DELIM(*p)) { -#if defined(__unix__) - /* Convert trailing backslash to forwardslash on *nix */ - if(*p!='\\') -#endif - p++; - *p=PATH_DELIM; - *(++p)=0; - } - return(path); -} - -/****************************************************************************/ -/* Returns true if the specified filename an absolute pathname */ -/****************************************************************************/ -BOOL isabspath(const char *filename) -{ - char path[MAX_PATH+1]; - - return(stricmp(filename,FULLPATH(path,filename,sizeof(path)))==0); -} - -/****************************************************************************/ -/* Returns true if the specified filename is a full ("rooted") path */ -/****************************************************************************/ -BOOL isfullpath(const char* filename) -{ - return(filename[0]=='/' -#ifdef WIN32 - || filename[0]=='\\' || (IS_ALPHA(filename[0]) && filename[1]==':') -#endif - ); -} - -/****************************************************************************/ -/* Matches file name against filespec */ -/* Optionally not allowing * to match PATH_DELIM (for paths) */ -/****************************************************************************/ - -BOOL wildmatch(const char *fname, const char *spec, BOOL path, BOOL case_sensitive) -{ - char *specp; - char *fnamep; - char *wildend; - - specp=(char *)spec; - fnamep=(char *)fname; - for(;;specp++, fnamep++) { - switch(*specp) { - case '?': - if(!(*fnamep)) - return(FALSE); - break; - case 0: - if(!*fnamep) - return(TRUE); - break; - case '*': - while(*specp=='*') - specp++; - if(path) { - for(wildend=fnamep; *wildend; wildend++) { - if(IS_PATH_DELIM(*wildend)) { - wildend--; - break; - } - } - } - else - wildend=strchr(fnamep, 0); - for(;wildend >= fnamep;wildend--) { - if(wildmatch(wildend, specp, path, case_sensitive)) - return(TRUE); - } - return(FALSE); - default: - if(case_sensitive && *specp != *fnamep) - return(FALSE); - if((!case_sensitive) && toupper(*specp) != toupper(*fnamep)) - return(FALSE); - } - if(!(*specp && *fnamep)) - break; - } - while(*specp=='*') - specp++; - if(*specp==*fnamep) - return(TRUE); - if((!case_sensitive) && toupper(*specp) == toupper(*fnamep)) - return(TRUE); - return(FALSE); -} - -/****************************************************************************/ -/* Matches file name against filespec, ignoring case */ -/****************************************************************************/ -BOOL wildmatchi(const char *fname, const char *spec, BOOL path) -{ - return wildmatch(fname, spec, path, /* case_sensitive: */FALSE); -} - -/****************************************************************************/ -/* Creates all the necessary directories in the specified path */ -/****************************************************************************/ -int mkpath(const char* path) -{ - const char* p=path; - const char* tp; - const char* sep= -#ifdef _WIN32 - "\\" -#endif - "/"; - char dir[MAX_PATH+1]; - int result=0; - -#ifdef _WIN32 - if(p[1]==':') /* Skip drive letter, if specified */ - p+=2; -#endif - - while(*p) { - SKIP_CHARSET(p,sep); - if(*p==0) - break; - tp=p; - FIND_CHARSET(tp,sep); - safe_snprintf(dir,sizeof(dir),"%.*s", (int)(tp-path), path); - if(!isdir(dir)) { - if((result=MKDIR(dir))!=0) - break; - } - p=tp; - } - - return(result); -} - -#if !defined _WIN32 -BOOL CopyFile(const char* src, const char* dest, BOOL failIfExists) -{ - uint8_t buf[256 * 1024]; - FILE* in; - FILE* out; - BOOL success=TRUE; - - if(failIfExists && fexist(dest)) - return FALSE; - if((in=fopen(src,"rb"))==NULL) - return FALSE; - if((out=fopen(dest,"wb"))==NULL) { - fclose(in); - return FALSE; - } - - time_t ftime = filetime(fileno(in)); - while(!feof(in)) { - size_t rd = fread(buf, sizeof(uint8_t), sizeof(buf), in); - if(rd < 1) - break; - if(fwrite(buf, sizeof(uint8_t), rd, out) != rd) { - success = FALSE; - break; - } - MAYBE_YIELD(); - } - - fclose(in); - fclose(out); - setfdate(dest,ftime); - - return success; -} -#endif diff --git a/xpdev/dirwrap.h b/xpdev/dirwrap.h deleted file mode 100644 index dce4345..0000000 --- a/xpdev/dirwrap.h +++ /dev/null @@ -1,246 +0,0 @@ -/* Directory system-call wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _DIRWRAP_H -#define _DIRWRAP_H - -#include <stdlib.h> /* _fullpath() on Win32 */ - -#if defined(__unix__) - #include <sys/param.h> /* PATH_MAX */ -#endif - -#if defined(INCLUDE_PATHS_H) - #include <paths.h> /* _PATHS_* macros */ -#endif - -#include "gen_defs.h" /* ulong */ -#include "wrapdll.h" /* DLLEXPORT */ - -#if defined(__cplusplus) -extern "C" { -#endif - -#define ALLFILES "*" /* matches all files in a directory */ - -/****************/ -/* RTL-specific */ -/****************/ - -#if defined(__unix__) - - #include <sys/types.h> - #include <sys/stat.h> - #include <glob.h> /* POSIX.2 directory pattern matching function */ - #define MKDIR(dir) mkdir(dir,0777) - - #if defined(__CYGWIN__) - #define DLLEXPORT /* CygWin's glob.h #undef's DLLEXPORT */ - #endif - -#else - - /* Values for the second argument to access. - These may be OR'd together. */ - #define R_OK 4 /* Test for read permission. */ - #define W_OK 2 /* Test for write permission. */ - #define X_OK 1 /* Test for execute permission. */ - #define F_OK 0 /* Test for existence. */ - - #include <direct.h> /* mkdir() */ - - #ifdef __WATCOMC__ - #define MKDIR(dir) mkdir(dir) - #else - #define MKDIR(dir) _mkdir(dir) - #endif - - /* glob-compatible findfirst/findnext wrapper */ - - typedef struct - { - size_t gl_pathc; /* Count of paths matched so far */ - char **gl_pathv; /* List of matched pathnames. */ - size_t gl_offs; /* Slots to reserve in 'gl_pathv'. */ - } glob_t; - - /* Bits set in the FLAGS argument to `glob'. */ - #define GLOB_ERR (1 << 0) /* Return on read errors. */ - #define GLOB_MARK (1 << 1) /* Append a slash to each name. */ - #define GLOB_NOSORT (1 << 2) /* Don't sort the names. */ - #define GLOB_DOOFFS (1 << 3) /* Insert PGLOB->gl_offs NULLs. */ - #define GLOB_NOCHECK (1 << 4) /* If nothing matches, return the pattern. */ - #define GLOB_APPEND (1 << 5) /* Append to results of a previous call. */ - #define GLOB_NOESCAPE (1 << 6) /* Backslashes don't quote metacharacters. */ - #define GLOB_PERIOD (1 << 7) /* Leading `.' can be matched by metachars. */ - #define GLOB_MAGCHAR (1 << 8) /* Set in gl_flags if any metachars seen. */ - #define GLOB_ALTDIRFUNC (1 << 9) /* Use gl_opendir et al functions. */ - #define GLOB_BRACE (1 << 10) /* Expand "{a,b}" to "a" "b". */ - #define GLOB_NOMAGIC (1 << 11) /* If no magic chars, return the pattern. */ - #define GLOB_TILDE (1 << 12) /* Expand ~user and ~ to home directories. */ - #define GLOB_ONLYDIR (1 << 13) /* Match only directories. */ - #define GLOB_TILDE_CHECK (1 << 14) /* Like GLOB_TILDE but return an error - if the user name is not available. */ - /* Error returns from `glob'. */ - #define GLOB_NOSPACE 1 /* Ran out of memory. */ - #define GLOB_ABORTED 2 /* Read error. */ - #define GLOB_NOMATCH 3 /* No matches found. */ - #define GLOB_NOSYS 4 /* Not implemented. */ - - DLLEXPORT int glob(const char *pattern, int flags, void* unused, glob_t*); - DLLEXPORT void globfree(glob_t*); - -#endif - -#define FULLPATH(a,r,l) _fullpath(a,r,l) - -/*****************************/ -/* POSIX Directory Functions */ -/*****************************/ -#if defined(_MSC_VER) || defined(__DMC__) - #include <io.h> /* _finddata_t */ - - /* dirent structure returned by readdir(). - */ - struct dirent - { - char d_name[260]; /* filename */ - }; - - /* DIR type returned by opendir(). The members of this structure - * must not be accessed by application programs. - */ - typedef struct - { - char filespec[260]; - struct dirent dirent; - long handle; - struct _finddata_t finddata; - BOOL end; /* End of directory flag */ - } DIR; - - - /* Prototypes. - */ - DLLEXPORT DIR* opendir (const char *__dirname); - DLLEXPORT struct dirent* readdir (DIR *__dir); - DLLEXPORT int closedir (DIR *__dir); - DLLEXPORT void rewinddir(DIR *__dir); -#elif !defined(__WATCOMC__) - #include <dirent.h> /* POSIX directory functions */ -#endif - - -/**********/ -/* Macros */ -/**********/ - -/* POSIX readdir convenience macro */ -#ifndef DIRENT -#define DIRENT struct dirent -#endif - -#if defined(__unix__) - #define PATH_DELIM '/' - #define IS_PATH_DELIM(x) (x=='/') - - /* These may be pre-defined in paths.h (BSD) */ - #ifndef _PATH_TMP - #define _PATH_TMP "/tmp/" - #endif - #ifndef _PATH_DEVNULL - #define _PATH_DEVNULL "/dev/null" - #endif - -#else /* MS-DOS based OS */ - - #define PATH_DELIM '\\' - #define IS_PATH_DELIM(x) ((x)=='/' || (x)=='\\') - #define _PATH_TMP getenv("TEMP") - #define _PATH_DEVNULL "NUL" - -#endif - -#if !defined(MAX_PATH) /* maximum path length */ - #if defined MAXPATHLEN - #define MAX_PATH MAXPATHLEN /* clib.h */ - #elif defined PATH_MAX - #define MAX_PATH PATH_MAX - #elif defined _MAX_PATH - #define MAX_PATH _MAX_PATH - #else - #define MAX_PATH 260 - #endif -#endif - -#if defined(_MSC_VER) || defined(__MINGW32__) - #define CHMOD(s,m) _chmod(s,m) -#elif defined(__BORLANDC__) && !defined(__unix__) - #define CHMOD(p,a) _rtl_chmod(p,1,a) /* _chmod obsolete in 4.x */ -#else - #define CHMOD(s,m) chmod(s,m) -#endif - -/* General file system wrappers for all platforms and compilers */ -DLLEXPORT BOOL fexist(const char *filespec); -DLLEXPORT BOOL fexistcase(char *filespec); /* fixes upr/lwr case fname */ -DLLEXPORT off_t flength(const char *filename); -DLLEXPORT time_t fdate(const char *filename); -DLLEXPORT time_t fcdate(const char* filename); -DLLEXPORT int setfdate(const char* filename, time_t t); -DLLEXPORT BOOL isdir(const char *filename); -DLLEXPORT BOOL isabspath(const char *filename); -DLLEXPORT BOOL isfullpath(const char* filename); -DLLEXPORT char* getfname(const char* path); -DLLEXPORT char* getfext(const char* path); -DLLEXPORT int getfattr(const char* filename); -DLLEXPORT int getfmode(const char* filename); -DLLEXPORT ulong getfilecount(const char *path); -DLLEXPORT char* getdirname(const char* path); -DLLEXPORT long getdirsize(const char* path, BOOL include_subdirs, BOOL subdir_only); -DLLEXPORT ulong getdisksize(const char* path, ulong unit); -DLLEXPORT ulong getfreediskspace(const char* path, ulong unit); -DLLEXPORT uint64_t getfilesizetotal(const char *path); -DLLEXPORT long delfiles(const char *inpath, const char *spec, size_t keep); -DLLEXPORT char* backslash(char* path); -DLLEXPORT BOOL wildmatch(const char *fname, const char *spec, BOOL path, BOOL case_sensitive); -DLLEXPORT BOOL wildmatchi(const char *fname, const char *spec, BOOL path); -DLLEXPORT int mkpath(const char* path); - - -#if defined(__unix__) -DLLEXPORT void _splitpath(const char *path, char *drive, char *dir, - char *fname, char *ext); -DLLEXPORT char * _fullpath(char *target, const char *path, size_t size); -DLLEXPORT int removecase(const char *path); -#else - #define removecase(x) remove(x) -#endif - -#if !defined _WIN32 -DLLEXPORT BOOL CopyFile(const char* src, const char* dest, BOOL failIfExists); -#endif - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/eventwrap.h b/xpdev/eventwrap.h deleted file mode 100644 index e98b666..0000000 --- a/xpdev/eventwrap.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Event-related cross-platform development wrappers (Win32 API emulation) */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _EVENTWRAP_H -#define _EVENTWRAP_H - -#include "gen_defs.h" - -#if defined(__unix__) - - #include "xpevent.h" - -#elif defined(_WIN32) - - typedef HANDLE xpevent_t; - #define WaitForEvent(event,ms) WaitForSingleObject(event,ms) - #define CloseEvent(event) CloseHandle(event) - -#else - - #error "Need event wrappers." - -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/filewrap.c b/xpdev/filewrap.c deleted file mode 100644 index 62c1670..0000000 --- a/xpdev/filewrap.c +++ /dev/null @@ -1,427 +0,0 @@ -/* File-related system-call wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* OS-specific */ -#if defined(__unix__) - -#include <stdarg.h> /* va_list */ -#include <string.h> /* strlen() */ -#include <unistd.h> /* getpid() */ -#include <fcntl.h> /* fcntl() file/record locking */ -#include <sys/file.h> /* L_SET for Solaris */ -#include <errno.h> -#include <sys/param.h> /* BSD */ - -#endif - -/* ANSI */ -#include <sys/types.h> /* _dev_t */ -#include <sys/stat.h> /* struct stat */ -#include <limits.h> /* struct stat */ -#include <stdlib.h> /* realloc() */ - -#include "filewrap.h" /* Verify prototypes */ - -/****************************************************************************/ -/* Returns the modification time of the file in 'fd' */ -/* or -1 if file doesn't exist. */ -/****************************************************************************/ -time_t filetime(int fd) -{ - struct stat st; - - if(fstat(fd, &st)!=0) - return(-1); - - return(st.st_mtime); -} - -#if defined(__unix__) && !defined(__BORLANDC__) - -/****************************************************************************/ -/* Returns the length of the file in 'fd' */ -/* or -1 if file doesn't exist. */ -/****************************************************************************/ -off_t filelength(int fd) -{ - struct stat st; - - if(fstat(fd, &st)!=0) - return(-1L); - - return(st.st_size); -} - -// See https://patchwork.kernel.org/patch/9289177/ -#if defined(F_OFD_SETLK) && _FILE_OFFSET_BITS != 64 - #undef F_OFD_SETLK -#endif - -/* Sets a lock on a portion of a file */ -int lock(int fd, off_t pos, off_t len) -{ - #if defined(F_SANERDLCKNO) || !defined(BSD) - struct flock alock = {0}; - int cmd = F_SETLK; - #ifdef F_OFD_SETLK - cmd = F_OFD_SETLK; - #endif - - #ifndef F_SANEWRLCKNO - int flags; - if((flags=fcntl(fd,F_GETFL))==-1) - return -1; - if((flags & (O_RDONLY|O_RDWR|O_WRONLY))==O_RDONLY) - alock.l_type = F_RDLCK; /* set read lock to prevent writes */ - else - alock.l_type = F_WRLCK; /* set write lock to prevent all access */ - #else - alock.l_type = F_SANEWRLCKNO; - #endif - alock.l_whence = L_SET; /* SEEK_SET */ - alock.l_start = pos; - alock.l_len = (int)len; - - int result = fcntl(fd, cmd, &alock); - if(result == -1 && errno != EINVAL) - return -1; - #ifdef F_OFD_SETLK - if(result == 0) - return 0; - #endif - #endif - - #if !defined(F_SANEWRLCKNO) && !defined(__QNX__) && !defined(__solaris__) - /* use flock (doesn't work over NFS) */ - if(flock(fd,LOCK_EX|LOCK_NB)!=0 && errno != EOPNOTSUPP) - return(-1); - #endif - - return(0); -} - -/* Removes a lock from a file record */ -int unlock(int fd, off_t pos, off_t len) -{ - -#if defined(F_SANEUNLCK) || !defined(BSD) - struct flock alock = {0}; - int cmd = F_SETLK; -#ifdef F_OFD_SETLK - cmd = F_OFD_SETLK; -#endif -#ifdef F_SANEUNLCK - alock.l_type = F_SANEUNLCK; /* remove the lock */ -#else - alock.l_type = F_UNLCK; /* remove the lock */ -#endif - alock.l_whence = L_SET; - alock.l_start = pos; - alock.l_len = (int)len; - int result = fcntl(fd, cmd, &alock); - if(result == -1 && errno != EINVAL) - return -1; -#ifdef F_OFD_SETLK - if(result == 0) - return 0; -#endif -#endif - -#if !defined(F_SANEUNLCK) && !defined(__QNX__) && !defined(__solaris__) - /* use flock (doesn't work over NFS) */ - if(flock(fd,LOCK_UN|LOCK_NB)!=0 && errno != EOPNOTSUPP) - return(-1); -#endif - - return(0); -} - -/* Opens a file in specified sharing (file-locking) mode */ -/* - * This is how it *SHOULD* work: - * Values of DOS 2-6.22 file sharing behavior: - * | Second and subsequent Opens - * First |Compat Deny Deny Deny Deny - * Open | All Write Read None - * |R W RW R W RW R W RW R W RW R W RW - * - - - - -| - - - - - - - - - - - - - - - - - - * Compat R |Y Y Y N N N 1 N N N N N 1 N N - * W |Y Y Y N N N N N N N N N N N N - * RW|Y Y Y N N N N N N N N N N N N - * - - - - -| - * Deny R |C C C N N N N N N N N N N N N - * All W |C C C N N N N N N N N N N N N - * RW|C C C N N N N N N N N N N N N - * - - - - -| - * Deny R |2 C C N N N Y N N N N N Y N N - * Write W |C C C N N N N N N Y N N Y N N - * RW|C C C N N N N N N N N N Y N N - * - - - - -| - * Deny R |C C C N N N N Y N N N N N Y N - * Read W |C C C N N N N N N N Y N N Y N - * RW|C C C N N N N N N N N N N Y N - * - - - - -| - * Deny R |2 C C N N N Y Y Y N N N Y Y Y - * None W |C C C N N N N N N Y Y Y Y Y Y - * RW|C C C N N N N N N N N N Y Y Y - * - * Legend: - * Y = open succeeds, - * N = open fails with error code 05h. - * C = open fails, INT 24 generated. - * 1 = open succeeds if file read-only, else fails with error code. - * 2 = open succeeds if file read-only, else fails with INT 24 - */ -#if !defined(__QNX__) -int sopen(const char *fn, int sh_access, int share, ...) -{ - int fd; - int pmode=S_IREAD; -#ifndef F_SANEWRLCKNO - int flock_op=LOCK_NB; /* non-blocking */ -#endif -#if defined(F_SANEWRLCKNO) || !defined(BSD) - struct flock alock = {0}; -#endif - va_list ap; - - if(sh_access&O_CREAT) { - va_start(ap,share); - pmode = va_arg(ap,unsigned int); - va_end(ap); - } - - if ((fd = open(fn, sh_access, pmode)) < 0) - return -1; - - if (share == SH_DENYNO || share == SH_COMPAT) /* no lock needed */ - return fd; -#if defined(F_SANEWRLCKNO) || !defined(BSD) - int cmd = F_SETLK; -#ifdef F_OFD_SETLK - cmd = F_OFD_SETLK; -#endif - /* use fcntl (doesn't work correctly with threads) */ - alock.l_type = share; - alock.l_whence = L_SET; - alock.l_start = 0; - alock.l_len = 0; /* lock to EOF */ - - if(fcntl(fd, cmd, &alock)==-1 && errno != EINVAL) { /* EINVAL means the file does not support locking */ - close(fd); - return -1; - } -#endif - -#if !defined(F_SANEWRLCKNO) && !defined(__QNX__) && !defined(__solaris__) - /* use flock (doesn't work over NFS) */ - if(share==SH_DENYRW) - flock_op|=LOCK_EX; - else /* SH_DENYWR */ - flock_op|=LOCK_SH; - if(flock(fd,flock_op)!=0 && errno != EOPNOTSUPP) { /* That object doesn't do locks */ - if(errno==EWOULDBLOCK) - errno=EAGAIN; - close(fd); - return(-1); - } -#endif - - return fd; -} -#endif /* !QNX */ - -#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__DMC__) - -#include <io.h> /* tell */ -#include <stdio.h> /* SEEK_SET */ -#include <sys/locking.h> /* _locking */ - -/* Fix MinGW locking.h typo */ -#if defined LK_UNLOCK && !defined LK_UNLCK - #define LK_UNLCK LK_UNLOCK -#endif - -int lock(int file, off_t offset, off_t size) -{ - int i; - off_t pos; - - pos=tell(file); - if(offset!=pos) - (void)lseek(file, offset, SEEK_SET); - i=_locking(file,LK_NBLCK,(long)size); - if(offset!=pos) - (void)lseek(file, pos, SEEK_SET); - return(i); -} - -int unlock(int file, off_t offset, off_t size) -{ - int i; - off_t pos; - - pos=tell(file); - if(offset!=pos) - (void)lseek(file, offset, SEEK_SET); - i=_locking(file,LK_UNLCK,(long)size); - if(offset!=pos) - (void)lseek(file, pos, SEEK_SET); - return(i); -} - -#endif /* !Unix && (MSVC || MinGW) */ - -#if defined(_WIN32 ) -static size_t -p2roundup(size_t n) -{ - if(n & (n-1)) { // If n isn't a power of two already... - n--; - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; -#if SIZE_T_MAX > 0xffffffffU - n |= n >> 32; -#endif - n++; - } - return (n); -} - -static int expandtofit(char **linep, size_t len, size_t *linecapp) -{ - char *newline; - size_t newcap; - - if(len+1 >= LONG_MAX) - return -1; - if(len > *linecapp) { - if(len == LONG_MAX) - newcap = LONG_MAX; - else - newcap = p2roundup(len); - newline = (char *)realloc(*linep, newcap); - if(newline == NULL) - return -1; - *linecapp = newcap; - *linep = newline; - } - return 0; -} - -long getdelim(char **linep, size_t *linecapp, int delimiter, FILE *stream) -{ - size_t linelen; - int ch; - - if(linep == NULL || linecapp == NULL) - return -1; - if(*linep == NULL) - *linecapp = 0; - if(feof(stream)) { - if(expandtofit(linep, 1, linecapp)) - return -1; - (*linep)[0]=0; - return -1; - } - - linelen = 0; - for(;;) { - ch = fgetc(stream); - if(ch == EOF) - break; - if(expandtofit(linep, linelen+2, linecapp)) - return -1; - (*linep)[linelen++]=ch; - if(ch == delimiter) - break; - } - (*linep)[linelen]=0; - if(linelen==0) - return -1; - return linelen; -} -#endif - -#ifdef __unix__ -FILE *_fsopen(const char *pszFilename, const char *pszMode, int shmode) -{ - int file; - int Mode=0; - const char *p; - - for(p=pszMode;*p;p++) { - switch (*p) { - case 'r': - Mode |= 1; - break; - case 'w': - Mode |= 2; - break; - case 'a': - Mode |= 4; - break; - case '+': - Mode |= 8; - break; - case 'b': - case 't': - break; - default: - errno=EINVAL; - return(NULL); - } - } - switch(Mode) { - case 1: - Mode =O_RDONLY; - break; - case 2: - Mode=O_WRONLY|O_CREAT|O_TRUNC; - break; - case 4: - Mode=O_APPEND|O_WRONLY|O_CREAT; - break; - case 9: - Mode=O_RDWR|O_CREAT; - break; - case 10: - Mode=O_RDWR|O_CREAT|O_TRUNC; - break; - case 12: - Mode=O_RDWR|O_APPEND|O_CREAT; - break; - default: - errno=EINVAL; - return(NULL); - } - if(Mode&O_CREAT) - file=sopen(pszFilename,Mode,shmode,S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - else - file=sopen(pszFilename,Mode,shmode); - if(file==-1) - return(NULL); - return(fdopen(file,pszMode)); -} -#endif diff --git a/xpdev/filewrap.h b/xpdev/filewrap.h deleted file mode 100644 index 706993d..0000000 --- a/xpdev/filewrap.h +++ /dev/null @@ -1,181 +0,0 @@ -/* File system-call wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _FILEWRAP_H -#define _FILEWRAP_H - -#include "wrapdll.h" /* DLLEXPORT */ -#include "gen_defs.h" /* int32_t, int64_t */ - -#include <sys/stat.h> /* S_IREAD and S_IWRITE (for use with sopen) */ -#include <stdio.h> - -#if defined(__unix__) - #include <unistd.h> /* read, write, close, ftruncate, lseek, etc. */ -#endif - -#if defined(_WIN32) || defined(__BORLANDC__) - #include <io.h> -#endif - -#include <fcntl.h> /* O_RDONLY, O_CREAT, etc. */ - -/**********/ -/* Macros */ -/**********/ - -#if defined(_WIN32) - - - #include <windows.h> /* OF_SHARE_ */ - #include <share.h> /* SH_DENY */ - - #ifndef SH_DENYNO - #define SH_DENYNO OF_SHARE_DENY_NONE - #define SH_DENYWR OF_SHARE_DENY_WRITE - #define SH_DENYRW OF_SHARE_EXCLUSIVE - #endif - - #ifndef SH_COMPAT - #define SH_COMPAT 0 - #endif - - #if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS==64) - #define lseek _lseeki64 - #define tell _telli64 - #define filelength _filelengthi64 - #define stat _stati64 - #define fstat _fstati64 - #define fseeko _fseeki64 - #define ftello _ftelli64 - #else - #define fseeko fseek - #define ftello ftell - #endif - - #define mkstemp(t) _open(_mktemp(t), O_RDWR | O_CREAT | O_EXCL) - -#elif defined(__unix__) - - #ifdef __solaris__ - #define LOCK_NB 1 - #define LOCK_SH 2 - #define LOCK_EX 4 - #endif - - #ifdef __QNX__ - #include <share.h> - #define L_SET SEEK_SET - #else - #ifndef O_TEXT - #define O_TEXT 0 /* all files in binary mode on Unix */ - #define O_BINARY 0 /* all files in binary mode on Unix */ - #endif - #undef O_DENYNONE - #define O_DENYNONE (1<<31) /* req'd for Baja/nopen compatibility */ - - #define SH_DENYNO 2 /* no locks */ - #ifdef F_SANEWRLCKNO - #define SH_DENYRW F_SANEWRLCKNO /* exclusive lock */ - #else - #define SH_DENYRW F_WRLCK /* exclusive lock */ - #endif - - #ifdef F_SANERDLCKNO - #define SH_DENYWR F_SANERDLCKNO /* shareable lock */ - #else - #define SH_DENYWR F_RDLCK /* shareable lock */ - #endif - - #ifndef SH_COMPAT - #define SH_COMPAT 0 - #endif - #endif - - #ifndef DEFFILEMODE - #define DELFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) - #endif - - #define chsize(fd,size) ftruncate(fd,size) - #define tell(fd) lseek(fd,0,SEEK_CUR) - #define eof(fd) (tell(fd)==filelength(fd)) - -#elif defined(__OS2__) - - #include <share.h> /* SH_DENY */ - -#endif - -#ifndef DEFFILEMODE -#define DEFFILEMODE (S_IREAD|S_IWRITE) -#endif - -/* Standard file descriptors. */ -#ifndef STDIN_FILENO -#define STDIN_FILENO 0 /* Standard input */ -#define STDOUT_FILENO 1 /* Standard output */ -#define STDERR_FILENO 2 /* Standard error output */ -#endif - -#ifndef O_DENYNONE -#define O_DENYNONE SH_DENYNO -#endif - -#define CLOSE_OPEN_FILE(x) while((x) >= 0) { close(x); (x)=-1; break; } - -/**************/ -/* Prototypes */ -/**************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -#if !defined(__BORLANDC__) && !defined(__WATCOMC__) - DLLEXPORT int lock(int fd, off_t pos, off_t len); - DLLEXPORT int unlock(int fd, off_t pos, off_t len); -#endif - -#if defined(_WIN32 ) - DLLEXPORT long getdelim(char **linep, size_t *linecapp, int delimiter, FILE *stream); -#endif - -#if !defined(__BORLANDC__) && defined(__unix__) - DLLEXPORT int sopen(const char* fn, int sh_access, int share, ...); - DLLEXPORT off_t filelength(int fd); -#endif - -#if defined(__unix__) - DLLEXPORT FILE * _fsopen(const char *pszFilename, const char *pszMode, int shmode); -#endif - -#if defined(_MSC_VER) && (_MSC_VER < 1300) /* missing prototypes */ - DLLEXPORT int _fseeki64(FILE*, int64_t, int origin); - DLLEXPORT int64_t _ftelli64(FILE*); -#endif - -DLLEXPORT time_t filetime(int fd); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/gen_defs.h b/xpdev/gen_defs.h deleted file mode 100644 index 405504c..0000000 --- a/xpdev/gen_defs.h +++ /dev/null @@ -1,574 +0,0 @@ -/* General(ly useful) constant, macro, and type definitions */ - -/* $Id: gen_defs.h,v 1.85 2020/08/15 19:57:51 rswindell Exp $ */ -// vi: tabstop=4 - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _GEN_DEFS_H -#define _GEN_DEFS_H - -#include <xpdevplus.h> -#include "cp437defs.h" -#include <errno.h> - -/* Resolve multi-named errno constants */ -#if defined(EDEADLK) && !defined(EDEADLOCK) - #define EDEADLOCK EDEADLK -#endif - -#if defined(_WIN32) - #define WIN32_LEAN_AND_MEAN /* Don't bring in excess baggage */ - #include <windows.h> -#elif defined(__OS2__) - #define INCL_BASE /* need this for DosSleep prototype */ - #include <os2.h> -#else - #if (defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__)) || defined (__NetBSD__) - #ifndef __unix__ - #define __unix__ - #endif - #endif -#endif - -#include <ctype.h> -#include <sys/types.h> -#ifdef HAS_INTTYPES_H -#if defined __cplusplus -#define __STDC_FORMAT_MACROS -#endif -#include <inttypes.h> -#else -#ifdef HAS_STDINT_H -#include <stdint.h> -#endif -#endif - - /* Control characters */ -#ifndef STX -#define STX 0x02 /* Start of text ^B */ -#endif -#ifndef ETX -#define ETX 0x03 /* End of text ^C */ -#endif -#ifndef BEL -#define BEL 0x07 /* Bell/beep ^G */ -#endif -#ifndef FF -#define FF 0x0c /* Form feed ^L */ -#endif -#ifndef ESC -#define ESC 0x1b /* Escape ^[ */ -#endif -#ifndef DEL -#define DEL 0x7f /* Delete ^BS */ -#endif -#ifndef BS -#define BS '\b' /* Back space ^H */ -#endif -#ifndef TAB -#define TAB '\t' /* Horizontal tabulation ^I */ -#endif -#ifndef LF -#define LF '\n' /* Line feed ^J */ -#endif -#ifndef CR -#define CR '\r' /* Carriage return ^M */ -#endif - -#ifndef CTRL_A -enum { - CTRL_AT // NUL - ,CTRL_A // SOH - ,CTRL_B // STX - ,CTRL_C // ETX - ,CTRL_D // EOT - ,CTRL_E // ENQ - ,CTRL_F // ACK - ,CTRL_G // BEL - ,CTRL_H // BS - ,CTRL_I // HT - ,CTRL_J // LF - ,CTRL_K // VT - ,CTRL_L // FF - ,CTRL_M // CR - ,CTRL_N // SO - ,CTRL_O // SI - ,CTRL_P // DLE - ,CTRL_Q // DC1 - ,CTRL_R // DC2 - ,CTRL_S // DC3 - ,CTRL_T // DC4 - ,CTRL_U // NAK - ,CTRL_V // SYN - ,CTRL_W // ETB - ,CTRL_X // CAN - ,CTRL_Y // EM - ,CTRL_Z // SUB - ,CTRL_OPEN_BRACKET // ESC - ,CTRL_BACKSLASH // FS - ,CTRL_CLOSE_BRACKET // GS - ,CTRL_CARET // RS - ,CTRL_UNDERSCORE // US - ,CTRL_QUESTION_MARK = 0x7f // DEL -}; -#endif - -/* Unsigned type short-hands */ -#ifndef uchar - #define uchar unsigned char -#endif -#ifndef ushort - #define ushort unsigned short - typedef unsigned int uint; /* Incompatible with Spidermonkey header files when #define'd */ - #define ulong unsigned long -#endif - -/* Printf format specifiers... */ -#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) -#define XP_PRIsize_t "I" -#else -#define XP_PRIsize_t "z" -#endif - -#if !defined(HAS_INTTYPES_H) && !defined(XPDEV_DONT_DEFINE_INTTYPES) - -#if !defined(HAS_STDINT_H) - -typedef char int8_t; -#ifndef INT8_MAX -#define INT8_MAX 0x7f -#endif -#ifndef INT16_MAX -#define INT16_MAX (-0x7f-1) -#endif -typedef short int16_t; -#ifndef INT16_MAX -#define INT16_MAX 0x7fff -#endif -#ifndef INT16_MIN -#define INT16_MIN (-0x7fff-1) -#endif -typedef long int32_t; -#ifndef INT32_MAX -#define INT32_MAX 0x7fffffff -#endif -#ifndef INT32_MIN -#define INT32_MIN (-0x7fffffff-1) -#endif -typedef uchar uint8_t; -#ifndef UINT8_MAX -#define UINT8_MAX 0xff -#endif -typedef ushort uint16_t; -#ifndef UINT16_MAX -#define UINT16_MAX 0xffff -#endif -typedef ulong uint32_t; -#ifndef UINT32_MAX -#define UINT32_MAX 0xffffffff -#endif - -#endif - -#if !defined(__MSDOS__) -#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) -typedef SSIZE_T ssize_t; -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; -#define INTTYPES_H_64BIT_PREFIX "I64" -#else -typedef signed long long int int64_t; -typedef unsigned long long int uint64_t; -#define INTTYPES_H_64BIT_PREFIX "ll" -#endif - -typedef uint64_t uintmax_t; -#define _UINTMAX_T_DECLARED -typedef int64_t intmax_t; -#define _INTMAX_T_DECLARED - -#if !defined(HAS_STDINT_H) && !defined(_UINTPTR_T_DEFINED) -typedef uintmax_t uintptr_t; -typedef intmax_t intptr_t; -#endif -#endif // !MSDOS - -/* printf integer formatters: */ - -#define PRId32 "d" -#define PRIu32 "u" -#define PRIi32 "i" -#define PRIx32 "x" -#define PRIX32 "X" -#define PRIo32 "o" - -#define PRIi64 INTTYPES_H_64BIT_PREFIX"i" -#define PRIu64 INTTYPES_H_64BIT_PREFIX"u" -#define PRId64 INTTYPES_H_64BIT_PREFIX"d" -#define PRIx64 INTTYPES_H_64BIT_PREFIX"x" -#define PRIX64 INTTYPES_H_64BIT_PREFIX"X" -#define PRIo64 INTTYPES_H_64BIT_PREFIX"o" - -#define PRIdMAX PRId64 -#define PRIiMAX PRIi64 -#define PRIuMAX PRIu64 -#define PRIxMAX PRIx64 -#define PRIXMAX PRIX64 -#define PRIoMAX PRIo64 - -/* scanf integer formatters: */ - -#define SCNd32 PRId32 -#define SCNi32 PRIi32 -#define SCNu32 PRIu32 -#define SCNx32 PRIx32 -#define SCNX32 PRIX32 -#define SCNo32 PRIo32 - -#define SCNd64 PRId64 -#define SCNi64 PRIi64 -#define SCNu64 PRIu64 -#define SCNx64 PRIx64 -#define SCNX64 PRIX64 -#define SCNo64 PRIo64 - -#define SCNdMAX PRId64 -#define SCNiMAX PRIi64 -#define SCNuMAX PRIu64 -#define SCNxMAX PRIx64 -#define SCNXMAX PRIX64 -#define SCNoMAX PRIo64 - -#endif - -/* Legacy 32-bit time_t */ -typedef int32_t time32_t; - -#if defined(_WIN32) -# if defined _MSC_VER && !defined _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS==64) -# define off_t int64_t -# define PRIdOFF PRId64 -# define PRIuOFF PRIu64 -# else -# define PRIdOFF "ld" -# define PRIuOFF "lu" -# endif -#elif defined(__linux__) || defined(__sun__) -# if (defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS==64)) || defined(__LP64__) -# define PRIdOFF PRId64 -# define PRIuOFF PRIu64 -# else -# define PRIdOFF "ld" -# define PRIuOFF "lu" -# endif -#else -# define PRIdOFF PRId64 -# define PRIuOFF PRIu64 -#endif - -/* Windows Types */ - -#ifndef _WIN32 -#ifndef BYTE -#define BYTE uint8_t -#endif -#ifndef WORD -#define WORD uint16_t -#endif -#ifndef DWORD -#define DWORD uint32_t -#endif -#ifndef BOOL -#define BOOL int -#endif - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif -#ifndef HANDLE -#define HANDLE void* -#endif -#endif - -#ifndef INT_TO_BOOL -#define INT_TO_BOOL(x) ((x)?TRUE:FALSE) -#endif - -/* Custom Types */ -typedef struct { - char* name; - char* value; -} named_string_t; - -typedef struct { - char* name; - int value; -} named_int_t; - -typedef struct { - char* name; - uint value; -} named_uint_t; - -typedef struct { - char* name; - long value; -} named_long_t; - -typedef struct { - char* name; - ulong value; -} named_ulong_t; - -typedef struct { - char* name; - short value; -} named_short_t; - -typedef struct { - char* name; - ushort value; -} named_ushort_t; - -typedef struct { - char* name; - float value; -} named_float_t; - -typedef struct { - char* name; - double value; -} named_double_t; - -typedef struct { - char* name; - BOOL value; -} named_bool_t; - -typedef struct { - int key; - char* value; -} keyed_string_t; - -typedef struct { - int key; - int value; -} keyed_int_t; - - -/************************/ -/* Handy Integer Macros */ -/************************/ - -/* Data Block Length Alignment Macro (returns required padding length for proper alignment) */ -#define PAD_LENGTH_FOR_ALIGNMENT(len,blk) (((len)%(blk))==0 ? 0 : (blk)-((len)%(blk))) - -#define HEX_DIGITS(n) ( n > 0xfffffff ? 8 \ - : n > 0x0ffffff ? 7 \ - : n > 0x00fffff ? 6 \ - : n > 0x000ffff ? 5 \ - : n > 0x0000fff ? 4 \ - : n > 0x00000ff ? 3 \ - : n > 0x000000f ? 2 : 1 ) -#define DEC_DIGITS(n) ( n < 10 ? 1 \ - : n < 100 ? 2 \ - : n < 1000 ? 3 \ - : n < 10000 ? 4 \ - : n < 100000 ? 5 \ - : n < 1000000 ? 6 \ - : n < 10000000 ? 7 \ - : n < 100000000 ? 8 \ - : n < 1000000000 ? 9 : 10 ) - -/***********************/ -/* Handy String Macros */ -/***********************/ - -/* Null-Terminate an ASCIIZ char array */ -#define TERMINATE(str) str[sizeof(str)-1]=0 - -/* This is a bound-safe version of strcpy basically - only works with fixed-length arrays */ -#ifdef SAFECOPY_USES_SPRINTF -#define SAFECOPY(dst,src) sprintf(dst,"%.*s",(int)sizeof(dst)-1,src) -#else /* strncpy is faster */ -#define SAFECOPY(dst,src) (strncpy(dst,src,sizeof(dst)), TERMINATE(dst)) -#endif - -#define SAFECAT(dst, src) do { \ - if(strlen((char*)(dst)) + strlen((char*)(src)) < sizeof(dst)) { \ - strcat((char*)(dst), (char*)(src)); \ - } \ -} while(0) - -/* Bound-safe version of sprintf() - only works with fixed-length arrays */ -#if (defined __FreeBSD__) || (defined __NetBSD__) || (defined __OpenBSD__) || (defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__)) -/* *BSD *nprintf() is already safe */ -#define SAFEPRINTF(dst,fmt,arg) snprintf(dst,sizeof(dst),fmt,arg) -#define SAFEPRINTF2(dst,fmt,a1,a2) snprintf(dst,sizeof(dst),fmt,a1,a2) -#define SAFEPRINTF3(dst,fmt,a1,a2,a3) snprintf(dst,sizeof(dst),fmt,a1,a2,a3) -#define SAFEPRINTF4(dst,fmt,a1,a2,a3,a4) snprintf(dst,sizeof(dst),fmt,a1,a2,a3,a4) -#else -#define SAFEPRINTF(dst,fmt,arg) snprintf(dst,sizeof(dst),fmt,arg), TERMINATE(dst) -#define SAFEPRINTF2(dst,fmt,a1,a2) snprintf(dst,sizeof(dst),fmt,a1,a2), TERMINATE(dst) -#define SAFEPRINTF3(dst,fmt,a1,a2,a3) snprintf(dst,sizeof(dst),fmt,a1,a2,a3), TERMINATE(dst) -#define SAFEPRINTF4(dst,fmt,a1,a2,a3,a4) snprintf(dst,sizeof(dst),fmt,a1,a2,a3,a4), TERMINATE(dst) -#endif - -/* Replace every occurrence of c1 in str with c2, using p as a temporary char pointer */ -#define REPLACE_CHARS(str,c1,c2,p) for((p)=(str);*(p);(p)++) if(*(p)==(c1)) *(p)=(c2); - -/* ASCIIZ char* parsing helper macros */ -/* These (unsigned char) typecasts defeat MSVC debug assertion when passed a negative value */ -#define IS_WHITESPACE(c) (isspace((unsigned char)(c)) || c == CP437_NO_BREAK_SPACE) -#define IS_CONTROL(c) iscntrl((unsigned char)(c)) -#define IS_ALPHA(c) isalpha((unsigned char)(c)) -#define IS_ALPHANUMERIC(c) isalnum((unsigned char)(c)) -#define IS_UPPERCASE(c) isupper((unsigned char)(c)) -#define IS_LOWERCASE(c) islower((unsigned char)(c)) -#define IS_PUNCTUATION(c) ispunct((unsigned char)(c)) -#define IS_PRINTABLE(c) isprint((unsigned char)(c)) -#define IS_DIGIT(c) isdigit((unsigned char)(c)) -#define IS_HEXDIGIT(c) isxdigit((unsigned char)(c)) -#define IS_OCTDIGIT(c) ((c) >= '0' && (c) <= '7') -#define SKIP_WHITESPACE(p) while((p) && *(p) && IS_WHITESPACE(*(p))) (p)++; -#define FIND_WHITESPACE(p) while((p) && *(p) && !IS_WHITESPACE(*(p))) (p)++; -#define SKIP_CHAR(p,c) while((p) && *(p)==c) (p)++; -#define FIND_CHAR(p,c) while((p) && *(p) && *(p)!=c) (p)++; -#define SKIP_CHARSET(p,s) while((p) && *(p) && strchr(s,*(p))!=NULL) (p)++; -#define FIND_CHARSET(p,s) while((p) && *(p) && strchr(s,*(p))==NULL) (p)++; -#define SKIP_CRLF(p) SKIP_CHARSET(p, "\r\n") -#define FIND_CRLF(p) FIND_CHARSET(p, "\r\n") -#define SKIP_ALPHA(p) while((p) && *(p) && IS_ALPHA(*(p))) (p)++; -#define FIND_ALPHA(p) while((p) && *(p) && !IS_ALPHA(*(p))) (p)++; -#define SKIP_ALPHANUMERIC(p) while((p) && *(p) && IS_ALPHANUMERIC(*(p))) (p)++; -#define FIND_ALPHANUMERIC(p) while((p) && *(p) && !IS_ALPHANUMERIC(*(p))) (p)++; -#define SKIP_DIGIT(p) while((p) && *(p) && IS_DIGIT(*(p))) (p)++; -#define FIND_DIGIT(p) while((p) && *(p) && !IS_DIGIT(*(p))) (p)++; -#define SKIP_HEXDIGIT(p) while((p) && *(p) && IS_HEXDIGIT(*(p))) (p)++; -#define FIND_HEXDIGIT(p) while((p) && *(p) && !IS_HEXDIGIT(*(p))) (p)++; - -#define HEX_CHAR_TO_INT(ch) (((ch)&0xf)+(((ch)>>6)&1)*9) -#define DEC_CHAR_TO_INT(ch) ((ch)&0xf) -#define OCT_CHAR_TO_INT(ch) ((ch)&0x7) - -/* Variable/buffer initialization (with zeros) */ -#define ZERO_VAR(var) memset(&(var),0,sizeof(var)) -#define ZERO_ARRAY(array) memset(array,0,sizeof(array)) - -/****************************************************************************/ -/* MALLOC/FREE Macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/* FAR16 is used to create a far (32-bit) pointer in 16-bit compilers */ -/* HUGE16 is used to create a huge (32-bit) pointer in 16-bit compilers */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) - #define HUGE16 huge - #define FAR16 far - #if defined(__TURBOC__) - #define REALLOC(x,y) farrealloc(x,y) - #define LMALLOC(x) farmalloc(x) - #define MALLOC(x) farmalloc(x) - #define LFREE(x) farfree(x) - #define FREE(x) farfree(x) - #elif defined(__WATCOMC__) - #define REALLOC realloc - #define LMALLOC(x) halloc(x,1) /* far heap, but slow */ - #define MALLOC malloc /* far heap, but 64k max */ - #define LFREE hfree - #define FREE free - #else /* Other 16-bit Compiler */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free - #endif -#else /* 32-bit Compiler or Small Memory Model */ - #define HUGE16 - #define FAR16 - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free -#endif - -/********************************/ -/* Handy Pointer-freeing Macros */ -/********************************/ -#define FREE_AND_NULL(x) do { \ - if((x)!=NULL) { \ - FREE(x); \ - (x)=NULL; \ - } \ - } while(0) -#define FREE_LIST_ITEMS(list,i) if(list!=NULL) { \ - for(i=0;list[i]!=NULL;i++) \ - FREE_AND_NULL(list[i]); \ - } -#define FREE_LIST(list,i) FREE_LIST_ITEMS(list,i) FREE_AND_NULL(list) - -/********************************/ -/* Other Pointer-List Macros */ -/********************************/ -#define COUNT_LIST_ITEMS(list,i) { i=0; if(list!=NULL) while(list[i]!=NULL) i++; } - -#if defined(__unix__) - #include <syslog.h> -#else - /* - * log priorities (copied from BSD syslog.h) - */ - #define LOG_EMERG 0 /* system is unusable */ - #define LOG_ALERT 1 /* action must be taken immediately */ - #define LOG_CRIT 2 /* critical conditions */ - #define LOG_ERR 3 /* error conditions */ - #define LOG_WARNING 4 /* warning conditions */ - #define LOG_NOTICE 5 /* normal but significant condition */ - #define LOG_INFO 6 /* informational */ - #define LOG_DEBUG 7 /* debug-level messages */ -#endif - -#ifdef WITH_SDL_AUDIO - #include <SDL.h> -#endif - -#endif /* Don't add anything after this #endif statement */ diff --git a/xpdev/genpack.pl b/xpdev/genpack.pl deleted file mode 100755 index 90d26f9..0000000 --- a/xpdev/genpack.pl +++ /dev/null @@ -1,254 +0,0 @@ -#!/usr/bin/perl - -if($#ARGV != 2) { - print <<ENDOFUSAGE; -Usage: $0 infile.h outhead.h outprog.c - -ENDOFUSAGE - exit(1); -} - -my ($infile, $outhead, $outc) = @ARGV; -open IN,'<',$infile; - -while (<IN>) { - $header .= $_; -} -close IN; - -my $defs=''; -my $protos=''; -my $functions=''; - -my $count = 0; -my @structs = (); -while($header =~ m/struct\s+([^\s\r\n]*)[\s\r\n]+{([^}]*)}/gs) { - my($name, $def) = ($1,$2); - my ($packcode, $unpackcode, $size, @ints) = parse_defs($name, $def); - if(defined $size) { - $count++; - push @structs,"+ $name"; - $defs .= $size; - $protos .= "int pack_$name\_struct(char *buf, struct $name *data);\n"; - $protos .= "int unpack_$name\_struct(struct $name *data, char *buf);\n"; - $functions .= "int pack_$name\_struct(char *buf, struct $name *data)\n"; - $functions .= "{\n"; - $functions .= "\tchar\t*p;\n"; - if($#ints >= 0) { - $functions .= "\tint\t\t".join(', ',@ints).";\n"; - } - $functions .="\n\tp = buf;\n"; - $functions .= $packcode; - $functions .="\n\treturn((int)(p-buf));\n}\n\n"; - $functions .= "int unpack_$name\_struct(struct $name *data, char *buf)\n"; - $functions .= "{\n"; - $functions .= "\tchar\t*p;\n"; - if($#ints >= 0) { - $functions .= "\tint\t\t".join(', ',@ints).";\n"; - } - $functions .="\n\tp = buf;\n"; - $functions .= $unpackcode; - $functions .="\n\treturn((int)(p-buf));\n}\n\n"; - } - else { - push @structs,"! $name"; - } -} - -if($count) { - open HEAD,'>',$outhead; - open C,'>',$outc; - - print HEAD "/* Generated by genpack.pl from $infile on ".(scalar localtime(time))." */\n\n"; - my $macro = uc($outhead); - $macro=~s/[^A-Z0-9]/_/g; - print HEAD '#ifndef _INCLUDED_',$macro,"\n"; - print HEAD '#define _INCLUDED_',$macro,"\n\n"; - print HEAD "#include \"$infile\"\n#include \"xpendian.h\"\n\n"; - print HEAD "/* *_SIZE macros are the packed buffer size requred */\n"; - print HEAD $defs; - print HEAD "\n/* Function prototypes */\n"; - print HEAD "#if defined(__cplusplus)\nextern \"C\" {\n#endif\n"; - print HEAD $protos; - print HEAD "#if defined(__cplusplus)\n}\n#endif"; - print HEAD "\n\n"; - print HEAD "#endif /* Do not add anything after this line! */\n"; - close HEAD; - - open C,'>',$outc; - print HEAD "/* Generated by genpack.pl from $infile on ".(scalar localtime(time))." */\n\n"; - print C "#include \"$outhead\"\n\n"; - print C $functions; - print C "\n"; - close C; - - print "$count structures read successfully\n+ indicates functions were created\n! indicates a failure\n\n"; - print join("\n", @structs),"\n"; -} -else { - print "No structures imported... files not created.\n"; -} - -sub parse_defs -{ - my ($sname, $defs)=@_; - - my $packcode=''; - my $unpackcode=''; - my %vars=(); - my %sizes=(); - - # Remove comments - $defs=~s|/\*.*?\*/||gs; - my @lines=split(/[\r\n]+/, $defs); - foreach my $line (@lines) { - my ($p, $u); - my @newvars; - my $this_size=0; - chomp $line; - next if($line =~ /^\s*$/); - if($line =~ m/^\s*((?:char)|(?:BYTE)|(?:INT16)|(?:WORD)|(?:INT32)|(?:DWORD)|(?:float))\s+([^\s]+)\s*;\s*$/) { - my ($type, $name) = ($1, $2); - ($p, $u, @newvars) = parse_line(\%sizes, $type, $name, 0); - } - elsif($line =~ m/^\s*struct\s+([^\s]+)\s+([^\s]+)\s*;\s*$/) { - my ($struct, $name) = ($1, $2); - ($p, $u, @newvars) = parse_line(\%sizes, $struct, $name, 1); - } - else { - print "Cannot parse: $line\n"; - return(); - } - if(!defined $u) { - return(); - } - @vars{@newvars}=@newvars; - $packcode .= $p; - $unpackcode .= $u; - } - my $sizedef = '#define '.uc($sname)."_SIZE\t("; - foreach my $key (keys %sizes) { - if(defined $sizes{$key}{count} && !defined $sizes{$key}{multiplier}) { - if($sizes{$key}{count} == 1) { - $sizedef .= "$key + "; - } - else { - $sizedef .= "($key * $sizes{$key}{count}) + "; - } - } - elsif(!defined $sizes{$key}{count} && defined $sizes{$key}{multiplier}) { - $sizes{$key}{multiplier} = substr($sizes{$key}{multiplier}, 0, -3); - $sizedef .= "($key * ($sizes{$key}{multiplier})) + "; - } - elsif(defined $sizes{$key}{count} && defined $sizes{$key}{multiplier}) { - $sizes{$key}{multiplier} = substr($sizes{$key}{multiplier}, 0, -3); - $sizedef .= "($key * ($sizes{$key}{count} + $sizes{$key}{multiplier})) + "; - } - } - $sizedef = substr($sizedef, 0, -3) . ")\n"; - return($packcode, $unpackcode, $sizedef, sort keys %vars); -} - -sub parse_line -{ - my ($sizes, $type, $name, $struct) = @_; - my $tabs = "\t"; - my $end = ''; - my %vars=(); - my $nextint='i'; - my ($packcode, $unpackcode); - my $sizekey; - - if($struct) { - $sizekey = uc($type).'_SIZE'; - } - else { - $sizekey = "sizeof($type)"; - } - if($name =~ /\[/) { # Handle arrays! - while($name =~ s/\[([^\]]+)\]/;$nextint;/) { - my $size = $1; - $packcode .= $tabs."for($nextint = 0; $nextint < $size; $nextint++) {\n"; - $unpackcode .= $tabs."for($nextint = 0; $nextint < $size; $nextint++) {\n"; - $sizes->{$sizekey}{multiplier} .= "$size * "; - $end = "$tabs}\n$end"; - $tabs .= "\t"; - $vars{$nextint}=1; - $nextint=chr(ord($nextint)+1); - } - $sizes->{$sizekey}{multiplier} = substr($sizes->{$sizekey}{multiplier}, 0, -3); - $sizes->{$sizekey}{multiplier} .= ' + '; - $name =~ s/;(.);/[$1]/g; - } - else { - $sizes->{$sizekey}{count}++; - } - $name = "data->$name"; - my ($p, $u) = pack_line($type, $name, $struct, $tabs); - $p = "$packcode$p$end"; - $u = "$unpackcode$u$end"; - return($p, $u, sort keys %vars); -} - -sub pack_line -{ - my ($type, $name, $struct, $tabs)=@_; - my $packcode = ''; - my $unpackcode = ''; - - # ie: *(INT32)p = LE_LONG($name); - if(!$struct) { - if($type eq 'char') { - $packcode .= $tabs."*p = $name;\n"; - $packcode .= $tabs."p++;\n"; - $unpackcode .= $tabs."$name = *p;\n"; - $unpackcode .= $tabs."p++;\n"; - } - elsif($type eq 'BYTE') { - $packcode .= $tabs."*(BYTE *)p = $name;\n"; - $packcode .= $tabs."p++;\n"; - $unpackcode .= $tabs."$name = *(BYTE *)p;\n"; - $unpackcode .= $tabs."p++;\n"; - } - elsif($type eq 'INT16') { - $packcode .= $tabs."*(INT16 *)p = LE_SHORT($name);\n"; - $packcode .= $tabs."p += sizeof(INT16);\n"; - $unpackcode .= $tabs."$name = LE_SHORT(*(INT16 *)p);\n"; - $unpackcode .= $tabs."p += sizeof(INT16);\n"; - } - elsif($type eq 'WORD') { - $packcode .= $tabs."*(WORD *)p = LE_SHORT($name);\n"; - $packcode .= $tabs."p += sizeof(WORD);\n"; - $unpackcode .= $tabs."$name = LE_SHORT(*(WORD *)p);\n"; - $unpackcode .= $tabs."p += sizeof(WORD);\n"; - } - elsif($type eq 'INT32') { - $packcode .= $tabs."*(INT32 *)p = LE_LONG($name);\n"; - $packcode .= $tabs."p += sizeof(INT32);\n"; - $unpackcode .= $tabs."$name = LE_LONG(*(INT32 *)p);\n"; - $unpackcode .= $tabs."p += sizeof(INT32);\n"; - } - elsif($type eq 'DWORD') { - $packcode .= $tabs."*(DWORD *)p = LE_LONG($name);\n"; - $packcode .= $tabs."p += sizeof(DWORD);\n"; - $unpackcode .= $tabs."$name = LE_LONG(*(DWORD *)p);\n"; - $unpackcode .= $tabs."p += sizeof(DWORD);\n"; - } - elsif($type eq 'float') { - $packcode .= $tabs."*(DWORD *)p = LE_LONG(*((DWORD *)&($name)));\n"; - $packcode .= $tabs."p += sizeof(float);\n"; - $unpackcode .= $tabs."*(((DWORD *)&($name))) = LE_LONG(*(DWORD *)p);\n"; - $unpackcode .= $tabs."p += sizeof(DWORD);\n"; - } - else { - print "Unhandled type: $type\n"; - return(undef, undef); - } - } - else { - $packcode .= $tabs."p += pack_$type\_struct(p, &($name));\n"; - $unpackcode .= $tabs."p += unpack_$type\_struct(&($name), p);\n"; - } - - return($packcode, $unpackcode); -} diff --git a/xpdev/genwrap.c b/xpdev/genwrap.c deleted file mode 100644 index 04e9e06..0000000 --- a/xpdev/genwrap.c +++ /dev/null @@ -1,886 +0,0 @@ -/* General cross-platform development wrappers */ - -/* $Id: genwrap.c,v 1.118 2020/08/10 04:11:44 rswindell Exp $ */ -// vi: tabstop=4 - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> /* strlen() */ -#include <stdarg.h> /* vsnprintf() */ -#include <stdlib.h> /* RAND_MAX */ -#include <fcntl.h> /* O_NOCTTY */ -#include <time.h> /* clock() */ -#include <errno.h> /* errno */ -#include <ctype.h> /* toupper/tolower */ -#include <limits.h> /* CHAR_BIT */ -#include <math.h> /* fmod */ - -#if defined(__unix__) - #include <sys/ioctl.h> /* ioctl() */ - #include <sys/utsname.h> /* uname() */ - #include <signal.h> -#elif defined(_WIN32) - #include <windows.h> - #include <lm.h> /* NetWkstaGetInfo() */ -#endif - -#include "genwrap.h" /* Verify prototypes */ -#include "xpendian.h" /* BYTE_SWAP */ - -/****************************************************************************/ -/* Used to replace snprintf() guarantees to terminate. */ -/****************************************************************************/ -int safe_snprintf(char *dst, size_t size, const char *fmt, ...) -{ - va_list argptr; - int numchars; - - va_start(argptr,fmt); - numchars= vsnprintf(dst,size,fmt,argptr); - va_end(argptr); - if (size > 0) - dst[size-1]=0; -#ifdef _MSC_VER - if(numchars==-1) - numchars=strlen(dst); -#endif - if(numchars>=(int)size && numchars>0) - numchars=size-1; - return(numchars); -} - -#ifdef NEEDS_STRLCPY -size_t strlcpy(char *dst, const char *src, size_t size) -{ - size_t i; - - if(size < 1) - return 0; - - for(i = 0; src[i] != '\0'; i++) { - if(i < (size - 1)) - *(dst++) = src[i]; - } - *dst = 0; - return i; -} -#endif - -#ifdef _WIN32 -/****************************************************************************/ -/* Case insensitive version of strstr() - currently heavy-handed */ -/****************************************************************************/ -char* strcasestr(const char* haystack, const char* needle) -{ - const char* p; - size_t len = strlen(needle); - - for(p = haystack; *p != '\0'; p++) { - if(strnicmp(p, needle, len) == 0) - return (char*)p; - } - return NULL; -} -#endif - -/****************************************************************************/ -/* Return last character of string */ -/****************************************************************************/ -char* lastchar(const char* str) -{ - size_t len; - - len = strlen(str); - - if(len) - return((char*)&str[len-1]); - - return((char*)str); -} - -/****************************************************************************/ -/* Return character value of C-escaped (\) character */ -/****************************************************************************/ -char c_unescape_char(const char ch) -{ - switch(ch) { - case 'e': return(ESC); /* non-standard */ - case 'a': return('\a'); - case 'b': return('\b'); - case 'f': return('\f'); - case 'n': return('\n'); - case 'r': return('\r'); - case 't': return('\t'); - case 'v': return('\v'); - } - return(ch); -} - -/****************************************************************************/ -/* Return character value of C-escaped (\) character literal sequence */ -/* supports \x## (hex) and \### sequences (for octal or decimal) */ -/****************************************************************************/ -char c_unescape_char_ptr(const char* str, char** endptr) -{ - char ch; - - if(*str == 'x') { - int digits = 0; // \x## for hexadecimal character literals (only 2 digits supported) - ++str; - ch = 0; - while(digits < 2 && IS_HEXDIGIT(*str)) { - ch *= 0x10; - ch += HEX_CHAR_TO_INT(*str); - str++; - digits++; - } -#ifdef C_UNESCAPE_OCTAL_SUPPORT - } else if(IS_OCTDIGIT(*str)) { - int digits = 0; // \### for octal character literals (only 3 digits supported) - ch = 0; - while(digits < 3 && IS_OCTDIGIT(*str)) { - ch *= 8; - ch += OCT_CHAR_TO_INT(*str); - str++; - digits++; - } -#else - } else if(IS_DIGIT(*str)) { - int digits = 0; // \### for decimal character literals (only 3 digits supported) - ch = 0; - while(digits < 3 && IS_DIGIT(*str)) { - ch *= 10; - ch += DEC_CHAR_TO_INT(*str); - str++; - digits++; - } -#endif - } else - ch=c_unescape_char(*(str++)); - - if(endptr!=NULL) - *endptr=(char*)str; - - return ch; -} - -/****************************************************************************/ -/* Unescape a C string, in place */ -/****************************************************************************/ -char* c_unescape_str(char* str) -{ - char ch; - char* buf; - char* src; - char* dst; - - if(str==NULL || (buf=strdup(str))==NULL) - return(NULL); - - src=buf; - dst=str; - while((ch=*(src++))!=0) { - if(ch=='\\') /* escape */ - ch=c_unescape_char_ptr(src,&src); - *(dst++)=ch; - } - *dst=0; - free(buf); - return(str); -} - -char* c_escape_char(char ch) -{ - switch(ch) { - case 0: return("\\x00"); - case 1: return("\\x01"); - case ESC: return("\\e"); /* non-standard */ - case '\a': return("\\a"); - case '\b': return("\\b"); - case '\f': return("\\f"); - case '\n': return("\\n"); - case '\r': return("\\r"); - case '\t': return("\\t"); - case '\v': return("\\v"); - case '\\': return("\\\\"); - case '\"': return("\\\""); - case '\'': return("\\'"); - } - return(NULL); -} - -char* c_escape_str(const char* src, char* dst, size_t maxlen, BOOL ctrl_only) -{ - const char* s; - char* d; - const char* e; - - for(s=src,d=dst;*s && (size_t)(d-dst)<maxlen;s++) { - if((!ctrl_only || (uchar)*s < ' ') && (e=c_escape_char(*s))!=NULL) { - strncpy(d,e,maxlen-(d-dst)); - d+=strlen(d); - } else if((uchar)*s < ' ') { - d += safe_snprintf(d, maxlen-(d-dst), "\\x%02X", *s); - } else *d++=*s; - } - *d=0; - - return(dst); -} - -/* Returns a byte count parsed from the 'str' argument, supporting power-of-2 - * short-hands (e.g. 'K' for kibibytes). - * If 'unit' is specified (greater than 1), result is divided by this amount. - * - * Moved from ini_file.c/parseBytes() - */ -int64_t parse_byte_count(const char* str, ulong unit) -{ - char* p=NULL; - double bytes; - - bytes=strtod(str,&p); - if(p!=NULL) { - SKIP_WHITESPACE(p); - switch(toupper(*p)) { - case 'E': - bytes*=1024; - /* fall-through */ - case 'P': - bytes*=1024; - /* fall-through */ - case 'T': - bytes*=1024; - /* fall-through */ - case 'G': - bytes*=1024; - /* fall-through */ - case 'M': - bytes*=1024; - /* fall-through */ - case 'K': - bytes*=1024; - break; - } - } - return((int64_t)(unit>1 ? (bytes/unit):bytes)); -} - -static const double one_tebibyte = 1024.0*1024.0*1024.0*1024.0; -static const double one_gibibyte = 1024.0*1024.0*1024.0; -static const double one_mebibyte = 1024.0*1024.0; -static const double one_kibibyte = 1024.0; - -/* Convert an exact byte count to a string with a floating point value - and a single letter multiplier/suffix. - For values evenly divisible by 1024, no suffix otherwise. -*/ -char* byte_count_to_str(int64_t bytes, char* str, size_t size) -{ - if(bytes && fmod((double)bytes,one_tebibyte)==0) - safe_snprintf(str, size, "%gT",bytes/one_tebibyte); - else if(bytes && fmod((double)bytes,one_gibibyte)==0) - safe_snprintf(str, size, "%gG",bytes/one_gibibyte); - else if(bytes && fmod((double)bytes,one_mebibyte)==0) - safe_snprintf(str, size, "%gM",bytes/one_mebibyte); - else if(bytes && fmod((double)bytes,one_kibibyte)==0) - safe_snprintf(str, size, "%gK",bytes/one_kibibyte); - else - safe_snprintf(str, size, "%"PRIi64, bytes); - - return str; -} - -/* Convert a rounded byte count to a string with a floating point value - with a single decimal place and a single letter multiplier/suffix. - This function also appends 'B' for exact byte counts (< 1024). - 'unit' is the smallest divisor used. -*/ -char* byte_estimate_to_str(int64_t bytes, char* str, size_t size, ulong unit, int precision) -{ - if(bytes >= one_tebibyte) - safe_snprintf(str, size, "%1.*fT", precision, bytes/one_tebibyte); - else if(bytes >= one_gibibyte || unit == one_gibibyte) - safe_snprintf(str, size, "%1.*fG", precision, bytes/one_gibibyte); - else if(bytes >= one_mebibyte || unit == one_mebibyte) - safe_snprintf(str, size, "%1.*fM", precision, bytes/one_mebibyte); - else if(bytes >= one_kibibyte || unit == one_kibibyte) - safe_snprintf(str, size, "%1.*fK", precision, bytes/one_kibibyte); - else - safe_snprintf(str, size, "%"PRIi64"B", bytes); - - return str; -} - - -/* Parse a duration string, default unit is in seconds */ -/* (Y)ears, (W)eeks, (D)ays, (H)ours, and (M)inutes */ -/* suffixes/multipliers are supported. */ -/* Return value is in seconds */ -double parse_duration(const char* str) -{ - char* p=NULL; - double t; - - t=strtod(str,&p); - if(p!=NULL) { - SKIP_WHITESPACE(p); - switch(toupper(*p)) { - case 'Y': t*=365.0*24.0*60.0*60.0; break; - case 'W': t*= 7.0*24.0*60.0*60.0; break; - case 'D': t*= 24.0*60.0*60.0; break; - case 'H': t*= 60.0*60.0; break; - case 'M': t*= 60.0; break; - } - } - return t; -} - -/* Convert a duration (in seconds) to a string - * with a single letter multiplier/suffix: - * (Y)ears, (W)eeks, (D)ays, (H)ours, (M)inutes, or (S)econds - */ -char* duration_to_str(double value, char* str, size_t size) -{ - if(value && fmod(value,365.0*24.0*60.0*60.0)==0) - safe_snprintf(str, size, "%gY",value/(365.0*24.0*60.0*60.0)); - else if(value && fmod(value,7.0*24.0*60.0*60.0)==0) - safe_snprintf(str, size, "%gW",value/(7.0*24.0*60.0*60.0)); - else if(value && fmod(value,24.0*60.0*60.0)==0) - safe_snprintf(str, size, "%gD",value/(24.0*60.0*60.0)); - else if(value && fmod(value,60.0*60.0)==0) - safe_snprintf(str, size, "%gH",value/(60.0*60.0)); - else if(value && fmod(value,60.0)==0) - safe_snprintf(str, size, "%gM",value/60.0); - else - safe_snprintf(str, size, "%gS",value); - - return str; -} - -/* Convert a duration (in seconds) to a verbose string - * with a word clarifier / modifier: - * year[s], week[s], day[s], hour[s], minute[s] or second[s] - */ -char* duration_to_vstr(double value, char* str, size_t size) -{ - if(value && fmod(value,365.0*24.0*60.0*60.0)==0) { - value /= (365.0*24.0*60.0*60.0); - safe_snprintf(str, size, "%g year%s", value, value == 1 ? "":"s"); - } - else if(value && fmod(value,7.0*24.0*60.0*60.0)==0) { - value /= (7.0*24.0*60.0*60.0); - safe_snprintf(str, size, "%g week%s", value, value == 1 ? "":"s"); - } - else if(value && fmod(value,24.0*60.0*60.0)==0) { - value /= (24.0*60.0*60.0); - safe_snprintf(str, size, "%g day%s", value, value == 1 ? "":"s"); - } - else if(value && fmod(value,60.0*60.0)==0) { - value /= (60.0*60.0); - safe_snprintf(str, size, "%g hour%s", value, value == 1 ? "":"s"); - } - else if(value && fmod(value,60.0)==0) { - value /= 60.0; - safe_snprintf(str, size, "%g minute%s", value, value == 1 ? "":"s"); - } - else - safe_snprintf(str, size, "%g second%s", value, value == 1 ? "":"s"); - - return str; -} - - -/****************************************************************************/ -/* Convert ASCIIZ string to upper case */ -/****************************************************************************/ -#if defined(__unix__) -char* strupr(char* str) -{ - char* p=str; - - while(*p) { - *p=toupper(*p); - p++; - } - return(str); -} -/****************************************************************************/ -/* Convert ASCIIZ string to lower case */ -/****************************************************************************/ -char* strlwr(char* str) -{ - char* p=str; - - while(*p) { - *p=tolower(*p); - p++; - } - return(str); -} -/****************************************************************************/ -/* Reverse characters of a string (provided by amcleod) */ -/****************************************************************************/ -char* strrev(char* str) -{ - char t, *i=str, *j=str+strlen(str); - - while (i<j) { - t=*i; *(i++)=*(--j); *j=t; - } - return str; -} -#endif - -#if !defined(__unix__) - -/****************************************************************************/ -/* Implementations of the recursive (thread-safe) version of strtok */ -/* Thanks to Apache Portable Runtime (APR) */ -/****************************************************************************/ -char* strtok_r(char *str, const char *delim, char **last) -{ - char* token; - - if (str==NULL) /* subsequent call */ - str = *last; /* start where we left off */ - - /* skip characters in delimiter (will terminate at '\0') */ - while(*str && strchr(delim, *str)) - ++str; - - if(!*str) { /* no more tokens */ - *last = str; - return NULL; - } - - token = str; - - /* skip valid token characters to terminate token and - * prepare for the next call (will terminate at '\0) - */ - *last = token + 1; - while(**last && !strchr(delim, **last)) - ++*last; - - if (**last) { - **last = '\0'; - ++*last; - } - - return token; -} - -#endif - -/****************************************************************************/ -/* Initialize (seed) the random number generator */ -/****************************************************************************/ -void xp_randomize(void) -{ -#if !(defined(HAS_SRANDOMDEV_FUNC) && defined(HAS_RANDOM_FUNC)) - unsigned seed=~0; -#if defined(HAS_DEV_URANDOM) && defined(URANDOM_DEV) - int rf; -#endif -#endif - -#if defined(HAS_SRANDOMDEV_FUNC) && defined(HAS_RANDOM_FUNC) - srandomdev(); - return; -#else - -#if defined(HAS_DEV_URANDOM) && defined(URANDOM_DEV) - if((rf=open(URANDOM_DEV, O_RDONLY))!=-1) { - read(rf, &seed, sizeof(seed)); - close(rf); - } - else { -#endif - unsigned curtime = (unsigned)time(NULL); - unsigned process_id = (unsigned)GetCurrentProcessId(); - - seed = curtime ^ BYTE_SWAP_INT(process_id); - - #if defined(_WIN32) || defined(GetCurrentThreadId) - seed ^= (unsigned)GetCurrentThreadId(); - #endif - -#if defined(HAS_DEV_URANDOM) && defined(URANDOM_DEV) - } -#endif - -#ifdef HAS_RANDOM_FUNC - srandom(seed); -#else - srand(seed); -#endif -#endif -} - -/****************************************************************************/ -/* Return random number between 0 and n-1 */ -/****************************************************************************/ -long xp_random(int n) -{ -#ifdef HAS_RANDOM_FUNC - long curr; - unsigned long limit; - - if(n<2) - return(0); - - limit = ((1UL<<((sizeof(long)*CHAR_BIT)-1)) / n) * n - 1; - - while(1) { - curr=random(); - if(curr <= limit) - return(curr % n); - } -#else - double f=0; - int ret; - - if(n<2) - return(0); - do { - f=(double)rand()/(double)(RAND_MAX+1); - ret=(int)(n*f); - } while(ret==n); - - return(ret); -#endif -} - -/****************************************************************************/ -/* Return ASCII string representation of ulong */ -/* There may be a native GNU C Library function to this... */ -/****************************************************************************/ -#if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__WATCOMC__) -char* ultoa(ulong val, char* str, int radix) -{ - switch(radix) { - case 8: - sprintf(str,"%lo",val); - break; - case 10: - sprintf(str,"%lu",val); - break; - case 16: - sprintf(str,"%lx",val); - break; - default: - sprintf(str,"bad radix: %d",radix); - break; - } - return(str); -} -#endif - -/****************************************************************************/ -/* Write the version details of the current operating system into str */ -/****************************************************************************/ -char* os_version(char *str) -{ -#if defined(__OS2__) && defined(__BORLANDC__) - - sprintf(str,"OS/2 %u.%u (%u.%u)",_osmajor/10,_osminor/10,_osmajor,_osminor); - -#elif defined(_WIN32) - - /* Windows Version */ - char* winflavor=""; - OSVERSIONINFO winver; - - winver.dwOSVersionInfoSize=sizeof(winver); - GetVersionEx(&winver); - - switch(winver.dwPlatformId) { - case VER_PLATFORM_WIN32_NT: - winflavor="NT "; - break; - case VER_PLATFORM_WIN32s: - winflavor="Win32s "; - break; - case VER_PLATFORM_WIN32_WINDOWS: - winver.dwBuildNumber&=0xffff; - break; - } - - /* Work-around Microsoft Windows 8.1 stupidity where GetVersionEx() lies about the current OS version */ - if(winver.dwMajorVersion == 6 && winver.dwMinorVersion == 2) { - WKSTA_INFO_100* wksta_info; - if(NetWkstaGetInfo(NULL, 100, (LPBYTE*)&wksta_info) == NERR_Success) { - winver.dwMajorVersion = wksta_info->wki100_ver_major; - winver.dwMinorVersion = wksta_info->wki100_ver_minor; - winver.dwBuildNumber = 0; - } - } - - sprintf(str,"Windows %sVersion %lu.%lu" - ,winflavor - ,winver.dwMajorVersion, winver.dwMinorVersion); - if(winver.dwBuildNumber) - sprintf(str+strlen(str), " (Build %lu)", winver.dwBuildNumber); - if(winver.szCSDVersion[0]) - sprintf(str+strlen(str), " %s", winver.szCSDVersion); - -#elif defined(__unix__) - - struct utsname unixver; - - if(uname(&unixver)<0) - sprintf(str,"Unix (uname errno: %d)",errno); - else - sprintf(str,"%s %s %s" - ,unixver.sysname /* e.g. "Linux" */ - ,unixver.release /* e.g. "2.2.14-5.0" */ - ,unixver.machine /* e.g. "i586" */ - ); - -#else /* DOS */ - - sprintf(str,"DOS %u.%02u",_osmajor,_osminor); - -#endif - - return(str); -} - -char* os_cmdshell(void) -{ - char* shell=getenv(OS_CMD_SHELL_ENV_VAR); - -#if defined(__unix__) - if(shell==NULL) -#ifdef _PATH_BSHELL - shell=_PATH_BSHELL; -#else - shell="/bin/sh"; -#endif -#endif - - return(shell); -} - -/****************************************************************/ -/* Microsoft (DOS/Win32) real-time system clock implementation. */ -/****************************************************************/ -#ifdef __unix__ -clock_t msclock(void) -{ - return (clock_t)(llroundl(xp_timer() * 1000.0)); -} -#endif - -/****************************************************************************/ -/* Skips all white-space chars at beginning of 'str' */ -/****************************************************************************/ -char* skipsp(char* str) -{ - SKIP_WHITESPACE(str); - return(str); -} - -/****************************************************************************/ -/* Truncates all white-space chars off end of 'str' (needed by STRERRROR) */ -/****************************************************************************/ -char* truncsp(char* str) -{ - size_t i,len; - - if(str!=NULL) { - i=len=strlen(str); - while(i && IS_WHITESPACE(str[i-1])) - i--; - if(i!=len) - str[i]=0; /* truncate */ - } - return(str); -} - -/****************************************************************************/ -/* Truncates common white-space chars off end of \n-terminated lines in */ -/* 'dst' and retains original line break format (e.g. \r\n or \n) */ -/****************************************************************************/ -char* truncsp_lines(char* dst) -{ - char* sp; - char* dp; - char* src; - - if((src=strdup(dst))==NULL) - return(dst); - - for(sp=src, dp=dst; *sp!=0; sp++) { - if(*sp=='\n') { - while(dp!=dst - && (*(dp-1)==' ' || *(dp-1)=='\t' || *(dp-1)=='\r')) - dp--; - if(sp!=src && *(sp-1)=='\r') - *(dp++)='\r'; - } - *(dp++)=*sp; - } - *dp=0; - - free(src); - return(dst); -} - -/****************************************************************************/ -/* Truncates carriage-return and line-feed chars off end of 'str' */ -/****************************************************************************/ -char* truncnl(char* str) -{ - size_t i,len; - - if(str!=NULL) { - i=len=strlen(str); - while(i && (str[i-1]=='\r' || str[i-1]=='\n')) - i--; - if(i!=len) - str[i]=0; /* truncate */ - } - return(str); -} - -/****************************************************************************/ -/* Return errno from the proper C Library implementation */ -/* (single/multi-threaded) */ -/****************************************************************************/ -int get_errno(void) -{ - return(errno); -} - -/****************************************************************************/ -/* Returns the current value of the systems best timer (in SECONDS) */ -/* Any value < 0 indicates an error */ -/****************************************************************************/ -long double xp_timer(void) -{ - long double ret; -#if defined(__unix__) - struct timespec ts; - - if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { - ret = ts.tv_sec; - ret += ((long double)ts.tv_nsec) / 1000000000; - } - else - ret = -1; -#elif defined(_WIN32) - LARGE_INTEGER freq; - LARGE_INTEGER tick; - if(QueryPerformanceFrequency(&freq) && QueryPerformanceCounter(&tick)) { -#if 0 - ret=((long double)tick.HighPart*4294967296)+((long double)tick.LowPart); - ret /= ((long double)freq.HighPart*4294967296)+((long double)freq.LowPart); -#else - /* In MSVC, a long double does NOT have 19 decimals of precision */ - ret=(((long double)(tick.QuadPart%freq.QuadPart))/freq.QuadPart); - ret+=tick.QuadPart/freq.QuadPart; -#endif - } - else { - ret=GetTickCount(); - ret /= 1000; - } -#else -#error no high-resolution time for this platform -#endif - return(ret); -} - -/* Returns TRUE if specified process is running */ -BOOL check_pid(pid_t pid) -{ -#if defined(__unix__) - return(kill(pid,0)==0); -#elif defined(_WIN32) - HANDLE h; - BOOL result=FALSE; - - if((h=OpenProcess(PROCESS_QUERY_INFORMATION,/* inheritable: */FALSE, pid)) != NULL) { - DWORD code; - if(GetExitCodeProcess(h,(PDWORD)&code)==TRUE && code==STILL_ACTIVE) - result=TRUE; - CloseHandle(h); - } - return result; -#else - return FALSE; /* Need check_pid() definition! */ -#endif -} - -/* Terminate (unconditionally) the specified process */ -BOOL terminate_pid(pid_t pid) -{ -#if defined(__unix__) - return(kill(pid,SIGKILL)==0); -#elif defined(_WIN32) - HANDLE h; - BOOL result=FALSE; - - if((h=OpenProcess(PROCESS_TERMINATE,/* inheritable: */FALSE, pid)) != NULL) { - if(TerminateProcess(h,255)) - result=TRUE; - CloseHandle(h); - } - return result; -#else - return FALSE; /* Need check_pid() definition! */ -#endif -} - -/****************************************************************************/ -/* Re-entrant (thread-safe) version of strerror() */ -/* GNU (not POSIX) inspired API */ -/****************************************************************************/ -char* safe_strerror(int errnum, char *buf, size_t buflen) -{ - strncpy(buf, "Unknown error", buflen); - buf[buflen - 1] = 0; - -#if defined(_MSC_VER) - strerror_s(buf, buflen, errnum); -#elif defined(_WIN32) - strncpy(buf, strerror(errnum), buflen); - buf[buflen - 1] = 0; -#elif defined(_GNU_SOURCE) - buf = strerror_r(errnum, buf, buflen); -#else - strerror_r(errnum, buf, buflen); -#endif - return buf; -} diff --git a/xpdev/genwrap.h b/xpdev/genwrap.h deleted file mode 100644 index e888aa0..0000000 --- a/xpdev/genwrap.h +++ /dev/null @@ -1,399 +0,0 @@ -/* General cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _GENWRAP_H -#define _GENWRAP_H - -#include <stdio.h> /* sprintf */ -#include <string.h> /* strerror() */ -#include <time.h> /* clock_t */ -#include "gen_defs.h" /* ulong */ -#include "wrapdll.h" /* DLLEXPORT and */ - -#if defined(__unix__) - #include <sched.h> /* sched_yield */ - #include <time.h> /* clock_t */ - #include <sys/time.h> /* struct timeval */ - #include <strings.h> /* strcasecmp() */ - #include <unistd.h> /* usleep */ - - #ifdef XPDEV_THREAD_SAFE - #include <pthread.h>/* Check for GNU PTH libs */ - #ifdef _PTH_PTHREAD_H_ - #include <pth.h> - #endif - #define GetCurrentThreadId() pthread_self() - #endif -#elif defined(_WIN32) - #include <process.h> /* getpid() */ - #ifndef __MINGW32__ - typedef DWORD pid_t; - #endif -#endif - -#if !defined(_WIN32) - /* Simple Win32 function equivalents */ - #define GetCurrentProcessId() getpid() -#endif - -/* utime() support */ -#if defined(_MSC_VER) || defined(__WATCOMC__) - #include <sys/utime.h> -#else - #include <utime.h> -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - -/* - * The alloca() function can't be implemented in C, and on some - * platforms it can't be implemented at all as a callable function. - * The GNU C compiler provides a built-in alloca() which we can use; - * On platforms where alloca() is not in libc, programs which use - * it will fail to link when compiled with non-GNU compilers. - */ -#if __GNUC__ >= 2 || defined(__INTEL_COMPILER) -#undef alloca /* some GNU bits try to get cute and define this on their own */ -#define alloca(sz) __builtin_alloca(sz) -#elif defined(_WIN32) -#include <malloc.h> -#endif - -/*********************/ -/* Compiler-specific */ -/*********************/ - -/* Compiler Description */ -#if defined(__BORLANDC__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF2(str,"BCC %X.%02X" \ - ,__BORLANDC__>>8,__BORLANDC__&0xff); - -#elif defined(_MSC_VER) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"MSC %u", _MSC_VER); - -#elif defined(__clang__) && defined(__clang_patchlevel__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF3(str,"Clang %u.%u.%u" \ - ,__clang_major__,__clang_minor__,__clang_patchlevel__); - -#elif defined(__clang__) && defined(__clang_minor__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF2(str,"Clang %u.%u" \ - ,__clang_major__,__clang_minor__); - -#elif defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF3(str,"GCC %u.%u.%u" \ - ,__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__); - -#elif defined(__GNUC__) && defined(__GNUC_MINOR__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF2(str,"GCC %u.%u" \ - ,__GNUC__,__GNUC_MINOR__); - -#elif defined(__WATCOMC__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"WATC %d" \ - ,__WATCOMC__); - -#elif defined(__DMC__) /* Digital Mars C/C++ */ - - #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"DMC %X.%02X" \ - ,__DMC__>>8,__DMC__&0xff); - -#else /* Unknown compiler */ - - #define DESCRIBE_COMPILER(str) SAFECOPY(str,"UNKNOWN COMPILER"); - -#endif - -/**********/ -/* Macros */ -/**********/ - -/* Target Platform Description */ -#if defined(_WIN64) - #define PLATFORM_DESC "Win64" -#elif defined(_WIN32) - #define PLATFORM_DESC "Win32" -#elif defined(__OS2__) - #define PLATFORM_DESC "OS/2" -#elif defined(__MSDOS__) - #define PLATFORM_DESC "DOS" -#elif defined(__linux__) - #define PLATFORM_DESC "Linux" -#elif defined(__FreeBSD__) - #define PLATFORM_DESC "FreeBSD" -#elif defined(__OpenBSD__) - #define PLATFORM_DESC "OpenBSD" -#elif defined(__NetBSD__) - #define PLATFORM_DESC "NetBSD" -#elif defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__) - #define PLATFORM_DESC "MacOSX" -#elif defined(BSD) - #define PLATFORM_DESC "BSD" -#elif defined(__solaris__) - #define PLATFORM_DESC "Solaris" -#elif defined(__sun__) - #define PLATFORM_DESC "SunOS" -#elif defined(__gnu__) - #define PLATFORM_DESC "GNU/Hurd" -#elif defined(__QNX__) - #define PLATFORM_DESC "QNX" -#elif defined(__unix__) - #define PLATFORM_DESC "Unix" -#elif defined(__HAIKU__) - #define PLATFORM_DESC "Haiku" -#else - #error "Need to describe target platform" -#endif - -#if defined(_M_X64) || defined(_M_AMD64) || defined(__x86_64__) || defined(__amd64__) - #define ARCHITECTURE_DESC "x64" -#elif defined(__i386__) || _M_IX86 == 300 - #define ARCHITECTURE_DESC "i386" -#elif defined(__i486__) || _M_IX86 == 400 - #define ARCHITECTURE_DESC "i486" -#elif defined(__i586__) || _M_IX86 == 500 - #define ARCHITECTURE_DESC "i586" -#elif defined(__i686__) || _M_IX86 == 600 - #define ARCHITECTURE_DESC "i686" -#elif defined(__i786__) || _M_IX86 == 700 - #define ARCHITECTURE_DESC "i786" -#elif defined(_X86_) || defined(__x86__) || defined(_M_IX86) - #define ARCHITECTURE_DESC "x86" -#elif defined(__mips__) - #define ARCHITECTURE_DESC "mips" -#elif __ARM_ARCH == 5 || _M_ARM == 5 - #define ARCHITECTURE_DESC "armv5" -#elif __ARM_ARCH == 6 || _M_ARM == 6 - #define ARCHITECTURE_DESC "armv6" -#elif __ARM_ARCH == 7 || _M_ARM == 7 - #define ARCHITECTURE_DESC "armv7" -#elif __ARM_ARCH == 8 || _M_ARM == 8 - #define ARCHITECTURE_DESC "armv8" -#elif defined(__aarch64__) - #define ARCHITECTURE_DESC "arm64" -#elif defined(__arm__) - #define ARCHITECTURE_DESC "arm" -#elif defined(_M_PPC) || defined(__ppc__) - #define ARCHITECTURE_DESC "ppc" -#elif defined(_M_IA64) || defined(__ia64__) - #define ARCHITECTURE_DESC "ia64" -#else - #error "Need to describe target architecture" -#endif - -/*********************/ -/* String Functionss */ -/*********************/ - -#ifndef USE_SNPRINTF - #define snprintf safe_snprintf -#endif - -#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__DMC__) -#if !defined(snprintf) - #define snprintf _snprintf -#endif - #define vsnprintf _vsnprintf - #define NEEDS_STRLCPY -#endif - -#if defined(__WATCOMC__) - #define vsnprintf(s,l,f,a) vsprintf(s,f,a) -#endif - -#if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__WATCOMC__) - DLLEXPORT char* ultoa(ulong, char*, int radix); -#endif - -#if defined(__unix__) - DLLEXPORT char* strupr(char* str); - DLLEXPORT char* strlwr(char* str); - DLLEXPORT char* strrev(char* str); - #if !defined(stricmp) - #define stricmp strcasecmp - #define strnicmp strncasecmp - #endif -#endif - -#if defined(NEEDS_STRLCPY) - size_t strlcpy(char *dst, const char *src, size_t size); -#endif - -#if defined(_WIN32) - DLLEXPORT char* strcasestr(const char* haystack, const char* needle); -#endif - -/* Skip white-space chars at beginning of string */ -DLLEXPORT char* skipsp(char* str); -/* Truncate white-space chars off end of string */ -DLLEXPORT char* truncsp(char* str); -/* Truncate white-space chars off end of every \n-terminated line in string */ -DLLEXPORT char* truncsp_lines(char* str); -/* Truncate new-line chars off end of string */ -DLLEXPORT char* truncnl(char* str); - -#define STRERROR(x) strerror(x) - -/* Re-entrant version of strerror() */ -DLLEXPORT char* safe_strerror(int errnum, char* buf, size_t buflen); - -/*********************/ -/* Utility Functions */ -/*********************/ -/* Thunking for multi-threaded specific implementations of "errno" */ -DLLEXPORT int get_errno(void); - -/**********************************/ -/* Common Utility Macro Functions */ -/**********************************/ - -#if defined(_WIN32) - - #define YIELD() Sleep(1) /* Must sleep at least 1ms to avoid 100% CPU utilization */ - #define MAYBE_YIELD() Sleep(0) - #define SLEEP(x) Sleep(x) - #define popen _popen - #define pclose _pclose - #define tzname _tzname - -#elif defined(__OS2__) - - #define YIELD() DosSleep(1) /* Must sleep at least 1ms to avoid 100% CPU utilization */ - #define MAYBE_YIELD() DosSleep(0) - #define SLEEP(x) DosSleep(x) - -#elif defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) - - #if defined(_PTH_PTHREAD_H_) - #define SLEEP(x) ({ int sleep_msecs=x; struct timeval tv; \ - tv.tv_sec=(sleep_msecs/1000); tv.tv_usec=((sleep_msecs%1000)*1000); \ - pth_nap(tv); }) - #else - #define SLEEP(x) ({ int sleep_msecs=x; struct timespec ts={0}; \ - ts.tv_sec=(sleep_msecs/1000); ts.tv_nsec=((sleep_msecs%1000)*1000000); \ - while(nanosleep(&ts, &ts) != 0 && errno==EINTR && x > 1); }) - #endif - - #define YIELD() SLEEP(1) - - #if defined(XPDEV_THREAD_SAFE) - #if defined(__FreeBSD__) - #define MAYBE_YIELD() pthread_yield() - #elif defined(_PTH_PTHREAD_H_) - #define MAYBE_YIELD() pth_yield(NULL) - #elif defined(_POSIX_PRIORITY_SCHEDULING) - #define MAYBE_YIELD() sched_yield() - #else - #define MAYBE_YIELD() YIELD() - #endif - #else - #if defined(_POSIX_PRIORITY_SCHEDULING) - #define MAYBE_YIELD() sched_yield() - #else - #define MAYBE_YIELD() YIELD() - #endif - #endif - - /* - * QNX doesn't support fork() in threaded apps (yet) using vfork() instead - * works, but relies on undefined behaviours not being nasty. On most OSs - * vfork() will share the stack between the parent and child... - */ - #if defined(__QNX__) - #define FORK() vfork() - #else - #define FORK() fork() - #endif - - -#else /* Unsupported OS */ - - #error "Unsupported Target: Need some macros and/or function prototypes here." - -#endif - -/* Command processor/shell environment variable name */ -#ifdef __unix__ - #define OS_CMD_SHELL_ENV_VAR "SHELL" -#else /* DOS/Windows/OS2 */ - #define OS_CMD_SHELL_ENV_VAR "COMSPEC" -#endif - -/* Win32 implementations of recursive (thread-safe) std C time functions on Unix */ -#if !defined(__unix__) - - DLLEXPORT char* strtok_r(char *str, const char *delim, char **last); -#endif - -/* Mimic the Borland randomize() and random() CRTL functions */ -DLLEXPORT void xp_randomize(void); -DLLEXPORT long xp_random(int); - -DLLEXPORT long double xp_timer(void); -DLLEXPORT char* os_version(char *str); -DLLEXPORT char* os_cmdshell(void); -DLLEXPORT char* lastchar(const char* str); -DLLEXPORT int safe_snprintf(char *dst, size_t size, const char *fmt, ...) -#if defined(__GNUC__) // Catch printf-format errors - __attribute__ ((format (printf, 3 , 4))); // 1 is 'this' -#endif -; - -/* C string/char escape-sequence processing */ -DLLEXPORT char* c_escape_str(const char* src, char* dst, size_t maxlen, BOOL ctrl_only); -DLLEXPORT char* c_escape_char(char ch); -DLLEXPORT char* c_unescape_str(char* str); -DLLEXPORT char c_unescape_char_ptr(const char* str, char** endptr); -DLLEXPORT char c_unescape_char(char ch); - -/* Power-of-2 byte count string parser (e.g. "100K" returns 102400 if unit is 1) */ -DLLEXPORT int64_t parse_byte_count(const char*, ulong unit); -DLLEXPORT double parse_duration(const char*); -DLLEXPORT char* duration_to_str(double value, char* str, size_t size); -DLLEXPORT char* duration_to_vstr(double value, char* str, size_t size); -DLLEXPORT char* byte_count_to_str(int64_t bytes, char* str, size_t size); -DLLEXPORT char* byte_estimate_to_str(int64_t bytes, char* str, size_t size, ulong unit, int precision); - -/* Microsoft (e.g. DOS/Win32) real-time system clock API (ticks since process started) */ -typedef clock_t msclock_t; -#if defined(_WIN32) || defined(__OS2__) - #define MSCLOCKS_PER_SEC CLOCKS_PER_SEC /* e.g. 18.2 on DOS, 1000.0 on Win32 */ - #define msclock() clock() -#else - #define MSCLOCKS_PER_SEC 1000 - msclock_t msclock(void); -#endif - -DLLEXPORT BOOL check_pid(pid_t); -DLLEXPORT BOOL terminate_pid(pid_t); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/haproxy.h b/xpdev/haproxy.h deleted file mode 100644 index b80d382..0000000 --- a/xpdev/haproxy.h +++ /dev/null @@ -1,40 +0,0 @@ -/* haproxy.h */ - -/* HAPROXY PROTOCOL constant definitions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* HAPROXY PROTO BINARY DEFINITIONS */ -#define HAPROXY_AFINET 0x1 /* IPv4 Connection */ -#define HAPROXY_AFINET6 0x2 /* IPv6 Connection */ - -/* HAPROXY COMMANDS */ -#define HAPROXY_LOCAL 0x0 /* Connections instigated by the proxy, eg: health-check */ -#define HAPROXY_PROXY 0x1 /* Relay connections */ diff --git a/xpdev/ini_file.c b/xpdev/ini_file.c deleted file mode 100644 index 5b09d38..0000000 --- a/xpdev/ini_file.c +++ /dev/null @@ -1,2476 +0,0 @@ -/* Functions to create and parse .ini files */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "ini_file.h" -#include <stdlib.h> /* strtol */ -#include <string.h> /* strlen */ -#include <math.h> /* fmod */ -#include "xpdatetime.h" /* isoDateTime_t */ -#include "datewrap.h" /* ctime_r */ -#include "dirwrap.h" /* fexist */ -#include "filewrap.h" /* chsize */ - -/* Maximum length of entire line, includes '\0' */ -#define INI_MAX_LINE_LEN (INI_MAX_VALUE_LEN*2) -#define INI_COMMENT_CHAR ';' -#define INI_OPEN_SECTION_CHAR '[' -#define INI_CLOSE_SECTION_CHAR ']' -#define INI_SECTION_NAME_SEP "|" -#define INI_BIT_SEP '|' -#define INI_NEW_SECTION ((char*)~0) -#define INI_EOF_DIRECTIVE "!eof" -#define INI_INCLUDE_DIRECTIVE "!include " -#define INI_INCLUDE_MAX 10000 - -static ini_style_t default_style; - -void iniSetDefaultStyle(ini_style_t style) -{ - default_style = style; -} - -/* These correlate with the LOG_* definitions in syslog.h/gen_defs.h */ -static char* logLevelStringList[] - = {"Emergency", "Alert", "Critical", "Error", "Warning", "Notice", "Informational", "Debugging", NULL}; - -str_list_t iniLogLevelStringList(void) -{ - return(logLevelStringList); -} - -static BOOL is_eof(char* str) -{ - return(*str=='!' && stricmp(truncsp(str),INI_EOF_DIRECTIVE)==0); -} - -static char* section_name(char* p) -{ - char* tp; - - SKIP_WHITESPACE(p); - if(*p!=INI_OPEN_SECTION_CHAR) - return(NULL); - p++; - SKIP_WHITESPACE(p); - tp=strrchr(p,INI_CLOSE_SECTION_CHAR); - if(tp==NULL) - return(NULL); - *tp=0; - truncsp(p); - - return(p); -} - -static BOOL section_match(const char* name, const char* compare, BOOL case_sensitive) -{ - BOOL found=FALSE; - str_list_t names=strListSplitCopy(NULL,name,INI_SECTION_NAME_SEP); - str_list_t comps=strListSplitCopy(NULL,compare,INI_SECTION_NAME_SEP); - size_t i,j; - char* n; - char* c; - - /* Ignore trailing whitespace */ - for(i=0; names[i]!=NULL; i++) - truncsp(names[i]); - for(i=0; comps[i]!=NULL; i++) - truncsp(comps[i]); - - /* Search for matches */ - for(i=0; names[i]!=NULL && !found; i++) - for(j=0; comps[j]!=NULL && !found; j++) { - n=names[i]; - SKIP_WHITESPACE(n); - c=comps[j]; - SKIP_WHITESPACE(c); - if (case_sensitive) - found = strcmp(n, c) == 0; - else - found = stricmp(n, c) == 0; - } - - strListFree(&names); - strListFree(&comps); - - return(found); -} - -static BOOL seek_section(FILE* fp, const char* section) -{ - char* p; - char str[INI_MAX_LINE_LEN]; - - rewind(fp); - - if(section==ROOT_SECTION) - return(TRUE); - - /* Perform case-sensitive search first */ - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((p=section_name(str))==NULL) - continue; - if(section_match(p, section, /* case-sensitive */TRUE)) - return(TRUE); - } - - /* Then perform case-insensitive search */ - rewind(fp); - while (!feof(fp)) { - if (fgets(str, sizeof(str), fp) == NULL) - break; - if (is_eof(str)) - break; - if ((p = section_name(str)) == NULL) - continue; - if (section_match(p, section, /* case-sensitive */FALSE)) - return(TRUE); - } - - return(FALSE); -} - -static size_t find_section_index(str_list_t list, const char* section) -{ - char* p; - char str[INI_MAX_VALUE_LEN]; - size_t i; - - /* Perform case-sensitive search first */ - for (i = 0; list[i] != NULL; i++) { - SAFECOPY(str, list[i]); - if(is_eof(str)) - return(strListCount(list)); - if((p=section_name(str))!=NULL && section_match(p, section, /* case-sensitive */TRUE)) - return(i); - } - - /* Then perform case-insensitive search */ - for (i = 0; list[i] != NULL; i++) { - SAFECOPY(str, list[i]); - if (is_eof(str)) - return(strListCount(list)); - if ((p = section_name(str)) != NULL && section_match(p, section, /* case-sensitive */FALSE)) - return(i); - } - - return(i); -} - -static size_t section_start(str_list_t list, size_t index) -{ - char* p = list[index]; - if(p != NULL) { - SKIP_WHITESPACE(p); - if(*p == INI_OPEN_SECTION_CHAR) // A new section starts immediately? - return strListCount(list); - } - return index; -} - -static size_t find_section(str_list_t list, const char* section) -{ - size_t i; - - if(section==ROOT_SECTION) - return section_start(list, 0); - - i=find_section_index(list,section); - if(list[i]!=NULL) - i++; - return section_start(list, i); -} - -static char* key_name(char* p, char** vp, BOOL literals_supported) -{ - char* equal; - char* colon; - char* tp; - - *vp=NULL; - - if(p==NULL) - return(NULL); - - /* Parse value name */ - SKIP_WHITESPACE(p); - if(*p==INI_COMMENT_CHAR) - return(NULL); - if(*p==INI_OPEN_SECTION_CHAR) - return(INI_NEW_SECTION); - equal=strchr(p,'='); - colon=strchr(p,':'); - if(colon==NULL || (equal!=NULL && equal<colon)) { - *vp=equal; - colon=NULL; - } else - *vp=colon; - - if(*vp==NULL) - return(NULL); - - *(*vp)=0; - truncsp(p); - - /* Parse value */ - (*vp)++; - SKIP_WHITESPACE(*vp); - if(literals_supported && colon!=NULL) { /* string literal value */ - truncnl(*vp); /* "key : value" - truncate new-line chars only */ - if(*(*vp) == '"') { /* handled quoted-strings here */ - (*vp)++; - tp = strrchr(*vp, '"'); - if(tp != NULL) { - *tp = 0; - } - } - c_unescape_str(*vp); - } else - truncsp(*vp); /* "key = value" - truncate all white-space chars */ - - return(p); -} - -static char* read_value(FILE* fp, const char* section, const char* key, char* value, BOOL literals_supported) -{ - char* p; - char* vp=NULL; - char str[INI_MAX_LINE_LEN]; - - if(fp==NULL) - return(NULL); - - if(!seek_section(fp,section)) - return(NULL); - - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((p=key_name(str, &vp, literals_supported))==NULL) - continue; - if(p==INI_NEW_SECTION) - break; - if(stricmp(p,key)!=0) - continue; - if(vp==NULL) - break; - /* key found */ - sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,vp); - return(value); - } - - return(NULL); -} - -static size_t get_value(str_list_t list, const char* section, const char* key, char* value, char** vpp, BOOL literals_supported) -{ - char str[INI_MAX_LINE_LEN]; - char* p; - char* vp; - size_t i; - - if(value!=NULL) - value[0]=0; - if(vpp!=NULL) - *vpp=NULL; - if(list==NULL) - return 0; - - for(i=find_section(list, section); list[i]!=NULL; i++) { - SAFECOPY(str,list[i]); - if(is_eof(str)) - break; - if((p=key_name(str, &vp, literals_supported))==NULL) - continue; - if(p==INI_NEW_SECTION) - break; - if(stricmp(p,key)!=0) - continue; - if(value!=NULL) - sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,vp); - if(vpp!=NULL) - *vpp=list[i] + (vp - str); - return(i); - } - - return(i); -} - -BOOL iniSectionExists(str_list_t list, const char* section) -{ - size_t i; - - if(list==NULL) - return(FALSE); - - if(section==ROOT_SECTION) - return(TRUE); - - i=find_section_index(list,section); - return(list[i]!=NULL); -} - -str_list_t iniGetSection(str_list_t list, const char *section) -{ - size_t i; - str_list_t retval; - char *p; - - if(list==NULL) - return(NULL); - - if((retval=strListInit())==NULL) - return(NULL); - - i=find_section(list,section); - if(list[i]!=NULL) { - strListPush(&retval, list[i]); - for(i++;list[i]!=NULL;i++) { - p=list[i]; - SKIP_WHITESPACE(p); - if(*p==INI_OPEN_SECTION_CHAR) - break; - if(*p) - strListPush(&retval, list[i]); - } - } - return(retval); -} - -BOOL iniKeyExists(str_list_t list, const char* section, const char* key) -{ - size_t i; - - if(list==NULL) - return(FALSE); - - i=get_value(list, section, key, NULL, NULL, /* literals_supported: */FALSE); - - if(list[i]==NULL || *(list[i])==INI_OPEN_SECTION_CHAR) - return(FALSE); - - return(TRUE); -} - -BOOL iniValueExists(str_list_t list, const char* section, const char* key) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - return(vp!=NULL && *vp!=0); -} - -BOOL iniRemoveKey(str_list_t* list, const char* section, const char* key) -{ - size_t i; - char* vp=NULL; - - i=get_value(*list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL) - return(FALSE); - - return(strListDelete(list,i)); -} - -BOOL iniRemoveValue(str_list_t* list, const char* section, const char* key) -{ - char* vp=NULL; - - get_value(*list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL) - return(FALSE); - - *vp=0; - return(TRUE); -} - -BOOL iniRemoveSection(str_list_t* list, const char* section) -{ - size_t i; - - i=find_section_index(*list,section); - if((*list)[i]==NULL) /* not found */ - return(FALSE); - do { - strListDelete(list,i); - } while((*list)[i]!=NULL && *(*list)[i]!=INI_OPEN_SECTION_CHAR); - - return(TRUE); -} - -BOOL iniRemoveSections(str_list_t* list, const char* prefix) -{ - str_list_t sections; - const char* section; - - if (list == NULL) - return FALSE; - sections = iniGetSectionList(*list, prefix); - while((section = strListPop(§ions)) != NULL) - if(!iniRemoveSection(list, section)) - return(FALSE); - - strListFree(§ions); - - return(TRUE); -} - -// This sorts comments too, so should not be used on human created/edited files -BOOL iniSortSections(str_list_t* list, BOOL sort_keys) -{ - size_t i; - str_list_t root_keys; - str_list_t new_list; - str_list_t keys; - str_list_t section_list = iniGetSectionList(*list, /* prefix */NULL); - - root_keys = iniGetSection(*list, ROOT_SECTION); - if(section_list == NULL && root_keys == NULL) - return TRUE; - - if(sort_keys) - strListSortAlphaCase(root_keys); - - if(section_list != NULL) - strListSortAlphaCase(section_list); - new_list = strListInit(); - if(new_list == NULL) { - strListFree(§ion_list); - strListFree(&root_keys); - return FALSE; - } - strListAppendList(&new_list, root_keys); - strListFree(&root_keys); - for(i = 0; section_list != NULL && section_list[i] != NULL; i++) { - keys = iniGetSection(*list, section_list[i]); - if(sort_keys) - strListSortAlphaCase(keys); - iniAppendSectionWithKeys(&new_list, section_list[i], keys, /* ini_style_t */NULL); - strListFree(&keys); - } - strListFree(§ion_list); - strListFree(list); - *list = new_list; - return TRUE; -} - -BOOL iniRenameSection(str_list_t* list, const char* section, const char* newname) -{ - char str[INI_MAX_LINE_LEN]; - size_t i; - - if(section==ROOT_SECTION) - return(FALSE); - - if(stricmp(section, newname)!=0) { - i=find_section_index(*list,newname); - if((*list)[i]!=NULL) /* duplicate */ - return(FALSE); - } - - i=find_section_index(*list,section); - if((*list)[i]==NULL) /* not found */ - return(FALSE); - - SAFEPRINTF(str,"[%s]",newname); - return(strListReplace(*list, i, str)!=NULL); -} - -static size_t ini_add_section(str_list_t* list, const char* section - ,ini_style_t* style, size_t index) -{ - char str[INI_MAX_LINE_LEN]; - - if(section==ROOT_SECTION) - return(0); - - if((*list)[index]!=NULL) - return(index); - - if(style==NULL) - style=&default_style; - if(index > 0 && style->section_separator!=NULL) - strListAppend(list, style->section_separator, index++); - SAFEPRINTF(str,"[%s]",section); - strListAppend(list, str, index); - - return(index); -} - -size_t iniAddSection(str_list_t* list, const char* section, ini_style_t* style) -{ - if(section==ROOT_SECTION) - return(0); - - return ini_add_section(list,section,style,find_section_index(*list, section)); -} - -size_t iniAppendSection(str_list_t* list, const char* section, ini_style_t* style) -{ - if(section==ROOT_SECTION) - return(0); - - return ini_add_section(list,section,style,strListCount(*list)); -} - -size_t iniAppendSectionWithKeys(str_list_t* list, const char* section, const str_list_t keys - , ini_style_t* style) -{ - if(section==ROOT_SECTION) - return(0); - - ini_add_section(list,section,style,strListCount(*list)); - - return strListAppendList(list, keys); -} - -static BOOL str_contains_ctrl_char(const char* str) -{ - while(*str) { - if(*(unsigned char*)str < ' ') - return TRUE; - str++; - } - return FALSE; -} - -static char* ini_set_string(str_list_t* list, const char* section, const char* key, const char* value, BOOL literal - ,ini_style_t* style) -{ - char str[INI_MAX_LINE_LEN]; - char litstr[INI_MAX_VALUE_LEN]; - char curval[INI_MAX_VALUE_LEN]; - const char* key_prefix = ""; - const char* value_separator = "="; - const char* literal_separator = ":"; - size_t i; - - if(style==NULL) - style=&default_style; - - iniAddSection(list, section, style); - - if(key==NULL) - return(NULL); - if(style->key_prefix != NULL) - key_prefix = style->key_prefix; - if(style->value_separator != NULL) - value_separator = style->value_separator; - if(style->literal_separator != NULL) - literal_separator = style->literal_separator; - if(value==NULL) - value=""; - if(literal) { - char cstr[INI_MAX_VALUE_LEN]; - SAFEPRINTF(litstr, "\"%s\"", c_escape_str(value, cstr, sizeof(cstr)-1, /* ctrl_only: */FALSE)); - value = litstr; - value_separator = literal_separator; - } - safe_snprintf(str, sizeof(str), "%s%-*s%s%s" - ,key_prefix, style->key_len, key, value_separator, value); - i=get_value(*list, section, key, curval, NULL, /* literals_supported: */literal); - if((*list)[i]==NULL || *(*list)[i]==INI_OPEN_SECTION_CHAR) { - while(i && *(*list)[i-1]==0) i--; /* Insert before blank lines, not after */ - return strListInsert(list, str, i); - } - - if(strcmp(curval,value)==0) - return((*list)[i]); /* no change */ - - return strListReplace(*list, i, str); -} -char* iniSetString(str_list_t* list, const char* section, const char* key, const char* value - ,ini_style_t* style) -{ - BOOL literal = value != NULL && (str_contains_ctrl_char(value) || *value==' ' || *lastchar(value)==' '); - - return ini_set_string(list, section, key, value, literal, style); -} - -char* iniSetStringLiteral(str_list_t* list, const char* section, const char* key, const char* value - ,ini_style_t* style) -{ - return ini_set_string(list, section, key, value, /* literal: */TRUE, style); -} - -char* iniSetValue(str_list_t* list, const char* section, const char* key, const char* value - ,ini_style_t* style) -{ - return ini_set_string(list, section, key, value, /* literal: */FALSE, style); -} - -char* iniSetInteger(str_list_t* list, const char* section, const char* key, long value - ,ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - SAFEPRINTF(str,"%ld",value); - return iniSetString(list, section, key, str, style); -} - -char* iniSetShortInt(str_list_t* list, const char* section, const char* key, ushort value - ,ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - SAFEPRINTF(str,"%hu",value); - return iniSetString(list, section, key, str, style); -} - -char* iniSetLongInt(str_list_t* list, const char* section, const char* key, ulong value - ,ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - SAFEPRINTF(str,"%lu",value); - return iniSetString(list, section, key, str, style); -} - -char* iniSetHexInt(str_list_t* list, const char* section, const char* key, ulong value - ,ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - SAFEPRINTF(str,"0x%lx",value); - return iniSetString(list, section, key, str, style); -} - -char* iniSetFloat(str_list_t* list, const char* section, const char* key, double value - ,ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - SAFEPRINTF(str,"%g",value); - return iniSetString(list, section, key, str, style); -} - -char* iniSetBytes(str_list_t* list, const char* section, const char* key, ulong unit - ,int64_t value, ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - if(value==0) - SAFECOPY(str,"0"); - else - switch(unit) { - case 1024*1024*1024: - SAFEPRINTF(str,"%"PRIi64"G",value); - break; - case 1024*1024: - SAFEPRINTF(str,"%"PRIi64"M",value); - break; - case 1024: - SAFEPRINTF(str,"%"PRIi64"K",value); - break; - default: - if(unit<1) - unit=1; - byte_count_to_str(value*unit, str, sizeof(str)); - } - - return iniSetString(list, section, key, str, style); -} - -char* iniSetDuration(str_list_t* list, const char* section, const char* key - ,double value, ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - return iniSetString(list, section, key, duration_to_str(value, str, sizeof(str)), style); -} - - -#if !defined(NO_SOCKET_SUPPORT) -char* iniSetIpAddress(str_list_t* list, const char* section, const char* key, ulong value - ,ini_style_t* style) -{ - struct in_addr in_addr; - in_addr.s_addr=htonl(value); - return iniSetString(list, section, key, inet_ntoa(in_addr), style); -} - -char* iniSetIp6Address(str_list_t* list, const char* section, const char* key, struct in6_addr value - ,ini_style_t* style) -{ - char addrstr[INET6_ADDRSTRLEN]; - union xp_sockaddr addr = {{0}}; - - addr.in6.sin6_addr = value; - addr.in6.sin6_family = AF_INET6; - inet_addrtop(&addr, addrstr, sizeof(addrstr)); - return iniSetString(list, section, key, addrstr, style); -} -#endif - -char* iniSetBool(str_list_t* list, const char* section, const char* key, BOOL value - ,ini_style_t* style) -{ - return iniSetString(list, section, key, value ? "true":"false", style); -} - -char* iniSetDateTime(str_list_t* list, const char* section, const char* key - ,BOOL include_time, time_t value, ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - char tstr[32]; - char* p; - - if(value==0) - SAFECOPY(str,"Never"); - else if((p=ctime_r(&value,tstr))==NULL) - SAFEPRINTF(str,"0x%lx",value); - else if(!include_time) /* reformat into "Mon DD YYYY" */ - safe_snprintf(str,sizeof(str),"%.3s %.2s %.4s" ,p+4,p+8,p+20); - else /* reformat into "Mon DD YYYY HH:MM:SS" */ - safe_snprintf(str,sizeof(str),"%.3s %.2s %.4s %.8s" ,p+4,p+8,p+20,p+11); - - return iniSetString(list, section, key, str, style); -} - -char* iniSetEnum(str_list_t* list, const char* section, const char* key, str_list_t names, unsigned value - ,ini_style_t* style) -{ - if(value < strListCount(names)) - return iniSetString(list, section, key, names[value], style); - - return iniSetLongInt(list, section, key, value, style); -} - -char* iniSetEnumList(str_list_t* list, const char* section, const char* key - ,const char* sep, str_list_t names, unsigned* val_list, unsigned count, ini_style_t* style) -{ - char value[INI_MAX_VALUE_LEN]; - size_t i; - size_t name_count; - - value[0]=0; - - if(sep==NULL) - sep=","; - - if(val_list!=NULL) { - name_count = strListCount(names); - for(i=0; i < count; i++) { - if(value[0]) - SAFECAT(value,sep); - if(val_list[i] < name_count) - SAFECAT(value, names[val_list[i]]); - else - sprintf(value + strlen(value), "%u", val_list[i]); - } - } - - return iniSetString(list, section, key, value, style); -} - -char* iniSetNamedInt(str_list_t* list, const char* section, const char* key, named_long_t* names - ,long value, ini_style_t* style) -{ - size_t i; - - for(i=0;names[i].name!=NULL;i++) - if(names[i].value==value) - return iniSetString(list, section, key, names[i].name, style); - - return iniSetInteger(list, section, key, value, style); -} - -char* iniSetNamedHexInt(str_list_t* list, const char* section, const char* key, named_ulong_t* names - ,ulong value, ini_style_t* style) -{ - size_t i; - - for(i=0;names[i].name!=NULL;i++) - if(names[i].value==value) - return iniSetString(list, section, key, names[i].name, style); - - return iniSetHexInt(list, section, key, value, style); -} - -char* iniSetNamedLongInt(str_list_t* list, const char* section, const char* key, named_ulong_t* names - ,ulong value, ini_style_t* style) -{ - size_t i; - - for(i=0;names[i].name!=NULL;i++) - if(names[i].value==value) - return iniSetString(list, section, key, names[i].name, style); - - return iniSetLongInt(list, section, key, value, style); -} - -char* iniSetNamedFloat(str_list_t* list, const char* section, const char* key, named_double_t* names - ,double value, ini_style_t* style) -{ - size_t i; - - for(i=0;names[i].name!=NULL;i++) - if(names[i].value==value) - return iniSetString(list, section, key, names[i].name, style); - - return iniSetFloat(list, section, key, value, style); -} - -char* iniSetBitField(str_list_t* list, const char* section, const char* key - ,ini_bitdesc_t* bitdesc, ulong value, ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - int i; - const char* bit_separator = "|"; - - if(style==NULL) - style=&default_style; - if(style->bit_separator!=NULL) - bit_separator = style->bit_separator; - str[0]=0; - for(i=0;bitdesc[i].name;i++) { - if((value&bitdesc[i].bit)==0) - continue; - if(str[0]) - SAFECAT(str, bit_separator); - SAFECAT(str,bitdesc[i].name); - value&=~bitdesc[i].bit; - } - if(value) { /* left over bits? */ - if(str[0]) - SAFECAT(str, bit_separator); - sprintf(str+strlen(str), "0x%lX", value); - } - return iniSetString(list, section, key, str, style); -} - -char* iniSetStringList(str_list_t* list, const char* section, const char* key - ,const char* sep, str_list_t val_list, ini_style_t* style) -{ - char value[INI_MAX_VALUE_LEN]; - - if(sep==NULL) - sep=","; - - return iniSetString(list, section, key, strListCombine(val_list, value, sizeof(value), sep), style); -} - -char* iniSetIntList(str_list_t* list, const char* section, const char* key - ,const char* sep, int* val_list, unsigned count, ini_style_t* style) -{ - unsigned i; - char value[INI_MAX_VALUE_LEN]; - - if(sep == NULL) - sep = ","; - for(i = 0; i < count; i++) { - if(i) { - int len = strlen(value); - if(len > INI_MAX_VALUE_LEN - 20) - return NULL; - sprintf(value + len, "%s%d", sep, *(val_list + i)); - } else - sprintf(value, "%d", *val_list); - } - - return iniSetString(list, section, key, value, style); -} - -static char* default_value(const char* deflt, char* value) -{ - if(deflt!=NULL && deflt!=value && value!=NULL) - sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,deflt); - - return((char*)deflt); -} - -/* Supports string literals: */ -char* iniReadString(FILE* fp, const char* section, const char* key, const char* deflt, char* value) -{ - if(read_value(fp, section, key, value, /* literals_supported: */TRUE)==NULL || *value==0 /* blank */) - return default_value(deflt,value); - - return(value); -} - -/* Does NOT support string literals: */ -char* iniReadValue(FILE* fp, const char* section, const char* key, const char* deflt, char* value) -{ - if(read_value(fp, section, key, value, /* literals_supported: */FALSE)==NULL || *value==0 /* blank */) - return default_value(deflt,value); - - return(value); -} - -/* Supports string literals: */ -char* iniGetString(str_list_t list, const char* section, const char* key, const char* deflt, char* value) -{ - char* vp=NULL; - - get_value(list, section, key, value, &vp, /* literals_supported: */TRUE); - - if(vp==NULL || *vp==0 /* blank value or missing key */) - return default_value(deflt,value); - - if(value != NULL) /* return the modified (trimmed) value */ - return value; - - return(vp); -} - -/* Does NOT support string literals: */ -char* iniGetValue(str_list_t list, const char* section, const char* key, const char* deflt, char* value) -{ - char* vp=NULL; - - get_value(list, section, key, value, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0 /* blank value or missing key */) - return default_value(deflt,value); - - if(value != NULL) /* return the modified (trimmed) value */ - return value; - - return(vp); -} - -/* Does NOT support string literals: */ -char* iniPopKey(str_list_t* list, const char* section, const char* key, char* value) -{ - size_t i; - - if(list==NULL || *list==NULL) - return NULL; - - i=get_value(*list, section, key, value, NULL, /* literals_supported: */FALSE); - - if((*list)[i]==NULL) - return NULL; - - strListDelete(list,i); - - return(value); -} - -/* Supports string literals: */ -char* iniPopString(str_list_t* list, const char* section, const char* key, char* value) -{ - size_t i; - - if(list==NULL || *list==NULL) - return NULL; - - i=get_value(*list, section, key, value, NULL, /* literals_supported: */TRUE); - - if((*list)[i]==NULL) - return NULL; - - strListDelete(list,i); - - return(value); -} - -char* iniReadExistingString(FILE* fp, const char* section, const char* key, const char* deflt, char* value) -{ - if(read_value(fp,section,key,value, /* literals_supported: */TRUE)==NULL) - return(NULL); - - if(*value==0 /* blank */) - return default_value(deflt,value); - - return(value); -} - -char* iniGetExistingString(str_list_t list, const char* section, const char* key, const char* deflt, char* value) -{ - if(!iniKeyExists(list, section, key)) - return(NULL); - - return iniGetString(list, section, key, deflt, value); -} - -char* iniReadExistingValue(FILE* fp, const char* section, const char* key, const char* deflt, char* value) -{ - if(read_value(fp,section,key,value, /* literals_supported: */FALSE)==NULL) - return(NULL); - - if(*value==0 /* blank */) - return default_value(deflt,value); - - return(value); -} - -char* iniGetExistingValue(str_list_t list, const char* section, const char* key, const char* deflt, char* value) -{ - if(!iniKeyExists(list, section, key)) - return(NULL); - - return iniGetValue(list, section, key, deflt, value); -} - - -static str_list_t splitList(char* list, const char* sep) -{ - char* token; - char* tmp; - ulong items=0; - str_list_t lp; - - if((lp=strListInit())==NULL) - return(NULL); - - if(sep==NULL) - sep=","; - - token=strtok_r(list,sep,&tmp); - while(token!=NULL) { - SKIP_WHITESPACE(token); - truncsp(token); - if(strListAppend(&lp,token,items++)==NULL) - break; - token=strtok_r(NULL,sep,&tmp); - } - - return(lp); -} - -str_list_t iniReadStringList(FILE* fp, const char* section, const char* key - ,const char* sep, const char* deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - char list[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */TRUE))==NULL || *value==0 /* blank */) - value=(char*)deflt; - - if(value==NULL) - return(NULL); - - SAFECOPY(list,value); - - return(splitList(list,sep)); -} - -str_list_t iniGetStringList(str_list_t list, const char* section, const char* key - ,const char* sep, const char* deflt) -{ - char value[INI_MAX_VALUE_LEN]; - - get_value(list, section, key, value, NULL, /* literals_supported: */TRUE); - - if(*value==0 /* blank value or missing key */) { - if(deflt==NULL) - return(NULL); - SAFECOPY(value,deflt); - } - - return(splitList(value,sep)); -} - -void* iniFreeStringList(str_list_t list) -{ - strListFree(&list); - return(list); -} - -void* iniFreeNamedStringList(named_string_t** list) -{ - ulong i; - - if(list==NULL) - return(NULL); - - for(i=0;list[i]!=NULL;i++) { - if(list[i]->name!=NULL) - free(list[i]->name); - if(list[i]->value!=NULL) - free(list[i]->value); - free(list[i]); - } - - free(list); - return(NULL); -} - -str_list_t iniReadSectionList(FILE* fp, const char* prefix) -{ - char* p; - char str[INI_MAX_LINE_LEN]; - ulong items=0; - str_list_t lp; - - if((lp=strListInit())==NULL) - return(NULL); - - if(fp==NULL) - return(lp); - - rewind(fp); - - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((p=section_name(str))==NULL) - continue; - if(prefix!=NULL) - if(strnicmp(p,prefix,strlen(prefix))!=0) - continue; - if(strListFind(lp, p, /* case_sensitive */FALSE) >= 0) - continue; - if(strListAppend(&lp,p,items++)==NULL) - break; - } - - return(lp); -} - -str_list_t iniGetSectionList(str_list_t list, const char* prefix) -{ - char* p; - char str[INI_MAX_LINE_LEN]; - ulong i,items=0; - str_list_t lp; - - if((lp=strListInit())==NULL) - return(NULL); - - if(list==NULL) - return(lp); - - for(i=0; list[i]!=NULL; i++) { - SAFECOPY(str,list[i]); - if(is_eof(str)) - break; - if((p=section_name(str))==NULL) - continue; - if(prefix!=NULL) - if(strnicmp(p,prefix,strlen(prefix))!=0) - continue; - if(strListFind(lp, p, /* case_sensitive */FALSE) >= 0) - continue; - if(strListAppend(&lp,p,items++)==NULL) - break; - } - - return(lp); -} - -size_t iniGetSectionCount(str_list_t list, const char* prefix) -{ - char* p; - char str[INI_MAX_LINE_LEN]; - size_t i,items=0; - - if(list==NULL) - return(0); - - for(i=0; list[i]!=NULL; i++) { - SAFECOPY(str,list[i]); - if(is_eof(str)) - break; - if((p=section_name(str))==NULL) - continue; - if(prefix!=NULL) - if(strnicmp(p,prefix,strlen(prefix))!=0) - continue; - items++; - } - - return(items); -} - -size_t iniReadSectionCount(FILE* fp, const char* prefix) -{ - char* p; - char str[INI_MAX_LINE_LEN]; - ulong items=0; - - if(fp==NULL) - return(0); - - rewind(fp); - - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((p=section_name(str))==NULL) - continue; - if(prefix!=NULL) - if(strnicmp(p,prefix,strlen(prefix))!=0) - continue; - items++; - } - - return(items); -} - - -str_list_t iniReadKeyList(FILE* fp, const char* section) -{ - char* p; - char* vp; - char str[INI_MAX_LINE_LEN]; - ulong items=0; - str_list_t lp; - - if((lp=strListInit())==NULL) - return(NULL); - - if(fp==NULL) - return(lp); - - rewind(fp); - - if(!seek_section(fp,section)) - return(lp); - - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((p=key_name(str, &vp, /* literals_supported: */FALSE))==NULL) - continue; - if(p==INI_NEW_SECTION) - break; - if(strListAppend(&lp,p,items++)==NULL) - break; - } - - return(lp); -} - -str_list_t iniGetKeyList(str_list_t list, const char* section) -{ - char* p; - char* vp; - char str[INI_MAX_LINE_LEN]; - ulong i,items=0; - str_list_t lp; - - if((lp=strListInit())==NULL) - return(NULL); - - if(list==NULL) - return(lp); - - for(i=find_section(list,section);list[i]!=NULL;i++) { - SAFECOPY(str,list[i]); - if(is_eof(str)) - break; - if((p=key_name(str, &vp, /* literals_supported: */FALSE))==NULL) - continue; - if(p==INI_NEW_SECTION) - break; - if(strListAppend(&lp,p,items++)==NULL) - break; - } - - return(lp); -} - - -named_string_t** -iniReadNamedStringList(FILE* fp, const char* section) -{ - char* name; - char* value; - char str[INI_MAX_LINE_LEN]; - ulong items=0; - named_string_t** lp; - named_string_t** np; - - if(fp==NULL) - return(NULL); - - rewind(fp); - - if(!seek_section(fp,section)) - return(NULL); - - /* New behavior, if section exists but is empty, return single element array (terminator only) */ - if((lp=(named_string_t**)malloc(sizeof(named_string_t*)))==NULL) - return(NULL); - - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((name=key_name(str, &value, /* literals_supported: */TRUE))==NULL) - continue; - if(name==INI_NEW_SECTION) - break; - if((np=(named_string_t**)realloc(lp,sizeof(named_string_t*)*(items+2)))==NULL) - break; - lp=np; - if((lp[items]=(named_string_t*)malloc(sizeof(named_string_t)))==NULL) - break; - if((lp[items]->name=strdup(name))==NULL) - break; - if((lp[items]->value=strdup(value))==NULL) - break; - items++; - } - - lp[items]=NULL; /* terminate list */ - - return(lp); -} - -named_string_t** -iniGetNamedStringList(str_list_t list, const char* section) -{ - char* name; - char* value; - char str[INI_MAX_LINE_LEN]; - ulong i,items=0; - named_string_t** lp; - named_string_t** np; - - if(list==NULL) - return(NULL); - - i=find_section(list,section); - if(section!=ROOT_SECTION && list[i]==NULL) - return(NULL); - - /* New behavior, if section exists but is empty, return single element array (terminator only) */ - if((lp=(named_string_t**)malloc(sizeof(named_string_t*)))==NULL) - return(NULL); - - for(;list[i]!=NULL;i++) { - SAFECOPY(str,list[i]); - if(is_eof(str)) - break; - if((name=key_name(str, &value, /* literals_supported: */TRUE))==NULL) - continue; - if(name==INI_NEW_SECTION) - break; - if((np=(named_string_t**)realloc(lp,sizeof(named_string_t*)*(items+2)))==NULL) - break; - lp=np; - if((lp[items]=(named_string_t*)malloc(sizeof(named_string_t)))==NULL) - break; - if((lp[items]->name=strdup(name))==NULL) - break; - if((lp[items]->value=strdup(value))==NULL) - break; - items++; - } - - lp[items]=NULL; /* terminate list */ - - return(lp); -} - - -/* These functions read a single key of the specified type */ - -static BOOL isTrue(const char* value) -{ - char* str; - char* p; - BOOL is_true; - - if(!IS_ALPHA(*value)) - return FALSE; - - if((str=strdup(value)) == NULL) - return FALSE; - - /* Truncate value at first space, tab or semicolon for purposes of checking for special boolean words. */ - /* This allows comments or white-space to immediately follow a special boolean word: "True", "Yes", or "On" */ - p=str; - FIND_CHARSET(p, "; \t"); - *p=0; - - is_true = (stricmp(str,"TRUE")==0 || stricmp(str,"YES")==0 || stricmp(str,"ON")==0); - free(str); - return is_true; -} - -static long parseInteger(const char* value) -{ - if(isTrue(value)) - return(TRUE); - - return(strtol(value,NULL,0)); -} - -static ulong parseLongInteger(const char* value) -{ - if(isTrue(value)) - return(TRUE); - - return(strtoul(value,NULL,0)); -} - -static BOOL parseBool(const char* value) -{ - return(INT_TO_BOOL(parseInteger(value))); -} - -long iniReadInteger(FILE* fp, const char* section, const char* key, long deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseInteger(value)); -} - -long iniGetInteger(str_list_t list, const char* section, const char* key, long deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseInteger(vp)); -} - -ushort iniReadShortInt(FILE* fp, const char* section, const char* key, ushort deflt) -{ - return((ushort)iniReadInteger(fp, section, key, deflt)); -} - -ushort iniGetShortInt(str_list_t list, const char* section, const char* key, ushort deflt) -{ - return((ushort)iniGetInteger(list, section, key, deflt)); -} - -ulong iniReadLongInt(FILE* fp, const char* section, const char* key, ulong deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseLongInteger(value)); -} - -ulong iniGetLongInt(str_list_t list, const char* section, const char* key, ulong deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseLongInteger(vp)); -} - -int64_t iniReadBytes(FILE* fp, const char* section, const char* key, ulong unit, int64_t deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parse_byte_count(value,unit)); -} - -int64_t iniGetBytes(str_list_t list, const char* section, const char* key, ulong unit, int64_t deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parse_byte_count(vp,unit)); -} - -double iniReadDuration(FILE* fp, const char* section, const char* key, double deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parse_duration(value)); -} - -double iniGetDuration(str_list_t list, const char* section, const char* key, double deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parse_duration(vp)); -} - -#if !defined(NO_SOCKET_SUPPORT) - -int iniGetSocketOptions(str_list_t list, const char* section, SOCKET sock - ,char* error, size_t errlen) -{ - int i; - int result; - char* name; - char err[128]; - BYTE* vp; - socklen_t len; - int option; - int level; - int value; - int type=0; // Assignment is to silence Valgrind. - LINGER linger; - socket_option_t* socket_options=getSocketOptionList(); -#ifdef IPPROTO_IPV6 - union xp_sockaddr addr; -#endif - - len=sizeof(type); - if((result=getsockopt(sock, SOL_SOCKET, SO_TYPE, (char*)&type, &len)) != 0) { - safe_snprintf(error,errlen,"%d (%s) getting socket type", ERROR_VALUE, socket_strerror(socket_errno,err,sizeof(err))); - return(result); - } -#ifdef IPPROTO_IPV6 - len=sizeof(addr); - if((result=getsockname(sock, &addr.addr, &len)) != 0) { - safe_snprintf(error,errlen,"%d (%s) getting socket name", ERROR_VALUE, socket_strerror(socket_errno,err,sizeof(err))); - return(result); - } -#endif - for(i=0;socket_options[i].name!=NULL;i++) { - if(socket_options[i].type != 0 - && socket_options[i].type != type) - continue; -#ifdef IPPROTO_IPV6 - if(addr.addr.sa_family != AF_INET6 && socket_options[i].level == IPPROTO_IPV6) - continue; -#endif - name = socket_options[i].name; - if(!iniValueExists(list, section, name)) - continue; - value=iniGetInteger(list, section, name, 0); - - vp=(BYTE*)&value; - len=sizeof(value); - - level = socket_options[i].level; - option = socket_options[i].value; - - if(option == SO_LINGER) { - if(value) { - linger.l_onoff = TRUE; - linger.l_linger = value; - } else { - ZERO_VAR(linger); - } - vp=(BYTE*)&linger; - len=sizeof(linger); - } - - if((result=setsockopt(sock,level,option,(const char *)vp,len)) != 0) { - safe_snprintf(error,errlen,"%d (%s) setting socket option (%s, %d) to %d" - ,ERROR_VALUE, socket_strerror(socket_errno,err,sizeof(err)), name, option, value); - return(result); - } - } - - return(0); -} - -static ulong parseIpAddress(const char* value) -{ - if(strchr(value,'.')==NULL) - return(strtol(value,NULL,0)); - - return(ntohl(inet_addr(value))); -} - -static struct in6_addr parseIp6Address(const char* value) -{ - struct addrinfo hints = {0}; - struct addrinfo *res, *cur; - struct in6_addr ret = {{{0}}}; - - hints.ai_flags = AI_NUMERICHOST|AI_PASSIVE; - if(getaddrinfo(value, NULL, &hints, &res)) - return ret; - - for(cur = res; cur; cur++) { - if(cur->ai_addr->sa_family == AF_INET6) - break; - } - if(!cur) { - freeaddrinfo(res); - return ret; - } - memcpy(&ret, &((struct sockaddr_in6 *)(cur->ai_addr))->sin6_addr, sizeof(ret)); - freeaddrinfo(res); - return ret; -} - -ulong iniReadIpAddress(FILE* fp, const char* section, const char* key, ulong deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseIpAddress(value)); -} - -struct in6_addr iniReadIp6Address(FILE* fp, const char* section, const char* key, struct in6_addr deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseIp6Address(value)); -} - -ulong iniGetIpAddress(str_list_t list, const char* section, const char* key, ulong deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseIpAddress(vp)); -} - -struct in6_addr iniGetIp6Address(str_list_t list, const char* section, const char* key, struct in6_addr deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseIp6Address(vp)); -} - -#endif /* !NO_SOCKET_SUPPORT */ - -char* iniFileName(char* dest, size_t maxlen, const char* indir, const char* infname) -{ - char dir[MAX_PATH+1]; - char fname[MAX_PATH+1]; - char ext[MAX_PATH+1]; - char* p; - - SAFECOPY(dir,indir); - backslash(dir); - SAFECOPY(fname,infname); - ext[0]=0; - if((p=getfext(fname))!=NULL) { - SAFECOPY(ext,p); - *p=0; - } - -#if !defined(NO_SOCKET_SUPPORT) - { - char hostname[128]; - - if(gethostname(hostname,sizeof(hostname))==0) { - safe_snprintf(dest,maxlen,"%s%s.%s%s",dir,fname,hostname,ext); - if(fexistcase(dest)) /* path/file.host.domain.ini */ - return(dest); - if((p=strchr(hostname,'.'))!=NULL) { - *p=0; - safe_snprintf(dest,maxlen,"%s%s.%s%s",dir,fname,hostname,ext); - if(fexistcase(dest)) /* path/file.host.ini */ - return(dest); - } - } - } -#endif - - safe_snprintf(dest,maxlen,"%s%s.%s%s",dir,fname,PLATFORM_DESC,ext); - if(fexistcase(dest)) /* path/file.platform.ini */ - return(dest); - - safe_snprintf(dest,maxlen,"%s%s%s",dir,fname,ext); - fexistcase(dest); /* path/file.ini */ - return(dest); -} - -double iniReadFloat(FILE* fp, const char* section, const char* key, double deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(atof(value)); -} - -double iniGetFloat(str_list_t list, const char* section, const char* key, double deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(atof(vp)); -} - -BOOL iniReadBool(FILE* fp, const char* section, const char* key, BOOL deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseBool(value)); -} - -BOOL iniGetBool(str_list_t list, const char* section, const char* key, BOOL deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseBool(vp)); -} - -static BOOL validDate(struct tm* tm) -{ - return(tm->tm_mon && tm->tm_mon<=12 - && tm->tm_mday && tm->tm_mday<=31); -} - -static time_t fixedDateTime(struct tm* tm, const char* tstr, char pm) -{ - if(tm->tm_year<70) - tm->tm_year+=100; /* 05 == 2005 (not 1905) and 70 == 1970 (not 2070) */ - else if(tm->tm_year>1900) - tm->tm_year-=1900; - if(tm->tm_mon) - tm->tm_mon--; /* zero-based month field */ - - /* hh:mm:ss [p] */ - sscanf(tstr,"%u:%u:%u",&tm->tm_hour,&tm->tm_min,&tm->tm_sec); - if(tm->tm_hour < 12 && (toupper(pm)=='P' || strchr(tstr,'p') || strchr(tstr,'P'))) - tm->tm_hour += 12; /* pm, correct for 24 hour clock */ - - tm->tm_isdst=-1; /* auto-detect */ - - return(mktime(tm)); -} - -static int getMonth(const char* month) -{ - char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec",NULL}; - int i; - - for(i=0;mon[i]!=NULL;i++) - if(strnicmp(month,mon[i],3)==0) - return(i+1); - - return(atoi(month)); -} - -static time_t parseDateTime(const char* value) -{ - char month[INI_MAX_VALUE_LEN]; - char tstr[INI_MAX_VALUE_LEN]; - char pm=0; - time_t t; - struct tm tm; - struct tm curr_tm; - isoDate_t isoDate; - isoTime_t isoTime; - - ZERO_VAR(tm); - tstr[0]=0; - - /* Use current month and year as default */ - t=time(NULL); - if(localtime_r(&t,&curr_tm)!=NULL) { - tm.tm_mon=curr_tm.tm_mon+1; /* convert to one-based (reversed later) */ - tm.tm_year=curr_tm.tm_year; - } - - /* CCYYMMDDTHHMMSS <--- ISO-8601 date and time format */ - if(sscanf(value,"%uT%u" - ,&isoDate,&isoTime)>=2) - return(isoDateTime_to_time(isoDate,isoTime)); - - /* DD.MM.[CC]YY [time] [p] <-- Euro/Canadian numeric date format */ - if(sscanf(value,"%u.%u.%u %s %c" - ,&tm.tm_mday,&tm.tm_mon,&tm.tm_year,tstr,&pm)>=2 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,pm)); - - /* MM/DD/[CC]YY [time] [p] <-- American numeric date format */ - if(sscanf(value,"%u%*c %u%*c %u %s %c" - ,&tm.tm_mon,&tm.tm_mday,&tm.tm_year,tstr,&pm)>=2 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,pm)); - - /* DD[-]Mon [CC]YY [time] [p] <-- Perversion of RFC822 date format */ - if(sscanf(value,"%u%*c %s %u %s %c" - ,&tm.tm_mday,month,&tm.tm_year,tstr,&pm)>=2 - && (tm.tm_mon=getMonth(month))!=0 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,pm)); - - /* Wday, DD Mon YYYY [time] <-- IETF standard (RFC2822) date format */ - if(sscanf(value,"%*s %u %s %u %s" - ,&tm.tm_mday,month,&tm.tm_year,tstr)>=2 - && (tm.tm_mon=getMonth(month))!=0 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,0)); - - /* Mon DD[,] [CC]YY [time] [p] <-- Preferred date format */ - if(sscanf(value,"%s %u%*c %u %s %c" - ,month,&tm.tm_mday,&tm.tm_year,tstr,&pm)>=2 - && (tm.tm_mon=getMonth(month))!=0 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,pm)); - - /* Wday Mon DD YYYY [time] <-- JavaScript (SpiderMonkey) Date.toString() format */ - if(sscanf(value,"%*s %s %u %u %s" - ,month,&tm.tm_mday,&tm.tm_year,tstr)>=2 - && (tm.tm_mon=getMonth(month))!=0 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,0)); - - /* Wday Mon DD [time] YYYY <-- ctime() format */ - if(sscanf(value,"%*s %s %u %s %u" - ,month,&tm.tm_mday,tstr,&tm.tm_year)>=2 - && (tm.tm_mon=getMonth(month))!=0 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,0)); - - if((t=xpDateTime_to_time(isoDateTimeStr_parse(value))) != INVALID_TIME) - return t; - - return(strtoul(value,NULL,0)); -} - -time_t iniReadDateTime(FILE* fp, const char* section, const char* key, time_t deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseDateTime(value)); -} - -time_t iniGetDateTime(str_list_t list, const char* section, const char* key, time_t deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseDateTime(vp)); -} - -static unsigned parseEnum(const char* value, str_list_t names, unsigned deflt) -{ - unsigned i,count; - char val[INI_MAX_VALUE_LEN]; - char* p=val; - char* endptr; - - /* Strip trailing words (enums must be a single word with no white-space) */ - /* to support comments following enum values */ - SAFECOPY(val,value); - FIND_WHITESPACE(p); - *p=0; - - if((count=strListCount(names)) == 0) - return 0; - - /* Look for exact matches first */ - for(i=0; i<count; i++) - if(stricmp(names[i],val)==0) - return(i); - - /* Look for partial matches second */ - for(i=0; i<count; i++) - if(strnicmp(names[i],val,strlen(val))==0) - return(i); - - i=strtoul(val, &endptr, 0); - if(*endptr != 0 && !IS_WHITESPACE(*endptr)) - return deflt; - if(i>=count) - i=count-1; - return i; -} - -unsigned* parseEnumList(const char* values, const char* sep, const char** names, unsigned* count) -{ - char* vals; - str_list_t list; - unsigned* enum_list; - size_t i; - - *count=0; - - if(values==NULL) - return NULL; - - if((vals=strdup(values)) == NULL) - return NULL; - - list=splitList(vals, sep); - - free(vals); - - if((*count=strListCount(list)) < 1) { - strListFree(&list); - return NULL; - } - - if((enum_list=(unsigned *)malloc((*count)*sizeof(unsigned)))!=NULL) { - for(i=0;i<*count;i++) - enum_list[i]=parseEnum(list[i], names, /* default: */0); - } - - strListFree(&list); - - return enum_list; -} - -unsigned iniReadEnum(FILE* fp, const char* section, const char* key, str_list_t names, unsigned deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseEnum(value,names,deflt)); -} - -unsigned* iniReadEnumList(FILE* fp, const char* section, const char* key - ,str_list_t names, unsigned* cp - ,const char* sep, const char* deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - unsigned count; - - if(cp==NULL) - cp=&count; - - *cp=0; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL || *value==0 /* blank */) - value=(char*)deflt; - - return(parseEnumList(value, sep, names, cp)); -} - -unsigned iniGetEnum(str_list_t list, const char* section, const char* key, str_list_t names, unsigned deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseEnum(vp,names, deflt)); -} - -unsigned* iniGetEnumList(str_list_t list, const char* section, const char* key - ,str_list_t names, unsigned* cp, const char* sep, const char* deflt) -{ - char* vp=NULL; - unsigned count; - - if(cp==NULL) - cp=&count; - - *cp=0; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0 /* blank value or missing key */) { - if(deflt==NULL) - return(NULL); - vp=(char*)deflt; - } - return(parseEnumList(vp, sep, names, cp)); -} - -static long parseNamedInt(const char* value, named_long_t* names) -{ - unsigned i; - - /* Look for exact matches first */ - for(i=0; names[i].name!=NULL; i++) - if(stricmp(names[i].name,value)==0) - return(names[i].value); - - /* Look for partial matches second */ - for(i=0; names[i].name!=NULL; i++) - if(strnicmp(names[i].name,value,strlen(value))==0) - return(names[i].value); - - return(parseInteger(value)); -} - -long iniReadNamedInt(FILE* fp, const char* section, const char* key - ,named_long_t* names, long deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseNamedInt(value,names)); -} - -long iniGetNamedInt(str_list_t list, const char* section, const char* key - ,named_long_t* names, long deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseNamedInt(vp,names)); -} - -static ulong parseNamedLongInt(const char* value, named_ulong_t* names) -{ - unsigned i; - - /* Look for exact matches first */ - for(i=0; names[i].name!=NULL; i++) - if(stricmp(names[i].name,value)==0) - return(names[i].value); - - /* Look for partial matches second */ - for(i=0; names[i].name!=NULL; i++) - if(strnicmp(names[i].name,value,strlen(value))==0) - return(names[i].value); - - return(parseLongInteger(value)); -} - -ulong iniReadNamedLongInt(FILE* fp, const char* section, const char* key - ,named_ulong_t* names, ulong deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseNamedLongInt(value,names)); -} - -ulong iniGetNamedLongInt(str_list_t list, const char* section, const char* key - ,named_ulong_t* names, ulong deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseNamedLongInt(vp,names)); -} - -static double parseNamedFloat(const char* value, named_double_t* names) -{ - unsigned i; - - /* Look for exact matches first */ - for(i=0; names[i].name!=NULL; i++) - if(stricmp(names[i].name,value)==0) - return(names[i].value); - - /* Look for partial matches second */ - for(i=0; names[i].name!=NULL; i++) - if(strnicmp(names[i].name,value,strlen(value))==0) - return(names[i].value); - - return(atof(value)); -} - -double iniReadNamedFloat(FILE* fp, const char* section, const char* key - ,named_double_t* names, double deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseNamedFloat(value,names)); -} - -double iniGetNamedFloat(str_list_t list, const char* section, const char* key - ,named_double_t* names, double deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseNamedFloat(vp,names)); -} - -static ulong parseBitField(char* value, ini_bitdesc_t* bitdesc) -{ - int i; - char* p; - char* tp; - ulong v=0; - - for(p=value;*p;) { - tp=strchr(p,INI_BIT_SEP); - if(tp!=NULL) - *tp=0; - truncsp(p); - - for(i=0;bitdesc[i].name;i++) - if(!stricmp(bitdesc[i].name,p)) - break; - - if(bitdesc[i].name) - v|=bitdesc[i].bit; - else - v|=strtoul(p,NULL,0); - - if(tp==NULL) - break; - - p=tp+1; - SKIP_WHITESPACE(p); - } - - return(v); -} - -ulong iniReadBitField(FILE* fp, const char* section, const char* key, - ini_bitdesc_t* bitdesc, ulong deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) /* missing key */ - return(deflt); - - return(parseBitField(value,bitdesc)); -} - -ulong iniGetBitField(str_list_t list, const char* section, const char* key, - ini_bitdesc_t* bitdesc, ulong deflt) -{ - char* vp=NULL;; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL) /* missing key */ - return(deflt); - - return(parseBitField(vp,bitdesc)); -} - -int* parseIntList(const char* values, const char* sep, unsigned* count) -{ - char* vals; - str_list_t list; - int* int_list; - size_t i; - - *count = 0; - - if(values == NULL) - return NULL; - - if((vals = strdup(values)) == NULL) - return NULL; - - list = splitList(vals, sep); - - free(vals); - - if((*count = strListCount(list)) < 1) { - strListFree(&list); - return NULL; - } - - if((int_list = malloc((*count)*sizeof(int))) != NULL) { - for(i = 0; i < *count; i++) - int_list[i] = atoi(list[i]); - } - - strListFree(&list); - - return int_list; -} - -int* iniGetIntList(str_list_t list, const char* section, const char* key - ,unsigned* cp, const char* sep, const char* deflt) -{ - char* vp=NULL; - unsigned count; - - if(cp == NULL) - cp = &count; - - *cp=0; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp == NULL || *vp == 0 /* blank value or missing key */) { - if(deflt == NULL) - return NULL; - vp = (char*)deflt; - } - return parseIntList(vp, sep, cp); -} - -int* iniReadIntList(FILE* fp, const char* section, const char* key - ,unsigned* cp, const char* sep, const char* deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - unsigned count; - - if(cp == NULL) - cp = &count; - - *cp = 0; - - if((value = read_value(fp, section, key, buf, /* literals_supported: */FALSE)) == NULL || *value == 0 /* blank */) - value = (char*)deflt; - - return parseIntList(value, sep, cp); -} - -FILE* iniOpenFile(const char* fname, BOOL create) -{ - char* mode="r+"; - - if(create && !fexist(fname)) - mode="w+"; - - return(fopen(fname,mode)); -} - -BOOL iniCloseFile(FILE* fp) -{ - return(fclose(fp)==0); -} - -str_list_t iniReadFile(FILE* fp) -{ - char str[INI_MAX_LINE_LEN]; - char err[512]; - char* p; - size_t i; - size_t inc_len; - size_t inc_counter=0; - str_list_t list; - FILE* insert_fp=NULL; - - if(fp!=NULL) - rewind(fp); - - list = strListReadFile(fp, NULL, INI_MAX_LINE_LEN); - if(list==NULL) - return(NULL); - - /* Look for !include directives */ - inc_len=strlen(INI_INCLUDE_DIRECTIVE); - for(i=0; list[i]!=NULL; i++) { - if(strnicmp(list[i],INI_INCLUDE_DIRECTIVE,inc_len)==0) { - glob_t gl = {0}; - size_t j; - p=list[i]+inc_len; - SKIP_WHITESPACE(p); - truncsp(p); - (void)glob(p, GLOB_MARK, NULL, &gl); - safe_snprintf(str, sizeof(str), "; %s - %lu matches found", list[i], (ulong)gl.gl_pathc); - strListReplace(list, i, str); - for(j = 0; j < gl.gl_pathc; j++) { - char* fname = gl.gl_pathv[j]; - if(*lastchar(fname) == '/') - continue; - if(inc_counter >= INI_INCLUDE_MAX) - SAFEPRINTF2(str, "; %s - MAXIMUM INCLUDES REACHED: %u", fname, INI_INCLUDE_MAX); - else if((insert_fp=fopen(fname,"r"))==NULL) - SAFEPRINTF2(str, "; %s - FAILURE: %s", fname, safe_strerror(errno, err, sizeof(err))); - else - SAFEPRINTF(str, "; %s", fname); - strListInsert(&list, str, i + 1); - if(insert_fp!=NULL) { - strListInsertFile(insert_fp, &list, i + 2, INI_MAX_LINE_LEN); - fclose(insert_fp); - insert_fp=NULL; - inc_counter++; - } - } - globfree(&gl); - } - } - - /* truncate new-line chars off end of strings */ - for(i=0; list[i]!=NULL; i++) - truncnl(list[i]); - - return(list); -} - -BOOL iniHasInclude(const str_list_t list) -{ - size_t i; - - /* Look for !include directives */ - size_t inc_len=strlen(INI_INCLUDE_DIRECTIVE) + 1; - for(i=0; list[i]!=NULL; i++) { - if(strnicmp(list[i], ";" INI_INCLUDE_DIRECTIVE, inc_len)==0) - return TRUE; - } - return FALSE; -} - -BOOL iniWriteFile(FILE* fp, const str_list_t list) -{ - size_t count; - long pos; - - rewind(fp); - count = strListWriteFile(fp,list,"\n"); - fflush(fp); - pos = ftell(fp); - if (pos == -1) - return (FALSE); - if(chsize(fileno(fp), pos)!=0) /* truncate */ - return(FALSE); - - return(count == strListCount(list)); -} - -#ifdef INI_FILE_TEST -void main(int argc, char** argv) -{ - int i; - size_t l; - char str[128]; - FILE* fp; - str_list_t list; - - for(i=1;i<argc;i++) { - if((fp=iniOpenFile(argv[i],FALSE)) == NULL) { - perror(argv[i]); - continue; - } - if((list=iniReadFile(fp)) != NULL) { - iniSortSections(&list, TRUE); - for(size_t j = 0; list[j] != NULL; j++) - printf("%s\n", list[j]); - strListFree(&list); - } - fclose(fp); - } -} -#endif diff --git a/xpdev/ini_file.h b/xpdev/ini_file.h deleted file mode 100644 index 5830995..0000000 --- a/xpdev/ini_file.h +++ /dev/null @@ -1,293 +0,0 @@ -/* Functions to parse ini (initialization / configuration) files */ - -/* $Id: ini_file.h,v 1.60 2020/04/03 18:41:45 rswindell Exp $ */ -// vi: tabstop=4 - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _INI_FILE_H -#define _INI_FILE_H - -#if !defined(NO_SOCKET_SUPPORT) - #include "sockwrap.h" /* inet_addr, SOCKET */ -#endif -#include "genwrap.h" -#include "str_list.h" /* strList_t */ - -#define INI_MAX_VALUE_LEN 1024 /* Maximum value length, includes '\0' */ -#define ROOT_SECTION NULL - -typedef struct { - ulong bit; - const char* name; -} ini_bitdesc_t; - -typedef struct { - int key_len; - char* key_prefix; - char* section_separator; - char* value_separator; - char* bit_separator; - char* literal_separator; -} ini_style_t; - -#if defined(__cplusplus) -extern "C" { -#endif - -/* Read all section names and return as an allocated string list */ -/* Optionally (if prefix!=NULL), returns a subset of section names */ -DLLEXPORT str_list_t iniReadSectionList(FILE*, const char* prefix); -/* Returns number (count) of sections */ -DLLEXPORT size_t iniReadSectionCount(FILE*, const char* prefix); -/* Read all key names and return as an allocated string list */ -DLLEXPORT str_list_t iniReadKeyList(FILE*, const char* section); -/* Read all key and value pairs and return as a named string list */ -DLLEXPORT named_string_t** - iniReadNamedStringList(FILE*, const char* section); - -/* Return the supported Log Levels in a string list - for *LogLevel macros */ -DLLEXPORT str_list_t iniLogLevelStringList(void); - -/* Return the unparsed/converted value */ -DLLEXPORT char* iniReadValue(FILE*, const char* section, const char* key - ,const char* deflt, char* value); -DLLEXPORT char* iniReadExistingValue(FILE*, const char* section, const char* key - ,const char* deflt, char* value); - -/* These functions read a single key of the specified type */ -DLLEXPORT char* iniReadString(FILE*, const char* section, const char* key - ,const char* deflt, char* value); -/* If the key doesn't exist, iniReadExistingString just returns NULL */ -DLLEXPORT char* iniReadExistingString(FILE*, const char* section, const char* key - ,const char* deflt, char* value); -DLLEXPORT str_list_t iniReadStringList(FILE*, const char* section, const char* key - ,const char* sep, const char* deflt); -DLLEXPORT long iniReadInteger(FILE*, const char* section, const char* key - ,long deflt); -DLLEXPORT ushort iniReadShortInt(FILE*, const char* section, const char* key - ,ushort deflt); -DLLEXPORT ulong iniReadLongInt(FILE*, const char* section, const char* key - ,ulong deflt); -DLLEXPORT int64_t iniReadBytes(FILE*, const char* section, const char* key - ,ulong unit, int64_t deflt); -DLLEXPORT double iniReadDuration(FILE*, const char* section, const char* key - ,double deflt); -DLLEXPORT double iniReadFloat(FILE*, const char* section, const char* key - ,double deflt); -DLLEXPORT BOOL iniReadBool(FILE*, const char* section, const char* key - ,BOOL deflt); -DLLEXPORT time_t iniReadDateTime(FILE*, const char* section, const char* key - ,time_t deflt); -DLLEXPORT unsigned iniReadEnum(FILE*, const char* section, const char* key - ,str_list_t names, unsigned deflt); -DLLEXPORT unsigned* iniReadEnumList(FILE*, const char* section, const char* key - ,str_list_t names, unsigned* count, const char* sep, const char* deflt); -DLLEXPORT int* iniReadIntList(FILE*, const char* section, const char* key - ,unsigned* count, const char* sep, const char* deflt); -DLLEXPORT long iniReadNamedInt(FILE*, const char* section, const char* key - ,named_long_t*, long deflt); -DLLEXPORT ulong iniReadNamedLongInt(FILE*, const char* section, const char* key - ,named_ulong_t*, ulong deflt); -DLLEXPORT double iniReadNamedFloat(FILE*, const char* section, const char* key - ,named_double_t*, double deflt); -DLLEXPORT ulong iniReadBitField(FILE*, const char* section, const char* key - ,ini_bitdesc_t* bitdesc, ulong deflt); -#define iniReadLogLevel(f,s,k,d) iniReadEnum(f,s,k,iniLogLevelStringList(),d) - -/* Free string list returned from iniRead*List functions */ -DLLEXPORT void* iniFreeStringList(str_list_t list); - -/* Free named string list returned from iniReadNamedStringList */ -DLLEXPORT void* iniFreeNamedStringList(named_string_t** list); - - -/* File I/O Functions */ -DLLEXPORT char* iniFileName(char* dest, size_t maxlen, const char* dir, const char* fname); -DLLEXPORT FILE* iniOpenFile(const char* fname, BOOL create); -DLLEXPORT str_list_t iniReadFile(FILE*); -DLLEXPORT BOOL iniWriteFile(FILE*, const str_list_t); -DLLEXPORT BOOL iniCloseFile(FILE*); - -/* StringList functions */ -DLLEXPORT str_list_t iniGetSectionList(str_list_t list, const char* prefix); -DLLEXPORT size_t iniGetSectionCount(str_list_t list, const char* prefix); -DLLEXPORT str_list_t iniGetKeyList(str_list_t list, const char* section); -DLLEXPORT named_string_t** - iniGetNamedStringList(str_list_t list, const char* section); - -/* Return the unparsed value (string literals not supported): */ -DLLEXPORT char* iniGetValue(str_list_t, const char* section, const char* key - ,const char* deflt, char* value /* may be NULL */); -DLLEXPORT char* iniGetExistingValue(str_list_t, const char* section, const char* key - ,const char* deflt, char* value /* may be NULL */); - -/* Return the string value (potentially string literals separated by colon rather than equal): */ -DLLEXPORT char* iniGetString(str_list_t, const char* section, const char* key - ,const char* deflt, char* value /* may be NULL */); -/* If the key doesn't exist, iniGetExistingString just returns NULL */ -DLLEXPORT char* iniGetExistingString(str_list_t, const char* section, const char* key - ,const char* deflt, char* value /* may be NULL */); -DLLEXPORT str_list_t iniGetStringList(str_list_t, const char* section, const char* key - ,const char* sep, const char* deflt); -DLLEXPORT long iniGetInteger(str_list_t, const char* section, const char* key - ,long deflt); -DLLEXPORT ushort iniGetShortInt(str_list_t, const char* section, const char* key - ,ushort deflt); -DLLEXPORT ulong iniGetLongInt(str_list_t, const char* section, const char* key - ,ulong deflt); -DLLEXPORT int64_t iniGetBytes(str_list_t, const char* section, const char* key - ,ulong unit, int64_t deflt); -DLLEXPORT double iniGetDuration(str_list_t, const char* section, const char* key - ,double deflt); -DLLEXPORT double iniGetFloat(str_list_t, const char* section, const char* key - ,double deflt); -DLLEXPORT BOOL iniGetBool(str_list_t, const char* section, const char* key - ,BOOL deflt); -DLLEXPORT time_t iniGetDateTime(str_list_t, const char* section, const char* key - ,time_t deflt); -DLLEXPORT unsigned iniGetEnum(str_list_t, const char* section, const char* key - ,str_list_t names, unsigned deflt); -DLLEXPORT unsigned* iniGetEnumList(str_list_t, const char* section, const char* key - ,str_list_t names, unsigned* count, const char* sep, const char* deflt); -DLLEXPORT int* iniGetIntList(str_list_t, const char* section, const char* key - ,unsigned* count, const char* sep, const char* deflt); -DLLEXPORT long iniGetNamedInt(str_list_t, const char* section, const char* key - ,named_long_t*, long deflt); -DLLEXPORT ulong iniGetNamedLongInt(str_list_t, const char* section, const char* key - ,named_ulong_t*, ulong deflt); -DLLEXPORT double iniGetNamedFloat(str_list_t, const char* section, const char* key - ,named_double_t*, double deflt); -DLLEXPORT ulong iniGetBitField(str_list_t, const char* section, const char* key - ,ini_bitdesc_t* bitdesc, ulong deflt); -DLLEXPORT str_list_t iniGetSection(str_list_t, const char *section); -#define iniGetLogLevel(l,s,k,d) iniGetEnum(l,s,k,iniLogLevelStringList(),d) - -#if !defined(NO_SOCKET_SUPPORT) -DLLEXPORT ulong iniReadIpAddress(FILE*, const char* section, const char* key - ,ulong deflt); -DLLEXPORT ulong iniGetIpAddress(str_list_t, const char* section, const char* key - ,ulong deflt); -DLLEXPORT char* iniSetIpAddress(str_list_t*, const char* section, const char* key, ulong value - ,ini_style_t*); -DLLEXPORT struct in6_addr - iniReadIp6Address(FILE*, const char* section, const char* key - ,struct in6_addr deflt); -DLLEXPORT struct in6_addr - iniGetIp6Address(str_list_t, const char* section, const char* key - ,struct in6_addr deflt); -DLLEXPORT char* iniSetIp6Address(str_list_t*, const char* section, const char* key, struct in6_addr value - ,ini_style_t*); -DLLEXPORT int iniGetSocketOptions(str_list_t, const char* section - ,SOCKET sock, char* error, size_t errlen); -#endif - -DLLEXPORT void iniSetDefaultStyle(ini_style_t); - -DLLEXPORT char* iniSetString(str_list_t*, const char* section, const char* key, const char* value - ,ini_style_t*); -DLLEXPORT char* iniSetStringLiteral(str_list_t*, const char* section, const char* key, const char* value - ,ini_style_t*); -DLLEXPORT char* iniSetValue(str_list_t*, const char* section, const char* key, const char* value - ,ini_style_t*); -DLLEXPORT char* iniSetInteger(str_list_t*, const char* section, const char* key, long value - ,ini_style_t*); -DLLEXPORT char* iniSetShortInt(str_list_t*, const char* section, const char* key, ushort value - ,ini_style_t*); -DLLEXPORT char* iniSetLongInt(str_list_t*, const char* section, const char* key, ulong value - ,ini_style_t*); -DLLEXPORT char* iniSetBytes(str_list_t*, const char* section, const char* key, ulong unit, int64_t value - ,ini_style_t*); -DLLEXPORT char* iniSetDuration(str_list_t*, const char* section, const char* key, double value - ,ini_style_t*); -DLLEXPORT char* iniSetHexInt(str_list_t*, const char* section, const char* key, ulong value - ,ini_style_t*); -DLLEXPORT char* iniSetFloat(str_list_t*, const char* section, const char* key, double value - ,ini_style_t*); -DLLEXPORT char* iniSetBool(str_list_t*, const char* section, const char* key, BOOL value - ,ini_style_t*); -DLLEXPORT char* iniSetDateTime(str_list_t*, const char* section, const char* key, BOOL include_time, time_t - ,ini_style_t*); -DLLEXPORT char* iniSetEnum(str_list_t*, const char* section, const char* key, str_list_t names - ,unsigned value, ini_style_t*); -DLLEXPORT char* iniSetEnumList(str_list_t*, const char* section, const char* key - ,const char* sep, str_list_t names, unsigned* values, unsigned count, ini_style_t*); -DLLEXPORT char* iniSetNamedInt(str_list_t*, const char* section, const char* key, named_long_t* - ,long value, ini_style_t*); -DLLEXPORT char* iniSetNamedHexInt(str_list_t*, const char* section, const char* key, named_ulong_t* - ,ulong value, ini_style_t*); -DLLEXPORT char* iniSetNamedLongInt(str_list_t*, const char* section, const char* key, named_ulong_t* - ,ulong value, ini_style_t*); -DLLEXPORT char* iniSetNamedFloat(str_list_t*, const char* section, const char* key, named_double_t* - ,double value, ini_style_t*); -DLLEXPORT char* iniSetBitField(str_list_t*, const char* section, const char* key, ini_bitdesc_t*, ulong value - ,ini_style_t*); -DLLEXPORT char* iniSetStringList(str_list_t*, const char* section, const char* key - ,const char* sep, str_list_t value, ini_style_t*); -#define iniSetLogLevel(l,s,k,v,style) iniSetEnum(l,s,k,iniLogLevelStringList(),v,style) -DLLEXPORT char* iniSetIntList(str_list_t*, const char* section, const char* key - ,const char* sep, int* value, unsigned count, ini_style_t*); - -DLLEXPORT size_t iniAddSection(str_list_t*, const char* section - ,ini_style_t*); - -DLLEXPORT size_t iniAppendSection(str_list_t*, const char* section - ,ini_style_t*); - -DLLEXPORT size_t iniAppendSectionWithKeys(str_list_t*, const char* section, const str_list_t keys - ,ini_style_t*); - -DLLEXPORT BOOL iniSectionExists(str_list_t, const char* section); -DLLEXPORT BOOL iniKeyExists(str_list_t, const char* section, const char* key); -DLLEXPORT BOOL iniValueExists(str_list_t, const char* section, const char* key); -DLLEXPORT char* iniPopKey(str_list_t*, const char* section, const char* key, char* value); -DLLEXPORT char* iniPopString(str_list_t*, const char* section, const char* key, char* value); -DLLEXPORT BOOL iniRemoveKey(str_list_t*, const char* section, const char* key); -DLLEXPORT BOOL iniRemoveValue(str_list_t*, const char* section, const char* key); -DLLEXPORT BOOL iniRemoveSection(str_list_t*, const char* section); -DLLEXPORT BOOL iniRemoveSections(str_list_t*, const char* prefix); -DLLEXPORT BOOL iniRenameSection(str_list_t*, const char* section, const char* newname); -DLLEXPORT BOOL iniSortSections(str_list_t*, BOOL sort_keys); - -DLLEXPORT BOOL iniHasInclude(const str_list_t); - -/* - * Too handy to leave internal - */ -DLLEXPORT unsigned* parseEnumList(const char* values, const char* sep, const char** const names, unsigned* count); -DLLEXPORT int* parseIntList(const char* values, const char* sep, unsigned* count); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/ini_file.txt b/xpdev/ini_file.txt deleted file mode 100644 index 92c65d2..0000000 --- a/xpdev/ini_file.txt +++ /dev/null @@ -1,213 +0,0 @@ -$Id: ini_file.txt,v 1.2 2005/10/13 10:16:07 rswindell Exp $ - -Synchronet/xpdev ini_file module --------------------------------- -The basic format of the files supported by the xpdev ini_file module is that -of the Windows .ini file, with some additional features. - -The basic Windows .ini file format is as follows: - -1. The file contains ASCII text only with LF or CR/LF-terminated lines. - -2. The file is separated into logical "sections". Each section may have its - own list of keys with associated values, one per line. - -3. A section begins with a line consisting only of "[" <section name> "]". - -4. White space before or after the section name is ignored. - -5. A section ends when the end of file is reached or a new section begins. - -6. Keys and associated values within a section are specified, each on their - line, in the format: <key_name> "=" <value> - -7. White space before and after the key/value separator ("=") is ignored. - -8. Comments are lines with a semicolon (";") as the first non-whitespace - character. - -9. Blank lines between or within sections are ignored. - -Example basic Windows .ini file content: - -; for 16-bit app support -[fonts] -[extensions] -[Mail] -MAPI=1 -CMCDLLNAME32=mapi32.dll -CMCDLLNAME=mapi.dll -CMC=1 -MAPIX=1 -MAPIXVER=1.0.0.1 -OLEMessaging=1 -[SciCalc] -layout=0 -[MSUCE] -Advanced=1 -CodePage=Unicode -Font=Terminal - - -Synchronet/xpdev extended-ini_file format -========================================= -The Synchronet/xpdev ini_file module supports a somewhat "extended" .ini file -format with the following additions: - -Filenames ---------- -INI filenames typically end in a ".ini" suffix, but that is not a requirement. - -If the application uses the ini_file module's iniFileName() function to -determine the correct ini filename for the current system, different ini files -may be used for different systems on the same network, reading from the same -directory. - -The different ini filename permutations supported (assuming "file.ini" is the -base filename) are: - - path/file.<host>.<domain>.ini - path/file.<host>.ini - path/file.<platform>.ini - path/file.ini - -Root section ------------- -Key/value pairs in the file *before* the first section definition are -considered part of the "root" section. This section is often used to define -key/value pairs that apply globally to all the following sections. The root -section may have other uses as well. - -Section Prefixes ----------------- -Section names may be include a section "prefix", a fixed portion of the -section name that may be used be the application to logically group -related sections. Section pre-fixes typically end in a colon, but that is -not a requirement. - -Literal string values ---------------------- -String values separated by the key name with a colon (':') instead of an -equals sign ('='), are parsed as "literal" strings, which means the string -will retain any trailing white-space on the line. This may be enhanced in -the future to support C escape sequences, multiple/broken lines, etc. - -Section name list ------------------ -If one wishes to specify a list of sections for all values to be applied to -they may specify a list of section names, separated by '|', where a single -section name would normally be specified. Example: -"[telnet|rlogin]" - -Boolean values --------------- -Values with an either true or false (1 or 0) state can have their value -specified as a number (0, or non-zero), or the following strings (yes, -English only): "true", "yes", or "on" (interpretted as 1), or "false", -"no", or "off" (interpretted as 0). Any otherwise unrecognized text strings -will be interpretted as 0 (false). - -Integer values --------------- -Integer values may be negative or positive whole numbers of up to -(at least) 32-bits in size. - -Integer values may be specified in octal (base 8), decimal (base 10), -hexadecimal (base 16), or base 36 formats based on the following -interpretation of the specified value text: - -If the first character is 0 and the second character is not 'x' or 'X', the -string is interpreted as an octal integer; otherwise, it is interpreted as -a decimal number. If the first character is '0' and the second character is -'x' or 'X', the string is interpreted as a hexadecimal integer. If the -first character is '1' through '9', the string is interpreted as a decimal -integer. The letters 'a' through 'z' (or 'A' through 'Z') are assigned the -values 10 through 35. - -The exception to this rule are the values of "true", "yes", or "on", -always interpretted as the value of 1 (one). - -Long integer values -------------------- -Long integer values may be positive whole numbers of up to (at least) -32-bits in size. Otherwise, long integer values are interpretted the same as -normal integer values. - -Log levels ----------- -The ini_file module includes built-in support for the standard Unix syslog -levels: Emergency (0), Alert (1), Critical (2), Error (3), Warning (4), -Notice (5), Informational (6), and Debugging (7). - -The higher the log level, the more log output will be generated. - -Partial or complete log level names may be specified for the log level -value, or the numeric equivalent. - -Byte counts ------------ -Byte count values (e.g. file sizes) may be specified as positive numbers -(fractional numbers are supported), optionally with a 'T', 'G', 'M', or 'K' -suffix to specify terabytes, gigabytes, megabytes, or kilobytes, respectively. - -Date/Time stamps ----------------- -Date and time values may be specified in any of the following formats: - -ISO-8601 date and time format: "CCYYMMDDThhmmss" -Euro/Canadian numeric date format: "DD.MM.[CC]YY [time] [p]" -American numeric date format: "MM/DD/[CC]YY [time] [p]" -Perversion of RFC822 date format: "DD[-]Mon [CC]YY [time] [p]" -IETF standard (RFC2822) date format: "Wday, DD Mon [CC]YY [time]" -Preferred date format: "Mon DD[,] [CC]YY [time] [p]" -JavaScript Date.toString() format: "Wday Mon DD [CC]YY [time]" -ctime() format: "Wday Mon DD [time] [CC]YY" -time_t format: seconds since Jan 1, 1970 UTC - -where: - CC = Century (i.e. "19" or "20") - YY = Year number (e.g. "05") - MM = Month number (1-12) - DD = Day of month (1-31) - hh = Hour of day (0-23) - mm = Minute of hour (0-59) - ss = Second of minute (0-59) - p = AM/PM designation - time = Time of day specified as "hh[:mm[:ss]]" - Mon = Month name (e.g. "Jan", "Feb", etc.) - Wday = Weekday name (e.g. "Mon", "Tue", etc.) - [] = Optional parameter - -Bit-fields ----------- -Bit-field values may be specified as a positive number (same rules of -interpretation as integer values), a bit-name, or a list of numbers or -bit-names separated by the '|' character. - -Bit-fields are often used to specify multiple boolean-type values in -a single key/value pair. - -Include directive ------------------ -An ini file may be include/imported/inserted into a another with the -"!include" directive. The line must begin with "!include", followed by -white space, and then a filename to include (optionally with a path). -Sections may span files. - -file1.ini: -[section_one] - key1 = value1 -!include file2.ini - -file2.ini: - key2 = value2 - -In the above example, both key1 and key2 are part of section_one. - -End-of-file directive ---------------------- -An ini file may be prematurely terminated with the "!eof" directive. This -stops the ini_file module functions from processing any lines following this -directive. - - diff --git a/xpdev/link_list.c b/xpdev/link_list.c deleted file mode 100644 index 2ecbfa3..0000000 --- a/xpdev/link_list.c +++ /dev/null @@ -1,963 +0,0 @@ -/* Double-Linked-list library */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> /* malloc */ -#include <string.h> /* memset */ -#include "link_list.h" -#include "genwrap.h" - -#if defined(_WIN32) && defined(LINK_LIST_USE_HEAPALLOC) - #define malloc(size) HeapAlloc(GetProcessHeap(), /* flags: */0, size) - #define free(ptr) HeapFree(GetProcessHeap(), /* flags: */0, ptr) -#endif - -link_list_t* listInit(link_list_t* list, long flags) -{ - if(list == NULL) - return NULL; - - memset(list,0,sizeof(link_list_t)); - - list->flags = flags; - -#if defined(LINK_LIST_THREADSAFE) - if(list->flags&LINK_LIST_MUTEX) { - list->mutex = pthread_mutex_initializer_np(/* recursive: */TRUE); - } - - if(list->flags&LINK_LIST_SEMAPHORE) - sem_init(&list->sem,0,0); -#endif - - if(flags&LINK_LIST_ATTACH) - listAttach(list); - - return(list); -} - -BOOL listFreeNodeData(list_node_t* node) -{ - if(node!=NULL && node->data!=NULL && !(node->flags&LINK_LIST_LOCKED)) { - free(node->data); - node->data = NULL; - return(TRUE); - } - return(FALSE); -} - -long listFreeNodes(link_list_t* list) -{ - list_node_t* node; - list_node_t* next; - - if(list==NULL) - return(-1); - - listLock(list); - - for(node=list->first; node!=NULL; node=next) { - - if(node->flags&LINK_LIST_LOCKED) - break; - - if(((list->flags&LINK_LIST_ALWAYS_FREE) || (node->flags&LINK_LIST_MALLOC)) - && !(list->flags&LINK_LIST_NEVER_FREE)) - listFreeNodeData(node); - - next = node->next; - - free(node); - - if(list->count) - list->count--; - } - - list->first = node; - if(!list->count) - list->last = NULL; - - listUnlock(list); - - return(list->count); -} - -BOOL listFree(link_list_t* list) -{ - if(list==NULL) - return(FALSE); - - if(listFreeNodes(list)) - return(FALSE); - -#if defined(LINK_LIST_THREADSAFE) - - if(list->flags&LINK_LIST_MUTEX) { - while(pthread_mutex_destroy((pthread_mutex_t*)&list->mutex)==EBUSY) - SLEEP(1); - list->flags&=~LINK_LIST_MUTEX; - } - - if(list->flags&LINK_LIST_SEMAPHORE) { - while(sem_destroy(&list->sem)==-1 && errno==EBUSY) - SLEEP(1); - //list->sem=(sem_t)NULL; /* Removed 08-20-08 - list->sem is never checked and this causes an error with gcc 4.1.2 (ThetaSigma) */ - list->flags&=~LINK_LIST_SEMAPHORE; - } -#endif - - return(TRUE); -} - -long listAttach(link_list_t* list) -{ - if(list==NULL) - return(-1); - - listLock(list); - list->refs++; - listUnlock(list); - - return(list->refs); -} - -long listDettach(link_list_t* list) -{ - int refs; - - if(list==NULL || list->refs<1) - return(-1); - - listLock(list); - if((refs=--list->refs)==0) - listFree(list); - else - listUnlock(list); - - return(refs); -} - -void* listSetPrivateData(link_list_t* list, void* p) -{ - void* old; - - if(list==NULL) - return(NULL); - - listLock(list); - old=list->private_data; - list->private_data=p; - listUnlock(list); - return(old); -} - -void* listGetPrivateData(link_list_t* list) -{ - if(list==NULL) - return(NULL); - return(list->private_data); -} - -#if defined(LINK_LIST_THREADSAFE) - -BOOL listSemPost(link_list_t* list) -{ - if(list==NULL || !(list->flags&LINK_LIST_SEMAPHORE)) - return(FALSE); - - return(sem_post(&list->sem)==0); -} - -BOOL listSemWait(link_list_t* list) -{ - if(list==NULL || !(list->flags&LINK_LIST_SEMAPHORE)) - return(FALSE); - - return(sem_wait(&list->sem)==0); -} - -BOOL listSemTryWait(link_list_t* list) -{ - if(list==NULL || !(list->flags&LINK_LIST_SEMAPHORE)) - return(FALSE); - - return(sem_trywait(&list->sem)==0); -} - -BOOL listSemTryWaitBlock(link_list_t* list, unsigned long timeout) -{ - if(list==NULL || !(list->flags&LINK_LIST_SEMAPHORE)) - return(FALSE); - - return(sem_trywait_block(&list->sem,timeout)==0); -} - -#endif - -BOOL listLock(link_list_t* list) -{ - int ret=0; - - if(list==NULL) - return(FALSE); -#if defined(LINK_LIST_THREADSAFE) - if((list->flags&LINK_LIST_MUTEX) && (ret=pthread_mutex_lock(&list->mutex))==0) -#endif - list->locks++; - return(ret==0); -} - -BOOL listIsLocked(const link_list_t* list) -{ - if(list==NULL) - return(FALSE); - return(list->locks > 0 ? TRUE : FALSE); -} - -BOOL listUnlock(link_list_t* list) -{ - int ret=0; - - if(list==NULL) - return(FALSE); -#if defined(LINK_LIST_THREADSAFE) - if((list->flags&LINK_LIST_MUTEX) && (ret=pthread_mutex_unlock(&list->mutex))==0) -#endif - list->locks--; - return(ret==0); -} - -long listCountNodes(link_list_t* list) -{ - long count=0; - list_node_t* node; - - if(list==NULL) - return(-1); - - if(list->count) - return(list->count); - - listLock(list); - - for(node=list->first; node!=NULL; node=node->next) - count++; - - listUnlock(list); - - return(count); -} - -list_node_t* listFindNode(link_list_t* list, const void* data, size_t length) -{ - list_node_t* node; - - if(list==NULL) - return(NULL); - - listLock(list); - - for(node=list->first; node!=NULL; node=node->next) { - if(length==0) { - if(node->data==data) - break; - } else if(data==NULL) { - if(node->tag==(list_node_tag_t)length) - break; - } else if(node->data!=NULL && memcmp(node->data,data,length)==0) - break; - } - - listUnlock(list); - - return(node); -} - -ulong listCountMatches(link_list_t* list, const void* data, size_t length) -{ - list_node_t* node; - ulong matches = 0; - - if(list==NULL) - return 0; - - listLock(list); - - for(node=list->first; node!=NULL; node=node->next) { - if(length==0) { - if(node->data!=data) - continue; - } else if(data==NULL) { - if(node->tag==(list_node_tag_t)length) - continue; - } else if(node->data==NULL || memcmp(node->data,data,length)!=0) - continue; - matches++; - } - - listUnlock(list); - - return matches; -} - -#ifndef NO_STR_LIST_SUPPORT - -str_list_t listStringList(link_list_t* list) -{ - list_node_t* node; - str_list_t str_list; - size_t count=0; - - if(list==NULL) - return(NULL); - - if((str_list=strListInit())==NULL) - return(NULL); - - listLock(list); - - for(node=list->first; node!=NULL; node=node->next) { - if(node->data!=NULL) - strListAppend(&str_list, (char*)node->data, count++); - } - - listUnlock(list); - - return(str_list); -} - -str_list_t listSubStringList(const list_node_t* node, long max) -{ - long count; - str_list_t str_list; - link_list_t* list; - - if(node==NULL) - return(NULL); - - if((str_list=strListInit())==NULL) - return(NULL); - - list=node->list; - listLock(list); - - for(count=0; count<max && node!=NULL; node=node->next) { - if(node->data!=NULL) - strListAppend(&str_list, (char*)node->data, count++); - } - - listUnlock(list); - - return(str_list); -} - -void* listFreeStringList(str_list_t list) -{ - strListFree(&list); - return(list); -} - -#endif /* #ifndef NO_STR_LIST_SUPPORT */ - -list_node_t* listFirstNode(link_list_t* list) -{ - list_node_t* node; - - if(list==NULL) - return(NULL); - - listLock(list); - node=list->first; - listUnlock(list); - - return(node); -} - -list_node_t* listLastNode(link_list_t* list) -{ - list_node_t* node; - list_node_t* last=NULL; - - if(list==NULL) - return(NULL); - - listLock(list); - if(list->last!=NULL) - last=list->last; - else - for(node=list->first; node!=NULL; node=node->next) - last=node; - listUnlock(list); - - return(last); -} - -long listNodeIndex(link_list_t* list, list_node_t* find_node) -{ - long i=0; - list_node_t* node; - - if(list==NULL) - return(-1); - - listLock(list); - - for(node=list->first; node!=NULL; node=node->next) - if(node==find_node) - break; - - listUnlock(list); - - if(node==NULL) - return(-1); - - return(i); -} - -list_node_t* listNodeAt(link_list_t* list, long index) -{ - long i=0; - list_node_t* node; - - if(list==NULL || index<0) - return(NULL); - - listLock(list); - - for(node=list->first; node!=NULL && i<index; node=node->next) - i++; - - listUnlock(list); - - return(node); -} - -list_node_t* listNextNode(const list_node_t* node) -{ - list_node_t* next; - - if(node==NULL) - return(NULL); - - listLock(node->list); - next=node->next; - listUnlock(node->list); - - return(next); -} - -list_node_t* listPrevNode(const list_node_t* node) -{ - list_node_t* prev; - - if(node==NULL) - return(NULL); - - listLock(node->list); - prev=node->prev; - listUnlock(node->list); - - return(prev); -} - -void* listNodeData(const list_node_t* node) -{ - void* data; - - if(node==NULL) - return(NULL); - - listLock(node->list); - data=node->data; - listUnlock(node->list); - - return(data); -} - -BOOL listNodeIsLocked(const list_node_t* node) -{ - return(node!=NULL && (node->flags&LINK_LIST_LOCKED)); -} - -BOOL listLockNode(list_node_t* node) -{ - if(node==NULL || (node->flags&LINK_LIST_LOCKED)) - return(FALSE); - - listLock(node->list); - node->flags|=LINK_LIST_LOCKED; - listUnlock(node->list); - - return(TRUE); -} - -BOOL listUnlockNode(list_node_t* node) -{ - if(!listNodeIsLocked(node)) - return(FALSE); - - listLock(node->list); - node->flags&=~LINK_LIST_LOCKED; - listUnlock(node->list); - - return(TRUE); -} - -static list_node_t* list_add_node(link_list_t* list, list_node_t* node, list_node_t* after) -{ - if(list==NULL) - return(NULL); - - listLock(list); - - node->list = list; - if(after==LAST_NODE) /* e.g. listPushNode() */ - after=list->last; - node->prev = after; - - if(after==list->last) /* append to list */ - list->last = node; - if(after==FIRST_NODE) { /* insert at beginning of list */ - node->next = list->first; - if(node->next!=NULL) - node->next->prev = node; - list->first = node; - } else { - if(after->next!=NULL) { - after->next->prev = node; - node->next = after->next; - } - after->next = node; - } - - list->count++; - - listUnlock(list); - -#if defined(LINK_LIST_THREADSAFE) - if(list->flags&LINK_LIST_SEMAPHORE) - listSemPost(list); -#endif - - return(node); -} - -list_node_t* listAddNode(link_list_t* list, void* data, list_node_tag_t tag, list_node_t* after) -{ - list_node_t* node; - - if(list==NULL) - return(NULL); - - if((node=(list_node_t*)malloc(sizeof(list_node_t)))==NULL) - return(NULL); - - memset(node,0,sizeof(list_node_t)); - node->data = data; - node->tag = tag; - - return(list_add_node(list,node,after)); -} - -long listAddNodes(link_list_t* list, void** data, list_node_tag_t* tag, list_node_t* after) -{ - long i; - list_node_t* node=NULL; - - if(data==NULL) - return(-1); - - for(i=0; data[i]!=NULL ;i++) - if((node=listAddNode(list,data[i],tag==NULL ? LIST_NODE_TAG_DEFAULT : *(tag++),node==NULL ? after:node))==NULL) - return(i); - - return(i); -} - -list_node_t* listAddNodeData(link_list_t* list, const void* data, size_t length, list_node_tag_t tag, list_node_t* after) -{ - list_node_t* node; - void* buf; - - if((buf=malloc(length))==NULL) - return(NULL); - memcpy(buf,data,length); - - if((node=listAddNode(list,buf,tag,after))==NULL) { - free(buf); - return(NULL); - } - node->flags |= LINK_LIST_MALLOC; - - return(node); -} - -list_node_t* listAddNodeString(link_list_t* list, const char* str, list_node_tag_t tag, list_node_t* after) -{ - list_node_t* node; - char* buf; - - if(str==NULL) - return(NULL); - - if((buf=strdup(str))==NULL) - return(NULL); - - if((node=listAddNode(list,buf,tag,after))==NULL) { - free(buf); - return(NULL); - } - node->flags |= LINK_LIST_MALLOC; - - return(node); -} - -#ifndef NO_STR_LIST_SUPPORT - -long listAddStringList(link_list_t* list, str_list_t str_list, list_node_tag_t* tag, list_node_t* after) -{ - long i; - list_node_t* node=NULL; - - if(str_list==NULL) - return(-1); - - for(i=0; str_list[i]!=NULL ;i++) - if((node=listAddNodeString(list,str_list[i],tag==NULL ? LIST_NODE_TAG_DEFAULT : *(tag++),node==NULL ? after:node))==NULL) - return(i); - - return(i); -} - -#endif - -long listAddNodeList(link_list_t* list, const link_list_t* src, list_node_t* after) -{ - long count=0; - list_node_t* node=NULL; - list_node_t* src_node; - - if(src==NULL) - return(-1); - - for(src_node=src->first; src_node!=NULL; src_node=src_node->next, count++) { - if((node=listAddNode(list, src_node->data, src_node->tag, node==NULL ? after:node))==NULL) - return(count); - node->flags = src_node->flags; - } - - return(count); -} - -long listMerge(link_list_t* list, const link_list_t* src, list_node_t* after) -{ - long count=0; - list_node_t* node=NULL; - list_node_t* src_node; - - if(src==NULL) - return(-1); - - for(src_node=src->first; src_node!=NULL; src_node=src_node->next, count++) - if((node=list_add_node(list, src_node, node==NULL ? after:node))==NULL) - return(count); - - return(count); -} - -link_list_t* listExtract(link_list_t* dest_list, const list_node_t* node, long max) -{ - long count; - link_list_t* list; - - if(node==NULL || node->list==NULL) - return(NULL); - - if((list=listInit(dest_list, node->list->flags))==NULL) - return(NULL); - - for(count=0; count<max && node!=NULL; node=node->next) { - listAddNode(list, node->data, node->tag, list->last); - count++; - } - - return(list); -} - -static void* list_remove_node(link_list_t* list, list_node_t* node, BOOL free_data) -{ - void* data; - - if(node==FIRST_NODE) - node=list->first; - else if(node==LAST_NODE) - node=list->last; - if(node==NULL) - return(NULL); - - if(node->flags&LINK_LIST_LOCKED) - return(NULL); - - if(node->prev!=NULL) - node->prev->next = node->next; - if(node->next!=NULL) - node->next->prev = node->prev; - if(list->first==node) - list->first = node->next; - if(list->last==node) - list->last = node->prev; - - if(free_data) - listFreeNodeData(node); - - data = node->data; - - free(node); - - if(list->count) - list->count--; - - return(data); -} - -void* listRemoveNode(link_list_t* list, list_node_t* node, BOOL free_data) -{ - void* data; - - if(list==NULL) - return(NULL); - - listLock(list); - - data = list_remove_node(list, node, free_data); - - listUnlock(list); - - return(data); -} - -void* listRemoveTaggedNode(link_list_t* list, list_node_tag_t tag, BOOL free_data) -{ - void* data=NULL; - list_node_t* node; - - if(list==NULL) - return(NULL); - - listLock(list); - - if((node=listFindTaggedNode(list, tag)) != NULL) - data = list_remove_node(list, node, free_data); - - listUnlock(list); - - return(data); -} - -long listRemoveNodes(link_list_t* list, list_node_t* node, long max, BOOL free_data) -{ - list_node_t *next_node; - long count; - - if(list==NULL) - return(-1); - - listLock(list); - - if(node==FIRST_NODE) - node=list->first; - if(node==LAST_NODE) - node=list->last; - - for(count=0; node!=NULL && count<max; node=next_node, count++) { - next_node = node->next; - if(listRemoveNode(list, node, free_data)==NULL) - break; - } - - listUnlock(list); - - return(count); -} - -BOOL listSwapNodes(list_node_t* node1, list_node_t* node2) -{ - list_node_t tmp; - - if(node1==NULL || node2==NULL || node1==node2) - return(FALSE); - - if(listNodeIsLocked(node1) || listNodeIsLocked(node2)) - return(FALSE); - - if(node1->list==NULL || node2->list==NULL) - return(FALSE); - -#if defined(LINK_LIST_THREADSAFE) - listLock(node1->list); - if(node1->list != node2->list) - listLock(node2->list); -#endif - - tmp=*node1; - node1->tag=node2->tag; - node1->data=node2->data; - node1->flags=node2->flags; - node2->tag=tmp.tag; - node2->data=tmp.data; - node2->flags=tmp.flags; - -#if defined(LINK_LIST_THREADSAFE) - listUnlock(node1->list); - if(node1->list != node2->list) - listUnlock(node2->list); -#endif - - return(TRUE); -} - -static void list_update_prev(link_list_t* list) -{ - list_node_t* node; - list_node_t* prev = NULL; - - if(list == NULL) - return; - - node = list->first; - while(node != NULL) { - node->prev = prev; - prev = node; - node = node->next; - } -} - -void listReverse(link_list_t* list) -{ - list_node_t* node; - list_node_t* prev; - - if(list == NULL) - return; - - node = list->first; - - if(node == NULL) - return; - - listLock(list); - - list->last = list->first; - - prev = NULL; - while(node != NULL) { - list_node_t* next = node->next; - node->next = prev; - prev = node; - node = next; - } - - list->first = prev; - - list_update_prev(list); - - listUnlock(list); -} - -long listVerify(link_list_t* list) -{ - list_node_t* node; - list_node_t* prev = NULL; - long result = 0; - - if(list == NULL) - return -1; - - listLock(list); - - node = list->first; - while(node != NULL) { - if(node->list != list) { - result = -2; - break; - } - if(node->prev != prev) { - result = -3; - break; - } - prev = node; - node = node->next; - result++; - } - if(result >= 0 && list->last != prev) - result = -4; - - if(result >= 0 && result != list->count) - result = -5; - - listUnlock(list); - - return result; -} - -#if 0 - -#include <stdio.h> /* printf, sprintf */ - -int main(int arg, char** argv) -{ - int i; - long result; - char* p; - char str[32]; - link_list_t list; - - listInit(&list,0); - if((result = listVerify(&list)) < 0) { - fprintf(stderr, "line %d: listVerify() returned %ld\n", __LINE__, result); - return EXIT_FAILURE; - } - - for(i=0; i<100; i++) { - sprintf(str,"%u",i); - listPushNodeString(&list,str); - } - if((result = listVerify(&list)) < 0) { - fprintf(stderr, "line %d: listVerify() returned %ld\n", __LINE__, result); - return EXIT_FAILURE; - } - - listReverse(&list); - if((result = listVerify(&list)) < 0) { - fprintf(stderr, "line %d: listVerify() returned %ld\n", __LINE__, result); - return EXIT_FAILURE; - } - - while((p=listShiftNode(&list))!=NULL) - printf("%d %s\n",listCountNodes(&list),p), free(p); - if((result = listVerify(&list)) < 0) { - fprintf(stderr, "line %d: listVerify() returned %ld\n", __LINE__, result); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} - -#endif diff --git a/xpdev/link_list.h b/xpdev/link_list.h deleted file mode 100644 index c2bf6fc..0000000 --- a/xpdev/link_list.h +++ /dev/null @@ -1,205 +0,0 @@ -/* Double-Linked-list library */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _LINK_LIST_H -#define _LINK_LIST_H - -#include <stddef.h> /* size_t */ -#include <xpdevplus.h> -#include "wrapdll.h" -#include "str_list.h" /* string list functions and types */ - -#if defined(LINK_LIST_THREADSAFE) - #include "threadwrap.h" /* mutexes */ - #include "semwrap.h" /* semaphores */ -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - -#define FIRST_NODE ((list_node_t*)NULL) /* Special value to specify first node in list */ -#define LAST_NODE ((list_node_t*)-1) /* Special value to specify last node in list */ - -/* Valid link_list_t.flags and list_node_t.flags bits */ -#define LINK_LIST_MALLOC (1<<0) /* Node data allocated with malloc() */ -#define LINK_LIST_ALWAYS_FREE (1<<1) /* ALWAYS free node data in listFreeNodes() */ -#define LINK_LIST_NEVER_FREE (1<<2) /* NEVER free node data (careful of memory leaks!) */ -#define LINK_LIST_MUTEX (1<<3) /* Mutex-protected linked-list */ -#define LINK_LIST_SEMAPHORE (1<<4) /* Semaphore attached to linked-list */ -#define LINK_LIST_LOCKED (1<<5) /* Node is locked */ -#define LINK_LIST_ATTACH (1<<6) /* Attach during init */ - -/* in case the default tag type is not sufficient for your needs, you can over-ride */ -#if !defined(list_node_tag_t) - typedef long list_node_tag_t; -#endif -#if !defined(LIST_NODE_TAG_DEFAULT) - #define LIST_NODE_TAG_DEFAULT 0 -#endif - -typedef struct list_node { - void* data; /* pointer to some kind of data */ - struct list_node* next; /* next node in list (or NULL) */ - struct list_node* prev; /* previous node in list (or NULL) */ - struct link_list* list; - unsigned long flags; /* private use flags (by this library) */ - list_node_tag_t tag; /* application use value */ -} list_node_t; - -typedef struct link_list { - list_node_t* first; /* first node in list (or NULL) */ - list_node_t* last; /* last node in list (or NULL) */ - unsigned long flags; /* private use flags (by this library) */ - long count; /* number of nodes in list */ - void* private_data; /* for use by the application/caller */ - long refs; /* reference counter (attached clients) */ - long locks; /* recursive lock counter */ -#if defined(LINK_LIST_THREADSAFE) - pthread_mutex_t mutex; - sem_t sem; -#endif -} link_list_t; - -/* Initialization, Allocation, and Freeing of Lists and Nodes */ -DLLEXPORT link_list_t* listInit(link_list_t* /* NULL to auto-allocate */, long flags); -DLLEXPORT BOOL listFree(link_list_t*); -DLLEXPORT long listFreeNodes(link_list_t*); -DLLEXPORT BOOL listFreeNodeData(list_node_t* node); - -/* Increment/decrement reference counter (and auto-free when zero), returns -1 on error */ -DLLEXPORT long listAttach(link_list_t*); -DLLEXPORT long listDetach(link_list_t*); - -#if defined(LINK_LIST_THREADSAFE) -DLLEXPORT BOOL listSemPost(link_list_t*); -DLLEXPORT BOOL listSemWait(link_list_t*); -DLLEXPORT BOOL listSemTryWait(link_list_t*); -DLLEXPORT BOOL listSemTryWaitBlock(link_list_t*, unsigned long timeout); -#endif - -/* Lock/unlock linked lists (works best for mutex-protected lists) */ -/* Locks are recursive (e.g. must call Unlock for each call to Lock */ -DLLEXPORT BOOL listLock(link_list_t*); -DLLEXPORT BOOL listUnlock(link_list_t*); -DLLEXPORT BOOL listIsLocked(const link_list_t*); -#define listForceUnlock(list) while(listUnlock(list)==TRUE) - -/* Return count or index of nodes, or -1 on error */ -DLLEXPORT long listCountNodes(link_list_t*); -DLLEXPORT long listNodeIndex(link_list_t*, list_node_t*); - -/* Get/Set list private data */ -DLLEXPORT void* listSetPrivateData(link_list_t*, void*); -DLLEXPORT void* listGetPrivateData(link_list_t*); - -/* Return an allocated string list (which must be freed), array of all strings in linked list */ -DLLEXPORT str_list_t listStringList(link_list_t*); - -/* Return an allocated string list (which must be freed), subset of strings in linked list */ -DLLEXPORT str_list_t listSubStringList(const list_node_t*, long max); - -/* Free a string list returned from either of the above functions */ -DLLEXPORT void* listFreeStringList(str_list_t); - -/* Extract subset (up to max number of nodes) in linked list (src_node) and place into dest_list */ -/* dest_list == NULL, then allocate a return a new linked list */ -DLLEXPORT link_list_t* listExtract(link_list_t* dest_list, const list_node_t* src_node, long max); - -/* Simple search functions returning found node or NULL on error */ -DLLEXPORT list_node_t* listNodeAt(link_list_t*, long index); -/* Find a specific node by data or tag */ -/* Pass length of 0 to search by data pointer rather than by data content comparison (memcmp) */ -DLLEXPORT list_node_t* listFindNode(link_list_t*, const void* data, size_t length); -/* Find a specific node by its tag value */ -#define listFindTaggedNode(list, tag) listFindNode(list, NULL, tag) -/* Pass length of 0 to search by data pointer rather than by data content comparison (memcmp) */ -DLLEXPORT ulong listCountMatches(link_list_t*, const void* data, size_t length); - -/* Convenience functions */ -DLLEXPORT list_node_t* listFirstNode(link_list_t*); -DLLEXPORT list_node_t* listLastNode(link_list_t*); -DLLEXPORT list_node_t* listNextNode(const list_node_t*); -DLLEXPORT list_node_t* listPrevNode(const list_node_t*); -DLLEXPORT void* listNodeData(const list_node_t*); - -/* Primitive node locking (not recursive) */ -DLLEXPORT BOOL listLockNode(list_node_t*); -DLLEXPORT BOOL listUnlockNode(list_node_t*); -DLLEXPORT BOOL listNodeIsLocked(const list_node_t*); - -/* Add node to list, returns pointer to new node or NULL on error */ -DLLEXPORT list_node_t* listAddNode(link_list_t*, void* data, list_node_tag_t, list_node_t* after /* NULL=insert */); - -/* Add array of node data to list, returns number of nodes added (or negative on error) */ -/* tag array may be NULL */ -DLLEXPORT long listAddNodes(link_list_t*, void** data, list_node_tag_t*, list_node_t* after /* NULL=insert */); - -/* Add node to list, allocating and copying the data for the node */ -DLLEXPORT list_node_t* listAddNodeData(link_list_t*, const void* data, size_t length, list_node_tag_t, list_node_t* after); - -/* Add node to list, allocating and copying ASCIIZ string data */ -DLLEXPORT list_node_t* listAddNodeString(link_list_t*, const char* str, list_node_tag_t, list_node_t* after); - -/* Add a list of strings to the linked list, allocating and copying each */ -/* tag array may be NULL */ -DLLEXPORT long listAddStringList(link_list_t*, str_list_t, list_node_tag_t*, list_node_t* after); - -/* Add a list of nodes from a source linked list */ -DLLEXPORT long listAddNodeList(link_list_t*, const link_list_t* src, list_node_t* after); - -/* Merge a source linked list into the destination linked list */ -/* after merging, the nodes in the source linked list should not be modified or freed */ -DLLEXPORT long listMerge(link_list_t* dest, const link_list_t* src, list_node_t* after); - -/* Swap the data pointers and flags for 2 nodes (possibly in separate lists) */ -DLLEXPORT BOOL listSwapNodes(list_node_t* node1, list_node_t* node2); - -/* Convenience macros for pushing, popping, and inserting nodes */ -#define listPushNode(list, data) listAddNode(list, data, LIST_NODE_TAG_DEFAULT, LAST_NODE) -#define listInsertNode(list, data) listAddNode(list, data, LIST_NODE_TAG_DEFAULT, FIRST_NODE) -#define listPushNodeData(list, data, length) listAddNodeData(list, data, length, LIST_NODE_TAG_DEFAULT, LAST_NODE) -#define listInsertNodeData(list, data, length) listAddNodeData(list, data, length, LIST_NODE_TAG_DEFAULT, FIRST_NODE) -#define listPushNodeString(list, str) listAddNodeString(list, str, LIST_NODE_TAG_DEFAULT, LAST_NODE) -#define listInsertNodeString(list, str) listAddNodeString(list, str, LIST_NODE_TAG_DEFAULT, FIRST_NODE) -#define listPushStringList(list, str_list) listAddStringList(list, str_list, NULL, LAST_NODE) -#define listInsertStringList(list, str_list) listAddStringList(list, str_list, NULL, FIRST_NODE) -#define listPopNode(list) listRemoveNode(list, LAST_NODE, FALSE) -#define listShiftNode(list) listRemoveNode(list, FIRST_NODE, FALSE) - -/* Remove node from list, returning the node's data (if not free'd) */ -DLLEXPORT void* listRemoveNode(link_list_t*, list_node_t* /* NULL=first */, BOOL free_data); -DLLEXPORT void* listRemoveTaggedNode(link_list_t*, list_node_tag_t, BOOL free_data); - -/* Remove multiple nodes from list, returning the number of nodes removed */ -DLLEXPORT long listRemoveNodes(link_list_t*, list_node_t* /* NULL=first */, long count, BOOL free_data); - -/* Reverse the nodes in a list */ -DLLEXPORT void listReverse(link_list_t*); - -/* Return >= 0 (count of nodes) if list is valid, negative otherwise */ -DLLEXPORT long listVerify(link_list_t*); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/msg_queue.c b/xpdev/msg_queue.c deleted file mode 100644 index 7a0a733..0000000 --- a/xpdev/msg_queue.c +++ /dev/null @@ -1,234 +0,0 @@ -/* Uni or Bi-directional FIFO message queue */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> /* malloc */ -#include <string.h> /* memset */ - -#include "genwrap.h" /* msclock() */ -#include "threadwrap.h" /* pthread_self */ -#include "msg_queue.h" - -msg_queue_t* msgQueueInit(msg_queue_t* q, long flags) -{ - if(q==NULL) { - if((q=(msg_queue_t*)malloc(sizeof(msg_queue_t)))==NULL) - return(NULL); - flags |= MSG_QUEUE_MALLOC; - } - - memset(q,0,sizeof(msg_queue_t)); - - q->flags = flags; - q->refs = 1; - q->owner_thread_id = pthread_self(); - - if(q->flags&MSG_QUEUE_BIDIR) - listInit(&q->in,LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); - listInit(&q->out,LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); - - return(q); -} - -BOOL msgQueueOwner(msg_queue_t* q) -{ - if(q==NULL) - return(FALSE); - - return q->owner_thread_id == pthread_self(); -} - -BOOL msgQueueFree(msg_queue_t* q) -{ - if(q==NULL) - return(FALSE); - - listFree(&q->in); - listFree(&q->out); - - if(q->flags&MSG_QUEUE_MALLOC) - free(q); - - return(TRUE); -} - -long msgQueueAttach(msg_queue_t* q) -{ - if(q==NULL) - return(-1); - - q->refs++; - - return(q->refs); -} - -long msgQueueDetach(msg_queue_t* q) -{ - int refs; - - if(q==NULL || q->refs<1) - return(-1); - - if(msgQueueOwner(q)) - q->flags |= MSG_QUEUE_ORPHAN; - - if((refs=--q->refs)==0) - msgQueueFree(q); - - return(refs); -} - -void* msgQueueSetPrivateData(msg_queue_t* q, void* p) -{ - void* old; - - if(q==NULL) - return(NULL); - - old=q->private_data; - q->private_data=p; - return(old); -} - -void* msgQueueGetPrivateData(msg_queue_t* q) -{ - if(q==NULL) - return(NULL); - return(q->private_data); -} - -static link_list_t* msgQueueReadList(msg_queue_t* q) -{ - if(q==NULL) - return(NULL); - - if((q->flags&MSG_QUEUE_BIDIR) - && q->owner_thread_id == pthread_self()) - return(&q->in); - return(&q->out); -} - -static link_list_t* msgQueueWriteList(msg_queue_t* q) -{ - if(q==NULL) - return(NULL); - - if(!(q->flags&MSG_QUEUE_BIDIR) - || q->owner_thread_id == pthread_self()) - return(&q->out); - return(&q->in); -} - -long msgQueueReadLevel(msg_queue_t* q) -{ - return listCountNodes(msgQueueReadList(q)); -} - -static BOOL list_wait(link_list_t* list, long timeout) -{ -#if defined(LINK_LIST_THREADSAFE) - if(timeout<0) /* infinite */ - return listSemWait(list); - if(timeout==0) /* poll */ - return listSemTryWait(list); - - return listSemTryWaitBlock(list,timeout); -#else - clock_t start; - long count; - - start=msclock(); - while((count=listCountNodes(list))==0) { - if(timeout==0) - break; - if(timeout>0 && msclock()-start > timeout) - break; - YIELD(); - } - return(INT_TO_BOOL(count)); -#endif -} - -BOOL msgQueueWait(msg_queue_t* q, long timeout) -{ - BOOL result; - link_list_t* list = msgQueueReadList(q); - - if((result=list_wait(list,timeout))==TRUE) -#if defined(LINK_LIST_THREADSAFE) - listSemPost(list) /* Replace the semaphore we just cleared */ -#endif - ; - - return(result); -} - -void* msgQueueRead(msg_queue_t* q, long timeout) -{ - link_list_t* list = msgQueueReadList(q); - - list_wait(list,timeout); - - return listShiftNode(list); -} - -void* msgQueuePeek(msg_queue_t* q, long timeout) -{ - link_list_t* list = msgQueueReadList(q); - - if(list_wait(list,timeout)) -#if defined(LINK_LIST_THREADSAFE) - listSemPost(list) /* Replace the semaphore we just cleared */ -#endif - ; - - return listNodeData(listFirstNode(list)); -} - -void* msgQueueFind(msg_queue_t* q, const void* data, size_t length) -{ - link_list_t* list = msgQueueReadList(q); - list_node_t* node; - - if((node=listFindNode(list,data,length))==NULL) - return(NULL); - return listRemoveNode(list,node,/* Free Data? */FALSE); -} - -list_node_t* msgQueueFirstNode(msg_queue_t* q) -{ - return listFirstNode(msgQueueReadList(q)); -} - -list_node_t* msgQueueLastNode(msg_queue_t* q) -{ - return listLastNode(msgQueueReadList(q)); -} - -long msgQueueWriteLevel(msg_queue_t* q) -{ - return listCountNodes(msgQueueWriteList(q)); -} - -BOOL msgQueueWrite(msg_queue_t* q, const void* data, size_t length) -{ - return listPushNodeData(msgQueueWriteList(q),data,length)!=NULL; -} - diff --git a/xpdev/msg_queue.h b/xpdev/msg_queue.h deleted file mode 100644 index 5df9af8..0000000 --- a/xpdev/msg_queue.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Uni or Bi-directional FIFO message queue */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _MSG_QUEUE_H -#define _MSG_QUEUE_H - -#include "link_list.h" -#include "threadwrap.h" -#include "wrapdll.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -typedef struct { - char name[128]; /* for named-queues */ - link_list_t in; - link_list_t out; - pthread_t owner_thread_id; /* reads from in, writes to out */ - long refs; - unsigned long flags; /* private use flags */ - void* private_data; -} msg_queue_t; - -#define MSG_QUEUE_MALLOC (1<<0) /* Queue allocated with malloc() */ -#define MSG_QUEUE_BIDIR (1<<1) /* Bi-directional message queue */ -#define MSG_QUEUE_ORPHAN (1<<2) /* Owner has detached */ - -DLLEXPORT msg_queue_t* msgQueueInit(msg_queue_t*, long flags); -DLLEXPORT BOOL msgQueueFree(msg_queue_t*); - -DLLEXPORT long msgQueueAttach(msg_queue_t*); -DLLEXPORT long msgQueueDetach(msg_queue_t*); -DLLEXPORT BOOL msgQueueOwner(msg_queue_t*); - -/* Get/Set queue private data */ -DLLEXPORT void* msgQueueSetPrivateData(msg_queue_t*, void*); -DLLEXPORT void* msgQueueGetPrivateData(msg_queue_t*); - -DLLEXPORT BOOL msgQueueWait(msg_queue_t* q, long timeout); -DLLEXPORT long msgQueueReadLevel(msg_queue_t*); -DLLEXPORT void* msgQueueRead(msg_queue_t*, long timeout); -DLLEXPORT void* msgQueuePeek(msg_queue_t*, long timeout); -DLLEXPORT void* msgQueueFind(msg_queue_t*, const void*, size_t length); -DLLEXPORT list_node_t* msgQueueFirstNode(msg_queue_t*); -DLLEXPORT list_node_t* msgQueueLastNode(msg_queue_t*); -#define msgQueueNextNode(node) listNextNode(node) -#define msgQueuePrevNode(node) listPrevNode(node) -#define msgQueueNodeData(node) listNodeData(node) - -DLLEXPORT long msgQueueWriteLevel(msg_queue_t*); -DLLEXPORT BOOL msgQueueWrite(msg_queue_t*, const void*, size_t length); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/multisock.c b/xpdev/multisock.c deleted file mode 100644 index bc4e2d2..0000000 --- a/xpdev/multisock.c +++ /dev/null @@ -1,642 +0,0 @@ -// Multi-socket versions ofthe socket API... - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "gen_defs.h" -#include "sockwrap.h" -#include "dirwrap.h" -#include "multisock.h" -#include "haproxy.h" -#include <stdarg.h> - -struct xpms_set* xpms_create(unsigned int retries, unsigned int wait_secs, - int (*lprintf)(int level, const char *fmt, ...)) -{ - struct xpms_set *ret=(struct xpms_set *)calloc(1, sizeof(struct xpms_set)); - - if(ret==NULL) - return ret; - ret->retries = retries; - ret->wait_secs = wait_secs; - ret->lprintf=lprintf; - return ret; -} - -void xpms_destroy(struct xpms_set *xpms_set, void (*sock_destroy)(SOCKET, const void *), const void *cbdata) -{ - size_t i; - - if(!xpms_set) - return; - for(i=0; i<xpms_set->sock_count; i++) { - if(xpms_set->socks[i].sock != INVALID_SOCKET) { - if(xpms_set->lprintf!=NULL) - xpms_set->lprintf(LOG_INFO, "%04d %s closing socket %s port %d" - , xpms_set->socks[i].sock, xpms_set->socks[i].prot?xpms_set->socks[i].prot:"unknown" - , xpms_set->socks[i].address - , xpms_set->socks[i].port); - closesocket(xpms_set->socks[i].sock); - if(sock_destroy) - sock_destroy(xpms_set->socks[i].sock, cbdata); - } - xpms_set->socks[i].sock = INVALID_SOCKET; - FREE_AND_NULL(xpms_set->socks[i].address); - FREE_AND_NULL(xpms_set->socks[i].prot); - } - FREE_AND_NULL(xpms_set->socks); - free(xpms_set); -} - -BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type, - int protocol, const char *addr, uint16_t port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata) -{ - struct xpms_sockdef *new_socks; - struct addrinfo hints; - struct addrinfo *res=NULL; - struct addrinfo *cur; - unsigned int added = 0; - int ret; - char port_str[6]; - char err[128]; - -#ifndef _WIN32 - struct addrinfo dummy; - struct sockaddr_un un_addr; - - if(domain == AF_UNIX) { - memset(&dummy, 0, sizeof(dummy)); - memset(&un_addr, 0, sizeof(un_addr)); - dummy.ai_family = AF_UNIX; - dummy.ai_socktype = type; - dummy.ai_addr = (struct sockaddr *)&un_addr; - un_addr.sun_family=AF_UNIX; - - if(strlen(addr) >= sizeof(un_addr.sun_path)) { - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_ERR, "!%s ERROR %s is too long for a portable AF_UNIX socket", prot, addr); - return FALSE; - } - strcpy(un_addr.sun_path,addr); -#ifdef SUN_LEN - dummy.ai_addrlen = SUN_LEN(&un_addr); -#else - dummy.ai_addrlen = offsetof(struct sockaddr_un, un_addr.sun_path) + strlen(addr) + 1; -#endif - if(fexist(addr)) - unlink(addr); - res = &dummy; - } -#endif - if(res == NULL) { - memset(&hints, 0, sizeof(hints)); - hints.ai_flags=AI_PASSIVE; - hints.ai_family=domain; - hints.ai_socktype=type; - hints.ai_protocol=protocol; - hints.ai_flags|=AI_NUMERICSERV; -#ifdef AI_ADDRCONFIG - hints.ai_flags|=AI_ADDRCONFIG; -#endif - sprintf(port_str, "%hu", port); - if((ret=getaddrinfo(addr, port_str, &hints, &res))!=0) { - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_CRIT, "!%s ERROR %d calling getaddrinfo() on %s", prot, ret, addr); - return FALSE; - } - } - - for(cur=res; cur; cur=cur->ai_next) { - new_socks=(struct xpms_sockdef *)realloc(xpms_set->socks, sizeof(struct xpms_sockdef)*(xpms_set->sock_count+1)); - if(new_socks==NULL) { - /* This may be a partial failure */ - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_CRIT, "!%s ERROR out of memory adding to multisocket", prot); - break; - } - xpms_set->socks=new_socks; - xpms_set->socks[xpms_set->sock_count].address = strdup(addr); - xpms_set->socks[xpms_set->sock_count].cb_data = cbdata; - xpms_set->socks[xpms_set->sock_count].domain = cur->ai_family; /* Address/Protocol Family */ - xpms_set->socks[xpms_set->sock_count].type = cur->ai_socktype; - xpms_set->socks[xpms_set->sock_count].protocol = protocol; - xpms_set->socks[xpms_set->sock_count].port = port; - xpms_set->socks[xpms_set->sock_count].prot = strdup(prot); - xpms_set->socks[xpms_set->sock_count].sock = socket(cur->ai_family, cur->ai_socktype, protocol); - if(xpms_set->socks[xpms_set->sock_count].sock == INVALID_SOCKET) { - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].address); - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].prot); - continue; - } - if(sock_init) - sock_init(xpms_set->socks[xpms_set->sock_count].sock, cbdata); - - if(bind_init) { - if(port < IPPORT_RESERVED && port > 0) - bind_init(FALSE); - } - if(retry_bind(xpms_set->socks[xpms_set->sock_count].sock, cur->ai_addr, cur->ai_addrlen, xpms_set->retries, xpms_set->wait_secs, prot, xpms_set->lprintf)==-1) { - closesocket(xpms_set->socks[xpms_set->sock_count].sock); - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].address); - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].prot); - if(bind_init) { - if(port < IPPORT_RESERVED) - bind_init(TRUE); - } - continue; - } - if(bind_init) { - if(port < IPPORT_RESERVED && port > 0) - bind_init(TRUE); - } - - if(type != SOCK_DGRAM) { - if(listen(xpms_set->socks[xpms_set->sock_count].sock, SOMAXCONN)==-1) { - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_WARNING, "%04d !%s ERROR %d listening on port %d: %s" - ,xpms_set->socks[xpms_set->sock_count].sock, prot, ERROR_VALUE - ,port, socket_strerror(socket_errno,err,sizeof(err))); - closesocket(xpms_set->socks[xpms_set->sock_count].sock); - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].address); - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].prot); - continue; - } - } - - added++; - xpms_set->sock_count++; - } - -#ifndef _WIN32 - if(res != &dummy) -#endif - freeaddrinfo(res); - if(added) - return TRUE; - return FALSE; -} - -BOOL xpms_add_list(struct xpms_set *xpms_set, int domain, int type, - int protocol, str_list_t list, uint16_t default_port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata) -{ - char **iface; - char *host; - char *host_str; - char *p, *p2; - BOOL one_good=FALSE; - - for(iface=list; iface && *iface; iface++) { - WORD port=default_port; - - host=strdup(*iface); - - host_str=host; - p = strrchr(host, ':'); - /* - * If there isn't a [, and the first and last colons aren't the same - * it's assumed to be an IPv6 address - */ - if(strchr(host,'[')==NULL && p != NULL && strchr(host, ':') != p) - p=NULL; - if(host[0]=='[') { - host_str++; - p2=strrchr(host,']'); - if(p2) - *p2=0; - if(p2 > p) - p=NULL; - } - if(p!=NULL) { - *(p++)=0; - sscanf(p, "%hu", &port); - } - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_INFO, "%s listening on socket %s port %hu", prot, host_str, port); - if(xpms_add(xpms_set, domain, type, protocol, host_str, port, prot, sock_init, bind_init, cbdata)) - one_good=TRUE; - free(host); - } - return one_good; -} - -BOOL xpms_add_chararray_list(struct xpms_set *xpms_set, int domain, int type, - int protocol, const char *list, uint16_t default_port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata) -{ - str_list_t slist; - BOOL ret; - - slist = strListSplitCopy(NULL, list, ", \t\r\n"); - if (slist == NULL) - return FALSE; - ret = xpms_add_list(xpms_set, domain, type, protocol, slist, default_port, prot, - sock_init, bind_init, cbdata); - strListFree(&slist); - return ret; -} - -/* Convert a binary variable into a hex string - used for printing in the debug log */ -static void btox(char *hexstr, const char *srcbuf, size_t srcbuflen, size_t hexstrlen, int (*lprintf)(int level, const char *fmt, ...)) -{ - size_t i; - - if (hexstrlen < srcbuflen*2+1) { - lprintf(LOG_WARNING,"btox hexstr buffer too small [%d] - not all data will be processed",hexstrlen); - srcbuflen = hexstrlen/2-1; - } - - *hexstr = '\0'; - for (i=0;i<srcbuflen;i++) { - sprintf(hexstr+strlen(hexstr),"%02x",(unsigned char)srcbuf[i]); - } -} - -static BOOL read_socket(SOCKET sock, char *buffer, size_t len, int (*lprintf)(int level, const char *fmt, ...)) -{ - size_t i; - int rd; - unsigned char ch; - char err[128]; - - for (i=0;i<len;i++) { - if (socket_readable(sock, 1000)) { - rd = recv(sock,&ch,1,0); - if (rd == 0) { - lprintf(LOG_WARNING,"%04d multisock read_socket() - remote closed the connection",sock); - return FALSE; - - } else if (rd == 1) { - buffer[i] = ch; - - } else { - lprintf(LOG_WARNING,"%04d multisock read_socket() - failed to read from socket. Got [%d] with error [%s]",sock,rd,socket_strerror(socket_errno,err,sizeof(err))); - return FALSE; - } - - } else { - lprintf(LOG_WARNING,"%04d multisock read_socket() - No data?",sock); - return FALSE; - - } - } - - return TRUE; -} - -static BOOL read_socket_line(SOCKET sock, char *buffer, size_t buflen, int (*lprintf)(int level, const char *fmt, ...)) -{ - size_t i; - - for (i = 0; i < buflen - 1; i++) { - if (read_socket(sock, &buffer[i], 1, lprintf)) { - switch(buffer[i]) { - case 0: - return FALSE; - case '\n': - buffer[i+1] = 0; - return TRUE; - } - - } else { - buffer[i] = 0; - return FALSE; - } - } - - buffer[i] = 0; - return FALSE; -} - -SOCKET xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, - socklen_t * addrlen, unsigned int timeout, uint32_t flags, const void **cb_data) -{ -#ifdef PREFER_POLL - struct pollfd *fds; - int poll_timeout; - nfds_t scnt = 0; -#else - fd_set read_fs; - struct timeval tv; - struct timeval *tvp; - SOCKET max_sock=0; -#endif - size_t i; - SOCKET ret; - char hapstr[128]; - char haphex[256]; - char *p, *tok; - long l; - void *vp; - - if (xpms_set->sock_count < 1) - return INVALID_SOCKET; - -#ifdef PREFER_POLL - fds = calloc(xpms_set->sock_count, sizeof(*fds)); - if (fds == NULL) - return INVALID_SOCKET; - for (i = 0; i < xpms_set->sock_count; i++) { - if (xpms_set->socks[i].sock == INVALID_SOCKET) - continue; - fds[scnt].fd = xpms_set->socks[i].sock; - fds[scnt].events = POLLIN; - scnt++; - } - - if (timeout == XPMS_FOREVER) - poll_timeout = -1; - else if (timeout > INT_MAX) - poll_timeout = INT_MAX; - else - poll_timeout = timeout; - - switch (poll(fds, scnt, poll_timeout)) { - case 0: - free(fds); - return INVALID_SOCKET; - case -1: - free(fds); - return SOCKET_ERROR; - default: - scnt = 0; - for(i=0; i<xpms_set->sock_count; i++) { - if(xpms_set->socks[i].sock == INVALID_SOCKET) - continue; - if (fds[scnt].revents & ~(POLLIN)) { - scnt++; - closesocket(xpms_set->socks[i].sock); - xpms_set->lprintf(LOG_ERR, "%04d * Listening socket went bad", xpms_set->socks[i].sock); - xpms_set->socks[i].sock = INVALID_SOCKET; - continue; - } - if (fds[scnt++].revents & POLLIN) { -#else - FD_ZERO(&read_fs); - for(i=0; i<xpms_set->sock_count; i++) { - if(xpms_set->socks[i].sock == INVALID_SOCKET) - continue; - FD_SET(xpms_set->socks[i].sock, &read_fs); - if(xpms_set->socks[i].sock >= max_sock) - max_sock=xpms_set->socks[i].sock+1; - } - - if(timeout==XPMS_FOREVER) - tvp=NULL; - else { - tv.tv_sec=timeout/1000; - tv.tv_usec=(timeout%1000)*1000; - tvp=&tv; - } - switch(select(max_sock, &read_fs, NULL, NULL, tvp)) { - case 0: - return INVALID_SOCKET; - case -1: - return SOCKET_ERROR; - default: - for(i=0; i<xpms_set->sock_count; i++) { - if(xpms_set->socks[i].sock == INVALID_SOCKET) - continue; - if(FD_ISSET(xpms_set->socks[i].sock, &read_fs)) { -#endif - if(cb_data) - *cb_data=xpms_set->socks[i].cb_data; - ret = accept(xpms_set->socks[i].sock, &addr->addr, addrlen); - if (ret == INVALID_SOCKET) { - goto error_return; - } - - // Set host_ip from haproxy protocol, if its used - // http://www.haproxy.org/download/1.8/doc/proxy-protocol.txt - if (flags & XPMS_ACCEPT_FLAG_HAPROXY) { - memset(addr, 0, sizeof(*addr)); - xpms_set->lprintf(LOG_DEBUG,"%04d Working out client address from HAProxy PROTO",ret); - - // Read the first line - // In normal proxy usage, we shouldnt fail here - but if there is a badly implemented HAPROXY PROTO - // or the user attempts to connect direct to the BBS (not via the proxy) there could be anything - // received (IAC sequences, SSH setup, or just badness) - if (! read_socket_line(ret, hapstr, 108, xpms_set->lprintf)) { - btox(haphex,hapstr,strlen(hapstr),sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for version - failed [%s]",ret,haphex); - closesocket(ret); - goto error_return; - } - - btox(haphex,hapstr,strlen(hapstr)>16 ? 16 : strlen(hapstr),sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY looking for version - 1st %d bytes received [%s] of (%d)",ret,strlen(hapstr)>16 ? 16 : strlen(hapstr),haphex,strlen(hapstr)); - - // v1 of the protocol uses plain text, starting with "PROXY " - // eg: "PROXY TCP4 255.255.255.255 255.255.255.255 65535 65535\r\n" - if (strncmp((char *)hapstr,"PROXY ",6) == 0) { - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY PROTO v1",ret); - - tok = &hapstr[6]; - // IPV4 - if (strncmp(tok, "TCP4 ", 5) == 0) { - tok += 5; - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Proto TCP4",ret,hapstr); - addr->addr.sa_family = AF_INET; - if (addrlen) - *addrlen = sizeof(struct sockaddr_in); - vp = &addr->in.sin_addr; - // IPV6 - } else if (strncmp(tok,"TCP6 ",5) == 0) { - tok += 5; - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Proto TCP6",ret,hapstr); - addr->addr.sa_family = AF_INET6; - if (addrlen) - *addrlen = sizeof(struct sockaddr_in6); - vp = &addr->in6.sin6_addr; - // Unknown? - } else { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Unknown Protocol",ret); - closesocket(ret); - goto error_return; - } - - // Look for the space between the next IP - p = strchr(tok, ' '); - if (p == NULL) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Couldnt find IP address",ret); - closesocket(ret); - goto error_return; - } - *p = 0; - if (inet_pton(addr->addr.sa_family, tok, vp) != 1) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Unable to parse %s address [%s]",addr->addr.sa_family == AF_INET ? "IPv4" : "IPv6", tok); - closesocket(ret); - goto error_return; - } - tok = p + 1; - // Look for the space before the port number - p = strchr(tok, ' '); - if (p == NULL) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Couldnt find port",ret); - closesocket(ret); - goto error_return; - } - tok = p + 1; - l = strtol(tok, NULL, 10); - if (l <= 0 || l > UINT16_MAX) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Source port out of range",ret); - closesocket(ret); - goto error_return; - } - switch(addr->addr.sa_family) { - case AF_INET: - addr->in.sin_port = htons((unsigned short)l); - break; - case AF_INET6: - addr->in6.sin6_port = htons((unsigned short)l); - break; - } - - // v2 is in binary with the first 12 bytes "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A" - // we'll compare the 1st 6 bytes here, since we are determining if we are v1 or v2. - } else if (strcmp((char *)hapstr,"\r\n") == 0) { - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY PROTO v2",ret); - - // OK, just for sanity, our next 10 chars should be v2... - memset(hapstr, 0, 10); - if (read_socket(ret,hapstr,10,xpms_set->lprintf)==FALSE || memcmp(hapstr, "\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A", 10) != 0) { - btox(haphex,hapstr,10,sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Something went wrong - incomplete v2 setup [%s]",ret,haphex); - closesocket(ret); - goto error_return; - } - - // Command and Version - if (read_socket(ret,hapstr,1,xpms_set->lprintf)==FALSE) { - btox(haphex,hapstr,1,sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for Verson/Command - failed [%s]",ret,haphex); - closesocket(ret); - goto error_return; - } - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Version [%x]",ret,(hapstr[0]>>4)&0x0f); //Should be 2 - - // Check the version - switch((hapstr[0]>>4)&0x0f) { - case 0x02: - break; - default: - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY invalid version [%x]",ret,(hapstr[0]>>4)&0x0f); - closesocket(ret); - goto error_return; - } - - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Command [%x]",ret,hapstr[0]&0x0f); //0=Local/1=Proxy - - // Check the command - switch(hapstr[0]&0x0f) { - case HAPROXY_LOCAL: - xpms_set->lprintf(LOG_INFO,"%04d * HAPROXY health check - we are alive!",ret); - closesocket(ret); - goto error_return; - case HAPROXY_PROXY: - break; - default: - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY invalid command [%x]",ret,hapstr[0]&0x0f); - closesocket(ret); - goto error_return; - } - - // Protocol and Family - if (read_socket(ret,hapstr,1,xpms_set->lprintf)==FALSE) { - btox(haphex,hapstr,1,sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for Protocol/Family - failed [%s]",ret,haphex); - closesocket(ret); - goto error_return; - } - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Protocol [%x]",ret,hapstr[0]&0x0f); //0=Unspec/1=AF_INET/2=AF_INET6/3=AF_UNIX - l = (hapstr[0]>>4)&0x0f; - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Family [%x]",ret,l); //0=UNSPEC/1=STREAM/2=DGRAM - - // Address Length - 2 bytes - if (read_socket(ret,hapstr,2,xpms_set->lprintf)==FALSE) { - btox(haphex,hapstr,2,sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for address length - failed [%s]",ret,haphex); - closesocket(ret); - goto error_return; - } - i = ntohs(*(uint16_t*)hapstr); - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Address Length [%d]",ret,i); - - switch (l) { - // IPv4 - AF_INET - case HAPROXY_AFINET: - if (i != 12) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Something went wrong - IPv4 address length is incorrect",ret); - closesocket(ret); - goto error_return; - } - addr->in.sin_family = AF_INET; - if (read_socket(ret, hapstr, i, xpms_set->lprintf)==FALSE) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for IPv4 address - failed",ret); - closesocket(ret); - goto error_return; - } - memcpy(&addr->in.sin_addr.s_addr, hapstr, 4); - memcpy(&addr->in.sin_port, &hapstr[8], 2); - if (addrlen) - *addrlen = sizeof(struct sockaddr_in); - - break; - - // IPv6 - AF_INET6 - case HAPROXY_AFINET6: - if (i != 36) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Something went wrong - IPv6 address length is incorrect.",ret); - closesocket(ret); - goto error_return; - } - addr->in6.sin6_family = AF_INET6; - if (read_socket(ret,hapstr,i,xpms_set->lprintf)==FALSE) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for IPv6 address - failed",ret); - closesocket(ret); - goto error_return; - } - memcpy(&addr->in6.sin6_addr.s6_addr, hapstr, 16); - memcpy(&addr->in6.sin6_port, &hapstr[32], 2); - if (addrlen) - *addrlen = sizeof(struct sockaddr_in6); - - break; - - default: - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Unknown Family [%x]",ret,l); - closesocket(ret); - goto error_return; - } - - } else { - xpms_set->lprintf(LOG_ERR,"%04d Unknown HAProxy Initialisation - is HAProxy used?",ret); - closesocket(ret); - goto error_return; - } - - hapstr[0] = 0; - inet_addrtop(addr, hapstr, sizeof(hapstr)); - xpms_set->lprintf(LOG_INFO,"%04d * HAPROXY Source [%s]",ret,hapstr); - -#ifdef PREFER_POLL - free(fds); -#endif - return ret; - } else { -#ifdef PREFER_POLL - free(fds); -#endif - return ret; - } - } - } - } - -error_return: -#ifdef PREFER_POLL - free(fds); -#endif - return INVALID_SOCKET; -} diff --git a/xpdev/multisock.h b/xpdev/multisock.h deleted file mode 100644 index cc7f1c2..0000000 --- a/xpdev/multisock.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef MULTISOCK_H -#define MULTISOCK_H - -#include <limits.h> -#include "str_list.h" -#include "wrapdll.h" - -struct xpms_sockdef -{ - const void* cb_data; - int domain; - int type; - int protocol; - SOCKET sock; - char* address; - uint16_t port; - char* prot; -}; - -struct xpms_set { - struct xpms_sockdef* socks; - int (*lprintf)(int level, const char *fmt, ...); - size_t sock_count; - unsigned int retries; - unsigned int wait_secs; -}; - -#define XPMS_FOREVER UINT_MAX -#define XPMS_FLAGS_NONE 0 -#define XPMS_ACCEPT_FLAG_HAPROXY (1<<0) - -#ifdef __cplusplus -extern "C" { -#endif - -DLLEXPORT struct xpms_set* xpms_create(unsigned int retries, unsigned int wait_secs, - int (*lprintf)(int level, const char *fmt, ...)); -DLLEXPORT void xpms_destroy(struct xpms_set *xpms_set, void (*sock_destroy)(SOCKET, const void *), const void *cbdata); -DLLEXPORT BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type, - int protocol, const char *addr, uint16_t port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata); -DLLEXPORT BOOL xpms_add_list(struct xpms_set *xpms_set, int domain, int type, - int protocol, str_list_t list, uint16_t default_port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata); -DLLEXPORT BOOL xpms_add_chararray_list(struct xpms_set *xpms_set, int domain, int type, - int protocol, const char *list, uint16_t default_port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata); -DLLEXPORT SOCKET xpms_accept(struct xpms_set *, union xp_sockaddr * addr, - socklen_t * addrlen, unsigned int timeout, uint32_t flags, const void **cb_data); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/xpdev/netwrap.c b/xpdev/netwrap.c deleted file mode 100644 index 87a4ce3..0000000 --- a/xpdev/netwrap.c +++ /dev/null @@ -1,145 +0,0 @@ -/* netwrap.c */ - -/* Network related wrapper functions */ - -/* $Id: netwrap.c,v 1.8 2019/07/24 04:21:42 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "sockwrap.h" -#include "genwrap.h" /* truncsp */ -#include "netwrap.h" /* verify prototypes */ - -#include <stdlib.h> /* malloc() */ - -#if defined(_WIN32) - #include <iphlpapi.h> /* GetNetworkParams */ -#endif - -str_list_t getNameServerList(void) -{ -#ifdef __unix__ /* Look up DNS server address */ - FILE* fp; - char* p; - char str[128]; - str_list_t list; - - if((list=strListInit())==NULL) - return(NULL); - if((fp=fopen("/etc/resolv.conf","r"))!=NULL) { - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - truncsp(str); - p=str; - SKIP_WHITESPACE(p); - if(strnicmp(p,"nameserver",10)!=0) /* no match */ - continue; - FIND_WHITESPACE(p); /* skip "nameserver" */ - SKIP_WHITESPACE(p); /* skip more white-space */ - strListPush(&list,p); - } - fclose(fp); - } - return(list); - -#elif defined(_WIN32) - FIXED_INFO* FixedInfo=NULL; - ULONG FixedInfoLen=0; - IP_ADDR_STRING* ip; - str_list_t list; - - if((list=strListInit())==NULL) - return(NULL); - if(GetNetworkParams(FixedInfo,&FixedInfoLen) == ERROR_BUFFER_OVERFLOW) { - FixedInfo=(FIXED_INFO*)malloc(FixedInfoLen); - if(GetNetworkParams(FixedInfo,&FixedInfoLen) == ERROR_SUCCESS) { - ip=&FixedInfo->DnsServerList; - for(; ip!=NULL; ip=ip->Next) - strListPush(&list,ip->IpAddress.String); - } - if(FixedInfo!=NULL) - free(FixedInfo); - } - return(list); -#else - #error "Need a get_nameserver() implementation for this platform" -#endif -} - -const char* getHostNameByAddr(const char* str) -{ - HOSTENT* h; - uint32_t ip; - -#ifdef _WIN32 - WSADATA wsaData; - WSAStartup(MAKEWORD(2, 2), &wsaData); -#endif - if(str==NULL) - return NULL; - if((ip=inet_addr(str)) == INADDR_NONE) - return str; - if((h=gethostbyaddr((char *)&ip,sizeof(ip),AF_INET))==NULL) - return NULL; - -#ifdef _WIN32 - WSACleanup(); -#endif - - return h->h_name; -} - -/* In case we want to DLL-export getNameServerList in the future */ -void freeNameServerList(str_list_t list) -{ - strListFree(&list); -} - -#if NETWRAP_TEST -int main(int argc, char** argv) -{ - size_t i; - str_list_t list; - - if((list=getNameServerList())!=NULL) { - for(i=0;list[i]!=NULL;i++) - printf("%s\n",list[i]); - freeNameServerList(list); - } - - if(argc>1) - printf("%s\n", getHostNameByAddr(argv[1])); - return 0; -} -#endif - diff --git a/xpdev/netwrap.h b/xpdev/netwrap.h deleted file mode 100644 index d8fc18f..0000000 --- a/xpdev/netwrap.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Network related wrapper functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _NETWRAP_H -#define _NETWRAP_H - -#include <stddef.h> /* size_t */ -#include "str_list.h" /* string list functions and types */ -#include "wrapdll.h" - -#define IPv4_LOCALHOST 0x7f000001U /* 127.0.0.1 */ - -#if defined(__cplusplus) -extern "C" { -#endif - -DLLEXPORT const char* getHostNameByAddr(const char*); -DLLEXPORT str_list_t getNameServerList(void); -DLLEXPORT void freeNameServerList(str_list_t); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/petdefs.h b/xpdev/petdefs.h deleted file mode 100644 index bdf83ab..0000000 --- a/xpdev/petdefs.h +++ /dev/null @@ -1,103 +0,0 @@ -/* $Id: petdefs.h,v 1.4 2019/07/09 23:54:43 rswindell Exp $ */ - -/* Commodore/PET definitions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ -#ifndef _PETDEFS_H_ -#define _PETDEFS_H_ - -enum petscii_char { - /* Colors */ - PETSCII_BLACK = 144, - PETSCII_WHITE = 5, - PETSCII_RED = 28, - PETSCII_GREEN = 30, - PETSCII_BLUE = 31, - PETSCII_ORANGE = 129, // Dark purple in 80 column mode - PETSCII_BROWN = 149, // Dark yellow in 80 column mode - PETSCII_YELLOW = 158, - PETSCII_CYAN = 159, // Light cyan in 80 column mode - PETSCII_LIGHTRED = 150, - PETSCII_DARKGRAY = 151, // Dark cyan in 80 column mode - PETSCII_MEDIUMGRAY = 152, - PETSCII_LIGHTGREEN = 153, - PETSCII_LIGHTBLUE = 154, - PETSCII_LIGHTGRAY = 155, - PETSCII_PURPLE = 156, - /* Char-set */ - PETSCII_UPPERLOWER = 14, - PETSCII_UPPERGRFX = 142, - /* Attributes */ - PETSCII_FLASH_ON = 15, - PETSCII_FLASH_OFF = 143, - PETSCII_REVERSE_ON = 18, - PETSCII_REVERSE_OFF = 146, - /* Cursor movement */ - PETSCII_UP = 145, - PETSCII_DOWN = 17, - PETSCII_LEFT = 157, - PETSCII_RIGHT = 29, - PETSCII_HOME = 19, - PETSCII_CLEAR = 147, - PETSCII_INSERT = 148, - PETSCII_DELETE = 20, - PETSCII_CRLF = 141, - /* Symbols (which don't align with ASCII) */ - PETSCII_BRITPOUND = 92, - /* Graphic chars */ - PETSCII_UPARROW = 0x5E, - PETSCII_LEFTARROW = 0x5f, - PETSCII_LIGHTHASH = 0xA6, - PETSCII_MEDIUMHASH = 0xDE, - PETSCII_HEAVYHASH = 0xA9, - PETSCII_SOLID = 0xA0, // Actually inversed solid (empty) - PETSCII_LEFTHALF = 0xA1, - PETSCII_RIGHTHALF = 0xB6, // Not quite a full half - PETSCII_TOPHALF = 0xB8, // Not quite a full half - PETSCII_BOTTOMHALF = 0xA2, - PETSCII_CHECKMARK = 0xBA, - PETSCII_CROSS = 0xDB, - PETSCII_HORZLINE = 0xC0, - PETSCII_VERTLINE = 0xDD, - PETSCII_LWRRHTBOX = 0xAC, - PETSCII_LWRLFTBOX = 0xBB, - PETSCII_UPRRHTBOX = 0xBC, - PETSCII_UPRLFTBOX = 0xBE, - PETSCII_CHECKERBRD = 0xBF, - /* Replacement chars (missing ASCII chars) */ - PETSCII_BACKSLASH = '/', // the 109 graphics char is an 'M' in shifted/text mode :-( - PETSCII_BACKTICK = 0xAD, // a graphics char actually - PETSCII_TILDE = 0xA8, // a graphics char actually - PETSCII_UNDERSCORE = 0xA4, // a graphics char actually -}; - -#endif /* Don't add anything after this line */ diff --git a/xpdev/sdlfuncs.c b/xpdev/sdlfuncs.c deleted file mode 100644 index 3eab157..0000000 --- a/xpdev/sdlfuncs.c +++ /dev/null @@ -1,111 +0,0 @@ -#include <stdlib.h> /* getenv()/exit()/atexit() */ -#include <stdio.h> /* NULL */ - -#include <SDL.h> -#include "gen_defs.h" -#include "threadwrap.h" -#include "sdlfuncs.h" - -struct sdlfuncs xpbeep_sdl; - -/* Make xp_dl do static linking */ -#ifdef STATIC_SDL -#define STATIC_LINK -#endif -#include "xp_dl.h" - -static int sdl_funcs_loaded=0; -static int sdl_initialized=0; -static int sdl_audio_initialized=0; - -int xpbeep_load_sdl_funcs(struct sdlfuncs *sdlf) -{ - dll_handle sdl_dll; - const char *libnames[]={"SDL", "SDL-1.2", "SDL-1.1", NULL}; - - putenv("SDL_VIDEO_ALLOW_SCREENSAVER=1"); - sdlf->gotfuncs=0; - if((sdl_dll=xp_dlopen(libnames,RTLD_LAZY|RTLD_GLOBAL,SDL_PATCHLEVEL))==NULL) - return(-1); - - if((sdlf->Init=xp_dlsym(sdl_dll, SDL_Init))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->Quit=xp_dlsym(sdl_dll, SDL_Quit))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SemWait=xp_dlsym(sdl_dll, SDL_SemWait))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SemPost=xp_dlsym(sdl_dll, SDL_SemPost))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SDL_CreateSemaphore=xp_dlsym(sdl_dll, SDL_CreateSemaphore))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SDL_DestroySemaphore=xp_dlsym(sdl_dll, SDL_DestroySemaphore))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->InitSubSystem=xp_dlsym(sdl_dll, SDL_InitSubSystem))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->QuitSubSystem=xp_dlsym(sdl_dll, SDL_QuitSubSystem))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->OpenAudio=xp_dlsym(sdl_dll, SDL_OpenAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CloseAudio=xp_dlsym(sdl_dll, SDL_CloseAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->PauseAudio=xp_dlsym(sdl_dll, SDL_PauseAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->LockAudio=xp_dlsym(sdl_dll, SDL_LockAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->UnlockAudio=xp_dlsym(sdl_dll, SDL_UnlockAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetAudioStatus=xp_dlsym(sdl_dll, SDL_GetAudioStatus))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - sdlf->gotfuncs=1; - sdl_funcs_loaded=1; - return(0); -} - -int init_sdl_audio(void) -{ - if (!sdl_funcs_loaded) { - if (xpbeep_load_sdl_funcs(&xpbeep_sdl) != 0) - return -1; - } - if(!sdl_initialized) { - if(xpbeep_sdl.Init(0)==0) - sdl_initialized=TRUE; - else - return(-1); - } - if(sdl_audio_initialized) - return(0); - if(xpbeep_sdl.InitSubSystem(SDL_INIT_AUDIO)==0) { - sdl_audio_initialized=TRUE; - return(0); - } - return(-1); -} diff --git a/xpdev/sdlfuncs.h b/xpdev/sdlfuncs.h deleted file mode 100644 index f2eaf34..0000000 --- a/xpdev/sdlfuncs.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _SDLFUNCS_H_ -#define _SDLFUNCS_H_ - -#include "SDL.h" -#include "SDL_audio.h" -#include "SDL_thread.h" -#include "SDL_syswm.h" - -struct sdlfuncs { - int (*Init) (Uint32 flags); - void (*Quit) (void); - int (*SemWait) (SDL_sem *sem); - int (*SemPost) (SDL_sem *sem); - SDL_sem *(*SDL_CreateSemaphore) (Uint32 initial_value); - void (*SDL_DestroySemaphore) (SDL_sem *semaphore); - int (*InitSubSystem)(Uint32 flags); - void (*QuitSubSystem)(Uint32 flags); - int (*OpenAudio)(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); - void (*CloseAudio)(void); - void (*LockAudio)(void); - void (*UnlockAudio)(void); - void (*PauseAudio)(int pause_on); - SDL_AudioStatus (*GetAudioStatus)(void); - int gotfuncs; -}; - -extern struct sdlfuncs xpbeep_sdl; -extern SDL_sem *sdl_exit_sem; - -#ifdef __cplusplus -extern "C" { -#endif -int load_sdl_funcs(struct sdlfuncs *sdlf); -int init_sdl_audio(void); -int SDL_main_env(int argc, char *argv[], char **env); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/xpdev/semfile.c b/xpdev/semfile.c deleted file mode 100644 index 5b17cb9..0000000 --- a/xpdev/semfile.c +++ /dev/null @@ -1,146 +0,0 @@ -/* semfile.c */ - -/* $Id: semfile.c,v 1.8 2019/07/24 04:11:23 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> - -#include "semfile.h" -#include "filewrap.h" -#include "dirwrap.h" -#include "genwrap.h" - -#if !defined(NO_SOCKET_SUPPORT) - #include "sockwrap.h" -#endif - -/****************************************************************************/ -/* This function compares a single semaphore file's */ -/* date/time stamp (if the file exists) against the passed time stamp (t) */ -/* updating the time stamp to the latest dated semaphore file and returning */ -/* TRUE if any where newer than the initial value. */ -/****************************************************************************/ -BOOL semfile_check(time_t* t, const char* fname) -{ - time_t ft; - - if(*t==0) /* uninitialized */ - *t=time(NULL); - - if((ft=fdate(fname))==-1 || ft<=*t) - return(FALSE); - - *t=ft; - return(TRUE); -} - -/****************************************************************************/ -/* This function goes through a list of semaphore files, comparing the file */ -/* date/time stamp (if the file exists) against the passed time stamp (t) */ -/* updating the time stamp to the latest dated semaphore file and returning */ -/* a pointer to the filename if any where newer than the initial timestamp. */ -/****************************************************************************/ -char* semfile_list_check(time_t* t, str_list_t filelist) -{ - char* signaled=NULL; - size_t i; - - for(i=0;filelist[i]!=NULL;i++) - if(semfile_check(t, filelist[i])) - signaled = filelist[i]; - - return(signaled); -} - -str_list_t semfile_list_init(const char* parent, - const char* action, const char* service) -{ - char path[MAX_PATH+1]; - char hostname[128]; - char* p; - str_list_t list; - - if((list=strListInit())==NULL) - return(NULL); - SAFEPRINTF2(path,"%s%s",parent,action); - strListPush(&list,path); - SAFEPRINTF3(path,"%s%s.%s",parent,action,service); - strListPush(&list,path); -#if !defined(NO_SOCKET_SUPPORT) - if(gethostname(hostname,sizeof(hostname))==0) { - SAFEPRINTF3(path,"%s%s.%s",parent,action,hostname); - strListPush(&list,path); - SAFEPRINTF4(path,"%s%s.%s.%s",parent,action,hostname,service); - strListPush(&list,path); - if((p=strchr(hostname,'.'))!=NULL) { - *p=0; - SAFEPRINTF3(path,"%s%s.%s",parent,action,hostname); - strListPush(&list,path); - SAFEPRINTF4(path,"%s%s.%s.%s",parent,action,hostname,service); - strListPush(&list,path); - } - } -#endif - return(list); -} - -void semfile_list_add(str_list_t* filelist, const char* path) -{ - strListPush(filelist, path); -} - -void semfile_list_free(str_list_t* filelist) -{ - strListFree(filelist); -} - -BOOL semfile_signal(const char* fname, const char* text) -{ - int file; - struct utimbuf ut; -#if !defined(NO_SOCKET_SUPPORT) - char hostname[128]; - - if(text==NULL && gethostname(hostname,sizeof(hostname))==0) - text=hostname; -#endif - if((file=open(fname,O_CREAT|O_WRONLY, DEFFILEMODE))<0) /* use sopen instead? */ - return(FALSE); - if(text!=NULL) - write(file,text,strlen(text)); - close(file); - - /* update the time stamp */ - ut.actime = ut.modtime = time(NULL); - return utime(fname, &ut)==0; -} diff --git a/xpdev/semfile.h b/xpdev/semfile.h deleted file mode 100644 index 1b73d1b..0000000 --- a/xpdev/semfile.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Semaphore file functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _SEMFILE_H -#define _SEMFILE_H - -#include <time.h> /* time_t */ -#include "str_list.h" /* string list functions and types */ -#include "wrapdll.h" /* DLLEXPORT */ - -#if defined(__cplusplus) -extern "C" { -#endif - -/* semfile.c */ -DLLEXPORT BOOL semfile_signal(const char* fname, const char* text); -DLLEXPORT BOOL semfile_check(time_t* t, const char* fname); -DLLEXPORT char* semfile_list_check(time_t* t, str_list_t filelist); -DLLEXPORT str_list_t - semfile_list_init(const char* parent, const char* action - ,const char* service); -DLLEXPORT void semfile_list_add(str_list_t* filelist, const char* fname); -DLLEXPORT void semfile_list_free(str_list_t* filelist); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/semwrap.c b/xpdev/semwrap.c deleted file mode 100644 index daad538..0000000 --- a/xpdev/semwrap.c +++ /dev/null @@ -1,125 +0,0 @@ -/* semwrap.c */ - -/* Semaphore-related cross-platform development wrappers */ - -/* $Id: semwrap.c,v 1.15 2018/07/24 01:13:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <errno.h> -#include "semwrap.h" - -#if defined(__unix__) - -#include <sys/time.h> /* timespec */ -#include <stdlib.h> /* NULL */ - -int -sem_trywait_block(sem_t *sem, unsigned long timeout) -{ - int retval; - struct timespec abstime; - struct timeval currtime; - - gettimeofday(&currtime,NULL); - abstime.tv_sec=currtime.tv_sec + (currtime.tv_usec/1000 + timeout)/1000; - abstime.tv_nsec=(currtime.tv_usec*1000 + timeout*1000000)%1000000000; - - retval=sem_timedwait(sem, &abstime); - if(retval && errno==ETIMEDOUT) - errno=EAGAIN; - return retval; -} - -#elif defined(_WIN32) - -#include <limits.h> /* INT_MAX */ - -#if defined(__BORLANDC__) - #pragma argsused -#endif -int sem_init(sem_t* psem, int pshared, unsigned int value) -{ - - if((*(psem)=CreateSemaphore(NULL,value,INT_MAX,NULL))==NULL) - return -1; - - return 0; -} - -int sem_trywait_block(sem_t* psem, unsigned long timeout) -{ - if(WaitForSingleObject(*(psem),timeout)!=WAIT_OBJECT_0) { - errno=EAGAIN; - return -1; - } - - return 0; -} - -int sem_post(sem_t* psem) -{ - if(ReleaseSemaphore(*(psem),1,NULL)==TRUE) - return 0; - - return -1; -} - -int sem_getvalue(sem_t* psem, int* vp) -{ -#if 0 /* This only works on 9x *sniff* */ - ReleaseSemaphore(*(psem),0,(LPLONG)vp); - return 0; -#else - /* Note, this should REALLY be in a critical section... */ - int retval=0; - - if(WaitForSingleObject(*(psem),0)!=WAIT_OBJECT_0) - *vp=0; - else { - if(ReleaseSemaphore(*(psem),1,(LPLONG)vp)) - (*vp)++; - else - retval=-1; - } - return(retval); -#endif -} - -int sem_destroy(sem_t* psem) -{ - if(CloseHandle(*(psem))==TRUE) - return 0; - return -1; -} - -#endif /* _WIN32 */ diff --git a/xpdev/semwrap.h b/xpdev/semwrap.h deleted file mode 100644 index 17cae49..0000000 --- a/xpdev/semwrap.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Semaphore-related cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _SEMWRAP_H -#define _SEMWRAP_H - -#include "gen_defs.h" -#include "wrapdll.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -#if defined(__unix__) - #if defined(USE_XP_SEMAPHORES) - #include "xpsem.h" - #define sem_init(x, y, z) xp_sem_init(x, y, z) - #define sem_destroy(x) xp_sem_destroy(x) - #define sem_close(x) xp_sem_close(x) - #define sem_unlink(x) xp_sem_unlink(x) - #define sem_wait(x) xp_sem_wait(x) - #define sem_trywait(x) xp_sem_trywait(x) - #define sem_post(x) xp_sem_post(x) - #define sem_getvalue(x,y) xp_sem_getvalue(x,y) - #define sem_timedwait(x,y) xp_sem_timedwait(x,y) - #define sem_t xp_sem_t - #else - #include <semaphore.h> /* POSIX semaphores */ - #endif - -#elif defined(_WIN32) - - #include <process.h> /* _beginthread */ - - /* POSIX semaphores */ - typedef HANDLE sem_t; - DLLEXPORT int sem_init(sem_t*, int pshared, unsigned int value); - DLLEXPORT int sem_post(sem_t*); - DLLEXPORT int sem_getvalue(sem_t*, int* value); - DLLEXPORT int sem_destroy(sem_t*); - #define sem_wait(psem) sem_trywait_block(psem,INFINITE) - #define sem_trywait(psem) sem_trywait_block(psem,0) - -#elif defined(__OS2__) /* These have *not* been tested! */ - - /* POSIX semaphores */ - typedef HEV sem_t; - #define sem_init(psem,ps,v) DosCreateEventSem(NULL,psem,0,0); - #define sem_wait(psem) DosWaitEventSem(*(psem),-1) - #define sem_post(psem) DosPostEventSem(*(psem)) - #define sem_destroy(psem) DosCloseEventSem(*(psem)) - -#else - - #error "Need semaphore wrappers." - -#endif - -/* NOT POSIX */ -DLLEXPORT int sem_trywait_block(sem_t* psem, unsigned long timeout); - - -/* Change semaphore to "unsignaled" (NOT POSIX) */ -#ifdef USE_XP_SEMAPHORES -#define sem_reset(psem) xp_sem_setvalue((psem), 0) -#else -#define sem_reset(psem) while(sem_trywait(psem)==0) -#endif - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/sockwrap.c b/xpdev/sockwrap.c deleted file mode 100644 index 42ae2c8..0000000 --- a/xpdev/sockwrap.c +++ /dev/null @@ -1,844 +0,0 @@ -/* Berkley/WinSock socket API wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> /* alloca/free on FreeBSD */ -#include <string.h> /* bzero (for FD_ZERO) on FreeBSD */ -#include <errno.h> /* ENOMEM */ -#include <stdio.h> /* SEEK_SET */ -#include <string.h> -#if defined(_WIN32) - #include <malloc.h> /* alloca() on Win32 */ -#endif - -#include "genwrap.h" /* SLEEP */ -#include "gen_defs.h" /* BOOL/LOG_WARNING */ -#include "sockwrap.h" /* sendsocket */ -#include "filewrap.h" /* filelength */ - -static socket_option_t socket_options[] = { - { "TYPE", 0, SOL_SOCKET, SO_TYPE }, - { "ERROR", 0, SOL_SOCKET, SO_ERROR }, - { "DEBUG", 0, SOL_SOCKET, SO_DEBUG }, - { "LINGER", SOCK_STREAM, SOL_SOCKET, SO_LINGER }, - { "SNDBUF", 0, SOL_SOCKET, SO_SNDBUF }, - { "RCVBUF", 0, SOL_SOCKET, SO_RCVBUF }, - -#ifndef _WINSOCKAPI_ /* Defined, but not supported, by WinSock */ - { "SNDLOWAT", 0, SOL_SOCKET, SO_SNDLOWAT }, - { "RCVLOWAT", 0, SOL_SOCKET, SO_RCVLOWAT }, - { "SNDTIMEO", 0, SOL_SOCKET, SO_SNDTIMEO }, - { "RCVTIMEO", 0, SOL_SOCKET, SO_RCVTIMEO }, -#ifdef SO_USELOOPBACK /* SunOS */ - { "USELOOPBACK", 0, SOL_SOCKET, SO_USELOOPBACK }, -#endif -#endif - - { "REUSEADDR", 0, SOL_SOCKET, SO_REUSEADDR }, -#ifdef SO_REUSEPORT /* BSD */ - { "REUSEPORT", 0, SOL_SOCKET, SO_REUSEPORT }, -#endif -#ifdef SO_EXCLUSIVEADDRUSE /* WinSock */ - { "EXCLUSIVEADDRUSE", 0, SOL_SOCKET, SO_EXCLUSIVEADDRUSE }, -#endif - { "KEEPALIVE", SOCK_STREAM, SOL_SOCKET, SO_KEEPALIVE }, - { "DONTROUTE", 0, SOL_SOCKET, SO_DONTROUTE }, - { "BROADCAST", SOCK_DGRAM, SOL_SOCKET, SO_BROADCAST }, - { "OOBINLINE", SOCK_STREAM, SOL_SOCKET, SO_OOBINLINE }, - -#ifdef SO_ACCEPTCONN - { "ACCEPTCONN", SOCK_STREAM, SOL_SOCKET, SO_ACCEPTCONN }, -#endif -#ifdef SO_PRIORITY /* Linux */ - { "PRIORITY", 0, SOL_SOCKET, SO_PRIORITY }, -#endif -#ifdef SO_NO_CHECK /* Linux */ - { "NO_CHECK", 0, SOL_SOCKET, SO_NO_CHECK }, -#endif -#ifdef SO_PROTOTYPE /* SunOS */ - { "PROTOTYPE", 0, SOL_SOCKET, SO_PROTOTYPE }, -#endif -#ifdef SO_MAX_MSG_SIZE /* WinSock2 */ - { "MAX_MSG_SIZE", SOCK_DGRAM, SOL_SOCKET, SO_MAX_MSG_SIZE }, -#endif -#ifdef SO_CONNECT_TIME /* WinSock2 */ - { "CONNECT_TIME", SOCK_STREAM, SOL_SOCKET, SO_CONNECT_TIME }, -#endif - - /* IPPROTO-level socket options */ - { "TCP_NODELAY", SOCK_STREAM, IPPROTO_TCP, TCP_NODELAY }, - /* The following are platform-specific */ -#ifdef TCP_MAXSEG - { "TCP_MAXSEG", SOCK_STREAM, IPPROTO_TCP, TCP_MAXSEG }, -#endif -#ifdef TCP_CORK - { "TCP_CORK", SOCK_STREAM, IPPROTO_TCP, TCP_CORK }, -#endif -#ifdef TCP_KEEPIDLE - { "TCP_KEEPIDLE", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPIDLE }, -#endif -#ifdef TCP_KEEPINTVL - { "TCP_KEEPINTVL", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPINTVL }, -#endif -#ifdef TCP_KEEPCNT - { "TCP_KEEPCNT", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPCNT }, -#endif -#ifdef TCP_KEEPALIVE /* SunOS */ - { "TCP_KEEPALIVE", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPALIVE }, -#endif -#ifdef TCP_SYNCNT - { "TCP_SYNCNT", SOCK_STREAM, IPPROTO_TCP, TCP_SYNCNT }, -#endif -#ifdef TCP_LINGER2 - { "TCP_LINGER2", SOCK_STREAM, IPPROTO_TCP, TCP_LINGER2 }, -#endif -#ifdef TCP_DEFER_ACCEPT - { "TCP_DEFER_ACCEPT", SOCK_STREAM, IPPROTO_TCP, TCP_DEFER_ACCEPT }, -#endif -#ifdef TCP_WINDOW_CLAMP - { "TCP_WINDOW_CLAMP", SOCK_STREAM, IPPROTO_TCP, TCP_WINDOW_CLAMP }, -#endif -#ifdef TCP_QUICKACK - { "TCP_QUICKACK", SOCK_STREAM, IPPROTO_TCP, TCP_QUICKACK }, -#endif -#ifdef TCP_NOPUSH - { "TCP_NOPUSH", SOCK_STREAM, IPPROTO_TCP, TCP_NOPUSH }, -#endif -#ifdef TCP_NOOPT - { "TCP_NOOPT", SOCK_STREAM, IPPROTO_TCP, TCP_NOOPT }, -#endif -#if defined(IPV6_V6ONLY) && defined(IPPROTO_IPV6) - { "IPV6_V6ONLY", 0, IPPROTO_IPV6, IPV6_V6ONLY }, -#endif - { NULL } -}; - -int getSocketOptionByName(const char* name, int* level) -{ - int i; - - if(level!=NULL) - *level=SOL_SOCKET; /* default option level */ - for(i=0;socket_options[i].name;i++) { - if(stricmp(name,socket_options[i].name)==0) { - if(level!=NULL) - *level = socket_options[i].level; - return(socket_options[i].value); - } - } - if(!IS_DIGIT(*name)) /* unknown option name */ - return(-1); - return(strtol(name,NULL,0)); -} - -socket_option_t* getSocketOptionList(void) -{ - return(socket_options); -} - -off_t sendfilesocket(int sock, int file, off_t *offset, off_t count) -{ - char buf[1024*16]; - off_t len; - ssize_t rd; - ssize_t wr=0; - off_t total=0; - ssize_t i; - -/* sendfile() on Linux may or may not work with non-blocking sockets ToDo */ - len=filelength(file); - - if(offset!=NULL) - if(lseek(file,*offset,SEEK_SET)<0) - return(-1); - - if(count<1 || count>len) { - count=len; - count-=tell(file); /* don't try to read beyond EOF */ - } -#if USE_SENDFILE - while((i=sendfile(file,sock,(offset==NULL?0:*offset)+total,count-total,NULL,&wr,0))==-1 && errno==EAGAIN) { - total+=wr; - SLEEP(1); - } - if(i==0) - return(count); -#endif - - if(count<0) { - errno=EINVAL; - return(-1); - } - - while(total<count) { - rd=read(file,buf,sizeof(buf)); - if(rd==-1) - return(-1); - if(rd==0) - break; - for(i=wr=0;i<rd;i+=wr) { - wr=sendsocket(sock,buf+i,rd-i); - if(wr>0) - continue; - if(wr==SOCKET_ERROR && ERROR_VALUE==EWOULDBLOCK) { - wr=0; - SLEEP(1); - continue; - } - return(wr); - } - if(i!=rd) - return(-1); - total+=rd; - } - - if(offset!=NULL) - (*offset)+=total; - - return(total); -} - -off_t recvfilesocket(int sock, int file, off_t *offset, off_t count) -{ - /* Writes a file from a socket - - * - * sock - Socket to read from - * file - File descriptior to write to - * MUST be open and writeable - * offset - pointer to file offset to start writing at - * is set to offset writing STOPPED - * on return - * count - number of bytes to read/write - * - * returns -1 if an error occurse, otherwise - * returns number ob bytes written and sets offset - * to the new offset - */ - - char* buf; - ssize_t rd; - ssize_t wr; - - if(count<1) { - errno=ERANGE; - return(-1); - } - - if((buf=(char*)malloc((size_t)count))==NULL) { - errno=ENOMEM; - return(-1); - } - - if(offset!=NULL) { - if(lseek(file,*offset,SEEK_SET)<0) { - free(buf); - return(-1); - } - } - - rd=read(sock,buf,(size_t)count); - if(rd!=count) { - free(buf); - return(-1); - } - - wr=write(file,buf,rd); - - if(offset!=NULL) - (*offset)+=wr; - - free(buf); - return(wr); -} - - -/* Return true if connected, optionally sets *rd_p to true if read data available */ -/* - * The exact conditions where rd_p is set to TRUE and the return value - * is true or false are complex, but the intent appears to be as follows: - * - * If the remote has half-closed the socket, rd_p should be FALSE and - * the function should return FALSE, unless rd_p is NULL in which case - * the function should return TRUE. wr_p will indicate that transmit - * buffers are available. - * - * If we have half-closed the socket, wr_p should be TRUE, the function - * should return TRUE, and rd_p will indicate if there is data available - * to be received. - * - * If the socket is completely closed, wr_p should be TRUE, rd_p should be - * FALSE, and the function should return FALSE, unless rd_p is NULL in which - * case, the function should return TRUE. - * - * When the function is open in both directions, wr_p will indicate transmit - * buffers are available, rd_p will indicate data is available to be recv()ed - * and the return value should be TRUE. - * - * If the socket is invalid, rd_p should be FALSE, wr_p should be FALSE, and - * the function should return FALSE. - * - * These rules have various exceptions when errors are returned by select(), - * poll(), or recv(), which will generally cause a FALSE return with rd_p - * being FALSE and wr_p being FALSE if select/poll failed, or indicating - * available write buffers otherwise. - */ -BOOL socket_check(SOCKET sock, BOOL* rd_p, BOOL* wr_p, DWORD timeout) -{ -#ifdef PREFER_POLL - struct pollfd pfd = {0}; - int j, rd; - char ch; - - if(rd_p!=NULL) - *rd_p=FALSE; - - if(wr_p!=NULL) - *wr_p=FALSE; - - if(sock==INVALID_SOCKET) - return(FALSE); - - pfd.fd = sock; - pfd.events = POLLIN | POLLHUP; - if (wr_p != NULL) - pfd.events |= POLLOUT; - - j = poll(&pfd, 1, timeout); - - if (j == 0) - return TRUE; - - if (j == 1) { - if (wr_p != NULL && (pfd.revents & POLLOUT)) { - *wr_p = TRUE; - if (rd_p == NULL) - return TRUE; - } - - if (pfd.revents & (POLLERR | POLLNVAL | POLLHUP)) - return FALSE; - - if(pfd.revents & ~(POLLOUT) && (rd_p !=NULL || wr_p==NULL)) { - rd=recv(sock,&ch,1,MSG_PEEK); - if(rd==1 || (rd==SOCKET_ERROR && ERROR_VALUE==EMSGSIZE)) { - if(rd_p!=NULL) - *rd_p=TRUE; - return TRUE; - } - } - return FALSE; - } - - if (j == -1) { - if (errno == EINTR || errno == ENOMEM) - return TRUE; - } - - return FALSE; -#else - char ch; - int i,rd; - fd_set rd_set; - fd_set* rd_set_p=&rd_set; - fd_set wr_set; - fd_set* wr_set_p=NULL; - struct timeval tv; - - if(rd_p!=NULL) - *rd_p=FALSE; - - if(wr_p!=NULL) - *wr_p=FALSE; - - if(sock==INVALID_SOCKET) - return(FALSE); - - FD_ZERO(&rd_set); - FD_SET(sock,&rd_set); - if(wr_p!=NULL) { - wr_set_p=&wr_set; - FD_ZERO(wr_set_p); - FD_SET(sock,wr_set_p); - if(rd_p==NULL) - rd_set_p=NULL; - } - - /* Convert timeout from ms to sec/usec */ - tv.tv_sec=timeout/1000; - tv.tv_usec=(timeout%1000)*1000; - - i=select(sock+1,rd_set_p,wr_set_p,NULL,&tv); - if(i==SOCKET_ERROR) - return(FALSE); - - if(i==0) - return(TRUE); - - if(wr_p!=NULL && FD_ISSET(sock,wr_set_p)) { - *wr_p=TRUE; - if(i==1) - return(TRUE); - } - - if(rd_p !=NULL || wr_p==NULL) { - rd=recv(sock,&ch,1,MSG_PEEK); - if(rd==1 - || (rd==SOCKET_ERROR && ERROR_VALUE==EMSGSIZE)) { - if(rd_p!=NULL) - *rd_p=TRUE; - return(TRUE); - } - } - - return(FALSE); -#endif -} - -/* - * Return TRUE if recv() will not block on socket - * Will block for timeout ms or forever if timeout is negative - * - * This means it will return true if recv() will return an error - * as well as if the socket is closed (and recv() will return 0) - */ -BOOL socket_readable(SOCKET sock, int timeout) -{ -#ifdef PREFER_POLL - struct pollfd pfd = {0}; - pfd.fd = sock; - pfd.events = POLLIN; - - if (poll(&pfd, 1, timeout) == 1) - return TRUE; - return FALSE; -#else - fd_set rd_set; - struct timeval tv = {0}; - struct timeval *tvp = &tv; - - FD_ZERO(&rd_set); - FD_SET(sock, &rd_set); - if (timeout < 0) - tvp = NULL; - else { - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - } - - switch (select(sock+1, &rd_set, NULL, NULL, tvp)) { - case 0: // Nothing to read - return FALSE; - case 1: - return TRUE; - } - // Errors and unexpected cases - return TRUE; -#endif -} - -/* - * Return TRUE if send() will not block on socket - * Will block for timeout ms or forever if timeout is negative - * - * This means it will return true if send() will return an error - * as well as if the socket is closed (and send() will return 0) - */ -BOOL socket_writable(SOCKET sock, int timeout) -{ -#ifdef PREFER_POLL - struct pollfd pfd = {0}; - pfd.fd = sock; - pfd.events = POLLOUT; - - if (poll(&pfd, 1, timeout) == 1) - return TRUE; - return FALSE; -#else - fd_set wr_set; - struct timeval tv = {0}; - struct timeval *tvp = &tv; - - FD_ZERO(&wr_set); - FD_SET(sock, &wr_set); - if (timeout < 0) - tvp = NULL; - else { - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - } - - switch (select(sock+1, NULL, &wr_set, NULL, tvp)) { - case 0: // Nothing to read - return FALSE; - case 1: - return TRUE; - } - // Errors and unexpected cases - return TRUE; -#endif -} - -/* - * Return TRUE if recv() will not block and will return zero - * or an error. This is *not* a test if a socket is - * disconnected, but rather that it is disconnected *AND* all - * data has been recv()ed. - */ -BOOL socket_recvdone(SOCKET sock, int timeout) -{ -#ifdef PREFER_POLL - struct pollfd pfd = {0}; - pfd.fd = sock; - pfd.events = POLLIN; - char ch; - int rd; - - switch (poll(&pfd, 1, timeout)) { - case 1: - if (pfd.revents) { - rd = recv(sock,&ch,1,MSG_PEEK); - if (rd == 1 || (rd==SOCKET_ERROR && ERROR_VALUE==EMSGSIZE)) - return FALSE; - return TRUE; - } - return FALSE; - case -1: - if (errno == EINTR || errno == ENOMEM) - return FALSE; - return TRUE; - } - return FALSE; -#else - fd_set rd_set; - struct timeval tv = {0}; - struct timeval *tvp = &tv; - char ch; - int rd; - - FD_ZERO(&rd_set); - FD_SET(sock, &rd_set); - if (timeout < 0) - tvp = NULL; - else { - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - } - - switch (select(sock+1, &rd_set, NULL, NULL, tvp)) { - case -1: // Error, call this disconnected - return TRUE; - case 0: // Nothing to read - return FALSE; - } - rd = recv(sock,&ch,1,MSG_PEEK); - if (rd == 1 || (rd==SOCKET_ERROR && ERROR_VALUE==EMSGSIZE)) - return FALSE; - return TRUE; -#endif -} - -int retry_bind(SOCKET s, const struct sockaddr *addr, socklen_t addrlen - ,uint retries, uint wait_secs - ,const char* prot - ,int (*lprintf)(int level, const char *fmt, ...)) -{ - char port_str[128]; - char err[256]; - int result=-1; - uint i; - - if(addr->sa_family==AF_INET) - SAFEPRINTF(port_str," to port %u",ntohs(((SOCKADDR_IN *)(addr))->sin_port)); - else - port_str[0]=0; - for(i=0;i<=retries;i++) { - if((result=bind(s,addr,addrlen))==0) - break; - if(lprintf!=NULL) - lprintf(i<retries ? LOG_WARNING:LOG_CRIT - ,"%04d !ERROR %d binding %s socket%s: %s", s, ERROR_VALUE, prot, port_str, socket_strerror(socket_errno, err, sizeof(err))); - if(i<retries) { - if(lprintf!=NULL) - lprintf(LOG_WARNING,"%04d Will retry in %u seconds (%u of %u)" - ,s, wait_secs, i+1, retries); - SLEEP(wait_secs*1000); - } - } - return(result); -} - -int nonblocking_connect(SOCKET sock, struct sockaddr* addr, size_t size, unsigned timeout) -{ - int result; - socklen_t optlen; - - result=connect(sock, addr, size); - - if(result==SOCKET_ERROR) { - result=ERROR_VALUE; - if(result==EWOULDBLOCK || result==EINPROGRESS) { - if (socket_writable(sock, timeout * 1000)) { - result = 0; - } - else { - optlen = sizeof(result); - if(getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)&result, &optlen)==SOCKET_ERROR) - result=ERROR_VALUE; - } - } - } - return result; -} - - -union xp_sockaddr* inet_ptoaddr(const char *addr_str, union xp_sockaddr *addr, size_t size) -{ - struct addrinfo hints = {0}; - struct addrinfo *res, *cur; - - hints.ai_flags = AI_NUMERICHOST|AI_PASSIVE; - if(getaddrinfo(addr_str, NULL, &hints, &res)) - return NULL; - - for(cur = res; cur; cur = cur->ai_next) { - if(cur->ai_addr->sa_family == AF_INET6) - break; - if(cur->ai_addr->sa_family == AF_INET) - break; - } - if(!cur) { - freeaddrinfo(res); - return NULL; - } - if (size < sizeof(struct sockaddr_in6)) { - freeaddrinfo(res); - return NULL; - } - size = sizeof(struct sockaddr_in6); - memcpy(addr, ((struct sockaddr_in6 *)(cur->ai_addr)), size); - freeaddrinfo(res); - return addr; -} - -const char* inet_addrtop(union xp_sockaddr *addr, char *dest, size_t size) -{ -#ifdef _WIN32 - if(getnameinfo(&addr->addr, xp_sockaddr_len(addr), dest, size, NULL, 0, NI_NUMERICHOST)) - safe_snprintf(dest, size, "<Error %u converting address, family=%u>", WSAGetLastError(), addr->addr.sa_family); - return dest; -#else - switch(addr->addr.sa_family) { - case AF_INET: - return inet_ntop(addr->in.sin_family, &addr->in.sin_addr, dest, size); - case AF_INET6: - return inet_ntop(addr->in6.sin6_family, &addr->in6.sin6_addr, dest, size); - case AF_UNIX: - strncpy(dest, addr->un.sun_path, size); - dest[size-1]=0; - return dest; - default: - safe_snprintf(dest, size, "<unknown address family: %u>", addr->addr.sa_family); - return NULL; - } -#endif -} - -uint16_t inet_addrport(union xp_sockaddr *addr) -{ - switch(addr->addr.sa_family) { - case AF_INET: - return ntohs(addr->in.sin_port); - case AF_INET6: - return ntohs(addr->in6.sin6_port); - default: - return 0; - } -} - -void inet_setaddrport(union xp_sockaddr *addr, uint16_t port) -{ - switch(addr->addr.sa_family) { - case AF_INET: - addr->in.sin_port = htons(port); - break; - case AF_INET6: - addr->in6.sin6_port = htons(port); - break; - } -} - -/* Return TRUE if the 2 addresses are the same host (type and address) */ -BOOL inet_addrmatch(union xp_sockaddr* addr1, union xp_sockaddr* addr2) -{ - if(addr1->addr.sa_family != addr2->addr.sa_family) - return FALSE; - - switch(addr1->addr.sa_family) { - case AF_INET: - return memcmp(&addr1->in.sin_addr, &addr2->in.sin_addr, sizeof(addr1->in.sin_addr)) == 0; - case AF_INET6: - return memcmp(&addr1->in6.sin6_addr, &addr2->in6.sin6_addr, sizeof(addr1->in6.sin6_addr)) == 0; - } - return FALSE; -} - -/* Return the current socket error description (for Windows), like strerror() does for errno */ -DLLEXPORT char* socket_strerror(int error_number, char* buf, size_t buflen) -{ -#if defined(_WINSOCKAPI_) - strncpy(buf, "Unknown error", buflen); - buf[buflen - 1] = 0; - if(error_number > 0 && error_number < WSABASEERR) - error_number += WSABASEERR; - if(!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, // dwFlags - NULL, // lpSource - error_number, // dwMessageId - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // dwLanguageId - buf, - buflen, - NULL)) - safe_snprintf(buf, buflen, "Error %d getting error description", GetLastError()); - truncsp(buf); - return buf; -#else - return safe_strerror(error_number, buf, buflen); -#endif -} - -DLLEXPORT void set_socket_errno(int err) -{ -#if defined(_WINSOCKAPI_) - WSASetLastError(err); -#else - errno = err; -#endif -} - -DLLEXPORT int xp_inet_pton(int af, const char *src, void *dst) -{ - struct addrinfo hints = {0}; - struct addrinfo *res, *cur; - - if (af != AF_INET && af != AF_INET6) { - set_socket_errno(EAFNOSUPPORT); - return -1; - } - - hints.ai_flags = AI_NUMERICHOST|AI_PASSIVE; - if(getaddrinfo(src, NULL, &hints, &res)) - return -1; - - for(cur = res; cur; cur++) { - if(cur->ai_addr->sa_family == af) - break; - } - if(!cur) { - freeaddrinfo(res); - return 0; - } - switch(af) { - case AF_INET: - memcpy(dst, &(((struct sockaddr_in *)cur)->sin_addr), sizeof(((struct sockaddr_in *)cur)->sin_addr)); - break; - case AF_INET6: - memcpy(dst, &(((struct sockaddr_in6 *)cur)->sin6_addr), sizeof(((struct sockaddr_in6 *)cur)->sin6_addr)); - break; - } - freeaddrinfo(res); - return 1; -} - -#ifdef _WIN32 -DLLEXPORT int -socketpair(int domain, int type, int protocol, SOCKET *sv) -{ - union xp_sockaddr la = {0}; - const int ra = 1; - SOCKET ls; - SOCKET *check; - fd_set rfd; - struct timeval tv; - size_t sa_len; - - sv[0] = sv[1] = INVALID_SOCKET; - ls = socket(domain, type, protocol); - if (ls == INVALID_SOCKET) - goto fail; - switch (domain) { - case PF_INET: - if (inet_ptoaddr("127.0.0.1", &la, sizeof(la)) == NULL) - goto fail; - sa_len = sizeof(la.in); - break; - case PF_INET6: - if (inet_ptoaddr("::1", &la, sizeof(la)) == NULL) - goto fail; - sa_len = sizeof(la.in6); - break; - default: - goto fail; - } - inet_setaddrport(&la, 0); - if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, (const char *)&ra, sizeof(ra)) == -1) - goto fail; - if (bind(ls, &la.addr, sa_len) == -1) - goto fail; - if (getsockname(ls, &la.addr, &sa_len) == -1) - goto fail; - if (listen(ls, 1) == -1) - goto fail; - sv[0] = socket(la.addr.sa_family, type, protocol); - if (sv[0] == INVALID_SOCKET) - goto fail; - if (connect(sv[0], &la.addr, sa_len) == -1) - goto fail; - sv[1] = accept(ls, NULL, NULL); - if (sv[1] == INVALID_SOCKET) - goto fail; - closesocket(ls); - ls = INVALID_SOCKET; - - if (send(sv[1], (const char *)&sv, sizeof(sv), 0) != sizeof(sv)) - goto fail; - tv.tv_sec = 0; - tv.tv_usec = 50000; - FD_ZERO(&rfd); - FD_SET(sv[0], &rfd); - if (select(sv[0] + 1, &rfd, NULL, NULL, &tv) != 1) - goto fail; - if (recv(sv[0], (char *)&check, sizeof(check), 0) != sizeof(check)) - goto fail; - if (check != sv) - goto fail; - return 0; - -fail: - if (ls != INVALID_SOCKET) - closesocket(ls); - if (sv[0] != INVALID_SOCKET) - closesocket(sv[0]); - sv[0] = INVALID_SOCKET; - if (sv[1] != INVALID_SOCKET) - closesocket(sv[1]); - sv[1] = INVALID_SOCKET; - return -1; -} -#endif - diff --git a/xpdev/sockwrap.h b/xpdev/sockwrap.h deleted file mode 100644 index b5d3866..0000000 --- a/xpdev/sockwrap.h +++ /dev/null @@ -1,308 +0,0 @@ -/* Berkley/WinSock socket API wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _SOCKWRAP_H -#define _SOCKWRAP_H - -#include "gen_defs.h" /* BOOL */ - -/***************/ -/* OS-specific */ -/***************/ -#if defined(_WIN32) /* Use WinSock */ - -#ifndef _WINSOCKAPI_ - #include <winsock2.h> /* socket/bind/etc. */ - #include <mswsock.h> /* Microsoft WinSock2 extensions */ -#if defined(__BORLANDC__) -// Borland C++ builder 6 comes with a broken ws2tcpip.h header for GCC. -#define _MSC_VER 7 -#endif - #include <ws2tcpip.h> /* More stuff */ -#if defined(__BORLANDC__) -#undef _MSC_VER -#endif - #if (_WIN32_WINNT < _WIN32_WINNT_WINXP) - #include <wspiapi.h> /* getaddrinfo() for Windows 2k */ - #endif - #define SOCK_MAXADDRLEN sizeof(SOCKADDR_STORAGE) - /* Let's agree on a standard WinSock symbol here, people */ - #define _WINSOCKAPI_ -#endif -#ifndef MSG_WAITALL -#define MSG_WAITALL 0x08 -#endif - -#elif defined __unix__ /* Unix-variant */ - -#include <netdb.h> /* gethostbyname */ -#include <sys/types.h> /* For u_int32_t on FreeBSD */ -#include <netinet/in.h> /* IPPROTO_IP */ -#include <sys/un.h> -/* define _BSD_SOCKLEN_T_ in order to define socklen_t on darwin */ -#ifdef __DARWIN__ -#define _BSD_SOCKLEN_T_ int -#endif -#include <sys/socket.h> /* socket/bind/etc. */ -#include <sys/time.h> /* struct timeval */ -#include <arpa/inet.h> /* inet_ntoa */ -#include <netinet/tcp.h> /* TCP_NODELAY */ -#include <unistd.h> /* close */ -#include <poll.h> -#if defined(__solaris__) - #include <sys/filio.h> /* FIONBIO */ - #define INADDR_NONE -1L -#else - #include <sys/ioctl.h> /* FIONBIO */ -#endif - -#endif - -#include <errno.h> /* errno */ -#include "wrapdll.h" /* DLLEXPORT */ - -typedef struct { - char* name; - int type; /* Supported socket types (or 0 for unspecified) */ - int level; - int value; -} socket_option_t; - -/* - * Fancy sockaddr_* union - */ -union xp_sockaddr { - struct sockaddr addr; - struct sockaddr_in in; - struct sockaddr_in6 in6; -#ifndef _WIN32 - struct sockaddr_un un; -#endif - struct sockaddr_storage store; -}; - -#define xp_sockaddr_len(a) ((((struct sockaddr *)a)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) - - - -/**********************************/ -/* Socket Implementation-specific */ -/**********************************/ -#if defined(_WINSOCKAPI_) - -#undef EINTR -#define EINTR (WSAEINTR-WSABASEERR) -#undef ENOTSOCK -#define ENOTSOCK (WSAENOTSOCK-WSABASEERR) -#undef EMSGSIZE -#define EMSGSIZE (WSAEMSGSIZE-WSABASEERR) -#undef EWOULDBLOCK -#define EWOULDBLOCK (WSAEWOULDBLOCK-WSABASEERR) - -#ifndef EPROTOTYPE -#define EPROTOTYPE (WSAEPROTOTYPE-WSABASEERR) -#endif -#ifndef ENOPROTOOPT -#define ENOPROTOOPT (WSAENOPROTOOPT-WSABASEERR) -#endif -#ifndef EPROTONOSUPPORT -#define EPROTONOSUPPORT (WSAEPROTONOSUPPORT-WSABASEERR) -#endif -#ifndef ESOCKTNOSUPPORT -#define ESOCKTNOSUPPORT (WSAESOCKTNOSUPPORT-WSABASEERR) -#endif -#ifndef EOPNOTSUPP -#define EOPNOTSUPP (WSAEOPNOTSUPP-WSABASEERR) -#endif -#ifndef EPFNOSUPPORT -#define EPFNOSUPPORT (WSAEPFNOSUPPORT-WSABASEERR) -#endif -#ifndef EAFNOSUPPORT -#define EAFNOSUPPORT (WSAEAFNOSUPPORT-WSABASEERR) -#endif - -#undef EADDRINUSE -#define EADDRINUSE (WSAEADDRINUSE-WSABASEERR) -#undef EADDRNOTAVAIL -#define EADDRNOTAVAIL (WSAEADDRNOTAVAIL-WSABASEERR) -#undef ECONNABORTED -#define ECONNABORTED (WSAECONNABORTED-WSABASEERR) -#undef ECONNRESET -#define ECONNRESET (WSAECONNRESET-WSABASEERR) -#undef ENOBUFS -#define ENOBUFS (WSAENOBUFS-WSABASEERR) -#undef EISCONN -#define EISCONN (WSAEISCONN-WSABASEERR) -#undef ENOTCONN -#define ENOTCONN (WSAENOTCONN-WSABASEERR) -#undef ESHUTDOWN -#define ESHUTDOWN (WSAESHUTDOWN-WSABASEERR) -#undef ETIMEDOUT -#define ETIMEDOUT (WSAETIMEDOUT-WSABASEERR) -#undef ECONNREFUSED -#define ECONNREFUSED (WSAECONNREFUSED-WSABASEERR) -#undef EINPROGRESS -#define EINPROGRESS (WSAEINPROGRESS-WSABASEERR) - -/* for shutdown() */ -#define SHUT_RD SD_RECEIVE -#define SHUT_WR SD_SEND -#define SHUT_RDWR SD_BOTH - -#define s_addr S_un.S_addr -#define sa_family_t ushort -typedef uint32_t in_addr_t; - -static int wsa_error; -#define ERROR_VALUE ((wsa_error=WSAGetLastError())>0 ? wsa_error-WSABASEERR : wsa_error) -#define socket_errno WSAGetLastError() -#define sendsocket(s,b,l) send(s,b,l,0) -typedef ULONG nfds_t; -/* - * NOTE: WSAPoll() has a bug where a non-blocking socket which has connect() - * called on it that is trying to connect to a closed port will timeout - * instead of returning a failure, even with POLLOUT specified. - */ -#define poll(s, c, t) WSAPoll(s, c, t) - -/* For getaddrinfo() */ -#ifndef AI_ADDRCONFIG -# define AI_ADDRCONFIG 0x400 // Vista or later -#endif -#ifndef AI_NUMERICSERV -# define AI_NUMERICSERV 0 // Not supported by Win32 -#endif - -#else /* BSD sockets */ - -/* WinSock-isms */ -#define HOSTENT struct hostent -#define IN_ADDR struct in_addr -#define SOCKADDR struct sockaddr -#define SOCKADDR_IN struct sockaddr_in -#define LINGER struct linger -#define SOCKET int -#define SOCKET_ERROR -1 -#define INVALID_SOCKET (SOCKET)(~0) -#define closesocket close -#define ioctlsocket ioctl -#define ERROR_VALUE errno -#define socket_errno errno -#define sendsocket write /* FreeBSD send() is broken */ - -#ifdef __WATCOMC__ - #define socklen_t int -#endif - -#endif /* __unix__ */ - -#ifdef __cplusplus -extern "C" { -#endif - -DLLEXPORT socket_option_t* getSocketOptionList(void); -DLLEXPORT int getSocketOptionByName(const char* name, int* level); - -DLLEXPORT off_t sendfilesocket(int sock, int file, off_t* offset, off_t count); -DLLEXPORT off_t recvfilesocket(int sock, int file, off_t* offset, off_t count); -DLLEXPORT BOOL socket_check(SOCKET sock, BOOL* rd_p, BOOL* wr_p, DWORD timeout); -DLLEXPORT int retry_bind(SOCKET s, const struct sockaddr *addr, socklen_t addrlen - ,uint retries, uint wait_secs, const char* prot - ,int (*lprintf)(int level, const char *fmt, ...)); -DLLEXPORT int nonblocking_connect(SOCKET, struct sockaddr*, size_t, unsigned timeout /* seconds */); -DLLEXPORT union xp_sockaddr* inet_ptoaddr(const char *addr_str, union xp_sockaddr *addr, size_t size); -DLLEXPORT const char* inet_addrtop(union xp_sockaddr *addr, char *dest, size_t size); -DLLEXPORT uint16_t inet_addrport(union xp_sockaddr *addr); -DLLEXPORT void inet_setaddrport(union xp_sockaddr *addr, uint16_t port); -DLLEXPORT BOOL inet_addrmatch(union xp_sockaddr* addr1, union xp_sockaddr* addr2); -DLLEXPORT char* socket_strerror(int, char*, size_t); -DLLEXPORT void set_socket_errno(int); -DLLEXPORT int xp_inet_pton(int af, const char *src, void *dst); -#if defined(_WIN32) // mingw and WinXP's WS2_32.DLL don't have inet_pton(): - #define inet_pton xp_inet_pton -DLLEXPORT int socketpair(int domain, int type, int protocol, SOCKET *sv); -#endif - -/* - * Return TRUE if recv() will not block on socket - * Will block for timeout ms or forever if timeout is negative - * - * This means it will return true if recv() will return an error - * as well as if the socket is closed (and recv() will return 0) - */ -DLLEXPORT BOOL socket_readable(SOCKET sock, int timeout); - -/* - * Return TRUE if send() will not block on socket - * Will block for timeout ms or forever if timeout is negative - * - * This means it will return true if send() will return an error - * as well as if the socket is closed (and send() will return 0) - */ -DLLEXPORT BOOL socket_writable(SOCKET sock, int timeout); - -/* - * Return TRUE if recv() will not block and will return zero - * or an error. This is *not* a test if a socket is - * disconnected, but rather that it is disconnected *AND* all - * data has been recv()ed. - */ -DLLEXPORT BOOL socket_recvdone(SOCKET sock, int timeout); - -#ifdef __cplusplus -} -#endif - -#ifndef IPPORT_HTTP -#define IPPORT_HTTP 80 -#endif -#ifndef IPPORT_HTTPS -#define IPPORT_HTTPS 443 -#endif -#ifndef IPPORT_FTP -#define IPPORT_FTP 21 -#endif -#ifndef IPPORT_TELNET -#define IPPORT_TELNET 23 -#endif -#ifndef IPPORT_SMTP -#define IPPORT_SMTP 25 -#endif -#ifndef IPPORT_POP3 -#define IPPORT_POP3 110 -#endif -#ifndef IPPORT_POP3S -#define IPPORT_POP3S 995 -#endif -#ifndef IPPORT_IDENT -#define IPPORT_IDENT 113 -#endif -#ifndef IPPORT_SUBMISSION -#define IPPORT_SUBMISSION 587 -#endif -#ifndef IPPORT_SUBMISSIONS -#define IPPORT_SUBMISSIONS 465 -#endif -#ifndef IPPORT_BINKP -#define IPPORT_BINKP 24554 -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/str_list.c b/xpdev/str_list.c deleted file mode 100644 index aeace2d..0000000 --- a/xpdev/str_list.c +++ /dev/null @@ -1,876 +0,0 @@ -/* Functions to deal with NULL-terminated string lists */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> /* malloc and qsort */ -#include <string.h> /* strtok */ -#include "genwrap.h" /* stricmp */ -#include "str_list.h" -#include "xpprintf.h" - -str_list_t strListInit(void) -{ - str_list_t list; - - if((list=(str_list_t)malloc(sizeof(char*)))==NULL) - return(NULL); - - list[0]=NULL; /* terminated by default */ - return(list); -} - -size_t strListCount(const str_list_t list) -{ - size_t i; - - COUNT_LIST_ITEMS(list,i); - - return(i); -} - -BOOL strListIsEmpty(const str_list_t list) -{ - return (list == NULL) || (list[0] == NULL); -} - -int strListIndexOf(const str_list_t list, const char* str) -{ - size_t i; - - if(list==NULL) - return -1; - - for(i=0; list[i]!=NULL; i++) { - if(list[i]==str) - return i; - } - - return -1; -} - -int strListFind(const str_list_t list, const char* str, BOOL case_sensitive) -{ - size_t i; - - if(list == NULL || str == NULL) - return -1; - - for(i=0; list[i]!=NULL; i++) { - if(case_sensitive) { - if(strcmp(list[i],str) == 0) - return i; - } else { - if(stricmp(list[i],str) == 0) - return i; - } - } - - return -1; -} - -static char* str_list_append(str_list_t* list, char* str, size_t index) -{ - str_list_t lp; - - if((lp=(str_list_t)realloc(*list,sizeof(char*)*(index+2)))==NULL) - return(NULL); - - *list=lp; - lp[index++]=str; - lp[index]=NULL; /* terminate list */ - - return(str); -} - -static char* str_list_insert(str_list_t* list, char* str, size_t index) -{ - size_t i; - size_t count; - str_list_t lp; - - if(*list == NULL) - *list = strListInit(); - count = strListCount(*list); - if(index > count) /* invalid index, do nothing */ - return(NULL); - - count++; - if((lp=(str_list_t)realloc(*list,sizeof(char*)*(count+1)))==NULL) - return(NULL); - - *list=lp; - for(i=count; i>index; i--) - lp[i]=lp[i-1]; - lp[index]=str; - - return(str); -} - -char* strListRemove(str_list_t* list, size_t index) -{ - char* str; - size_t i; - size_t count; - str_list_t lp; - - count = strListCount(*list); - - if(index==STR_LIST_LAST_INDEX && count) - index = count-1; - - if(index >= count) /* invalid index, do nothing */ - return(NULL); - - count--; - if((lp=(str_list_t)realloc(*list,sizeof(char*)*(count+1)))==NULL) - return(NULL); - - *list=lp; - str=lp[index]; - for(i=index; i<count; i++) - lp[i]=lp[i+1]; - lp[count]=NULL; - - return(str); -} - -// Remove without realloc -char* strListFastRemove(str_list_t list, size_t index) -{ - char* str; - size_t i; - size_t count; - - count = strListCount(list); - - if(index == STR_LIST_LAST_INDEX && count) - index = count-1; - - if(index >= count) /* invalid index, do nothing */ - return NULL; - - str = list[index]; - for(i = index; i < count; i++) - list[i] = list[i + 1]; - - return str; -} - -BOOL strListDelete(str_list_t* list, size_t index) -{ - char* str; - - if((str=strListRemove(list, index))==NULL) - return(FALSE); - - free(str); - - return(TRUE); -} - -BOOL strListFastDelete(str_list_t list, size_t index) -{ - char* str; - - if((str=strListFastRemove(list, index))==NULL) - return(FALSE); - - free(str); - - return(TRUE); -} - -char* strListReplace(const str_list_t list, size_t index, const char* str) -{ - char* buf; - size_t count; - - if(str==NULL) - return(NULL); - - count = strListCount(list); - - if(index==STR_LIST_LAST_INDEX && count) - index = count-1; - - if(index >= count) /* invalid index, do nothing */ - return(NULL); - - if((buf=(char*)realloc(list[index],strlen(str)+1))==NULL) - return(NULL); - - list[index]=buf; - strcpy(buf,str); - - return(buf); -} - -size_t strListModifyEach(const str_list_t list, char*(modify(size_t, char*, void*)), void* cbdata) -{ - size_t i; - if(list == NULL) - return 0; - for(i = 0; list[i] != NULL; i++) { - char* str = modify(i, list[i], cbdata); - if(str == NULL || str == list[i]) // Same old pointer (or NULL), no modification - continue; - str = strdup(str); - if(str == NULL) - break; - free(list[i]); - list[i] = str; - } - return i; -} - -BOOL strListSwap(const str_list_t list, size_t index1, size_t index2) -{ - char* tmp; - size_t count; - - count = strListCount(list); - - if(index1==STR_LIST_LAST_INDEX && count) - index1 = count-1; - - if(index2==STR_LIST_LAST_INDEX && count) - index2 = count-1; - - if(index1 >= count || index2 >= count || index1 == index2) - return(FALSE); /* invalid index, do nothing */ - - tmp=list[index1]; - list[index1]=list[index2]; - list[index2]=tmp; - - return(TRUE); -} - -char* strListAppend(str_list_t* list, const char* str, size_t index) -{ - char* buf; - char *ret; - - if(str==NULL) - return(NULL); - - if((buf=strdup(str))==NULL) - return(NULL); - - if(index==STR_LIST_LAST_INDEX) - index=strListCount(*list); - - ret = str_list_append(list,buf,index); - if (ret == NULL) - free(buf); - return ret; -} - -size_t strListAppendList(str_list_t* list, const str_list_t add_list) -{ - size_t i; - size_t count; - - count=strListCount(*list); - for(i=0; add_list != NULL && add_list[i] != NULL; i++) - strListAppend(list,add_list[i],count++); - - return(count); -} - -#if !defined(__BORLANDC__) // Doesn't have asprintf() or va_copy()_vscprintf() -char* strListAppendFormat(str_list_t* list, const char* format, ...) -{ - char *ret; - char* buf = NULL; - int len; - va_list va; - - va_start(va, format); - len = vasprintf(&buf, format, va); - va_end(va); - - if(len == -1 || buf == NULL) - return NULL; - - ret = str_list_append(list, buf, strListCount(*list)); - if (ret == NULL) - free(buf); - return ret; -} -#endif - -char* strListInsert(str_list_t* list, const char* str, size_t index) -{ - char* buf; - char* ret; - - if(str==NULL) - return(NULL); - - if((buf=strdup(str))==NULL) - return(NULL); - - ret = str_list_insert(list,buf,index); - if (ret == NULL) - free(buf); - return ret; -} - -size_t strListInsertList(str_list_t* list, const str_list_t add_list, size_t index) -{ - size_t i; - - if(add_list == NULL) - return 0; - - for(i=0; add_list[i]!=NULL; i++) - if(strListInsert(list,add_list[i],index++)==NULL) - break; - - return(i); -} - -#if !defined(__BORLANDC__) // Doesn't have asprintf() or va_copy()_vscprintf() -char* strListInsertFormat(str_list_t* list, size_t index, const char* format, ...) -{ - char *ret; - char* buf = NULL; - int len; - va_list va; - - va_start(va, format); - len = vasprintf(&buf, format, va); - va_end(va); - - if(len == -1 || buf == NULL) - return NULL; - - ret = str_list_insert(list, buf, index); - if (ret == NULL) - free(buf); - return ret; -} -#endif - -str_list_t strListSplit(str_list_t* lp, char* str, const char* delimit) -{ - size_t count; - char* token; - char* tmp; - str_list_t list; - - if(str==NULL || delimit==NULL) - return(NULL); - - if(lp==NULL) { - if((list = strListInit())==NULL) - return(NULL); - lp=&list; - count=0; - } else - count=strListCount(*lp); - - for(token = strtok_r(str, delimit, &tmp); token!=NULL; token=strtok_r(NULL, delimit, &tmp)) - if(strListAppend(lp, token, count++)==NULL) - break; - - return(*lp); -} - -str_list_t strListSplitCopy(str_list_t* list, const char* str, const char* delimit) -{ - char* buf; - str_list_t new_list; - - if(str==NULL || delimit==NULL) - return(NULL); - - if((buf=strdup(str))==NULL) - return(NULL); - - new_list=strListSplit(list,buf,delimit); - - free(buf); - - if(list!=NULL) - *list = new_list; - - return(new_list); -} - -size_t strListMerge(str_list_t* list, str_list_t add_list) -{ - size_t i; - size_t count; - - if(add_list == NULL) - return 0; - - count=strListCount(*list); - for(i=0; add_list[i]!=NULL; i++) - str_list_append(list,add_list[i],count++); - - return(i); -} - -char* strListCombine(str_list_t list, char* buf, size_t maxlen, const char* delimit) -{ - size_t i; - char* end; - char* ptr; - - if(maxlen<1) - return(NULL); - - if(buf==NULL) - if((buf=(char*)malloc(maxlen))==NULL) - return(NULL); - - memset(buf, 0, maxlen); - if(list==NULL) - return buf; - - end=buf+maxlen; - for(i=0, ptr=buf; list[i]!=NULL && buf<end; i++) - ptr += safe_snprintf(ptr, end-ptr, "%s%s", i ? delimit:"", list[i]); - - return(buf); -} - -#if defined(_WIN32) - #define QSORT_CALLBACK_TYPE __cdecl -#else - #define QSORT_CALLBACK_TYPE -#endif - -static int QSORT_CALLBACK_TYPE strListCompareAlpha(const void *arg1, const void *arg2) -{ - return stricmp(*(char**)arg1, *(char**)arg2); -} - -static int QSORT_CALLBACK_TYPE strListCompareAlphaReverse(const void *arg1, const void *arg2) -{ - return stricmp(*(char**)arg2, *(char**)arg1); -} - -static int QSORT_CALLBACK_TYPE strListCompareAlphaCase(const void *arg1, const void *arg2) -{ - return strcmp(*(char**)arg1, *(char**)arg2); -} - -static int QSORT_CALLBACK_TYPE strListCompareAlphaCaseReverse(const void *arg1, const void *arg2) -{ - return strcmp(*(char**)arg2, *(char**)arg1); -} - -void strListSortAlpha(str_list_t list) -{ - if(list != NULL) - qsort(list,strListCount(list),sizeof(char*),strListCompareAlpha); -} - -void strListSortAlphaReverse(str_list_t list) -{ - if(list != NULL) - qsort(list,strListCount(list),sizeof(char*),strListCompareAlphaReverse); -} - -void strListSortAlphaCase(str_list_t list) -{ - if(list != NULL) - qsort(list,strListCount(list),sizeof(char*),strListCompareAlphaCase); -} - -void strListSortAlphaCaseReverse(str_list_t list) -{ - if(list != NULL) - qsort(list,strListCount(list),sizeof(char*),strListCompareAlphaCaseReverse); -} - -str_list_t strListDup(str_list_t list) -{ - str_list_t ret; - size_t count=0; - - if(list == NULL) - return NULL; - ret = strListInit(); - for(; *list; list++) - strListAppend(&ret, *list, count++); - return ret; -} - -int strListCmp(str_list_t list1, str_list_t list2) -{ - str_list_t l1=strListDup(list1); - str_list_t l2=strListDup(list2); - str_list_t ol1=l1; - str_list_t ol2=l2; - int tmp; - int ret; - - if(*l1 == NULL && *l2 == NULL) { - ret=0; - goto early_return; - } - if(*l1 == NULL) { - ret = -1; - goto early_return; - } - if(*l2 == NULL) { - ret = 1; - goto early_return; - } - - strListSortAlphaCase(l1); - strListSortAlphaCase(l2); - - for(; *l1; l1++) { - l2++; - if(*l2==NULL) { - ret=1; - goto early_return; - } - tmp = strcmp(*l1, *l2); - if(tmp != 0) { - ret=tmp; - goto early_return; - } - } - l2++; - if(*l2==NULL) - ret=0; - else - ret=-1; - -early_return: - strListFree(&ol1); - strListFree(&ol2); - return ret; -} - -void strListFreeStrings(str_list_t list) -{ - size_t i; - - FREE_LIST_ITEMS(list,i); -} - -void strListFree(str_list_t* list) -{ - if(list != NULL && *list != NULL) { - strListFreeStrings(*list); - FREE_AND_NULL(*list); - } -} - -static str_list_t str_list_read_file(FILE* fp, str_list_t* lp, size_t max_line_len) -{ - char* buf=NULL; - size_t count; - str_list_t list; - - if(max_line_len<1) - max_line_len=2048; - - if(lp==NULL) { - if((list = strListInit())==NULL) - return(NULL); - lp=&list; - } - - if(fp!=NULL) { - count=strListCount(*lp); - while(!feof(fp)) { - if(buf==NULL && (buf=(char*)malloc(max_line_len+1))==NULL) - return(NULL); - - if(fgets(buf,max_line_len+1,fp)==NULL) - break; - strListAppend(lp, buf, count++); - } - } - if(buf) - free(buf); - - return(*lp); -} - -size_t strListInsertFile(FILE* fp, str_list_t* lp, size_t index, size_t max_line_len) -{ - str_list_t list; - size_t count; - - if((list=str_list_read_file(fp, NULL, max_line_len)) == NULL) - return(0); - - count = strListInsertList(lp, list, index); - - strListFree(&list); - - return(count); -} - -str_list_t strListReadFile(FILE* fp, str_list_t* lp, size_t max_line_len) -{ - return str_list_read_file(fp,lp,max_line_len); -} - -size_t strListWriteFile(FILE* fp, const str_list_t list, const char* separator) -{ - size_t i; - - if(list==NULL) - return(0); - - for(i=0; list[i]!=NULL; i++) { - if(fputs(list[i],fp)==EOF) - break; - if(separator!=NULL && fputs(separator,fp)==EOF) - break; - } - - return(i); -} - -char* strListJoin(const str_list_t list, char* buf, size_t buflen, const char* separator) -{ - size_t i; - - if(buflen < 1) - return NULL; - - *buf = '\0'; - - if(list == NULL) - return buf; - - if(separator == NULL) - separator = ", "; - - for(i = 0; list[i] != NULL; i++) { - if(strlen(buf) + strlen(separator) + strlen(list[i]) >= buflen) - break; - if(i > 0) - strcat(buf, separator); - strcat(buf, list[i]); - } - return buf; -} - -size_t strListBlockLength(char* block) -{ - char* p=block; - size_t str_len; - size_t block_len=0; - - if(block==NULL) - return(0); - - /* calculate total block length */ - while((str_len=strlen(p))!=0) { - block_len+=(str_len + 1); - p+=(str_len + 1); - } - /* block must be double-NULL terminated */ - if(!block_len) - block_len=1; - block_len++; - - return(block_len); -} - -char* strListCopyBlock(char* block) -{ - char* p; - size_t block_len; - - if((block_len=strListBlockLength(block))==0) - return(NULL); - - if((p=(char*)malloc(block_len))==NULL) - return(NULL); - memcpy(p, block, block_len); - return(p); -} - -char* strListAppendBlock(char* block, str_list_t list) -{ - char* p; - size_t str_len; - size_t block_len; - size_t i; - - if((block_len=strListBlockLength(block))!=0) - block_len--; /* Over-write existing NULL terminator */ - - for(i=0; list != NULL && list[i] != NULL; i++) { - str_len=strlen(list[i]); - if(str_len==0) - continue; /* can't include empty strings in block */ - if((p=(char*)realloc(block, block_len + str_len + 1))==NULL) { - FREE_AND_NULL(block); - return(block); - } - block=p; - strcpy(block + block_len, list[i]); - block_len += (str_len + 1); - } - - /* block must be double-NULL terminated */ - if(!block_len) - block_len=1; - block_len++; - if((p=(char*)realloc(block, block_len))==NULL) { - FREE_AND_NULL(block); - return(block); - } - block=p; - memset(block + (block_len-2), 0, 2); - - return(block); -} - -char* strListCreateBlock(str_list_t list) -{ - return(strListAppendBlock(NULL,list)); -} - -void strListFreeBlock(char* block) -{ - if(block!=NULL) - free(block); /* this must be done here for Windows-DLL reasons */ -} - -int strListTruncateTrailingWhitespaces(str_list_t list) -{ - size_t i; - - if(list==NULL) - return(0); - - for(i=0; list[i]!=NULL; i++) { - truncsp(list[i]); - } - return i; -} - -int strListTruncateTrailingLineEndings(str_list_t list) -{ - size_t i; - - if(list==NULL) - return(0); - - for(i=0; list[i]!=NULL; i++) { - truncnl(list[i]); - } - return i; -} - -/* Truncate strings in list at first occurrence of any char in 'set' */ -int strListTruncateStrings(str_list_t list, const char* set) -{ - size_t i; - char* p; - - if(list==NULL) - return(0); - - for(i=0; list[i]!=NULL; i++) { - p=strpbrk(list[i], set); - if(p!=NULL && *p!=0) - *p=0; - } - return i; -} - -/* Strip chars in 'set' from strings in list */ -int strListStripStrings(str_list_t list, const char* set) -{ - size_t i; - char* o; - char* p; - - if(list == NULL) - return 0; - - for(i = 0; list[i] != NULL; i++) { - for(o = p = list[i]; (*p != '\0'); p++) { - if(strchr(set, *p) == NULL) - *(o++) = *p; - } - *o = '\0'; - } - return i; -} - -/* Remove duplicate strings from list, return the new list length */ -int strListDedupe(str_list_t* list, BOOL case_sensitive) -{ - size_t i,j; - - if(list == NULL || *list == NULL) - return 0; - - for(i = 0; (*list)[i] != NULL; i++) { - for(j = i + 1; (*list)[j] != NULL; ) { - if((case_sensitive && strcmp((*list)[i], (*list)[j]) == 0) - || (!case_sensitive && stricmp((*list)[i], (*list)[j]) == 0)) - strListDelete(list, j); - else - j++; - } - } - return i; -} - -int strListDeleteBlanks(str_list_t* list) -{ - size_t i; - - if(list == NULL || *list == NULL) - return 0; - - for(i = 0; (*list)[i] != NULL; ) { - if((*list)[i][0] == '\0') - strListDelete(list, i); - else - i++; - } - return i; -} - -int strListFastDeleteBlanks(str_list_t list) -{ - size_t i; - - if(list == NULL || *list == NULL) - return 0; - - for(i = 0; list[i] != NULL; ) { - if(list[i][0] == '\0') - strListFastDelete(list, i); - else - i++; - } - return i; -} diff --git a/xpdev/str_list.h b/xpdev/str_list.h deleted file mode 100644 index a5994b3..0000000 --- a/xpdev/str_list.h +++ /dev/null @@ -1,177 +0,0 @@ -/* Functions to deal with NULL-terminated string lists */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _STR_LIST_H -#define _STR_LIST_H - -#include <stdio.h> /* FILE */ -#include <stddef.h> /* size_t */ -#include "gen_defs.h" -#include "wrapdll.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -#define STR_LIST_LAST_INDEX (~0) - -typedef char** str_list_t; - -/* Returns an allocated and terminated string list */ -DLLEXPORT str_list_t strListInit(void); - -/* Frees the strings in the list (and the list itself) */ -DLLEXPORT void strListFree(str_list_t*); - -/* Frees the strings in the list */ -DLLEXPORT void strListFreeStrings(str_list_t); - -/* Adds a string to the end of a string list (see strListPush) */ -/* Pass a pointer to a string list, the string to add (append) */ -/* The string to add is duplicated (using strdup) and the duplicate is added to the list */ -/* If you already know the index of the last string, pass it, otherwise pass STR_LIST_LAST_INDEX */ -/* Returns the updated list or NULL on error */ -DLLEXPORT char* strListAppend(str_list_t*, const char* str, size_t index); - -/* Append a string list onto another string list */ -DLLEXPORT size_t strListAppendList(str_list_t*, const str_list_t append_list); - -/* Append a malloc'd formatted string to the end of the list */ -DLLEXPORT char* strListAppendFormat(str_list_t* list, const char* format, ...); - -/* Inserts a string into the list at a specific index */ -/* Pass a pointer to a string list, the string to add (insert) */ -/* The string to add is duplicated (using strdup) and the duplicate is added to the list */ -DLLEXPORT char* strListInsert(str_list_t*, const char* str, size_t index); - -/* Insert a string list into another string list */ -DLLEXPORT size_t strListInsertList(str_list_t*, const str_list_t append_list, size_t index); - -/* Insert a malloc'd formatted string into the list */ -DLLEXPORT char* strListInsertFormat(str_list_t* list, size_t index, const char* format, ...); - -/* Remove a string at a specific index */ -DLLEXPORT char* strListRemove(str_list_t*, size_t index); -DLLEXPORT char* strListFastRemove(str_list_t, size_t index); - -/* Remove and free a string at a specific index */ -DLLEXPORT BOOL strListDelete(str_list_t*, size_t index); -DLLEXPORT BOOL strListFastDelete(str_list_t, size_t index); - -/* Replace a string at a specific index */ -DLLEXPORT char* strListReplace(const str_list_t, size_t index, const char* str); - -/* Return a single-string representation of the entire string list, joined with the specified separator */ -DLLEXPORT char* strListJoin(const str_list_t, char* buf, size_t buflen, const char* separator); - -/* Call a modification callback function for each string in a list */ -/* and replace each string with the result of the modification callback. */ -/* If the modification callback function returns NULL, the string is not modified. */ -/* If the modification callback function returns the same string item pointer it was passed, the string is not realloc'd. */ -/* If the modification callback function needs to expand the string item (make it bigger), it must return a new valid pointer */ -/* (possibly, the cbdata, a global array or a static automatic variable). Since the new pointer is not free'd here, it should */ -/* not be dynamically allocated by the callback function. */ -/* Returns the number of modified strings (normally, the list count unless there was a failure) */ -DLLEXPORT size_t strListModifyEach(const str_list_t list, char*(modify(size_t index, char* str, void*)), void* cbdata); - -/* Swap the strings at index1 and index2 */ -DLLEXPORT BOOL strListSwap(const str_list_t, size_t index1, size_t index2); - -/* Convenience macros for pushing, popping strings (LIFO stack) */ -#define strListPush(list, str) strListAppend(list, str, STR_LIST_LAST_INDEX) -#define strListPop(list) strListRemove(list, STR_LIST_LAST_INDEX) - -/* Add to an existing or new string list by splitting specified string (str) */ -/* into multiple strings, separated by one of the delimit characters */ -DLLEXPORT str_list_t strListSplit(str_list_t*, char* str, const char* delimit); - -/* Same as above, but copies str to temporary heap buffer first */ -DLLEXPORT str_list_t strListSplitCopy(str_list_t*, const char* str, const char* delimit); - -/* Merge 2 string lists (no copying of string data) */ -DLLEXPORT size_t strListMerge(str_list_t*, str_list_t append_list); - -/* Create a single delimited string from the specified list */ -/* If buf is NULL, the buf is malloc'd and should be freed using strListFreeBlock() */ -/* Note: maxlen includes '\0' terminator */ -DLLEXPORT char* strListCombine(str_list_t, char* buf, size_t maxlen, const char* delimit); - -/* Count the number of strings in the list and returns the count */ -DLLEXPORT size_t strListCount(const str_list_t); -DLLEXPORT BOOL strListIsEmpty(const str_list_t); - -/* Returns the index of the specified str (by ptr compare) or -1 if not found */ -DLLEXPORT int strListIndexOf(const str_list_t, const char* str); -/* Returns the index of the specified str (by string compare) or -1 if not found */ -DLLEXPORT int strListFind(const str_list_t, const char* str, BOOL case_sensitive); - -/* Sort the strings in the string list */ -DLLEXPORT void strListSortAlpha(str_list_t); -DLLEXPORT void strListSortAlphaReverse(str_list_t); - -/* Case-sensitive sorting */ -DLLEXPORT void strListSortAlphaCase(str_list_t); -DLLEXPORT void strListSortAlphaCaseReverse(str_list_t); - -/* Create/Copy/Append/Free NULL-terminated string block */ -/* (e.g. for environment variable blocks) */ -DLLEXPORT char* strListCreateBlock(str_list_t); -DLLEXPORT char* strListCopyBlock(char* block); -DLLEXPORT char* strListAppendBlock(char* block, str_list_t); -DLLEXPORT size_t strListBlockLength(char* block); -DLLEXPORT void strListFreeBlock(char*); - -/* Duplicates a list */ -DLLEXPORT str_list_t strListDup(str_list_t list); - -/* Compares two lists */ -DLLEXPORT int strListCmp(str_list_t list1, str_list_t list2); - -/* Modifies strings in list (returns count of items in list) */ -DLLEXPORT int strListTruncateTrailingWhitespaces(str_list_t); -DLLEXPORT int strListTruncateTrailingLineEndings(str_list_t); -/* Truncate strings in list at first occurrence of any char in 'set' */ -DLLEXPORT int strListTruncateStrings(str_list_t, const char* set); -/* Remove all occurrences of chars in set from string in list */ -DLLEXPORT int strListStripStrings(str_list_t, const char* set); -/* Remove duplicate strings from list, return the new list length */ -DLLEXPORT int strListDedupe(str_list_t*, BOOL case_sensitive); -/* Remove blank strings from list, return the new list length */ -DLLEXPORT int strListDeleteBlanks(str_list_t*); -DLLEXPORT int strListFastDeleteBlanks(str_list_t); - -/************/ -/* File I/O */ -/************/ - -/* Read lines from file appending each line (with '\n' char) to string list */ -/* Pass NULL list to have list allocated for you */ -DLLEXPORT str_list_t strListReadFile(FILE*, str_list_t*, size_t max_line_len); -DLLEXPORT size_t strListInsertFile(FILE*, str_list_t*, size_t index, size_t max_line_len); - -/* Write to file (fp) each string in the list, optionally separated by separator (e.g. "\n") */ -DLLEXPORT size_t strListWriteFile(FILE*, const str_list_t, const char* separator); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/strwrap.c b/xpdev/strwrap.c deleted file mode 100644 index 00fff9a..0000000 --- a/xpdev/strwrap.c +++ /dev/null @@ -1,77 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#if !defined _MSC_VER && !defined __BORLANDC__ -char* itoa(int val, char* str, int radix) -{ - switch(radix) { - case 8: - sprintf(str,"%o",val); - break; - case 10: - sprintf(str,"%u",val); - break; - case 16: - sprintf(str,"%x",val); - break; - default: - sprintf(str,"bad radix: %d",radix); - break; - } - return(str); -} - -char* ltoa(long val, char* str, int radix) -{ - switch(radix) { - case 8: - sprintf(str,"%lo",val); - break; - case 10: - sprintf(str,"%lu",val); - break; - case 16: - sprintf(str,"%lx",val); - break; - default: - sprintf(str,"bad radix: %d",radix); - break; - } - return(str); -} -#endif - -#if defined(_WIN32) && !defined(_MSC_VER) -/* From FreeBSD */ -size_t -strnlen(const char *s, size_t maxlen) -{ - size_t len; - - for (len = 0; len < maxlen; len++, s++) { - if (!*s) - break; - } - return (len); -} -#endif - -#ifdef _WIN32 -/* From FreeBSD */ -char * -strndup(const char *str, size_t maxlen) -{ - char *copy; - size_t len; - - len = strnlen(str, maxlen); - copy = malloc(len + 1); - if (copy != NULL) { - (void)memcpy(copy, str, len); - copy[len] = '\0'; - } - - return copy; -} -#endif diff --git a/xpdev/strwrap.h b/xpdev/strwrap.h deleted file mode 100644 index e52986f..0000000 --- a/xpdev/strwrap.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _STRWRAP_H_ -#define _STRWRAP_H_ - -#include <string.h> - -#if !defined _MSC_VER && !defined __BORLANDC__ - -#if defined(__cplusplus) -extern "C" { -#endif -char* itoa(int val, char* str, int radix); -char* ltoa(long val, char* str, int radix); -#if defined(__cplusplus) -} -#endif - -#define strset(x,y) memset(x, y, strlen(x)) - -#endif - -#if defined(_MSC_VER) || defined(__MSVCRT__) -#if defined(__cplusplus) -extern "C" { -#endif - -char *strndup(const char *str, size_t maxlen); -size_t strnlen(const char *s, size_t maxlen); - -#if defined(__cplusplus) -} -#endif -#endif - -#endif diff --git a/xpdev/threadwrap.c b/xpdev/threadwrap.c deleted file mode 100644 index 782ee30..0000000 --- a/xpdev/threadwrap.c +++ /dev/null @@ -1,304 +0,0 @@ -/* threadwrap.c */ - -/* Thread-related cross-platform development wrappers */ - -/* $Id: threadwrap.c,v 1.37 2019/02/18 04:04:11 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#if defined(__unix__) - #include <unistd.h> /* _POSIX_THREADS */ - #include <sys/param.h> /* BSD */ -#endif - -#if defined(_WIN32) && !defined(_WIN32_WINNT) - #define _WIN32_WINNT 0x0400 /* Needed for TryEnterCriticalSection */ -#endif - -#include "genwrap.h" /* SLEEP() */ -#include "threadwrap.h" - -/****************************************************************************/ -/* Wrapper for Win32 create/begin thread function */ -/* Uses POSIX threads */ -/****************************************************************************/ -#if defined(__unix__) -#if defined(_POSIX_THREADS) -ulong _beginthread(void( *start_address )( void * ) - ,unsigned stack_size, void *arglist) -{ - pthread_t thread; - pthread_attr_t attr; - size_t default_stack; - - (void)stack_size; - - pthread_attr_init(&attr); /* initialize attribute structure */ - - /* set thread attributes to PTHREAD_CREATE_DETACHED which will ensure - that thread resources are freed on exit() */ - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - - /* Default stack size in BSD is too small for JS stuff */ - /* Force to at least 256k */ -#define XPDEV_MIN_THREAD_STACK_SIZE (256*1024) - if(stack_size==0 && pthread_attr_getstacksize(&attr, &default_stack)==0 - && default_stack < XPDEV_MIN_THREAD_STACK_SIZE) - stack_size=XPDEV_MIN_THREAD_STACK_SIZE; - - if(stack_size!=0) - pthread_attr_setstacksize(&attr, stack_size); - - if(pthread_create(&thread -#if defined(__BORLANDC__) /* a (hopefully temporary) work-around */ - ,NULL -#else - ,&attr /* default attributes */ -#endif - /* POSIX defines this arg as "void *(*start_address)" */ - ,(void * (*)(void *)) start_address - ,arglist)==0) { - pthread_attr_destroy(&attr); - return((ulong) thread /* thread handle */); - } - - pthread_attr_destroy(&attr); - return(-1); /* error */ -} -#else - -#error "Need _beginthread implementation for non-POSIX thread library." - -#endif - -#endif /* __unix__ */ - -/****************************************************************************/ -/* Wrappers for POSIX thread (pthread) mutexes */ -/****************************************************************************/ -pthread_mutex_t pthread_mutex_initializer_np(BOOL recursive) -{ - pthread_mutex_t mutex; -#if defined(_POSIX_THREADS) - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - if(recursive) -#if defined(__linux__) && defined(PTHREAD_MUTEX_RECURSIVE_NP) && !defined(__USE_UNIX98) - pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP); -#else - pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE); -#endif - pthread_mutex_init(&mutex, &attr); -#else /* Assumes recursive (e.g. Windows) */ - (void)recursive; - pthread_mutex_init(&mutex,NULL); -#endif - return(mutex); -} - -#if !defined(_POSIX_THREADS) - -int pthread_once(pthread_once_t *oc, void (*init)(void)) -{ - if (oc == NULL || init == NULL) - return EINVAL; - switch(InterlockedCompareExchange(&(oc->state), 1, 0)) { - case 0: // Never called - init(); - InterlockedIncrement(&(oc->state)); - return 0; - case 1: // In init function - /* We may not need to use InterlockedCompareExchange() here, - * but I hate marking things as volatile, and hate tight loops - * testing things that aren't marked volatile. - */ - while(InterlockedCompareExchange(&(oc->state), 1, 0) != 2) - SLEEP(1); - return 0; - case 2: // Done. - return 0; - } - return EINVAL; -} - -int pthread_mutex_init(pthread_mutex_t* mutex, void* attr) -{ - (void)attr; -#if defined(PTHREAD_MUTEX_AS_WIN32_MUTEX) - return ((((*mutex)=CreateMutex(/* security */NULL, /* owned */FALSE, /* name */NULL))==NULL) ? -1 : 0); -#elif defined(_WIN32) /* Win32 Critical Section */ - InitializeCriticalSection(mutex); - return 0; /* No error */ -#elif defined(__OS2__) - return DosCreateMutexSem(/* name */NULL, mutex, /* attr */0, /* owned */0); -#endif -} - -int pthread_mutex_lock(pthread_mutex_t* mutex) -{ -#if defined(PTHREAD_MUTEX_AS_WIN32_MUTEX) - return (WaitForSingleObject(*mutex, INFINITE)==WAIT_OBJECT_0 ? 0 : EBUSY); -#elif defined(_WIN32) /* Win32 Critical Section */ - EnterCriticalSection(mutex); - return 0; /* No error */ -#elif defined(__OS2__) - return DosRequestMutexSem(*mutex, -1 /* SEM_INDEFINITE_WAIT */); -#endif -} - -int pthread_mutex_trylock(pthread_mutex_t* mutex) -{ -#if defined(PTHREAD_MUTEX_AS_WIN32_MUTEX) - return (WaitForSingleObject(*mutex, 0)==WAIT_OBJECT_0 ? 0 : EBUSY); -#elif defined(_WIN32) /* Win32 Critical Section */ - /* TryEnterCriticalSection only available on NT4+ :-( */ - return (TryEnterCriticalSection(mutex) ? 0 : EBUSY); -#elif defined(__OS2__) - return DosRequestMutexSem(*mutex, 0 /* SEM_IMMEDIATE_RETURN */); -#endif -} - -int pthread_mutex_unlock(pthread_mutex_t* mutex) -{ -#if defined(PTHREAD_MUTEX_AS_WIN32_MUTEX) - return (ReleaseMutex(*mutex) ? 0 : GetLastError()); -#elif defined(_WIN32) /* Win32 Critical Section */ - LeaveCriticalSection(mutex); - return 0; /* No error */ -#elif defined(__OS2__) - return DosReleaseMutexSem(*mutex); -#endif -} - -int pthread_mutex_destroy(pthread_mutex_t* mutex) -{ -#if defined(PTHREAD_MUTEX_AS_WIN32_MUTEX) - return (CloseHandle(*mutex) ? 0 : GetLastError()); -#elif defined(_WIN32) /* Win32 Critical Section */ - DeleteCriticalSection(mutex); - return 0; /* No error */ -#elif defined(__OS2__) - return DosCloseMutexSem(*mutex); -#endif -} - -#endif /* POSIX thread mutexes */ - -/************************************************************************/ -/* Protected (thread-safe) Integers (e.g. atomic/interlocked variables) */ -/************************************************************************/ - -#if __STDC_NO_ATOMICS__ -void protected_int32_init(protected_int32_t* prot, int32_t value) -{ - prot->value = value; - pthread_mutex_init(&prot->mutex,NULL); -} - -void protected_int64_init(protected_int64_t* prot, int64_t value) -{ - prot->value = value; - pthread_mutex_init(&prot->mutex,NULL); -} - -int32_t protected_int32_adjust(protected_int32_t* i, int32_t adjustment) -{ - int32_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value += adjustment; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -uint32_t protected_uint32_adjust(protected_uint32_t* i, int32_t adjustment) -{ - uint32_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value += adjustment; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -int64_t protected_int64_adjust(protected_int64_t* i, int64_t adjustment) -{ - int64_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value += adjustment; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -uint64_t protected_uint64_adjust(protected_uint64_t* i, int64_t adjustment) -{ - uint64_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value += adjustment; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -int32_t protected_int32_set(protected_int32_t* i, int32_t val) -{ - int32_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value = val; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -uint32_t protected_uint32_set(protected_uint32_t* i, uint32_t val) -{ - uint32_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value = val; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -int64_t protected_int64_set(protected_int64_t* i, int64_t val) -{ - int64_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value = val; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -uint64_t protected_uint64_set(protected_uint64_t* i, uint64_t val) -{ - uint64_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value = val; - pthread_mutex_unlock(&i->mutex); - return newval; -} -#endif diff --git a/xpdev/threadwrap.h b/xpdev/threadwrap.h deleted file mode 100644 index 29638b5..0000000 --- a/xpdev/threadwrap.h +++ /dev/null @@ -1,278 +0,0 @@ -/* Thread-related cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _THREADWRAP_H -#define _THREADWRAP_H - -#include "gen_defs.h" /* HANDLE */ -#include "wrapdll.h" /* DLLEXPORT and */ - -#if !__STDC_NO_ATOMICS__ - #if defined __GNUC__ && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 9)) && !defined(__llvm__) && !defined(__INTEL_COMPILER) - #define __STDC_NO_ATOMICS__ 1 - #elif defined __BORLANDC__ || defined _MSC_VER - #define __STDC_NO_ATOMICS__ 1 - #endif -#endif -#if !__STDC_NO_ATOMICS__ -#include <stdbool.h> -#ifdef __cplusplus -#include <atomic> -#else -#include <stdatomic.h> -#endif -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - -#if defined(__unix__) - - #include <sys/param.h> - #include <pthread.h> /* POSIX threads and mutexes */ - #include <unistd.h> /* _POSIX_THREADS definition on FreeBSD (at least) */ - - /* Win32 thread API wrappers */ - ulong _beginthread(void( *start_address )( void * ) - ,unsigned stack_size, void *arglist); - - #define GetCurrentThreadId() pthread_self() - -#elif defined(_WIN32) - - #include <process.h> /* _beginthread */ - #include <limits.h> /* INT_MAX */ - #include <errno.h> /* EAGAIN and EBUSY */ - - /* POSIX threads */ - typedef DWORD pthread_t; - #define pthread_self() GetCurrentThreadId() - #define pthread_equal(t1,t2) ((t1)==(t2)) - - /* POSIX mutexes */ - #ifdef PTHREAD_MUTEX_AS_WIN32_MUTEX /* Much slower/heavier than critical sections */ - - typedef HANDLE pthread_mutex_t; - - #else /* Implemented as Win32 Critical Sections */ - - typedef CRITICAL_SECTION pthread_mutex_t; - - #endif - -#elif defined(__OS2__) - - /* POSIX mutexes */ - typedef TID pthread_t; - typedef HEV pthread_mutex_t; - -#else - - #error "Need thread wrappers." - -#endif - -/****************************************************************************/ -/* Wrappers for POSIX thread (pthread) mutexes */ -/****************************************************************************/ - -pthread_mutex_t pthread_mutex_initializer_np(BOOL recursive); - -#if defined(_POSIX_THREADS) - -#if defined (__FreeBSD__) || defined (__OpenBSD__) - #include <pthread_np.h> - #define SetThreadName(c) pthread_set_name_np(pthread_self(),c) -#elif defined(__GLIBC__) - #include <features.h> - #if (__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 12)) - #define SetThreadName(c) pthread_setname_np(pthread_self(),c) - #else - #define SetThreadName(c) - #endif -#else - #define SetThreadName(c) -#endif - -#else - -DLLEXPORT int pthread_mutex_init(pthread_mutex_t*, void* attr); -DLLEXPORT int pthread_mutex_lock(pthread_mutex_t*); -DLLEXPORT int pthread_mutex_trylock(pthread_mutex_t*); -DLLEXPORT int pthread_mutex_unlock(pthread_mutex_t*); -DLLEXPORT int pthread_mutex_destroy(pthread_mutex_t*); - -#define SetThreadName(c) - -// A structure in case we need to add an event or something... -typedef struct { - long state; -} pthread_once_t; - -#define PTHREAD_ONCE_INIT {0}; -DLLEXPORT int pthread_once(pthread_once_t *oc, void (*init)(void)); - -#endif - -#if !defined(PTHREAD_MUTEX_INITIALIZER_NP) - #define PTHREAD_MUTEX_INITIALIZER_NP pthread_mutex_initializer_np(/* recursive: */FALSE) -#endif -#if !defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) - #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP pthread_mutex_initializer_np(/* recursive: */TRUE) -#endif - -/************************************************************************/ -/* Protected (thread-safe) Integers (e.g. atomic/interlocked variables) */ -/************************************************************************/ -/* Use of these types and functions is not as fast as your compiler or */ -/* platform-specific functions (e.g. InterlockedIncrement on Windows or */ -/* atomic_add_int on FreeBSD) but they have the advantage of always */ -/* working and being thread-safe on all platforms that support pthread */ -/* mutexes. */ -/************************************************************************/ -#if !__STDC_NO_ATOMICS__ -#ifdef __cplusplus -typedef std::atomic<int32_t> protected_int32_t; -typedef std::atomic<uint32_t> protected_uint32_t; -typedef std::atomic<int64_t> protected_int64_t; -typedef std::atomic<uint64_t> protected_uint64_t; -#define protected_int32_init(pval, val) std::atomic_store<int32_t>(pval, val) -#define protected_uint32_init(pval, val) std::atomic_store<uint32_t>(pval, val) -#define protected_int64_init(pval, val) std::atomic_store<int64_t>(pval, val) -#define protected_uint64_init(pval, val) std::atomic_store<uint64_t>(pval, val) - -#define protected_int32_set(pval, val) std::atomic_store<int32_t>(pval, val) -#define protected_uint32_set(pval, val) std::atomic_store<uint32_t>(pval, val) -#define protected_int64_set(pval, val) std::atomic_store<int64_t>(pval, val) -#define protected_uint64_(pval, val) std::atomic_store<uint64_t>(pval, val) - -#define protected_int32_adjust(pval, adj) std::atomic_fetch_add<int32_t>(pval, adj) -#define protected_uint32_adjust(pval, adj) std::atomic_fetch_add<uint32_t>(pval, adj) -#define protected_int64_adjust(pval, adj) std::atomic_fetch_add<int64_t>(pval, adj) -#define protected_uint64_adjust(pval, adj) std::atomic_fetch_add<uint64_t>(pval, adj) - -#define protected_int32_adjust_fetch(pval, adj) (std::atomic_fetch_add<int32_t>(pval, adj) + adj) -#define protected_uint32_adjust_fetch(pval, adj) (std::atomic_fetch_add<uint32_t>(pval, adj) + adj) -#define protected_int64_adjust_fetch(pval, adj) (std::atomic_fetch_add<int64_t>(pval, adj) + adj) -#define protected_uint64_adjust_fetch(pval, adj) (std::atomic_fetch_add<uint64_t>(pval, adj) + adj) - -#define protected_int32_value(val) std::atomic_load<int32_t>(&val) -#define protected_uint32_value(val) std::atomic_load<uint32_t>(&val) -#define protected_int64_value(val) std::atomic_load<int64_t>(&val) -#define protected_uint64_value(val) std::atomic_load<uint64_t>(&val) -#else -typedef _Atomic(int32_t) protected_int32_t; -typedef _Atomic(uint32_t) protected_uint32_t; -typedef _Atomic(int64_t) protected_int64_t; -typedef _Atomic(uint64_t) protected_uint64_t; - -#define protected_int32_init(pval, val) atomic_init(pval, val) -#define protected_uint32_init(pval, val) atomic_init(pval, val) -#define protected_int64_init(pval, val) atomic_init(pval, val) -#define protected_uint64_init(pval, val) atomic_init(pval, val) - -#define protected_int32_set(pval, val) atomic_init(pval, val) -#define protected_uint32_set(pval, val) atomic_init(pval, val) -#define protected_int64_set(pval, val) atomic_init(pval, val) -#define protected_uint64_set(pval, val) atomic_init(pval, val) - -#define protected_int32_adjust(pval, adj) atomic_fetch_add(pval, adj) -#define protected_uint32_adjust(pval, adj) atomic_fetch_add(pval, adj) -#define protected_int64_adjust(pval, adj) atomic_fetch_add(pval, adj) -#define protected_uint64_adjust(pval, adj) atomic_fetch_add(pval, adj) - -#define protected_int32_adjust_fetch(pval, adj) (atomic_fetch_add(pval, adj) + adj) -#define protected_uint32_adjust_fetch(pval, adj) (atomic_fetch_add(pval, adj) + adj) -#define protected_int64_adjust_fetch(pval, adj) (atomic_fetch_add(pval, adj) + adj) -#define protected_uint64_adjust_fetch(pval, adj) (atomic_fetch_add(pval, adj) + adj) - -#define protected_int32_value(val) atomic_load(&val) -#define protected_uint32_value(val) atomic_load(&val) -#define protected_int64_value(val) atomic_load(&val) -#define protected_uint64_value(val) atomic_load(&val) -#endif - -#define protected_int32_destroy(i) -#define protected_uint32_destroy(i) -#define protected_int64_destroy(i) -#define protected_uint64_destroy(i) -#else -typedef struct { - int32_t value; - pthread_mutex_t mutex; -} protected_int32_t; - -typedef struct { - uint32_t value; - pthread_mutex_t mutex; -} protected_uint32_t; - -typedef struct { - int64_t value; - pthread_mutex_t mutex; -} protected_int64_t; - -typedef struct { - uint64_t value; - pthread_mutex_t mutex; -} protected_uint64_t; - -#define protected_uint32_init(i, val) protected_int32_init((protected_int32_t*)i, val) -#define protected_uint64_init(i, val) protected_int64_init((protected_int64_t*)i, val) -/* Return 0 on success, non-zero on failure (see pthread_mutex_destroy): */ -#define protected_int32_destroy(i) pthread_mutex_destroy(&(i).mutex) -#define protected_uint32_destroy protected_int32_destroy -#define protected_int64_destroy protected_int32_destroy -#define protected_uint64_destroy protected_int32_destroy -#define protected_int32_value(i) protected_int32_adjust(&(i),0) -#define protected_uint32_value(i) protected_uint32_adjust(&(i),0) -#define protected_int64_value(i) protected_int64_adjust(&(i),0) -#define protected_uint64_value(i) protected_uint64_adjust(&(i),0) - -#define protected_int32_adjust_fetch(a, b) protected_int32_adjust(a, b) -#define protected_uint32_adjust_fetch(a, b) protected_uint32_adjust(a, b) -#define protected_int64_adjust_fetch(a, b) protected_int64_adjust(a, b) -#define protected_uint64_adjust_fetch(a, b) protected_uint64_adjust(a, b) - -/* Return 0 on success, non-zero on failure (see pthread_mutex_init): */ -DLLEXPORT void protected_int32_init(protected_int32_t*, int32_t value); -DLLEXPORT void protected_int64_init(protected_int64_t*, int64_t value); - -/* Return new value: */ -DLLEXPORT int32_t protected_int32_adjust(protected_int32_t*, int32_t adjustment); -DLLEXPORT int32_t protected_int32_set(protected_int32_t*, int32_t val); -DLLEXPORT uint32_t protected_uint32_adjust(protected_uint32_t*, int32_t adjustment); -DLLEXPORT uint32_t protected_uint32_set(protected_uint32_t*, uint32_t val); -DLLEXPORT int64_t protected_int64_adjust(protected_int64_t*, int64_t adjustment); -DLLEXPORT int64_t protected_int64_set(protected_int64_t*, int64_t val); -DLLEXPORT uint64_t protected_uint64_adjust(protected_uint64_t*, int64_t adjustment); -DLLEXPORT uint64_t protected_uint64_set(protected_uint64_t*, uint64_t adjustment); - -#endif - -#if defined(__cplusplus) -} -#endif - -#include "semwrap.h" - -#endif /* Don't add anything after this line */ diff --git a/xpdev/tutorial.doc b/xpdev/tutorial.doc deleted file mode 100644 index 4f13c2ba0b02db75f708b131a98fe53d7a6c0118..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183296 zcmca`Uhu)fjZzO8(10BSGsD0CoD6J8;>-*T42g_T0RaYvWJU%C5cl8z|NlXvaf}QM z@r(=%35*O3|3|@)2!S_C4>I^FaI!Ek{1Dm?ibMtm0WihFz;I*|0|OsJQdUydBil!| zU{Mr;lSPa{HGz?#A)En>kMyBPV{rce=ZA~oV#5^VfEgFq!4w0C24N5nA1wk>0L4$B zdJnln1hCO(7#JA(JQx^am>3vf>a%__F#KR-VEE?6z`(=Kz`zs)(T|VLV_{$@2xDNV zVPs%<6VAYJfPsPG<qrl1CI$wE*FPZoiJ?^(7#Na%GcYJHF)%d!Wnj3#z`(%&lYv1L zVgw2a3x_okD8g_Kx_e>jU^K{Fkm4t)Ad&$b#vm5VT$p~47zo4oDnA(*#26SDVEWK$ zkoj#K2=ie2(9H#f56D~?hM5E76H9~a1F40X2Qo*A4dFhv90mqEHU<XmM+^*dtO$3( z+yl}}4(@#i(FOD0D^Pl2U|=xF%(V#kdyo;7p6=N*Fu>BCQ6d9_9y0@j=W_;z3W!!P z2{I>!i-E!FCj)~40|Nsn{edJ7K4)M!!^Xf6^bf>iU`R+|U}#}P@Im@OG9dqgX=r)} z*$d*s{D+HXVz|k`z~Gc$l#`g3qTrmLmzG+TnwOlaU}Rumq@b%1P?V~hj1UbeEy*v+ zOw6%T;B_v_FD}+C$Vn_o%P-1Ra7iso&B-swP0cG&D9<d(P;l0F*4E~As#FNdPf`dj z&&*3n&B@^{%1?4AuFOl$D9YE%OD*B$5mpHCcUFkWS5Pw4HC9rH$xw)?QV`)4R`7@n za1HYD^z&AT$x%>>56MrqG&V6burN|mU=%Ur^e;;-D$7hQ=M+{5aCCPKa&=QcQUfxF zQN&nO6pum1V1x7wIm0s&OB6DT6%rK!puVxkYN|0YrkX%ZHG-QOkY7}in3R*M5S(9H zl$@&IoS%}4-Fy>b%r}LYZ_F8<Q3(rl1=P5}Zn`NkrkjCGH{wJ!4`vNGZi7pT5=&Ck zGgFJPhLIV>78AT7Zw|Ia&ydqMGrcIWBr`t`t6Ap6m}LPm%ZM{1u_!&YBr`8vAyFZ? zBrz`~u_#3$s5DQvBr`Wv!6!4RD6yzgK_gW!T~EQ$FW6H@A;3S_GeQ%q)fU89Z3(qn z&yX{;7-TWXSbfi6e}w(uOaQeUSCCl}VV9)=%q}CSU0}y6IO8|l(g0$%DZc2iG=!LK z%o$penUh%s@<}3El2UL?DlREXOa{f3f=^;)Y7w?zvowTQXNK20a0WKgGuAWY^h+%% zPEIUHRe)!bpwc{Wd};Uv2Lxe_8%rZ%ECFY3kR?W(@WRa}LP5hhKer%14^&9OQbbyQ z5xQrQ$};RufR+U2c>M`32|!LT<_s*s8eGr}Z-LhsaE3S1GeL<RSV5)Wnp>I!&Ovx$ z1)B5mTLa1YdM0{?oNh(=xeB3qnH35p`3m8gc`5njSTnmNG_&J37@FBl^o$?|yZ8r# z%mtZ`HBg|r-V$%1Ky$r`o-xEws4MXr49(N{4Tk1vQ>4%?$w*ZQhE!R3sU->#0WPj# z&}>(U)d$cFjn5)O189ae)idOTRt(AcDXCb@Gc<r^VnYKwL1JhC&BdmAMx5@cdF4fk z1y~J(W>Er$LG!4oo-wC$K5oOHS&@KY(7b4>XTs@{S%lMN&`d?ZFleqa)idRE%gjl| zX&N+d85-gZG-&2B)idJ^&QH$9X&N*O5ikv!hfMX%IYTmvQWH~fng`7}1k8hG9aB9E z&hVndf|Ar?Y~_fd0W`}P8sYUTIL{d4tJ^(`i%YTA>xKr<%tOEmaP9#W?4YPo2(BzH zNzKJpbQl^y^9X+P48fViSkH*lu_!qsvm`aSq_haT0}WxB1YgU;&=8zSjKQfow;(eo zwFs;03}KlBzhU4^VytJv=~SATlcErkpPz%>I9N8pR}C8)g0qRSo++neK|xMtGNe=o zwa7EmOL4Z63=Lt~2EXCpY-6lv#_5t;mYIwr3}JZ&zfs^kW5OAnpHm8I4q*2(EW_Yy z3K$xKGYqK8ajnQK2Djbtn+nS|_)P_88&G}YoS&DH336j%jsmFS&xBN!*vdsiSRTS} zG&m2L=o#r5a{3pff?_2v9h%M+d=rz4^09{oEcf6y9GrVVh8uB0T$@^i&rnzv!q*Bh zGy-QKkfFvXnFx=;MzE{|GFX&{7uM6_4avwXRw#k?02RtJb8-}t^UG3;6hMvNoK)Rn zNCyWL3P>G8P`@%avm!M`H#r}Y=M++q`ii9>%?j`~nzpu%f_G(3W`%+?hzZgRs(;=6 zLZLC3TBP8dpOcdcX^Lv3Cnsy_DPVC~VoFL;YH_hbVo_>hu|j^DLS|k`YEf!&i2|s> zmy}<Up#U-%)^LD2DYZx;H@^(j0xro{@X5?8tx$kD0m4J5%S$Z>H8-FJ=qd1G=|=Lp z<rjgiDJU%}$S+O>xuXO*6m=9572sXy%wmO<)U?dJ)D(rpVui%KN`>V7+@#DrNJ)^N zX2r{!4^MQ(;KG$R5vgG0O#+ugsd;6YMfrK4-Wo5jYeiyiK~Aayy2fHFSj$d9qd2uJ zwJ0%1AuT7dEWfB&QwNkd{DXDCUI(?)6f|-{u7SzxDIm;6w!c^*GcP%(G$qwa!85NU zHAkVs!c0fOH@_smC_g7r!OX&2M<F1;JhdpmSx3RwGXQFXV~{V%#E^_s1q=@;B<JT9 zXBL-$V-OTykPa0rCFy_z*IA(m*3HX-b@PHkd^8nuGV`)iQy{|;mHDMb3ZNzyL=RZ1 zNI?TcC#I(=q^4w+<QHi|{0y?FpeR2pHMv9~zepiBF*`LaGbgoJ0Ya7*r>20SKC!eU zKR2-?73>Iz(+i67lT(X}^>}$5^C}f!W|V*i7)rqX(_)3((wve^tWlz)fD)QIAiE*P zB1LI2XruxhDk-T&pp>G3mfxT$6cqh12k61mCcK{oZF7PLBX~U(Qt}n@@=Fv_^OEyR zi$LK4$(EpiC`m2KRhV1=8^r(x;S@au&k}`<#A1b{)YLqM+)9Piih|UlOz^-F*t2Ds zMJ1()IXRUIi8(n6u!12!1r%0^NLq6elTve1QxN7)(E<4{KQE_Jp`@rZr&0lKaY?>H zqC#;&YI0^;X0k$YX;N`&2`E3ovQIHQ?ut^=@{2$=r7EC0eu_eJVjjq!NvR6pNK8yl z234)8IhEi<l3!Y)keriP1hN5=>87FBU!IX#l&YhUT9KGsl2d7~z{?9twCHwZ7Auq% zLp%?*q$FP<GcN^Hp+nu2k(ytWT9TQZn4?gTUy_<vk_pOu`9%teC?z8_^}zB5#2VDd zo&pLiyp|Q0B$kwda}QR-6{dj-AZSug%`C}CEmFWps7N84U!;&(qL7lGTAVkj1fB|@ z8o`MH6kn++pro4#j%ScMUOZz}yq<Z<pdvaoMIkq_C_A-8A-@1*MrmGVNoH!XLQ<td zaVb~?R4ON?z$<i6xtvxCY7oLp&|(E%S6B)zR>;jyDa}bNQb<WH&P>na^+?SrC<bNQ z)CzD>oK%`#te{a2%9^=}l?q9zkQyR4vjh|+3i){o`FW{uqjeOZia^c!%$!PvqSS(- z{FKt<OwiCCsE`09xzxmBkX%Y?QfYcRC=~J(67%vwp{mIn3Mu~K*&jKdqU7%km_xHu zQwzXFmO?RfJgXR7hvsA^=9TdB5H&~#N})xmpjuD?R?LG2av&pkpwLLp$OlzSX`nuT zc}8j;sKhNxEdn>j67v*NVGT1-HJy`+81IFqPLL6a3aF`40VbDUqyRP&5(D7)Qvg+) zIFy6kP@G(pSdyHf#|s}DgtR-LuC7$b%qz>!DN8L@NK8u1OUcgz84FDz;Hn)|X2D$z zNz3q91lMQ~F_5-Iuxnt+8(iL^7b?)U1;TdFFmZZ*eu_eJMt){;szPQOxcE;lEh<XQ zE78v{%1qD91LbV!P%<coCMFew8q1(!CM7j71>_2SXu}{iEiJ#O1Qd!eKV+6DWacU0 z3{yl2mQ`9@l9`s7nxd!R32_80+(FH>d{Bzc1&^;nYb$6o4IUUe;36MV(4)l&a@s6O zP0q;6EG$he2G^W<paLMX7_1k=k;wX>j?v>KcVLzm>Z`oe)D&<D2Cl-P#ww(NDi+X0 zLuMW%0ul=nlQMH4g+_iFsIGu!8U<|a15oKvmReM)kd|5wORvQWDfyZpPiBHE*+d0! zJj0_Nq$M@47}Nt*NL0wkOwUlr0X1a7l@Pdk1X*7RN-?Plxrv#1Aaj#)Qggv|ivqaa z2R959MH#6IIhnbcC8;S2MTvRo;MQSUVlv1SP{~(NlwX#al9~c80&)5!GqqTcm&oB~ zUcY>BQcFq&<?=Le?F0%!h4P|IaE1pBU?Ykc<a!%a3wfp~ROXk06{mt&MaT*iAPEUv zbAyZlkAuU?Ed^&#h2X5MtpIDFA^B4ytuznZnlA<^O3q0vE=~nCLc!6Uh}0J@&d4v# zNdYyAL0xx9sDj$1AnU-Q;DQm%0(I>{*$mV&1Qq3=LIIY~p%ok?U_lbF)+9^=WX1sM zQjo{N7Qp8ez{v?bNDWbf6j$Jsn3kWDlV1)hUtk_f%*iaNwBqG;&PW7}p{IiCBv3D0 z!BgK~K?Blg2CD}*GC}DK)WFNnNiEhy(gPANE-3;j%uUS8EPxLD>Vur0Sd>|upU3N) znwt-r<j6=(EYJisz49T$2)w?DB^jx?iQq;DZ*XRMUSdu$uM4Q{3NjVs8D8+<e+g`c zq_8-@s6><3B{MNSFTc1XGr3qn0~9eupzd_BCND2qm}qN*f*NEHG>UPD3Q`@89zc#c z>G?&OB^kNJyr7^dE-6Y)%q`}1tw>HS09mY%k(if~lbM&!>ztogl9-v7T2!o{QCOM^ zE}e=~ONw<AKrQ;z6onj6uR%v4wIo?jlb6>czZ}%b0cGw~@a&I*GdQ+ENfMq&5zz^4 z4ntxF(rQCWuz9JVHa=)J3DlK@mfN6c0VO6x?3Yv)q=L&Wq%>S?#mnnnlvt1fZv7!e zy?dyqCU0<lX<mwc38>wXo|*?9UI0ZZsKcOJ0v=FIP2mM~t%`J^9Su-o&n?XZH7+yr z^NM->QcKG7i?Y#$!NYNo9-~4^W>IQ#2`HIB`-C8U-l;`-sX4m2pcZ;TQGR++Vs0+T zN08~V6!4glLP}9)S!z+SCNC(><d!C9DCFiBrMB|&x|F7ZYA}%ZVFg-VBDiIi52={Y z5(_-&;UNx*n6kv;5{2BvEKnM#1Qn~uAqN?7C`v6X%`8e)K#C4<vmq}(PZw+pT2~NM zJSy<=dgdv>k{!e<uv$cx2F+C?C0tOCPa(0mxHK1>>_BY|P~QOL!DO_01|$Y)QNSx! zJq1v=KNZsR)`7JU&=i3i(coGXnt(u6KD>MYrG99rL!uy2p(M4U1QJ2e!a)<%Cd~tf z6UY%@AHmZyq@N54-%8}r0ySeZ63bE*^70i@)6zg)T!;+?MVWaeX_|Tp(AorJf{_;@ z0-7k#Q}A?kbyY}9%mp=f^V1LwR2_xvy!`S!aLNER$8sT^z+!O82=9GjjGciKby{L_ zDoBq4X!NVJB(+Gv6)}`itOuE|1+}MAQb8#(MIkr8xFn}i0h|EJ5{okPON$jiDHN0y zK*<LbEa34AXiCpZSAb*!NF5DptLZ3|fYvnVmKLY#z<r`nP@0sJS)7rY0&0#KT3VPX zl!HcPlA-<D<is3M#}yO~x}FgV8X$%`+<K7hAe%My6p)IZ%wn(^MTrHODLIu2$r+$p zA3T%*4ca^fa0v=3RzPkqPEF3wOHlyF3^+F?<`jcElL{c`XzKCudX`KoR>;f+^_LR! zz*T!*K6pGLu>=uXi3-Vx0W;LN0@v2X`MKbxM|nnOat3q+3LITXc`UIkF*66eiUHg< z1y_M+)g-7Z4Dkj$5rT&TAVXS^1b`k7lZrtz*ok@RrJykf@CY3!5fm$EI0kqYYl7n1 z(7?c0&rm@F>~%=mN-TzWPR~%&iZ>WK66k29;FMUL3YoWb4DjUj%?FM3W#*)UOB-yZ zo|OWqGp7S-(CC1M$nta)l5_Gw$sngVH8opDAuTVtBu7UfH#;S>NJpV47fdB*fGJQ# zqoYuo2ch!|QuDyVATz;?G|)O1Jq5T6ovajsQWJ9^!IoN4lA2cxN~pY!Aa&rT0B>+= zZel@3eo<<%f(AHlKq;XZAqZ}<fnxyD9Rsy6L3NR)0&h@iP9`{lK%L#hoMHuy+|)#H z=LlRqf~AV!)<YHPfW}e4!(1i#;3x+d-=M?`N`ASC6`8rExe9ruxk;%-AkqBN5^&^# z5+jCTnhLzWsl~;hm;_r{%o_q)c~O*_lL%_!!s_~B1&zGKy!_&v)YJk^c;Gl&LE=;a zQqL9hLMG6Pk%ENRx3na+BDEM=4&~>;MleBrT&Ql)un>4)6x8VR%>;F8^3zIS3Kjf9 z6hJK~(CCc<q@sqTOGvtfBsE<_OG^VpF`$tL3K>wO>VT39B>KQzMb7|dq=HowoXkLD zV#TSDk_a4@;9(?Ct?v&S(n4gT{5%D}5Z$Ci&`=_Jt|;b3ngJ>Xjaeyx6GKj7X<l-M z0(d+D>R;pv5<?egqzhC`frpaAGxLm%6hPSutGdiw(412ys5s3p0uAToWF~`oIr*Rt zD<}kwjTBsbd{A{m8%p2`B{3P46cs?@ba|Bud61R}D5ZcbRVW6v7ZQsV3Npd1B2eEU zIXkrk&95lt<yFEu7?6GzbXcVbHXy{yi-=)RlLS7A0ItnJ&0<hD0Mx4k*R#<66eQ&I z3_)$A0!WVmTbm&mR4O9UEVP#iPAGbY@Nr0R^nyoMpr(U+Yb6<}#i<HGAwI==@R<#$ zJZShJ2Q(5~gp{qorYgWK(@{t&Em0^g0Zp)gy1B&)X^BM&#TlT1g8VdyyHiV2F+7r- zs>jO%F$=P|1=I!yl_21_=M9Doqk(H!uqr)6r1T5QFwnUSZ2o~}7f^IU#=S~Fi8=s0 z1XjZClbM{FSDeZoo|>dvoLQ2}&hA{9UY?o9?jGR7j=YplDWjyMz)D{qG9p~8SCpEP zkyxUaoS&<o4A!9!T8l(bktjQRK)A6HyALk&3(Ad+^dOd`<rk%=g4P-$8;w;SWGb}y z(JcpM7u@DUj7D*P0g6^+%LpqLWoHi!_w-|T&d<$FElSQz%)uIJ<>lpiMXAN9plJfV z#1crj6_@LmfM%ZcOUpC!kgX*`wJ1BguXiwb<~lpGMBf!OMOILhS)59YOHvX`64UaN zON+tL2TK+DCE5BZ#qlNCsVS*tdWppaND&Hh5s|t;E`t}};MQSg1u>4wg=qpisvNR- z$;iOKKp)(?$gDsQA;KC!kwe15I9^8uP_=_R1B$eEE(f%B4%Dtm%mWq1pb?L>qQu-( zaIX#AUV;}CpdvXHG>ro;WWYU1aODeH*9b4MK;<5K{ehgTLD?TZ<c!t@DTXwI9RobU zQ(T}iJ%z-QlGNOSl44LX4rw#xR4Sx`7n!Ak9Gjb&o0$x5Dj>BE!NY9@iA5!u$>0%p zbO(X#$t(s{y`ZI|l_2jYfo5XC%^8pjL4(53fjv-#oCsP%T$}-N1JucIFTe(IiuFK! zUA&726;Rgx!b%=c8qCeF%FM}0)XOhQ*N0iFpI2N^gpoLKDinpx{SaEf2=Z!T9=K@< ztIM3B{me=Q)aXV`1ncIdmX?4fWI-_l3LZ$O1v=UYit(Jxq-2Gh%<NP|r2z`#RB)04 z&p$!BEudDMFT@WD$vK&+c_oNGBh2agj{ZLSnE^S8d8sApplRn6XbYn_Kdq!Zu?W;R zNJ|9`I~D6GfL3LK8l9kl$zphi7c{?>3Tpp?Cjdb%26e~XLp?zrhc1$U`T>z@zz!}( z>B&RKTdY7~3u<veTmxHsmsthQ2)y9I3{WV*20J|U{b3_txrup+>EKKQX?!B_Ays0f z0+JANjc8_~o0M4s_fj#hV@W<JsYBB;XpjV{H>v>YZi3p>#k`(*#U(|h@O;V}0GR?- z0L^NF#;kaKGQp!7aEG~oW``6KGgFFrgE5EmctLdl$aguJd7x=~kP)B|2eqw017D6s zsd<UTydH_5`~h)+YguYuNilCwYGR6hcu^*(<D8S9oLvkG##9C9%mgIrP|FlpL#h}w z;h&jTl3$#mpb-$@tf>QS?`ec*=J|zyd6pHB7Os(jHcB5G)XN1oeZd(V)MQDmC`imp z$;?X!$FM?DVsU0NEMXQymcoPl2bwZY26YTd@)e3w!Q<uN3{jp~smIF;YJP#|=3w22 zl6<HSKm|mq0xb0^L<Bhd`zmOlO@@I+5FpEZ{gc4`8{hnt)Ev<Cz5=4S1tnD2$Tw<{ ztplGtgk=IN1#Hb2oP|k60jNoXR`p>mb|5N6^>}&U%~!J4Df99=`$WJNU=)L<u|dP= z;K5;VKol$F7o{iWWmbVp255H=(gy-H>XJbvbAC}~DyUfp>PS2LL}-ATurQOraSUox zLrmih%LL7FgH?eRsFbBDfbu&+0a$%XVo9QIBDfGK1FHwkJCqdVLk6D{!MZ^cDLIu2 z#mR|~0S1U3NM8bB9H_Jhc`!URNdc+TgA|*fG=-!d930Te1h88Wa-i%4D!?Gs7-F;@ zKJ{Y7%j*aph6c^jD-`9ImSpCEy5x}Z2^3sT&Mum~PM|3d@EW7M6os_RyhPBx8JKFM zfqT%LVsd^SY-EbpIVZCqDIZ*oLyabs=|RaEGQ<ye4M<BtPHF|T8&M4AgX2b_C^bD3 zJkgYyp9dZ&FUrpW2LX7aP7Z8Nz`3-j7&LK>C^B6VOA<j{Qt-@xK4>TkGy#y4pAOcY z3+>#)eTZdP9$Ypfm9QXwUSck2J`7&|x#i?1f@hlw@-y>FKq&$mGGJTW0zyGTphUv! zo|>PVT2fRAmMAI8OwZ4Q2*AeBi@~${3K^N8^3NkABtS<Y!q*3~5CoJ`f<b$Pl2eO$ zeVv?x!KQ@fWr9|)z)C(|-_%6Vj2@`?23ZSr36|=_H#M&mp)0?%I2Aq_fjotiQk0lJ zDQ{9rQGS7bN`7*-Ca*7K_&yV~P7cxo<Mo3KsDPp)u>=$pyaAxWS0ojIB?|fqp!AMN zH;9-I0?m8FhGmL*gFvH*aL4clmn4>e7E^+jm%yVc7(9~#O1a2FAU^U`5_Hf7xrzjh ztw7fgKr51*O3>0gu;Wl`lVVWM(u$WC+}qTzurRX%DFm;LO)XL|;{`9EgNQ>`_!;vC zmf&ooff7ItXzm%@kcam!3QN%2Xt))M^6~~kH+F&Mc|g6S>`ch|Kjb0=Y0?_Jq9rG_ zq!^`)fhqvaH9?!Bpt)!8JOxGrrx-dd37c$3wg}P>1h44OQvkaS-quHI{DC&gLE2I! z;93(jo&s8FnVJV~6T%w6@RlEBauHPe>L`H9PEZC`fQ-fHAdSN4fETa9lL=&IOaU}# z8(0Ewk*4M)Cl(ZgCKgj6)oe;;8hAq>*eT#H2towfGJ+4P7wbR^R#376wLFpi4x3a; zEkX?-9nf$_Za$<l1gelhL5pEBq$L5ZXPiO70$$h&TCWCkFL;<fQ2|ue=BFu?r{?77 zLYAGRrsyc7m4cR{<%637x}aJv57h7gB?@Q_0g4YuSm?W?7H5~_7l8bdQkq->o8$mZ zx`3t>LBpUR&mpQ#SlYBw;0-L%hmE0t7juG!SyNL$`9i@r7}TZ$ZKYALG}X7X(D!xK zQSb{f(E;tWGys=P5dnH&BO(k9LH!1p^TFD|nMX$<I3Kh;tyo9FBS1GaLPx<f$TLDm z!4X7&>Ob%@P008lxLpQrrRJ3sL(KI}OvW%5G}4#~YW^ws2P;JADeyXhR>mg7$05KD zODjrERe-gG6mlSgJ&+iHk7(+_b_s&ANpfNyXn`Gg;1RU0Ehh&WY`I8%I?&WTEH&#X zI4Xep3`iD3i(-(*z!H6En1Dh)1>9#S$w!RQf+7+*cY|6YNQti)G`0l}Ku9|Bc5wwQ z3IoS7(#k7P*nl!m3P?G`O3-8&Qr92Xt}EVfG8RsO+S{NxKh$ls(C(-Xbd^nhT1hHo zeG9n53|>Z*nV$y=MQEp72gC*i3wTDMM4=$RxEQo14KmFMo8p45d4P9sKwboC0(ZQj zE0r{gVJoRYQ+%*|37T61XXsSuG9Yk@04-^QtSW;qwSu_~RB$AgfJd#9QWZdp+0sgL zK$D=LwIivy1v&Yko-eq!0NzPjsmF_L!x?WdD9u49cZ3zd`+I{@(=5!54Gk?#6=I4Y zy8w;!K+sTBM*)kP3<X9J@JJ`fyU>g&s>cf%n}kxJScmq|p$phk6x{tnb)l&|1u~(8 zluUGBi!>n%NP<#R6g(13bilb3YKH=3Dh<+H1g%tq7qA+TQBFg>l$;z*$N)fMGN`%% zjSGXbEF@Y%aSRzMf>aTp7y!*}lq5n{i-MJchX<f*XTY@p*bSfp)Yu5znXRxegC}(8 z;%!iNg1S<Vmp3#IwEC<xFR>&wr&0&BrUx8v;Ms=KV#vaW^yFkvS^zD%DT4Jcplhlj z0SQYG3Pq{Kpteq4x<YD2YH}&Ks|P71Aj!Bm2ekMb<m)`hx<F9-IUTexDlab;v^YDr z0J4D>Eet>loWec*ctJy?;OGLC%>_l7sU@H_7zK&R*`PTmNSH%{3moRTsh|ng%;H>d zuz(j*gMtxMP8OBsfv3j6!H8Z`5FLP!nk+4~96ZOLm{+L-ozg8<fG-izQvkafw2B|p zxdIQZ!^=#t!%|a9A&Ybpb3ijpkkMU86E?LhF{czf=%G+h3f@2f%3MYHrRm_!3z<a< z<*7*upaFM1(40AR=onEzgX&YT^`P=NDODjq3A|<|1u|oft3#V!l9QR23~F{MDTuh| z<R>NOD1@XYXXNGQ<b(EoEBKV8=;<hU<|XTif`$ZfnNyxwP?Qfc1~xJ+5)Kjp?+qvd z)#dqli8-Qr3V!*pp)qjFJhK=Sy`cVC3Mhq!d-^Gqg3I94Vg=|zV^GP3nEJ^t0%cgp zc?0m2S`0~H@K}eYd0j{YE)|-sp`~rH9xrT=3AVu#)b7RH^$A-~0Z(P<EnraM0&V&$ z0M&w^;7?R21}%Y5&;U*8B!iaOB`4-+f~H-eEfq)-%u9jH<{%H<LMAwkjo^iLv7Q3% zLeav|2&qss#V8QL@}L3{yv_@}$r}`m=>CRnY!wBk&6L!V#LS#xXbFw9bC(yyM#(tf zv71uRcpkJwDu$#okR{3ad71f$G7!84KRvZ1IYURGpcG6c7nFk5ZY6`4I;24wr<#xz zKcMBGpgIn0HoS|DFdQ6!$)!cbsm1zv5E^b(W?pegYGMkg+Rubcq$Z^*BqnEMrk16q zKvyh+90(du1-Vf#5tQ*jjru%TnnW@lw9+C6Jh%wSllf_&o)UZk4#bzp1DyVOsS3%7 zWvPiJR^YLQ^wbj2DjslwSx^dL!)N`#MFVKc7M`Y3Q=kD4O}wB`06B*jHc}Mk?1S7< zDF)3Ef>uaE)^~zdaYL5=I{QT6Njhfc7A8nZ$5_uuR0lq7>Fg5$soLO4ffu?A6f)<F zv_f11)PM_f_R$3OMc|EHq(lO)U&=E<1DE;Gtv-+}0`e5Jg#xLBK#P>hp(|Q4^U6|- zOES|zixoj}h1Bqdl>DF(E7(M&V}K`?$;j}`ywse`BzADm6!)YaXf&@pGcPrx5L{}Z zjou;2h_Zu>O3@Ex_jPk7W>zYxD6_aEKL>0qXilmWy%US6K$M*wGQ_6fo0ypwo|#9i zU7(RvP+J{r8JZtZ<WT0dKp~5(EI=;{QO8PQ%^~m*3ao$xwIK5pK-066Qb8+r;T!hy z(-fRxSqoHHW~3&jq!xkurl7hlu>@B5gJKml2n<R{kcA8I9xu2(4^A_Xm22@ysp*+{ zkm*-V1@O=@tTcs}MUcW2)cu0U!)MaK<{&aHQcDqfR!DkIeiCSDW-fR}Ul+au36XIj zt|%@k$|)}bEg&n(OwKKUmSMcSo+Ypn2joG}!hrOA(E1!m<HuQ{pePl#niD)42MS$q z<po->3UAJXi{nIv+|0bp+{7GENt6iMoR+6hkXi&DM*@vKf>&<9T3!li`S~T_@)T73 zf%{AtE6YK%JH@H#MX8|N1?oYA1{+FCK*MaA$&fK{@PKeS<Uj$1Y4F%lm<(B=nllBt z%7V0bL9Hy%GMl_~Q27X7s0^9S0S&`KhB84tm%LO3h&kYC4vnPL)B;T%1@PJ+9nhlq zlziAY7m_+q8Jz+uq*14qK*<SYI%v^{LMEtX3tI4;pQp#03^~F8#rdHAe11;q6ot&Z zf>KZ~AHMD$R3?E_1*kI$ZVIP?*5!hh0fLKoy$nzyaq$m^_w`}D*kUUMaJ8lZnJURn z%E&Cy(A48ift-4PVn1YZHNU75IRLE`K&cHJ*RV1lW;XP=8j!a^>&)~)^J6KQMPRkQ z!OoB{DF)XaNErp>7f`JOiW0bu$bkb*<lv2snN_Je3ZTAzN@j6(aY14-Xs;V+{WQqy zI7X;)6G3fvJzkIjpoR~MA3<y4z*!sFk2(s7nc|#Euzx_VE6zv+ZD$0TQ>>s-4AQCz z3TJRkfTFf2H95a1MFBLk1yZj8V(6FVfhbLID1fRTSj`Aa2gQ24#n5vdP+SHQOf8wB zkPF_k4VwN2nF%Tc!!z?hCqaP5m>`Q-Cp)DUW#^=V)*^uyEKLTtF%wHbooqc`NU4M2 zbBHjqx54{ujg1tL3oB4IMs84mVhikF4M^bt>AOPADu$#fh!A{9Ah;=!3tAV4W)^rb z7F2eEiaZ6Vc@W=f>VX!TgN~vCwYQPk;LcxCDmV?~R4Sz8m*?f=C#IyPSn)y^1-pd= zpv{D(f!FhZ+8TPGb&Sw+z4Q@viGD=^XeCHhCU_+X3CcyGc7kHXIV>19>j)aA2aWkc zm+~qkmSCNlOD-!$aS*5`L=zL`hOX)=E=q>D5_xfa8o0?;oRm}y+Uu8J4B8)DX~oT* zTvn{0o1$P<P@Gy+mRe+$n3tbdnVVl)?0{yxm40$raZ!GLi9Xm6Q0FO+TLZLfOCck( zM4>3Pq_ijxv<XY0AhEc(9F(|0`>J4@3p5qTw<|d#H8~r!Vjb=?Ug()H;JO^C(go+7 z63~|PT+nvOR0R!aS+AF&i74zrQGjT7fs+wrp)mM#1yEHT;NuwL<{#u6@8TNltS}8U z?2ufP30^%98gc*`0O@+cdo$pYM?p_vGPqSXMMq&Wc!+Katl|V26y)jT8t?4y8{p~V z8l+KNQlzOc4KlF~?%_i#nUvJx<f6<ZSPpguXHZZr03KW}$N{aD18;Kz&qRUB64=-x zbY&}~0-x;U?5tp_XJ#-(lQ-DM)ippPH!~+E6S4@q7-Tba4Fh;hWpQaSXp|mgDToiE zAsH1MqR>`CY6^6E4ipB+rh)TqQECoo!)RW*LMCXzO=fPYZZT-s3DnMq1XyvlLUD3N zYD#HNY7ws!$Vq9S4G^h$$(1?^DWI*(nfZAjmq9DhRE0zZ@b;0!5=iQWY?lTNLBsTc zod+@<;Y650pm{6>WLIkPf<ibsw*c(i;*z2~P|HR^16)SIi&*gDR88LEJaA(p4Xm~d z&eK42)X{Z-(;{?I1XS)rot6pRx|<3~VyVUG>#4w%9H_Yo?uLO&IxAk@+{|LoqG*hA zFdwu#p{TT=NCVWe05{U0tfJI15DSzbN^?r`6E!q>GxJI~D+=O^z%y(bpy|mxO$E+r zu*L^C)j=d-5u21+QV!Y#4;jMG(>3Hx&PXiM;><6Oho&+OumEWFlO`wO)C-+u1J#SD z&6~_T1xOzZoN*xe23)xNg(!rj78Qer3{CY63=}lLQ*H`IhL)z9Q#3&nz@X|0vWpg) z$>HM{;Fv@Y&-^q6q}C0h#S3jR!CFl4wslEm0cblDsK!VIZJ!6PFaQ<PnfZDdR=nUq zg|vmr@-tI36*xJkK}$c-lCwPBs??%<&;W6EY9**-1gnR%qrmEsm1pMWrlw?qx`Lp% z&Pmk;g>7OoXvs@<Y9(Y+9o(Sfg`PA8PGfk>J80vK#PZJ3$H&dn$2AzdfgY4g^3p-o z1ZZ_;9%x1voc+o(b5fE)^ZW&%Wpzd1IT7%7k6h3eXNAe2kw#F$F9x+jLA(DETeBd8 z{@994J%!0ydRkL7d7T`cy@P!mgFV1*Km-IRnn2^knC?j|C@9J=C<2FHL1GDLvj=#Q zI;aB%-H!~l5q$;@n&u|POaf<8aFGqp=o9rJBA|q%$?NOw;u!=gq7!p+z`Y&N@C4jS z<l+<5)Pby!0w36jXq$p2H!@Petwv}K&+F{r>+eFmsi0jokm5KMw4AXhGpV!$vJnrp z*aL+;X#5gkH>iH#bqn?J32+Png(|3EC&C-xr5)f%PgDReSIR6)RRD)CWR53K0k#1g zEDBkcg|FPxfThV~q&gTqm!{<xftqD`nHAtp1GLWp>OX**@EYL8Gqe){+c5#Iu)yUY zwD+K)2^w++jYy<qg2h2)A$SK2m=BI?MEUK^3yNj50v1%W#TOUkWR`$@tO42?nwJ7j z{fGtwIHaMmpNO;=7T$%n;^lSn_xIsUO9dS_04^{Uv_QH*m6RqYr!Ks_2nh;x1(g-) znPsVY&{P7c<RF9SkOK>fd2{mf(mB&|QuESFGLXyz#W0F_5EUR#fUE*<rw5y=qo8XD zvIjIE2k!pyf|kR?mvE+~B$lM&GZ7>YUONLa6yyg?qriU6ECz)!DBD83is3YvS3zcg zBq38D@YD*aXB0ToQ%ll7(qK1ffm0ZY58>LuGkKt6Ez)4y7gAHe%3%d=T4G5_5!4u% zE)=6c@`&7o8ekwN@Rovu9ps{-)Kqvc5^5wUeP|*@B}iTY+|5)#%!p*>p*s$=ga~&9 zhBR^m9)V7UoM8g$K7!*BwCoL9m!^WclSmRpso<pz$&h)xM6hyryEVT^50X#u)*YZw z0=bP)<pFM^fM*hQ6u>K}vq1$Etg{NrbckFQ6yk&Ez(Z@#<c#9Xs#I`$BrQcp0Tjv# zAQ4SSIxk7h$$?60LR^ivbb-4XU-1Inxr>yE;q^VJ>_+ZvgG&W?;|}U%a1S0F^9ovN zc{-rORp6^qK<z4Ue;?|8kb@u@5#b9*@Ww~*2?*dVj!6Av@H!MwS&qwbpn4VAf#_}n zjTt~~f(B+melf&}IjMP&Rv=_#0iP;fkP}gz0bZ?@2RR1`xp0G(9ho_)ASTpQ(5NEh z%t@5S8L0k-tuz4-KP4(4CqfO-*aa-nfzv!}hb6dQRt)Mrl;&lofo9oLK_dX*;S5k3 zLmkKfjc|ZH4LY(5lpLWWADP9ukmL%QZ~=FlQ1wBE@!;d9sYOMwVM|DR9nvKPR~>K@ zphoLK7np%uPq<+Q=}v*vqGT_yFLlvt!~8VpkT15O5%2~yP^tyDTc8;mZx%ta8#$9C zLM=hH9aPYR(gE0X)Bzq?BGBXIft}#V>j<3^1Wg6$mnG(8rhxk~px!oU-#utQD&(wB z@KIQhAywEZW{6=G=sC2|0eA4iHPGfm@EJ_teHA77pb-;LI)I#53)^N63I~vD5t#=z z#0cuggI1b?y3XwW!R(NJ1SoStnV<pD#Jm)Cc38>ftgQ{22{ATe_l2I3#tzy#&(4l0 z&Y+VRSXAbLlq%#FC)*mbvx5)#V+W4_fY=}@u*K;h7EIc$C^gk7*ae#cBp2yJR~O<k zO(7{6Y$Z4af|3{LTvh0N6w*2m_&7sxX%ei`g>9$<g<pPY325M01G1_N+!#hId(Z^e zCeRHwNCs3Yfa*!eq6pCF8)(cOy|I*El$%&$#mmcS11q=e^lb8r?euKGv)OjMpyftI zpd(zM$0<T4TN0C!ic-r!ZTl2>Ee7fnLJM-ls0g$zpPrno0}2Wqh1}w@WKA7~eCVk+ zkl_?;LpL~j1>khA134~HM*$j1ptbgSDbQeroqq<Nl?SaI0{a;nf}nVYga{~Di@=LW zKv@cOU|CXWI@AczGBQx>Iu*3Z8ypaN3edw1LFqOrIav?v4n4@IN-A%9a<U#cJ?Vk> zjq-wg2~`3SfE2p0=?|o!0-LUY;<{8&KMAx<2GSisJGL!3IWr|SuLOM50cbZks5FHp z3y9}HCPEgTB9>1=dRm|}6G4+Mpm|i-%nfM11{9~DV`L!qfeKRaCM!s<7dC+gN<m0N zmf+**P}bgn@;az81O+TK|AS_PLHkdUwz?>QrdyLBr!RtbUX^5kh7ObS^U`uMlS}mQ z-ShxCF&MHX2YTEuFKE^qn&@&td+^giOBO+cTzR1M3>r9x%|pS)PLM_$plvl!2tqmx zkm?59!~h-31nC!pLKWIOgyu0sX$Cs@1vK~oTIvD`J+Lc4Wmi7@NG6D>h$U;_W6D6C zbkKnxdFh}!6dGO%;G;s(Q$G4KU+6*-JzmiEAJCak>`sZv*}BC!plv!D6ZI!)f?L`O zDd2<z8m<5h_2!p=+l1ipN>I4ur0TJ=!%o0ucgrs-Pb^A7F(k7X;vR5#fa-MQpo0Z( zPO2Vg00&$oL3@ChXJCPfGME=Zop{jM7HDqNV`qnZ2W%m7u)~gw1SL)I!7vIrpw$ha z^LP>!K<i#XSs2N6lN6i-^nDdFQj0Q664O&Pk$vg{IeijT)Z;jH1>7$L?=H(P0xuLr z5=es_OoOn0vZEDfIN2FQg3tc}&0m3fAK<bV*;mlLR=VK5R>kF+CCM47pwk;c$qybV zlOYlc;5-iMAr?(Rc0A}@zlpjN6*NFyMQ}`mavdnSCFZ4|nhcJXNgxYAo9YxmHsDkX zN)(_IM?vTEfrf`sLQh8_0~{Ejd<}|#{4@pF&<x0*h-3yTUchOg%t#M1LJ2yIp-4{w z)T;sq2U2$nI`o3#bnw(Vc&%J!o&w05pmF3((2jsSg;db?OHfe3SK5KXmIsz*6xczF zgg~tvNM#7il%NxuK+DThi*i9{+rpYQ$%#cpnThGCx{!$xeNdd}rlo@WsF|Q-Wl&*| zqN89?VUVb!0A4~gIi@HkZ;GZKBoh&B5!~Qn&~iP<fn1;^1v!<-(FzKnVo+%WI*vCp zPhm3He9!?&Q$YPlq?8R=rUYIN196c8^k7)%peVRgPy||VUXrgcF(z*kcy=Fjm_!O> z))sUWm@a6rI1wTP-IE4B)(^CzAABMksC)pGo8aBE&`3yu99jYm-uygJOv5LoL2d>w zJFEmv<fl#n7YESu6+kwCmL{Quc(H=U#F(N<nxMiDl+%m#6u|46L5e}K3|?`al3!W^ zSy~MCNlCr})XxxK7K5r$P~BAuJ{lJq0?;)IkOMK1LQapJ-7mi+l^uLkONeuTzGnca z6<m^^oDVv{1RTl1zMx$_0saBTItp$eCL~9LhUUP14BW{EbYLnpfq|kN(rZku0L{Fm zCl;mTfOc*{>!}P-J%wJz!(0bFDi>VYf{I*FWe(c!1v(HIdL$hv5Bj+2qT8qgj!%?z z9H2!H3Yp+j1i@{f^rF;6aQibe4{Sg92*XMR4Wv*)SzrTN<_<s60-6jI(82(;j@ubL zC|L|%){8C;p5_H_hX)OSKvuDW%XjET7tqv-0>mN>kcT0wcT@5~Wi}#ngE9!D1Ocrg zNlq+I)hz}cX;T6k{mjn;XG-J@<pgT6f)8^B-M*3!S^}I{0#3RRQ$WkZGeGqnIG{80 zK&!<-r-XnmP0~|<RuRyY1m0Kxwh}4X<wM2;A*SUQfh#l60UW6cX*sDCpy_&0#szOG zg&)lZO6L#_AdiB|&SH?g;E{@g63{W+;MoLNQgBKI?_~r<7$`@8d&j|vxk-r%;Nc9& zU=z4~n^BomlnF^Cy6}b!xH(b@4*uN4;%vC*6~JDBg<fU}_~d9%E20=wpavA>gV+k} z;jrlh@D5v8Rs$tR(2=3gEuG+qEY3*H$x+ZqEJ{xXXZysW^fI(k39|VPstIf$=%`6} zcxZy_DzIi)69QT<fO05kGje`WF>LV>=qxe#TnE@JkmHae-w{?GfC@{<oCsVUcw7^H zz7(VsL$Nri5>#b?hs?ks4zen-D7{!OKPgK=1KRV`1P$dEgO-G+mq8@peNfbN>j6t+ zpl%YV=!JI4pp(G*DXC@pd8IiypeBT0sLvEg89mu2AjEKrCU}u1IHQ8c`ynw4t3s2J ze5}9@Y8NCUT|fY8ok1@k067)I5TubzP@@2{gA0`RL8r`u(<n+}0LL@zECEns4qCKB zr}jYmQB%?~i;7G1(=zi?@<8Ptay1QWWh$^kddrEhbInrnQ{fA+6%z9l($bQ0vXMd= zbLazPKB`TS18hLPNCLMBp@(QgsxMGk30cJg8jA&ufosARGiiW&p+&IijLbAdVgXN> zfwCN^*_@i1lA3}N7_cM?O1`ju0jz-vYvfJ_)nlo;pb@nx;G9>iqfiVwQyi=bJQoFP ziUh}dh6j0uxPsC*cv?9>50pq#!N=ugmVwUkMOPo>>gZB~MIR^!Bf=V5iWPxO0F{8C z&H7*$K^z3G&|t+tDtI>^iZ?+;E|QyyA-mlmMJ=Ql2L&l~CMY>0H$O!~6BZ1x9SNWV z`yj&^pcClwi@+0BsSw?MA)sAbMaWj5Bxy9~W3j9N)Tk>i2DJjxauU<QgORWl30l~Q zbSg@Deo;<}etJ=UX@P!eF=+2=YI122sPHRJ1#gN41s$Tgae?nd#N5dOE-k<r0^ABi z^s(XdZm^@wAfwEX@l8;?gYy+wJGkuEQ$RT=5|T_|!>fr3plQK)U&jc@vN6yupB(TA zD|i|nlD|Rg{y`}`QNh<S0;C?Q7L*yl27wYWsM(I{B2Z@u<N}C$ph*^-$dM9HDx`e@ z*_H!74hnRL%4C>HApHsu4^DyYREExN<m7-G8;~IfP>UM6<qOgc2D=NiMLW4DADjfi zqspMYC(r|mL2d?_t`7?`1#qnhYAAx24nZu{V`t|<xu*v-PL&693CIliDK4M`jNsS# zK++zl)0mf@lM1R{KqodJ4k`hK7NUD!0I3a&!Gji{g`}xg@J_b^J0g|jf(`<Lo|2kh zq%awDIv;4QVsSC(_5#@T6d>DRl^LiRGubDzq$DR*!8I=>Gcj+9jsoluy^;*j3cwQ3 zA@5*c=q6Q`Ku(NL2Ss^io<c6<?A^&Z5ED|tX95%zmrMbb_CCQ*3L2o*J|*D3G5CUk zyb=YFA)ukcqT&)gTo+}48Ya1*_Gyr3Fle<f_<{*g<qLMNQ)W6Pj!nu;S3q^CFUX}} z`#_y|Yz{>XQ9vp=@PIrxr$ZWJ;KoQQI9N*Z6_P<kOfu+d2~ddUfg0UOkoy^mK~a*I zt^mG526|i^D6EP>SB!$kixi;!7f>e%QbK};#!?laU4_Z817JYGsE}Wjl3E155CM{& z!I!8Yf(M+*!DBhF=?qZ7LMJ8^it|BhJHb;Tpd<m>eFW;RmZgFwb3kX(f(kEi-T-$M zO7dYltHDtSu^XZRybuRebb)&|phj<EQ7UK$BzTAk>@-kTD9r<%{RnncaY<1r_+l%C zq|6fCw9M3;6iB`VA3zIIjCAh>)T>~nU>}1j2uGw_5fJymfR>4aFZ2TKxC8kCbSNKa z_z!$Ed{JsK=oo#_05oU<DAfvbF$rQRI>Ze~i5)am4OwafS?^M;paDLZ3$~Rj6LLO} zrXKhx3eY4%F?0ndqCiFzl8MR5`K5U!kfIp8Zy6NCNcBS|*zKTMIgtB6!GKZ_V9)iS zUQK#x5jc3tGgC@3iqQ_^1r13c904k+4b8xNC80V&Bh;WXL&0OopfMQmzDH<SfN~+Y znn5)Iy4w<F0!oz`l$urqItm_qMlEDj@8rz9k|_$=sg>X*pQU-=jwmSV!43vBG(aOs zNV!i>0o0a+t3WKs0(E0jQq#cQ4rnff?s$TZ@jFF^xauf``v<w`D7ZkV%)AmqGf=3O z7#o3?TB5d&LE!_<7-+Q`q{X9vGOi77j_dh5d4Y2$sPa+(Z$kz(0AL}B7GSuI$;W00 zN?<ysfLG6gdOVP>6}Z%a93%v;;E)$MAvqM}Fi1iJB_T*H2w#T^%0K~-N(C}vh3tLk z^cvV@#R}loMWTY9kEat@1Y|D4!_f8s*uU8IB_b&X_pHIAYmoYHa!zK_6wp!s;6gMH zv>yT#Gf<bY<Bk`Qb3v01plS$2LyUtQ3Jl!{2kIVZfLsk8+W}n(109$_s86ZPOU#9d zg4cYb=ymb&fsL~v(msaG@OC9QU4X(Gr?Hg^8hXX~pt>(76}$#|GKz~U!38;Vd;`?h zM>K;-N(9L90E#UlQvtlK>5O)iXl^2?jiR3d+KT{Qg;<%Jl%E6bL4sCj!gZD>RzjyH zz?CVe^Ng5&0A+Ge@PPOJz^cJCh0?r~)S}{K@cF+b`3lbPbs!K6^g!pSfSI6uHR+&p z@IeM8D!|WT2Nzg5sTH6)3_NB48nXix^PmxM(C(oM<ZIYqlNRU|x^h8LVtOv<)-=eb zY*0}SuBkxD1+q~)7h`N2)EG?8&jYW_&&V%VC`Jw$P*VjGbl{tTAUPIZ6+vZCG9qjq zS^?@9v{h%2`NGUR(1lESB{`MgIRVfDC(wy#sAUFd4JoK_$ZZ9!=K_r~B`4;A>_Q%> zhDRGBb%QfIqUK6U%}6ZE1hu=s6?rD;;G$g6Fm}EI*t@Vw98y)ls`sK)1yFMavLY7J zLexX;V<2omSPiO{5aRG|J0$T!0~s9q@TP-4*g^%+Uii$sbkG)?6wnE5;8+8<o)U91 z)4^B5q1A`*K@zZ1=vWFk8G&LQGF34d76%~Xryxf(NB~qbmuG<LOz<2&s0Rri=Te9V z$%2+WLt8iS)nh2}1MO4dnEN3$Xh9WaGVVc_L~vpNEq(;K8dQFP1_eNDcu0aPQ*dY& zL#I|jSCQp|8m8bn9MlDZ#BmDvRs>K}57A47C0pp`XGA2HrRJr85)W$Bf=UIvISG;` z!0SWw*x3Uh)f8yQDYRJvb`qv7XlWN(j)KN@k*_iUw;w@0PZVbqB!bQ(ElDi``HWDp zn~VtSoJvsCgK`?`qF>mo8Yr~kW<y)dpk6Vk9E4WM5Z|U2!G>GG`#({OU<Jrz9B3gv z_!fxFBGB1!(A#mWcy-}tRe*OT@apD62j?o0=ks}WJ>kNzYau|bWytM?&}h#us^r!6 z!KMyYsX(ebusRpW+9%NdivsY?V31BFr1OuMMn&$R!aNJw-T;~dP(VZ@Qqu+0=g3Vg zDOS*M_IGpBQE>Hf(^2sEbpy2x5RnrM+rx?MOVHdOXnYqu+mC28!dwk%6o6J9fU^X$ zjj)M-kbVU`l?Ec!BYNEkPl47HpeFW|)U?FX9MH)yIpD$z(a-^%90fl;7IYUM=s2C! z3Q&0t%A2r7RM1QX9c)k0M`~Q?LiVXa+bp1oJm}gGtSgZ~kp*%JxcLZ5fAaD1#U&}= zIVBJQvJ~MuP!xbpKG%h~2(+07z7!Ht@WF~r&^bg<UxJN}k55iXP0m3n??5FKq^%A< zH3T*+R|%dNf-I?ptlWcFk~mxhayK;Jz!q?UYBk8BE%05$ys$-C3dNOqC5aWF#sau& z0nIK78lVyzlrLc(0BJx|42n_E++$9vCMd!|Lo?vEFQf*B-8~2?-k_N!GZ`{w4w*NC zISy2Uf+jgL^Yh?|kvAB;Neo=gfHy`!XHFq&QBojwpc;eF3p%<g6T0df<(g#3GIh{u zxV(Ju_A+o!CJ1sWV&xR@O?;q44!>7fK|?PyFB8%j1*LlMp%GwZpd<J~d{c8h^D@DM zub|KXAF{{`y+@fBG@SsN6w*!21GPO;K!qRd_GXCtQ!>-iKnEj(@8^I{u_>T-cA=($ zr=5yH$GyWhBZFE_7*ho)(8G31(3j?9L$2}30bfg|0jZ!Mt0RguK~o8-Ir#;kS^zu+ zm6QrvAPByOBnLEt2TJw4o_XLi!;-)^9D=XfK^*f74|>pqa%oN~=yHZs&^1AzqCXF` zG9m@ut15=}K*9ZJ9q?ozWbz~hbT%RAR*g!e0uQ=f4dQ$Su=9CSVV6ExDTKTDg2w7| zQ$dq=ygaaS4|FjU*tB%exoD8fsChjnm4PN2%fOeT!md07uNDFM4>j0Pf&{S`2)Zk@ z0JNMAbfru&<P<8<8Ug50*r4%kP`*Ll%m6-dGZl0|4kY!1rU4;GWF@B-ffgg>fX^NV z&BlY4PrxU<z=N$Rso>qDpdqB<%oOO&PoRMmtQS~=_H@DT!2~5q*t`<-oS#HU#FiF= z2cAGPxuEtxZoh+04?<XkY#?YVKN)&lN)qS_Gf!|G2?|PBzDA@9q*cnrR@~5qtDu%? zg?@TzCTOLlUIttke84_JoEKbfVK=upA2bIHDRr#4L0ei&^D-;+(^E@8<GXsvU?He^ zFfr)J6G~+asrfQNcSmM|?zzkbojZtXxN>G1sB!?^!K@J<?&)W2q{*$Ipr8;8x~)XR z(7?bz)0$g3H3wN)JjgZi@eqZj;Ij+BDz)Is^HMU?czGQmHEmgH5o8<)m)jD-&1c9o zF=&4%Xp?+WT4^!ph+fd-G;C5Fe2^q;>v|gGCRES?A0?@flW5`P4tOC6sN(~gsRNr( zoSFkVy9PX^3foZ%$~A~Y0IPEqK($Y?4!CItuC^e-lL;E1C|1w_ugV0)YyoHw8MInN zQlbf3>i|B2hZp0{C&+#2h`~bi3F@L$UGQ)zXi5Nd*($V21?gCV>sQ#aQgEXaS{I@h zmR7vH!H}*fJBAC`+2f&+#}2x#88mXE3qDodKUe`Imjk*0JU$+@-dG>JloYg)J{7cQ z1#}#GPNgPT6?DOCd^|gpg+&!;)iTHmr(hT8r7s}MK-$5H46=wCDg(9LKiDWfp4~rK z-w32E-Z$9AKR7;~-8WblG!_JMo{N95iF<rJdl0yPkeH(Y9f$<UgNNZjC#!%Iy7@SU zfXo6FNjMboz<MsAvmlG|A;$?rx`5C+89F!w8nVC}Euaf^Q6dIXo}?Cm(hzjT6QoK9 zwP2tv0_bj9q{xE12jl^FzffmLJV1~6LXmay5At#Ja{;M<HDo|7vHT+NcnP>*0pA)A zT`mnWFx)Z3+21!lo;^IVBso79tdN~O-Z$7eKFl?U9nmXBEMHe(XGfmh!VD)^TZr@! zf+k($Sus5Yk5o`KQIx6x9`j5DT~vw`JdVj3un9DfyW<^w0z4eqU0j_Nz$`>P43_nb zurOl>4c3G2WCx87K{8V@Sk^Znz?mI<F+0dppgoJl8E6Lh21OVc7_j?#1_YzY!1V?= zqsU|$!>zP1Ft#v5wKUTNN!A2iHaD}N7-|>fF#Y@@kV}J%;cfskQH<ne7zLvtFd72n zg#Zf!gAoe@g9!@*Llg@GLp2KnLk$Z9!vq!vhKVc;43k(G7$&nYFic@#U|7e(z_6Z$ zfnfs+1H(oZ28K;63=ErD7#Mc5Ffi<4VPM$H!oYBqg@NH33j@P-76yhJEDQ`cSr`~@ zu`n>)W?^8s!@|IDmxY1hI|~ED4;BW7pDYXvzgQR;{<1JI{9|EY5M*Uw5MpIu5N2gy z&}L;|`2GC@!)u1uPj6g!dSTCv4U0C+>YLTjH>>Z)B9KVVjig0Mv-)N+FbElV2{B}F zFywkLu;h6#u#|EzGN>_eG%{y>Vqjok<6yMYVsz4C3guvgsVK-`VEE4fQYQsgR|!#v zqyi)-&YT4bQ$dbKR0%#ojz*YCAa&BtUJ?xcUJML@UJMM0UJ}R-5d*m`(Mtxq`#{Fy zcOO4UKayn<5I2EDQ60s=jiibbqAHYwk;mCfg~8v8nIX`NnSp^F<kAcd26j`9Mi7%h zjR7g{vsf4ys-STWiZ4S}28M~O3=HpC85ly@7#J3^F)+xmGca_pGcY`1XJ82CU|`t6 z!N6e6$-vOW$-wZElYzmBi-BP}7X!lwE(V53ZU%-`+zbrgxfvK-co-P|g1igEL~?$^ z)Pv|RAOeQp!WbYLH-|_)&p@WYFbW67XcQUT9D3=2IT%8-OEK^s<6vOgz_Lw|fs0)d z!c$-d^CTd=35*~f1ET~310w?igA^$Kk4!>~8;EhE<gg9_78V9ZMn+IMtHa8`pv%g@ zpvTI<pwG&{V8F`20LuGDtPBjstPBjktPBi(tPBkPtPBhRtPBjntPBhxtPBi=tPBiA ztPBjrtPBj@tPBi2tPBjjtPBi&tPBkOtPBhjpykITRtAR2tPBimSs57Cu`)2MXJug6 zz{<d|nU#TI3o8S|c~%C73#<$b7g-q?Ua~SUykccwc+JYd@P?Iv;Vmlz!#ijh^nsOu z;Ug;p!>4EWo?SeAarf5U3oq_Iy!+m>dz0ZJ^-z&Qs0afCq=ffp2G;~=WhSJSxW)vQ zBUnqsLeyb3;|U`nGmy(?^imyP4T8JGN3Vx))mM-Z$cDHO)%7}{@Z@G=VBle6VBlqA zVBlk8VBlwCU=UzqU@&E4U@&82U@&K6VDM*SU<hDiU<hPmU<hJkU<hVoU<hG@)C*y3 z3=H9H3=D;A3=BnV3=G9=3=Ab~3=HLL3=9=)3=EBI3=B<d3=GX|3=Ff`7#QZTF)++! zV_=xa#=tP2je%hSv~F3%#=x+cje%h=8w0~WHU@^DAMai`w&U1_B^#zK*|6lojtd`u zer&q%amU9EOE#3iMTpC!kT3wHW;PB+)G&ay6?U-@ib04Oju3TdX5b2Y^f<y7)54%y z9n@Aps>yN3J|yj)fTU|YX%{`MA*VwIHBdP3XJcSEz{bFEn2mwq2pa>#A2tStzibQ) z|JWE9#Ml`a#Mv1bB-j}kB-t4lq}Ul4q}d_u09keh203;H1`Bou21|AZ1}k<325WW( z1_yQq21j-Vh75KFhD>$_hAeglh9-6fhGupKh8A`PhE{e4hBkHvhIVLMqLZD0p^Ke? zVF^0}!%}tzhGpyw49nRW7~b5!e)9Uktp}HHJ-GG$$@|wAUhjp9)Wb!x?_-O9NZ3qZ zCoV=o{==0jKxq_z3k^9uAt^+a4QwwBQV4on5=tFwSivsAojTM&;k<^OfnhB>1H%z^ z28N^T3=GHE85r)dGcep|XJB~1&cN`Hoq^#II|IXGXuIzzI|IWrb_NCp4h9BB4h9A$ z4h9Bh4v<X@4D1{X48|M`3?>{545l0m489x;41OF84E`Jp3;`Sr41pXB3_%=_wqpnf z14AeW14BLs1497^14AJP149u914B6n149J|1H%js28Nj&3=Fe47#KEjFfe?3@$JEt z2gj~FxU%!b&W)=#PT#rl#l{C$9(2M*N}(dS(?kg;$eo0H1i!)l!Cq1{LF90UDoR_N z_&9^49!`kqG)O&I`bk=#aNW$oz_5jbfnh5L1H(2B28Qj>cKuEc28LZ63=CH|7#OZ{ zFfd%>U|_h;!N72bgMr~L2LppNCj)~FCj)~lCj)~iCj)~SCj)~yCj)~8Cj)~eCj)~O zC!}v+!^yy4%gMkH&dI<K!O6f7$;rSF#mT@B&&j}$z{$Xn#L2*r%*nuz!pXo;!^yx< z%gMk{$H~A@&&j~hz{$YS2<=}qb22craFSR5U*rbIJ6fnh%83Yw9G>`u#LRsz+-9Uf z<nWk*Tuz{;34FBz?mUiOx8SOSAg+H4N%^QDpaTled7KOk^Enw97H~2!EaYThSi;G` zu#}U5;Up&m!zoS%hSQu3439Y(7@lx4Fg)dCV0gyK!0?=tf#C(T&-aRxf#EeL0|P54 z47eB=*tr-OIJg)Xc)1uD__!Dtl(-lel(`rfRJa%zY`7R0Y`GX1?6?>h?70{i9Jm-5 z9JwI<MrSSt1{W>{hBz(;hIlRph6FAKhD0s~22j|7+5#UBecZKf*MfDs)?GLRY76vS zfQZz=MY1k@WMF{S=X!kL*uoPdkZ{?`3s#33E>JUUAaVrFILw313|#Sn9&hBuJ|yjW zL2Sn3LiDtToDLZ@L1CND#lTR`#lTR(#lTR>#lSF;i-BPh7X!m&E(V4vTnr3TxfmFx zLHqSHxEL5_axpM$=3-#j!o|R_m5YI48y5q^ZY~CfJzNY77q}Q0E^;w2T;gJ2c*VuQ z@S2N(;SCo9!&@!}hId>H4DX?110T5<7(Q_^Fz|3QFz|9SFz|6RFz|CTFbHuoFbH!q zFj#UkFj#RjFj#XlFa&cmFobY3Fobe5Fobb4FnoOZ@an_kS07&8^>NqBEiV`BdI=Vp z1Q)4;iWFRZ2#Mov0c`OD2|*!<9G(z_m@$(dw;2i$IXq?{hdS;Y4Y6rCB;}%|NMchH zdVJ$cT?{&)@C@f>U;veYpz)e0ZU%;EZU%-@ZU%-jZU%;OZU%-5ZU%;0ZU%-rZU%-< zZU%-fZU%;KZU%<M+zbp$xEUChax*Y2=VoA7!Og(15<2Fynwx=P4L1YBF>VHi<J=4k zC%73HPI5Caoa1I-IM2<%aE+UR;W{@1!wqf*h7X`P<z`^`#Ld9)g`0ulD>nnfH|V(0 z4{ipApP)3s!@wZI!@%(Q*^OrxPF>jc?81!;>prhr@Od3nqz5We2N%KC2tW~ogm%6V z?s)ws2$sVWuMjh8A?na#3_YJi(i;mzEgmzG(+VlEi9224N;?eNpfDBXVPFvBVPKHv zVPKHqVPH_^VPH_<VPH_@VPLT3VPLT1VPLT5VPJ6NVPJ6LVPJ6PfsE(5@-Q&C@h~tX z@GvkW@-Q$Y@h~tX^Dr=E@GvlB@-Q$I@GvkG@-Q$I@h~uS@h~uS^Dr><@Gvm+@h~v- z^Dr<>;9+2x$iu)eiHCt<G7kg8S{??5bvz6V>v<R$Ht;YoY~^8K*v7-au#bm<VLuPC z{Q*#)0TR+@M2L&MV2C=j*n^mHOPG)u$gu@U4T%svXy)OH1N2maFTbLv2HY_Yas3NO z+QyyMv_Rvspg6eC!@!`+%fL{}%fN7&mw^FPd)DzWFr4ROV36TwV94fYU^v0gz#uHZ zzz`?Ez_3Mtfq`F;fgwkbf#IMa1A~+h1B0v(1B03n1B0tD14E=R1H%eo28NZw3=F%3 z85n*b=R9&apo$%C#w$3Bfq{Wy4v|I^>FO8AZbKO&eu6B6(r-nPLE+p&)&pg;GB9wd zF>t$yF|aZ*aH%nJyXiqja~T;KKqI^OMt)Jph#4e7`RV`<1H%m-28NqF3=Fq;7#QyG zFfiQZVPLq&!@vMa7Y}$C7#{L4F#P6WVE6+X$LC>S_{YP*z|70Qz{1PGz{AVHz{|_P zz{ktLpvKF<pw7#{pux+)pvB9;pv}v`pu-DETY9_<4Enqb44%9U3|_np4Bos93_iRJ z41v513_-jM3^BY646(cn3~{^+3}w6w4CTBG3>CZ#3{|`g4As003^ma7`T6zT&#ymU zICNpxmR$=j>^ijT_2<`<;39QUkpi#?Bu8qBgL5%jj)dfq4Psz9+<62#f@ls=ht-UI zqJ+#qE+x=&F}@s+JBLGj<_fVH%~j}S3a+w;K?juI>v$O$>UkL$X7VyH%;IHWn9a+; zFo&0cVIeOA!y;Y=hE==_46At=7}oGIFdX4!U^vRlz;KM0f#C!%1H(yP28L76GUE&{ z1H)Nf28QRn3=A)L85myjGBCX2Wng&C%fRpklt%a%82I=Y82I@Z7}WU~7&Q187&Q49 z7_|8q7<Bj;7<Bm{<&Hid1A_q{1A`YI1A{jo1H<RnPhVgB{QB_g-RpNRT)%t$=ffb8 z-p|d4n|H6@T?!Y0W)B<`B)oVf!7+svUf4$7AgN=D1Xw-6)FBN~hh{FWa7T|Hd?^6p zjzy3ZjK>}LQW(xuqyY+FA3g>KUp@wg06qqWKt2YBSUv`ZI6el3cs>S(ay|xz3O)vg zN<IdLYCZ;r8a@VwT0RB_P~A|^$H36Q$G|X)kAYz}9|OZ2J_d%ld<+Z=_!t-#@-Z;1 z<6~f0&&R;9fscXV1Rn##Nj?UKQ+x~zXZRQx&hjxZoP*Xc7x)+$F7h!jyyjzIc*DoQ z@RpB(;T<0X!$&>_hEIG948Qpp82*6dpre2I#{&`df0i_HaraRQtPU;iAmLsCks~tP zA!+PC)-*<qw18f6;EY#j|FsR`65OuW0)^{eJ_ZI+eg+0Heg+0{eg+0feg+09eg+0< zen{Of%g?|d$IrlE!Oy^8$<M%G#m~TC&CkGK$IrlE&(FZ%#m~Ut&CkH#!_UBw!q32v z%Fn=%#?Qcz!Oy^u$<M%$1#Lg%@G~&v@-r~B^D{7X@G~%U@-r}W@iQ>=@-r~>@iQ<i z=VxG8!Oy_3lAnR$AU^}cA$|si!~6^kNBJ2Tj`1@v9EY|+NH717%i@k<KZqReFoKr< zS7mUU5d)FKV+Ow5i7)r#j$uezdkjhAXlWO{e8H9W7<52wx|94245#=R7@qJmFg)dF zV0gyQ!0?=(f#DTD1H)^628K`k3=E(785q9sGcfQ7Ffi~6Ffi~5Ffa%RFfa%TFff36 z(4cmqhyVkFr~m_lz5oM*fdB)8p#TGekpKgOu>b>ui2wtGtpEdqod5%ay#ND4xBvq~ zga89WqyPg$v;YG`i~s{eEVOMIFTlW%Ai%&-CBVQ?EkND!f3-ZeSj1ia8$s0LiCIWI z?3BZ1F0OD#j~{#~08$P)K+MPE4tyyLXDZSFg>Q`j14FF<14DxV14E+#1H)ti28JmD z3=C5R7#P+HFfgnWU|?7;z`(FkfPrC?00YBjX#0Pw00YA|0S1N(0t^fn1sE7E2{15R z7GPkwCcwaOU4Vh%od5&FdjST94+0Df9D)oCoPrDtT!IV?Jc0}iyn+l2e1ecZgn%Fe zgP<S-gSH?8gN`5rgRUS0gPtG*gRvk3gNYymgSQ|9gO4ET{XY&RaGc-?Gf3R^D}vRb z<snG8i$Ub@n1LMb5cB3LU^9;zX@S)8Uj^b4+^*LGg{!Y114F7H14Ei114FtX14E`D z14EV|14A~nf0rxBz>p`%z|bMcz|bkkz|bYgz|bwoz%W6OfnlN`1H%GA28M-#3=E3| z85nj6GBE5GWMJ4M$iT2qkbz;pAOphzXdm&AAOpi;K?a7qf(#7z1Q{6a3o<Y~5M*F@ zD#*a_Opt-$ryv8vFF^)|-+~Mb!a@uTB0>xdqCyM|;zA4z5<(0Nl0uMvCh6sWstUFk zfyD3|Ww0FXFoKr<#SnE^Q^_xaDGfQ5pvNM<+>bNoLS5Aeu^G)(=;aHpw8x+W>bFZn z`|hAVd!;x7L$f#o!!2<Jh6myd3~mw(3|<lp45uU*7#>S7Fg%f9U`Uo^U`UZ<VAw3l z!0=3(f#Hob1A~_w1B0I&1A~Af0|O|}*eWqF*eNkE@To8`sHre8q^mG6EKy-#uu^4U za8zYrxUb5<@KTk5VYeCs!(}xFhAV0e46*7A3^nQu47KVE3{@Ho43jh%7$$2lFwD|m zV3@7Jz_3(<fnk{j1H)Pk28MMS3=I1<7#KV>85kyLGB6y~WMDX^$-wYdlY!x#CIf@E z76XHh76U`I76U_#76ZdJEe3||S_}*pIt&bfIt&c4It&bPIt&cGIt&cI7=AE(0mF}P zJ~Dh{_`>jl;RVAFh93-1!J?0@Fg&_){?V1AyN>QUx`|=+M+9V8%<zkWfq~zYqtQu= zF@~cNw6c(af!9fkG0uyL0m9=m<!JQxVqpmMVqu8kXk-vI@DgEg(qe##fmQt%28n{r z0V#rraln)?NF!unVldnOvw-9nSPZ;CBa5aSjUYQXVCxYXSU?V8U^C-rjOA!#V9wxR zK&%dAZ~%?X92aI_xGBuQ02=Eu6k%X65@BFy7GYp$5n*5m5@lcr7G+>~D9XU_UzCBt zLY#rYQk;QdzBmKJ0&xb01PKO)8ff|er43NJ*docma9fgrVTu$3!#pVlhFBQ}hG{aO za7OByfr1UrC30wmVr8G<HZo9QND9R?l#w1HIVdAND4u(S)1fFbP*sdf3=E*LA0Fty z5E}#UF&4%QMh5<t3ruk>7no4Ti4fyQ3{s$YIUvix@Isb>K~;`{K~0W<K~A25L0+DL zAx)lvAzhw<VYWO2!wGo?hKKSD4DaL_7{19fFt8{vFi0veFc>K?Fc>Q^FtjT$Fmxy| zFicipV3@DKz_3Yyf#HDy1H(fF28J9(28LWk28MP;28OwcXlo5o7I+f5D3nNL-=M(* zrfA5ap>v2d8f63%g~PxAi)}tQOOk<skr^^#C<BU*HHr)jClwhO9w;&}Fe))H=tIkH zdnE>j2TBYK50T38?Wzn6JD}w@tjq?L*B$B%42RVj7(6r>7{WCm<u|D829?{OG8<N2 zqhx!EIVgFCNDfLuAW{!XkiG$@Cn$ki21OZ>9CA!U8UBX2ijf5p*Noh50uUAhhy{yv zM2cXL2GyZSnhXrd(0UY9hl1))P~8ctH$ipg4lM?TQ`!s+Pqi5s%yl4jsDlmzg9o%O z#hplr3|=CY;kE}QPH`*y00|xliJJqFA08xV37-n1XBud+Hv=qPFmQvKbs!-DP+KTS zhk+py+9ukh!@!W+0+NFIKOIVgDcl^e^nep6zMaUxAg0174)Z<Jv>XQ3YZ5Gs3=G&X z$2B(wW(Eco&MZDDB?dMXP7Kemxv^r3Z4gEm<GjYkzyyLq*W?%&82)eGycwbdgC%^; z0Hgrq8e(aYZ_H9kQrCDu>S0(Kl`DhFl||*6Tw`Nk<YLZYNc_f}!@$4-YXA1>FfjD% zFfeS;VPM#(!@#gthk;?A4g<pr9R`M%It&c2bQl=ebQu`fbr~3Bbr~4sbQu^zbr~4K zbQu`Jbr~2MbQu^Lbr~2Y>oPD*(Pdybqszc>R+oX{oGt^y4_yX^pCEmD3=DF53=DC4 z3=Hvl3=9c+3=EU>7#Jq&F)(b>V_?{<$H4GTkAdO69s|P%Jq89@eFg?OeFlaG0|tg> z0|tic1`G^03>X-=4H+1C3>g@B4H+1W3>g@V4H+0-nJ_RYn=&w{m@+V^nldm%nldm% znKCd$n=&vonldmnnKCd;G-Y5oY|6mEZ^pnNX2!rEZpOf1Y{tM~W5&Q>YsSD(Y{tOw z{nPtT44)XDL#X=@>N<ov5222OsKX4O7<Pjg+ZaAEtOGGtGaOzHLTsE_j0{&kFtC6( z*YJb)7G2f?_b)>^7&)B1gc%aOgc%qhGN7^+vhEbtI){k=)PU)L@RiW`(dwx3c50~n z$*M3ui-DIA15$e*V%|M?Z<xUel;1b&Ffi<Z#yf{D0|Tcn1A_!8&U6_VnsgZ$nspf% zI-v3UOP7J+w=M&NkRAg=Qv^~uQ3FZj5E3`1=>-{j9+06Yg9+jk5Q*X(kN^V%N=Z>O zFeSwx$p3txc$C#+V3?xEz%W&hfnhl`Kg#PfFevCVF!<^-Fl>e9KNCX+22(=@hM$li zgpeql8XcriN0GtJL5Z9yh@lX&0zyH^G6)4BQDh1rVmL@v1_r?v2d0D;2PRnihXK@I z8nJPXlJa>#@j1bWfnlN%1H)P)28KgM3=CI{7#N-yF)(~LVqg$4W?)b=W?--}W?=9! zW?+alW?;xQW?-l=W?<+sW?)!t%)qe8n1NxRF$2R<V+Mxn#taNMj2RdvnlLa-GGSn7 zF=b#lV#>g9)RcjN&kU{ahtg6bvJp58l!11o!c!|s7~tlhv{v82bu*xaD6#~2EeJTx zvobL7w^*>mwOFvg+Ws1l{+~1`PC#`cs4fK6fs4%;7%rPJFkCTXU=TECU=T8AU@$Xh zU<fg1V8}CPU}!XFU|3+zz_7)ff#HZb1H)}|28OTZ3=HfR3=9Gm3=C2h3=C!#3=EzY z3=EML3=Fvz3=GpP7#KEMFfi=0U|=|Ef#zaz;*-ecK1y$DgmMu5e;sgofW^NSB>rVU zab9J{z))?*zyON-m1YbKzE%tjVO9(b5mpQgDOL;&sa6aOc~%Sz1y&3U<yH&~)m97) zHC7A^>#Z0VHdrw*Y_wuvxMsz`aNUZ5;ieS>L#Z_bgNH2xLy#>4L$@sh!$eyKhR3!H z3@>dN7`W{i7#27%Ff4RnVA$cnz_8PSfnk>e1H(ZF28Kfp3=Bsc7#NN^FfiP7U|_iA zz`$_Zfq~(*0|Ubw2L^_(4h#&x9T*sDofsHeoER9EIx#RTb7Ell>de6K&6$Bg(uILR z%7uZ!!i9ms(uIM+)`fw=&V_*?&4qy>-Gzan%7uZU+J%8(t1AP;Hdh9Qv#tyb=Uf>W z&bu-&TykY#xa`WnaMhK8;m;3-KMY@>_&vk(_fOt4+-JCc9|RfRGn{|V0D{Ls#2<z~ z3`ZFD{MoZ@50re*unr^v%7~EG)<j)cYm5uj8iS6*@<VoLn}PS1$8t2X1bBgRDY(T5 zYI{N2g%A_wgWBKVU2Etg$%ye`NJ|f*ev&rKM#M-j8+2S4)<T80I9)*b@u39+!!HX4 z20=>(24zbI1_Mh5h8Rl*hI~r~hDJ*UhKZI84C^cz81`B+Fr2YuV0dWB!0^SAfq}z{ zfkDcOfkE1efx*WLl5Rk0r2?8pZa~vRi8UlmP(0i-$P7T)T8>hvqi|3*gQIX>gHj0$ zqv&}G69v&IGAJC7EF6Q<4|Kd2RO-WWx+Wy2gJm-q<61HpVKO=l3{s%H%3{mFz-kN0 zv!ML?7@AL|?HL#x>=_v99T*s<I5050gXY2SjtmSx92poELi68D7Y2q|E({Dzt_%#q zt_%!{ZVU`YZVU{w+!+|wyE8E8crY;NdN42?@IWj3aaVUlmewc+yoZMbdaZ~O=qP$n zVgN-3H;1}<aJvn+3~sl<f`E|)I>yVy0GkvrU=UuC!XUCFg&|snF-C<Ey#HSsRNh^4 zWng&a%E0j2m4V@nD+7a&8v}!|8w0}!cLs)!?hFhZ9t;ee9t;dz9t;fp9t;cu9t;cz zJs247doVD3@?c>2?7_ew?#aL);mN=t>B+#L@5#Vm;K{(?;mN?@>B+!Q;>o~J>dC-R z=E=Y?*^_}`iYEiZ7EcC-t)2`Fw>=pc?szgV-1TH&`0B~P@XeEfLBWTCLEVRe;l2+8 z!!sWS1`S^Z27O-!hIn5FhBRLW1}8rT25&zGhC6-?3{U+S7_9sm7+m}r81w=d81w@e z7%~DF7%~GG7_tHw7^Vg=FiZ<zVAvnPz;Gadf#GQY1H-cb28QPW3=H1_7#O|>FfjZN zU|`?~WMGgAWMGgBWMI$<1kF`_`o#c(uRz2jhF=V~eq9GK&qJu=AnGu~VTSz-AQFUs zF>D73{$f}UqV_ZFhxPLVj9}$4q<q#kgz=%JFaxY~hRAmqz~mwP+4?X(aw-2u4<?E} z`v}q1jF1P{DqL_rqE=vV1?5RlT%Pn`U^wf+z;M-rf#DuBZl8NFFuX<2v)^G!3`7&j z@$o_Gz~j~fG7*kfk=Q4X0i9$K!uEyxogirZ4zxENZWe^WwgAic-7hR+Isy<42$J&} z2LpIakAX?(ng(d#4fm)XLYDmgJ;(w7K?cFFG-yo?1B#FgrjRVA5bAgzO5YC@Cmf*o z1?6EwPX-1fPX-1{PX-2CXx^Rb$-pqplYwEWCj-MuXrBG<iLd{kIRRuSG~94^`Eko+ zc2H;l0|P_<U`jcIJPq)G;`4_m1B1L51H&{g28QWg3=C(z7#QAqF)%23GcZJZGcd$> zGcd^eK+5HOXyk&aTrdeGvY|AXLgA!=g`fnH925g^bD)MoC|J8j2GZgIjq;491<*lP zNEo#|VBiMTwV-+yRJVfaRZyJ@s!u=oGcf$|XJAkYU|>)VU|^UYz`*c0kb&WKAOnMA z5Cel#5Cg-MAO;4(U<QVz!3+$NAq)&IAq)&<Aq))VAq)(MLl_v2gfK90hB7ethB7eR z2?f=ukaz-<6u0G31`be01W-7*TarW?K;+adk;+iqhMV&o97a$AHwUT!PQh}3Jbczy z4$iWK<_c!Gh%5tx6sWC}8OXpeBangNP9P+Xxsn(d43ZcayptFh0+JXQN|P8E8j~0p zW+gE&EJ$Kt*qy|{a4?C1;YAVy!<QrmhUv)+4C|8_7`7%eFziicU|>yQU|>&SV2Da# zV2Dp)V3?l5z%VC;fnh}o1H<|h28Kf^3=CgV7#O_M85n}o85p|K85pLfGcbr}Ffb@( zFff#4Ffi0-FfhE$U|{%>!N6dc$-rQf$-v;5#lR4r#lXOk&A=d>&A_0N&A_0W&A@OY zn}OkRHUoo34g-T;4g*6)4g*7d4g-UDE(3#XE(3#R9s`3(9s@&U9s@&49s`47J_CbB zJ_Ez-d<KSP`3wx#^BEX!=QA)o$Y)@9lFz^pR=~iJSir#Wpn!qlQ2_(P;{pbTHw6p~ z9)%1HL4^zq!G#PAA%zSK%L^G8Ru(catSV$+*j&iK@S%`_;a4F8!|y@{hChW23|opA z7`7ELFnnkD{(<2I!v`ezgaHOWFg!qm5E*1qkO(p##s-~Q2kY0v#udOT$Pg>hc>KNC z7y`Z67~;Ix7#IW$yo4E$MIu1?@<}KILu?oWLtGdGLthvJ!{smrhTCBb42Izh3`XG$ z3|qq)7(5~v80JMVFz`e&FyuutFyu!vFzk$EVAvJO!0;fFfk7jRfx#z=fx$P5fuSji zfuT8yf#FgV1A|I514Di^1H;y6w7wt8x*rq{?p%S=??KUn!oi*8iIhPx4L66#ERWj& z6dByP9JdTS<3ky+{I3kp<4SOrBAlfFF9{f=K=JZFnt{P1hJj&D3<JZ`7zPHhSOy01 zSO$jKu?!4zVi_2A#WFCQiDh6o8_U4p7stThAIHE@7019ZDUN|*avTH0t2hRR*KrIC z{P7G7rtu66X7LOR@$n1{3GoaJ74ZxVjqwZ&nF&Of|3sF{xRVL)SVrl(<2K+KG&sQ& z3Ws6?a9fHZ^AKz`l)xPzAO)~ESB1x~3V6_$zXf%)M-3k9FdfPa3{s$YDM?^pc%Q() z@F9VLAvuwOAvckMfisDL0aOnNCowRHB{484CNVJRClQ^8QBpRM+4d{QH!w^j2c~?K zCKv)3eLv6|KyFZ+g6evkBnAd2q&h#O1<61^BsK$Xjt8<bGTCerphY{7^-3r%CTl!E zh4X=clLTly0NZ+=J)kqJP~FLvghlKI##*4^G9JLd3Tod4CNVIiB{4AMAhq?Hk{B2| zk{B5JklK9<lNcD5CowSOA3+MVOe8h~k(_+wIe#McpeV~nPMs(+Xe&F&>i^Ly)eOF| z00tgVe6B}o(;rG=V7QjVz;Fkteg8Fyf#F*c1H+VLd}BW-gF2aKkdg(843Qj^NF{#R zA!zhyG|rLw`=9|t)IL8-smcwC)2Yb}4C|nMxP#FC*_9Lqh9@Zu3|~_i7`~-2Fvz7b zFgT<!F!-i1FnFaS`flCnXl(+N${sfdrGbFb^uf)+Z5r;GINW+rrr2&HCD$Rq<N__| zxcpxXwzf5{<??@C1_ovoCjOT7$inOYC#o=k*E=yX!rO<c;FSR2`5ysL{PjTl-x3)N z44o!OE4Yx0X@;U95H8rANLpx>ku-eFK1H69<C*~j69dCf=0-&Zwx7%xj$rGMMHl0| z#sr#5;9`I;5GJc~U}RtrHDi<l9n1)s9FRsZWe`kR1QWF^U|<Htxnu?dgA{b^r4*C~ zkX_r3%t2Y6hkxB2vbF(alNR@&JV9#wFB{77&jO0?GU#~QJ5bz%4zh;D*J%D{U?8w< zV5sMRP@KQdU|{$F9cwkpWMJro#XpE1&Hs3}jj&I7I;8VID87xM<Lh2o3=EwKETCA2 z;L-d)?DIb;&b_l37<{rA82q5~E1cQ*%7CF&Ake=4&tV$E?LSsfTysI^(<*Zq7&;Fi zEr=P-|HD52gW|jjX}(kfY0k8>f~dY=r^g_#GDs@}NNxWQ>HN<Inj6>3V_?vR&XGsu z;Vb(``+uO#y2yB_xBo!#9SvO<p_I?S(5Zklelc495Bu^T6z9rF>tQ-a`~M`4{|)K# zpBc0UYEC`_!(8ZEsPKZ(@*gw<P3*A|>{Ct+>Ha?`z9XRP-5!GCUW2GMA7p%Bh>)~x z{|)W&e^8twuW|G&9L@iv<$s}}-2Z0*#kUu9J?jck+}D7n(4iT7wEZ{i+kc=qM_$AH z5tIg?(GRAE)^H!#$;bq0Wj{Ide{Kvzc>IqA6yKkq>(#dwF)(xrjQ0OXEB}Xf{SS(B z&>n^DMGOoFiWnGTi%08!(&B$e_y1Us<36UCfg!D!fg!z^fgz)qfnjzr1H;^628MaX z3=GSQ85pEX7#LJb7#P$_7#P$`7#K=Q7#Lbg7#OCPFfhz4VPKe5!oaW?#4crESX|1$ zu%wiMVQDD?gL@eRgGU(y!+|mehLdFs47wEz4CWOK3>Fm(43-rP3?Y>a43U)#4BM(0 z81`2&F!)t7Fho={Fho`}Fho@|Ffi6IFmTl{FwCxDU|3qiz_6@_fnhnQZBom?z*)<{ zFr$`%VNopu!@@cShE;V846ExH7}nG=FtF7#F!0wiF#M}$VBlzAVBl<EVBl(CVCZaM zV3^dvz;M2Sf#GHY1H-Kb28P=W3=H2J7#J8D85r`L7#J#>7#OOW7#OOX7#JLy85lg9 z85ou}Gcc@gW?+zLVPH^fVPH^dVPH^hVPKfl!oV=Sg@NH@3j;%3D+5DfD+5DTD+9xp zRtAQBtqctNTNxM*v@$T5wJ|W*w=pnWY-3=!-NwMc0IFL-Cx{?0=;RRuk37~#282Ea z1_sm}KxjM8<3ag74jSKcKzaWUQtb%}V>owo{TK4MFN{6Z*METG96686l#G`Dq?P}B zhIIQ66yLJY@_Ys;?mvw7|457fq22xi#W`}_J*#vy|C1K~Lp%S2;(InyJFRoe==d*b z@jtZlKdfyYUdF(%AE}M5SAnk_Xoa^585kH)I4CEx<{>MiKb!QiAJ9$-QrCYB>HN<I zif4UjKP<SCfuVECAYaTwMlvET9grITLp%S2;vClh-doAQu&<JVVSgn9gMSqRLu3^L z!`3Q9zudo?fuVB+QSC#NCFCd@MNl{>1q6x=3WwZ&DCh(rMg|7j#{ZDc|J<NB4S<fb z{0GJFfzkSZB-Q_*IA^FqjIqtB!B_8(uK$CL`@m@SDMLE{vw-4zE_6KgA1LmT58xxW z+$E!qrll6zmj6S${s+bRe^5L_$I@rkj^=;T%KxFA|3UFR3u*pj5p?c^r5>~vn5e!$ zXAe<LLR#i<{AQ2lf1LZj*+B8kT9243`wxnD<lqF&QNj76^*^lMhtWg5{s+Z319V=r z9W*zpFxvhnt^6O_^*<=iJ3#RcofE$RV#D)0bdDO%AI<-;d=I0Cdj1E+_eJRXhtHt6 z?}0})1E^n!;Em4z!{Qv79_sV|pg8~1z`*boY5hw<6TUvc&}tBn*7hT3{pXNw|FeSP zx)8d~$*!4!q0?e?{pU!k|3PtX-;7w}whWX85QRQujT)RkTK^-L{UG*Gum3^uy&P#> zqa<`q<HQyQhRzd2b?gWImQm8`fDtwS#|DaL<n^mJTNoHVv@kG8v@$R_v@$Tnw=ys! zAgyU7vVO>b7a0r;4CHW7CJ<5X3;_*RBAbrH1|?Tc1_mxQ25vV)P$>>MN0_$pKcwq_ zZqPdAt*s0U+n{TdP1+b3P|n`2{{sqDXdt8X0Z^1d6%0xW_sN(eDX(M81q>{p_%>}r ztWCevhOg~ETK|LUd}KV->wi#uUxw~SNN8tZNNi_d$Zls~IN1*B3lKFH*trC$gg_~s zQHqO!D;lt+d>WJq{4CQI8QA!d=1ibo9>nLrvVr!XaJ4fqgts#=#J4jrfYLx_I|D-& zG#$L{U|@LH!N4HW$-p4m$-ofO!@$to!@#hnhk@a84+8^dF9Smg2=_5C-0Ndtc-qIn z@T`x4;d>tg!;d}&hM#>542=B@3{3qD48r{k3?lsu45IxE408Pp4D$U943_;23|9RN z4A%V&3~v1l4DS654DtO83<>=V42k^=3@QB#45|GL3>Ezh43+&13|0LM3=RDZ42}H^ z3={ep7$){JFih%aV3^s@z%Z+yfnk0>1H*!T28M<G3=FIK85magGcauGXJFXe&%m&y zpMha-KLf+Qeg=ly{R|9u`WYDR_A@X%?Pp+k*3ZDeFoA)AaRLJa(*y>F?g<PGlO`}Q zOrF31-cIv_;RnN4h7SxcLGT&Fk83}!T|D}dVF%F!!;fpA<RIbfCBfkD#mWG>?>Eqk zl_AcHl_Akff`LKIz)Ok2l%o-LJx>frBlyl94u3BOhCnX{1_n7(jz)CtU{z2PSmL~x z(D(arfHZ*3hukm>yJ-@-56A<Q&rh{8Fr02@V7T7Sz@Xm2z);!2z_7K0f#Ezf?m_Wx z+{wUT-HESmKv@P_4)QAu<L02~K`AXzu9idLpy+{FfrSR&a>B^%W(`00+M0n6+BoE3 z;6299n8C<+fr*VDerGNd_=Xfx+XV3T-%!l|+@LsZ>||ir*~!4b)y2SI(Z#?prHg@K zZ5IQ>jxGj<(_IV<GrAcVHgq#EX!bBLXhHKoDDQ*veJV8X*Yq(k+=Z3_p!^TY`?&An zAyVcsa<rmciE|%W<}NY^w+xE18_0Tab5Qi4aKO14W(bN53g;|L35Z7FfCTViPSAPo zjPN7g6G1ojBJOT80;g5bdSwPiMtHjB0jKK=OpF#RZ2T=2EO9LsEU+|h29`rh^J1WQ z0+rFA@)=e(gUV%CnG7nAVP)|)<VBflk=?!=nG-hyiATAz6eQEom>%dyHSt6CVjcOv zn?p^k0jc!@)7Zdf#|vY_XpwKEAER!3jg5hkpP8Qle4aXpk@$@n_3jZ)0S0Cj)c7Od zUba&lFgL+y8oQT)3slE~>Q`9Z3aVFObt<Snh1I2?dK6ZNg6dCL-3h8UVRfeP1O^6_ z+Z#T>yaA$@CxA#O#-q#zssu#gQRV}ZhhjX+mOzz&C_KuhfaIYVk20tVFtrp+A`zhb zlnBJ|pi7a$pg8M-ws$~now*Yj80Jl2U|2qZfnoOq28KNo7#L1Yz<0+7%H10%oYlyi zK^7r}6vG^3PB8LaF(}Fqs_=!Y0`{DaC9DTWPFE0Xz?Rc#>t1ZN2?GNICn(P6OkiMu z#rra7-0wn){}a$O@OA<N!@CI#4DTl}F#Mdr!0>AV0|V<s1_ri?3=HfO85sB{GB5~C zWMEL8$iSdBk%2*dA_K#!i3|)ICo(W>n#jPgcOnDBzKIMB`zJCmoS4YKaC;&H!<~r? z40k6oFg%^e!0>Y-1H-S03=F>~GB7YtVqlP&#K0gsiGe|G5(9(ABnAevNem3;lNcB* zCNVJBPhwyQoW#HoG>L&BViE&G{v-y5f=LVvWs?{fdM7b3^i5)5m@<ihVaX&0hNY7j z7}iW;U^q01f#L8Z28JV(7#RM%d4Br}!*O(i;m;e83`hb6Kfld@K!{{XZ5Hm{0qQP( z%KHk?et<0~Z^Pmg6rZrT1jQpP4y`9LFsy{eB`6+2afot_(+1?C9i=URstk0#0xZbz zD1#{h(I}<tVvq<7qi|-yL_stP2P8mcj3X~GGBc1^=MQ+v#lQ=SOIUtH&Wp(T5S9nG zA(!WP8g@h~Ltbfu$264L1JszrS1XLR|NbLg`-7vs%D@FHTd7s9;%Ph~M<gC)$f<{N zWid!8hH}%83}ZkknLrYtQP825B88P1gbWyD0vH+OH(bzH*zmwsaRUdt(gqH8<p~Q| zRVFN8Rowvc+bABUAyCP{z~Dlm-#9Lud{y~#*EzwSCWciE-YdC5O<7P^mWP3XA)X<G zA)g_c!IHt4!Gyt(!GOVn!H9u@VPsisJWxI!FpEtF%Etp{vFSkhc)%<+8z>(Sn8oG; z<>LXf*kYi3JYW`E4wR1v$YM(dgMsn!09tG~P(B_oiwCI9WjRodJy3gdKw6mtXz>6w zeJmLU%;EuR`dBgyn8gFs^s!_ZFpCGM>0`+-U=|Nh)5nrwz$_lHrq6&_3>pO)kT%zV zT09_4ACQj+%;EuQbAfz3U=|O^a1+SK17`7nG<`rm9x#gsr0E0l@qk%8AWa{Tj|a@+ z0crYxd^}(l4@lDo<l_Oec)*%I17tBMum@m7zz{s?H9!^*P}2wG=K=EZ05yFK2WFfL z6wm|I^f6=@FpCGM>0>xB<6NLP9-yX=;lPY@fqXnbO&`O78Rr7|cz~Kdh66Ls1@iF# zHGK>RW}FM;;{j{>43Nb}12eY>s*OPdY+I?Yx`_eX>L$=3Ne|FgJ%N@{WiXU5lrR)9 zSTX1`=ra^E<TI2q6fq<-q%ssU=rI&Aq%x#1WH2N$lrZQqBs1hQ<TB_pBr{Ypq%)K= zWHRJ2=rb@dtfr@<t-$AVAUnE%p`5{(!H7W*#rbIr`3yx2=?tk1dJK6CsSG7xr^+%? zzIqI6_=+<yFlb>ojkxeEU?^e80EcxVLkdGNgDx~|L7oDIFM7O%(8!+S^o++a3{R9Z zfFLB%6*HtVB!UxS27?|r`5`C3Vuo@CeTEW-e1?369EM^BeTGtKkb#2hIz7DsI_U*9 z4}m;U&Y;JT0(N#H11KRTGn9h!6D$W6FcdN5Go&z-G9)vUfIU#ckj<bEj{SHB5F3>5 zQW?s?o-bwq?PCP(#RTP8iq<|7TQq=HA!GMeE<+|mGT8Z`#GQsxFhGig6o!0;a)x3C zBL)L7)CU(7B@C$yMGTn?72tfxOUrzyhBIm9GUPK<F=R62Fyt^KGU!2z2z>@fd}J}C z!s8>40Tk**V8^28KhRD-T!BN5`TOaaVEw2NI28;9@XCOJVSwVY1e^##F$qdq$qb-^ z0(br@gjN8=$0d2@(_xix5JM_M8iNIcIfF5HtcGrL`-8+{3kFbYi7ulxs6HMbi_I9! z87#m(`T6uLDD-d^6p&&*l_7(n5UEwj!0?t<&I2{B<ZwDC30$ufgWCf+NDhKH6I989 zS_SACAGB*5dm&Dod7#~VbgPa*V}#fpo6C?0u3j-KV+ICQT2`_;3=9mQ+8@?+C<E8; zpjKKjLnT8V1E@d-HFEUet?ytIaafxiRF|YMK$<$Bsu|SOL655l8rrpxR*4o{j|<er zLygB|hB9!=5Lcj4)Y==4nnf6t8Mqi288R9889+e{@uLL;gTu%FObiwbJPd3Me&B{3 zC~M>}Fff2N_kfNtVqysNVq%E*U}VYl;AAQG;AAQB;A9D4V02()U}6Yh;9=lo@BsHa zQova%ok4*CG#w$%z{tR+!U#U3QI|n@$p;3JB{mEWY77j*pyQ96y<`}?J!BaCy&x7a z_%SenP4vTRA}A}1GcZ9+WaM^3Hj$A*2xOue?9?QPfqo3kc+3NhX^S&3L(F4BHIE5m zp0k$}1Nhh_CWb^WDF!zN7O;74SltI2supKpftbgPY92EK7s!1v9F2)yG7LTptPG%# z^TBEkXaHD*ft7(vjRn;Z77>scU_XML6$>&=iouV84Qv|rPy-FFiZHM-aH+APn#L*y zGR@gbi~)A)6xelQ3?2;ZVDmh%x(+mSDZ;?cz@^59Y95;a1Ly!Mm|>uUsQef>z$RgL z8E8mQgn@&BON|}XBz7?duqQ!D4{{zB*ryT<E)1Mt^IWjH3^eW~!obPErN)739tRHt z$eW-evl6|;7;G3E9X|bE$Y8_3!yv}s0&Wu~GL$mpFqAMTFa&^m&xs7_3`Goy3<V4s z3<?Zx4EYRs3?+~Z10~xSQW+Q-J~6a0@GuB6crb)8_%ir_^@E0fKwZ}&22ef%jkkch zqznw^4Ezkd$BY;RrZ8);@8JsIdm>mN$|Jcz#zf(Sa*X;1trk5Aqcx@uAb&tDfl`tT zPFjrUCy5n6Hrd87#DUTzV+;ci0}o36RbbFy2xmxTNMg`rU|<kn5MU5qlENUeB!wYb zg)v5jQ4wS+B+4+)D1(}=#t`AKh(VB1je&=OgTa*{7aSsq48;tY48;tfQ*g{U8e=&c z^%z1O7BMI?>Oo_slA!=xtL1>pgKP!{1|9}GEk-9TCXm7Z8Qd7s9TqVdGJ<jvKT_z0 zFhF#cgIgw`?g{9qFbM`{FA*$9sfjSyG5qsi#Nfzi2aW~Mz(Em1HaPB587dh-`YRYp z7?QxF9Vy^4i3gPGV>lWMGSbr080;9r92PMILiK~<8PqKT^}<1M<^gq05d(%lcnUHa z7#bJ?7(y5r8Il-5Wgr)W6GIMo17tRX0z(KxDg(%F1_lKNF$TVt3rwKX$53M+7J42T zCnzRB0mHz+;K$&^z{pU<2+1=};K7bcH1ot6c#p9%Fdk3@n~P~CvUze0!l3lQAjiPV zz{(K9;LqR;EuEPdBp4VN)EGp-@@gpZpt6>WL6U*L<pe`q%L%YLQ7q~}WhfVe6a#<D z1je|Q35+1~#K3tJ)jUwy$i*Pdz~2(V6xR~L1X2g89hewU)q%=BE(RF}{uTx1xE2Lw zkU9x0=7CBzE(Tc!{+1WaaV;;v>LjtK1C>@>3~~(oEgM+kS~jqN%#*^R4pbI#F~~FU zw^XpkwN$Wz)JbDe2g;jV3<?bVEe>pPEe>o93^okT42%pyOrX+4fB`eU6c{`i@)$tv zG)M`;#h}Q*-;%)?*OI}=z+lCY1j;u|R?vI{D@B~a@t(@Sz<@jLg9?WueGCko3=9d3 z3>*yq|Ns9F5(9;G6axc876StV=oHsU3=9mn85kH085tNRGBPl{XJlXqWny4h$i%=P z!_2_Y!OXz$gqeXMn1z912MYs(H7f%{6DtG5OI8L3CpHF#>1+%PAJ`ZeBH0-jR<ScM zd}n81aN%HJn8?AvaG!&LL6?((p_Y?@;WQ@$gB}+HLmd|b!+9<S1{rP!hHP#Ih7;Tj z48lAN3~@XR3|n{@82EV^7;<<S7!L9>Fi7z+Fv#*TFsSh{Fu3wFFhue*Fs$HbU|7k| zz_5#-f#Enm1H(;z28LVw3=D<>3=BpB3=GWz3=Ay-3=Bbn3=F}73=9ti85sTxGB8*O zGcZ^RGce2-W?)z#%)pQ!!oW}?!oYA!gn{9S2m?ckC<DV5Q3i(Fq6`dE#26Uni7_z5 zN-!`?lVD&tAj!b+LXv?&Rf>T@O^Sg*PMU#1UYda+O`3rrU7CSmwlo97326p~htdoT z@1z+RzDYAMu*fhlNXjrU7|Ad&7|Sp)w97CsbjUC;OqO9_m@mV?ut|o2;eiYT!$TPc zh8$T2hFn<&hIUy7hPko~3~OW=7*5JEFg%cDU|^JEV9=LiV6c;8V6c~CV0a+M!0=Fx zfq_qffk91yfnmEM1H%qQ28P{A3=CJ47#L!e85nAn85la085j;LGcb6lFffFxFfdf9 zFfdG3VPKf8!oaXhg@Iw63IoG_6$XYRRR)G+RR)F$stgRrR2dlFsWLF=s4+0qs4*~X zS7Tt<p~k>)N}Yk>sX7CLxdsD+g$4tIg9ZbGhXw;fpaug&kOl)oqy_^+tOf(aCJhFL z%^D00J2V&=_G&ONaA-0xaB4CzNN6%J$Z9e$G-)z0G;1<2bZ9a#Ox9#z_@&9f@LQ9C zK}d^%K~{@_VTu+5!&EH>hUHoe44bqV8057X7!<S_7<{!E7`Ey#FkIJRU@*~TU@+BX zV3?rCz%Wsdfnlv41H&Ob28Jto3=B{77#P0mF))beGcc&>GcefbGcfq*Gcd&JGce@p zGcZ)>Gcfe%Gcc^yXJFW*&%m%xpMl}1J_EybeFlab`V0&c4Hy_E889%k7&0&%F=Svk zYRJIAXT-q3Z^Xc0Y{bA&Y{bB@*ocAQvJnHr6(a@)L1P96A!7yxGh+sZ5Mu_0JYxoi zMq>ts1;z{vTZ|bPju<mA+%{%l_-f3+z;438AYj74AZ5b9U}nO=;Az6Z5NX1|kZZ!g zFx`ZKVWSBH!!8pBhNC773=d5h7=D>BFbJA5FesZcFc_FJFvOTLFyxyuFf^JnFibRM zU|46$z_8bpf#HlP1H(g828J)D3=AA*3=C3c3=Gm{3=BSI3=F<z3=FAe3=9=!3=Gv~ z3=B8S7#MDvF));vGcc5zGcd4NGBB`OGB9{pGB9*oGB7;0WMJU7VqlQAW?*ozW?-nd zVPKeI!@%&)hJoR$4Fkh>TLy+7whRml?HCxA*)cH8bYNhZ<-owe<jBAv?8v~N=)}Na z<ix-*%b9^;y)y%Yjtc{Wt_uUh0T%{_gDwmVCtVmA&blx#Ty<e!xaY#aaNmW2;kgR~ z!&?^yhEFaG42G@@3`VXD43@4847RQe3?8lw3{zbh7^b;0Ff4UtU|8wOz_7)Yf#JI= z1H%tj1_pUI28L;F3=GrV7#PmFF)+M!V_;BnXJCkSXJCkNXJC-`U|>-2U|_iK!N3sj z$-v;`#lUdKi-Ez)n}OkjHv_{TZw3Y>9|i_x9|nf$J`4<xeHj>D`!X;%`Y|v#`7tm| z@nc{R^k-mL>d(L+8Nk5c62QPv7Qnzz9>BnGIDmoSNB{!^XCMQEZy*E1oj?YLCxHwM zu|W(BaX}0WeL)NimxCA>ZU-?i7zQ&i7zHyhYz<~$@CadGm>0spz!S>AkQd6pkRQsx zurri_VOJ;v!-G%;28}QV2A?nn2H!9ShNdtEhUPE^hD%`#3@YIa4Ef;<3|qq)82*Pd zFnB~TFwBWyU|1T#z#taMz#tyUz%V<KfniQ01H-OJ28J_{3=C%@85sPc7#RGc7#OOe z7#Jo+F)&PyVqka`#lY}7ih+SYnt{PInt{PAnt>rcnt>r9nt`Drnt`D)nt>rRhJm3Z zhJoRI3<JZ57zT#qSO$jNSOx~pI0go;I0gpcI0go>I0gpAI0gp&I0goTI0gorI0go% zI0gpqI0lA*I0lBmI0lBaI0lBCI0lB&I0lBsI0lBMI0lA}I0lBkI0lAUaSRL#;ushf z#xXD~k7Hn1AIHG3JC1?jU>pO(p*RMHYjF$=cj6crUc@mle2HUV_!`H+@GXvkVM;s$ z!_;^NhIR1_4C~_=7!D>dFdRx?V7QXN!0;r2f#GWc1H-oj1_rq#1_p;D1_s|G1_rNW z1_tkB28Q5d28Qlr28Nzw28OB03=9$}3=EPf3=C2!3=B#s3=E|y3=Cx{3=H)t3=Hp5 z7#QBCFfe>bVPN=?!oXmZ%D`Zp%D`Zg%D~{2#=zj6#=zi{#=zj0#=sDs#=yXt&cMKx z&cGm?&cINa!N5?J!N5?T!N4G%$-p3y$-p3+$-tnQ#lWDI#lWDQ#lT>a#lR4i#lR4q z#lVn~#lWDH&A_0X&A_0M&A>1_n}K0YHUq=lYzBs9*$fQfISdRDISdSmISdRBa~K#N z<uEWj&S7A9lf%H^najZ7mCL{olFPubBA0<-WiA85s$2$!&AAK=A9EQPKIJkn{K;it z*qX<{uq}^)VS63}!+|^ohS+=thPZqNhKzg$hB^5R40H1t80O_OFf7k!V2~+bV2~|f zU{Eh$V3<+Bz%a9bfninw1H)nvUC6*NyO4olX(0oHdl3VJM-c-<co74`{vrm314RrB zCyN*u^hy{Q^h+2REK3*|f=d|~LP{AJB1;(<_Led*>?>tp*k8)P;9thT5Lw2+u(gbV zVOtpk!~QY`2LEyfhJbPghNyA|hX0@ggDV&q7%LbUxGESJ=2S2+%&lNxSYE-v@UMb_ z;Xmkzph^Y?&PoP`nUxF-vnm-F7F9AZEUaQ+SX9Npu%?QEfu)*(fwh`}fvuW>fxnu8 z0d~(dR}BM0dkq6a2k5Tj8U}_*H4F?FY8V(U)-W*Ku3=#KT*JWdrG|mwYYhX#chF(x zwG0debqoxJbqoyEbqox4^$ZO5^$ZLS^$ZN2^$ZNl>KPc8*E2AzuV-M8XkcKFY+zte zZeU=T2)$2ldIJN)$p!|7n+*&M9~u}KBpMkQ92yxI;u{$l5*is85*ry9vKko}wl*>_ zY-?m-IMB$zVA90EVA{mMVAjOIVBf^RaH)xb;c^oL!|f&phJ<DYhQwwDhU{hrhLg<< z45ykI7*01cFkEkDU{G&iV5n?iVA$Hiz;M2Wf#F>X1A}NQ1A}oZ1A}!d14Cmg1H;Z% z1_rJ+1_p~Z28JnZ3=C`A7#Mc6F)*BNV_=xk&cLvtoq<8KgMmS-gMp#BgMs042LnS& zCj&!jCj&!D7Xw307X!oHE(V5sT?`D*x)>OKbTKge>|$VG>SkaN>1JRM?Pg$*?`B}I z>SkcD?q*<c?`B{~=w@I@>}Fs{?Pg%8>}Fu7>SkbQ>}Ft?*v-H&shfdeRyPB~f^G(e zh20DctGgK(Hg_{HZ0TlT*w@X#aHpGr;chnr!?SJ%2F4x+2Bsbc2H_qChOQn4hVC8) zhRHn)40C%J80PgbFf8w3VA$Qmz_6!>f#GBi1H-!>28Q=N3=F?|7#P@k85r1m85jh5 z85q=h85q=i85pd485mafGBB*_WnkFU%fPU&mw{n_F9XAgUIvCcy$lR@dl?v>_A)U1 z>SbW~-OIqh+{eHm+sD8l*T=x1(Z|4G-p9aT(Z|4G-^aiZ*vG&S)W^UO(Z|4$-^ajE z(8s_~*2lom+sDAr*T=vxrH_GONgo5l(mn=;HGK>Whx!;84)-xI9P49Xm;q{_gT^vJ zH0X@H2J%HDFwDUek;G6#j0kz=NMYE8DS~M`rW#^I2Aes=xS2dP<i!PM_>d<;p6%4| zDF=hD0wYF>0<SRx=N(Y5QG!uVfeEYz!~<c}+yv@TViOTlK$rtj0}=rp>c+sp(0~vD zjejFV7#PrX4WtOf?;tmW{0+jWJ_YrPsU-rj3lth4dq8*w0~=Bpf_mBz5s-U8A%+kE z=|UBO&OJ1M)IeexrVFGF)y<&(x&)&xG?qa;5Jpu4>dQmafXo5OgD|QZP(NRTNmqdx zoLWFU5Jpu48UvuEh$K>oLF@vFfZPo7H$ns!Vh9mfh#^FvH;*(RL|8$&f`I`^gbhQ4 z9Yq8=^+L=cMg-($(1CBLZstTW8Ki~_LxdYegc!Rp)$n12AxH!@3_&8OVF(gI4MUI! zY8Zk<P{R-;f*OV(5o&}Xy1yVP6XXj}ssv%wbO;&=B2GjADSW`X7-1ry(Ic=314sm9 z7bph7B5*aJktKu(NDZn8C{$5JK%t5%0t!{Q2-q%=E=;>XqgAMOp^AWX!9*;Wbro2^ zITxe@gi%8SG}47lL;@)^AZkD&Ab)|}gAf7Pg(?E_7pe%zU#KFm)B-UFIZm;QKzsqR z9pnQLMs+i23=UIdB`DW`{SLAnq=p!gnPln0G<nn<P(b1idD?{!q(%d!Oi*nG!l-Ej zG-?VdH$W}~@jw_=4QND_ToDbVyaO=@BmzpkpwK{wfLw?w0?RuHHL$#c5P{_#gb1vp zMTo#kT7(F!-a&}K>K%j#tlmM0!0H`@2<Wg<R5wF!3TZ&7;R6LL0|Sx>KZb|^hKL}F z2y&SKF_|0@NGyXw9u&hM42n}k%N#V84H7}LPH~B7A;l>~4M+rJGAJ|<BCt3`h`{0$ zBErBxj_o=awu3}aZ3l^<+71#ywH+h^OHmN_fJ9&^3LyeZQ3w%Oib9CMQWQc2mZA_M zuoQ(5fu$&f2rNY*L|`cjAp%QL2oYF{LWsap6hZ`+q7WiN&@_e+5ylV^!4MI}5D~)= z0j(B9qy$i?f@X+OMI<qFNnwacV~EILh{$4yfYvFZ+9i*nMgc=a5ko`?Lqr)x1UU~v z!jKpdO^nnF5<yPAkbDYCy`Ve_!l=0tG)F^U5d$PQLu?0$z}$=w0l66z@(>Z^&;W@* zY9de`1l2+yjOq)}ToT0ZpkM~^Kp0gGXr2ku{sE~0@jw_=4QLLE7!im$AYXvY0AW;J zpt&nzL?GsX{0=e$gi&>Y=DZ;O0@(%f69}WK0nLX&)PT$Z$%8Pe8qi!Bc_OIoF_1ar ziJ-Pp$TtVm_TgbNB!z?O6j160Vbu5n%|v1okwMB|5H%nXP-+3?CWHtmZJ>&PauY%X zImbbC5hEgtVLM0!)pn2ws_h^VRNFx!AipEr0}_GNry%!0QaC8*f_NZ|8XBOPR%{}c zNG^n^0g1p|2oiyq3=#pE3c{%7faYtliO3<D3{e9T0ht5x1wsVocZ3Mc?+6i?-w`4( zze7Zj<AQh*c?=hVL{MD_5<zw$Bs4%GppXDzRKJ5}ps|T4AlU^`0}_GR1rmXn4Dvh3 zR1iir2Q-h3O+*pNWQZD&2+U-J2*}N#kVlAs>_QcRg)>AAa;Oq7qJ-fdkO-=KKq9E_ zA<r&l47)%gsCI!wQ0)SVp!yvog6emW2rP|3{0<U<wO2tRkoW@W0>u>wqs9(sT>!Zv zYDoTqm;(}l`3oX~9Ad<as9=~35}}sKuyBUB2V^oVoFO9Qxmgv>&5)1>#SSRcK^Qfh zL8~VqYC!P?k_TZ_HK3Ih#E3x50rg5iW`HoNF3^e$OcB&t7^H?g5!AYyd~-myBl?3N zbEs)DqE|a=GI9#X9vYabg<2xuo7Ujtkf4$sWHM^J&tL%MCRlz4xey`(%ee><Sk8rr zp!*ACGHSd-=80hDfNY1f*+6X)&>A2RM%5*mgg)C25&@-Egvr=NP*X2<HJIjL>cVsn zrY=koOmi^RV2WVs8f>-?ta~s+3{wO%3^CPUieTy*ias4!H;>v5D#t*j8u_ISX3E4A z8Ek2FVB;N9gMezQ?}-cyAdKoB#Uk_?1SEnQs@O$P!x_68OmnEEix^)({0^#5LH-6| zR9zZn=za%@pt>2m2&ylztHCq}Qx~RtFm+*yV48!e22%u6*TCA2=|W7A!RF?H4KYmH zF-0)L5K{y*R58_HieTy*SlcmOh$({UW=u8ML=2Jo%aGg+5&@N>p!y3T0xDZjMPO}y zgc{KJ222g6dj>WP2iA6MA&=Zk0)-(lAqFYuK_L$+<3V@^0|!zJE@=jp^B@se3?f8e zF$fZYm;;J0kQpF6gTWffoW2$Yh8c`7krgcr3<wdB$uJR!IiS%MkQpF6gTV~R9G+H? zdq5%}U7)mq5P`V|Ap-Ijsv3|B5h6TjCPR9WFkK*Z5chyuUu|s+3?Pge?-Sb?7$9mu z?g7bzFshouc95HqV+SH)gk(EH1Y{1#W`qdLUl0*YbI?T~qedV%gLHr}s(Wm^(A@(P zK}}KEMNm@|OpO4%*AEjx^q@f^qq;zG0gBV18XAxk1xlHq)C9t)De87NdWr&xpr$D7 zBB*HtrUsFsU?PYV1riyGx*%Z)%FCee17XxK1f>s55!5gQslgOM4GowYL>R(E5Mc-s z8Px^Ll|wZ&Fh^V&SQr?zSs55UvNAC2V`E@g&d$KFiGzWmg_D6Hjf;UHjGKW$golA) zKMw;#EiVIuHy;DTA3g?#6Z{Me)dCC*K7tGkQbG(2y*dmG#byi)S6vwxbOIR|wt)`W zXlG!UJb{7X$Rq{^Z}2%33=IAZ3=9Db3=Dw`3=BaG3=F{x3=E(nR6`jU7(l0xf=-u; zWME(boi-57z`y`H`!be+fguij88`z2===iEDFnF;3=AMEdKefOmN76etN}$03j>1- z4+Fz4VFre2G7JoJ6&V=zgLa(jFfeS=VPFu_V_+}^?anr1U^r^Qz))(<z;M8Wf#IzO z1H*Su1_lKm28KJK3=CUAJ6RJL81$1E7y^<Q7?vk7FiZjM08M9LkjP+QD9vDCc$dMz zV3f(g;FZO|z?sd!P?^KPpqa<O5S7Qkpp?(RFgu@tA-sTr;b8#-gJ&TF!-_%%hL42| z3|osB7-EYV80Hi+FvyfJFw7`nV3<|Pz~ElSz@S&bzz|%?z~B$vaX6=jf#F{b1H;T( z1_qXT28RFj3=HiJ3=9_<7#Kb`FfbG}F)-LQGcYV`W?-1u!oZN#%D`aK#=vl?je+50 zI|GAtCj-NeJ_d%weg+2N2@DJ;ConMVo5;W*Hwh9aprbRx85kH67#J8585kIn7#J9m z85kH+z$bh$Fr<S|d1GM6WME(bowouyzbTJ_fgzuP0elE*Ap-;W#1_ygHl+*<3}p-q z4A9M&;0xM8Cq+~<Ffc$jLNe4bFfi1EvJL|SLn8wNLlXl7Lo)*dLkj}~Ln{LVLmLAF zLpuWlLk9x`Lni|RLl*-BLpK8hLoWjZLmvYJLq7up!vqEfhKURe44@MzCNnTFOkrSP zn99JwFpYtMVLAh(P63rupp-tFfq`KT0|Ucc1_p+C3=9mQ6Z;l0Fff2l8C%4_zyLZm zZV3Ye!%_wYhUE+l3@aEI7(iv^D(ErFYZ(|A)-f<JtcRv8P&)QyU|<0G3FHot8#XX7 zFzjJqV7SJ>z;J_sf#D|fWQ?B-3=Bey3=BGq3=DdV3=H~=kkc~!85tOg7#SFP7#SG) z7#SG)p(kjpXJlZwz{tSxijjfg4I=}?Tj;48yi5!XW=sqW0Za@GK}-w`!AuO`lQxQ( z7#NzE7#QX-F)++yVqlmLJ$++869dCvCI$v^W(EdHW(Ec+X2^*gR?G|xnam6f&CCo8 zt;`GzZO~IXmN7Fh9A#!;xX;YM@Q|5-;Su!Y4ki``1``$r20s=Ch5!}@hCmj`X&!|v z3=A__7#KFQFfeRoVPMz>J>laT3j>1;D+7ZWD+7ZCD+7ZiE9BIVNLB`hWL5@-T2=;z zdR7L82Ixs33s@N#PO&mDJYi*Ec*e@W@Em$N2s;}CgEAWfgDo2agFPDq1L!;y(1{@l zYzzz)Yzz#O*cce5urV-9g`Og^m5qVnA{zt4Yc>Xkw`>dy@1Q4(@Ub&6Sg|uOgs?L( zgt0R)gtJ3V8!2aJVCZ6JU|7NqDeG21ParwL&cJY;oq^#aI|IWPb_Ry8&{Ii7IT#pJ zI2ai0I2aflIT#q6I3OpLBylh>6ml>ybaOB;^l>mS^g~ZCS<k`1u%Cm0;U)(I!yOI= zhP%)cP5yE)Fz|9RFsO4fFlccyFlci^PC4=BWMGKpWMC-gWMHV`WMHU<o_sQ!lYwD1 zCj-M#P6mb(oD2*np{Jp|<YZvr<6>aY;9_9V=3-#b;ewoy;={$j5XZ&9P{GB(P|d}_ zPy;<RWeyhu!+I_ThLc<j3}?6)7|udZQhCe8!0?BQfkBL$fkBd+fkBEJa=MBYHv@w= zHv>Z|Hv>ZkHv>Z^^u(1;ZU%-G+zbqdxEUCZax*X-gPy|jjGKYsGdBYRFAoEQ01pF$ zAP?kZ7DFBe20I=Gh6o-8hG-rJh8P~mX)QH83=C6v7#P;^FfeT7VPMz<J;CJ?4+Fz{ z9tH+ZUIqppUIqqUUdX8~y1WbwKD-PJX}k;!nY;`PS<sVSx_B8F7V<JM?B-=)*vHGj zupfH*%Y9x3hF`o43?h6C4B~tY3=({h6JbCnjr3_SFl>OHGV)S`fq@Nr!bq4V149G! zbdj@~3=BU&;#v$0@mdTFlc1-Hya$~&q76Asgh!Ww!AO^ZLB)`PA<B?}q0ta>QpN@| z28L^93=9iw7#MciFfbgnVPH67!@zLMhJoQV=rjy_1_nt71_lcU1_oOP28J{T28JpJ z28OMU3=HQS85k}(GB8|qWMFvh$iN`v#K7>unSp`Rg@J(|deVi2D+7Z*^n{C2R|ba3 z(336hxH2$&b!A}C^I>4f^kHC_>chaW--m(WnGXZQHy;KD(1||6ye0pIBc}WpRxSBI z^}y6KqwL`k4pV!CBSij-HV{F!AgO5)W-j?ZwE;>-g!~un5r&Y+;t)1o^Z)+`o#)EU z5YK>mJg*V>#BuE677W<LjTubA;vwMk&OrBIn}F}WvS2X6A#RLA+ysX>F7wTBs5i$U z4sk!GJ1w!Q2i;ST>0d(z&`HrCaddMm84Pil0|^HY@Tr2J6Q_+BK(`EoLJDLKa`>A; zPbtPG4!Um}B#vn>_VC259(#C#?s~><KKAeg-5U&2kL-TX9V?)7r9tAD?!*?(pzGNT zu!I{(99wvT#3A8{YCcFDTR4Ekv85}JIJR&AiDOGwAaQKr020TRu0Z10{R@)83?I-n zG1&c!Jv>3`vHKTvUln%qvHKTv_YrpW*!>HNW9;g&``3uU0DP_+Xs<X7gZ9;fcBO;% zeQ$-H!3Nsv3fg-N+6@WXH3`}^0oo}AItQ%Pkbwb)LHiIuE9*h4^g(OxL2KAS>*YWg zw2m0GE*G@U6|{B|v>Fh!N)NOOFC`XnMv!L_<UAVC87iQ2Q$S~>tb?A30y+-`bmj?j z59GWM&{-Xzjs$2-3^b+#8Z!osErUj`LF@iNYxY2Uhd{f9K>LG0JAy!afIz!`K>K|7 z85kTudwD>+cR>4fKs$6mdvZX#a6tQRKs#+fduu?uX+ZmDKs#nYdt^YnVnF*~Ks#SR zdtE@gTR{6+Ks#7e7#J8-!6z{?FsL&yFlaC^fKT?+Vqjp<W?*0dohz-&z`y`Heq5E0 zfdLsu@G~&{6J%hh7GYqxCCb1sSB!ySsssbWbI_T03JeVUR2Ue1v>6z#>M$@E>oPDL zHbmemGX@5GYX*kNHVh1gP7Dm|oEaG8+#vY3Hv_{fUj~N9feZ|{f*2T<L@+QkL^CiH z$1pJD#4<40CowSiBr!0A6)`YGlrb<|Yi3|L*TTSH)ylxIy^Vq4R2u`s`gR6}>MjNb zp&kYXt6s=CDWI_5#mB&~mydx#K!AZkRDgj&NQQwyT!w*xMS+2VOM!twNST2_T$zDE zQkj84PMLv0L79O;RhfZ7U73MFN11^^Pnm(iSeb#rS($;sOPPVeN11^kSebz#RGEPx z3VMcKlQILtU1bJ_XUYr=`6>(y70|Qu)~YZtgsL+zM5;3|%-3RISf<6mutArBVT&#U z1EU@T1D77;%s4UVxp6kov*W6u=f|xyVqowxWnc(3Wnhr8V_=ZCV_-;kU|`5`U|@)M zVqi#dVqhqCVqmCnVqmCpVqmCuVqj==Vqj=<VqoZSVqoZZVqiGo#K3UgiGhK^nSp`J znSsI8nSsH}nSmkQnSmkCnSr6$nSr6o8FI$jGZzMixvmThOI#Tk!rd4c;@lV*_Pa4K zoN{AeaB*i~@N#Eh@Ns8g2zG~@m!|H)06sJAnFj-dh9?7qz9$2NmnQ>*zb6Ajm?r~6 zv?t^|wKPu#hSi=747)rT7#O`67&yHc7`VL{7$m$PXRUd8F)&Q@VqlmCJ$LPi7v$_U z7jFiJ9B&4Oa&HEPeclWVhrJmX{`)X6aQHGXNcl1_$oVob==d@)==(A-nD{a<B>OTj z%<yGknC;8Ju)vpr;k+*c!%bfXhDV^Z<qJt;JbnxeqJ9hvWqu3{m3|Bi%lsG^R{BBC zZBqzfU{DQUV9<r0;pP*-zz`U~zz`L{z;Hi+f#GQY1H;Pz28Q<m3=E$G7#MyAFfcF% zGBB_OGBEH4GBAh*GB5;#&UOoAU`PpMU`U6a_XbMWAwdib(LoFhNkI$@=|Kz(lY$r+ zrbEwu1Eu*tK@1G6!3+!&LKzrlhB7dm3T0rp6w1KxER=!aZ72i7$4~}_AE68ke?l1; zSi=|?c*7VNM8g;u9KskFJi{0mI>Hzj`ob6(riL*v%nf5;xE{v9a1VMOoK`pkgLXIr zgF!e0LrFLTLuEJv!=7*kh9lt&49pP>4BQcrbK-m>7#RE_7#QN9XU2i@p+zJEgHt2} z!-7Z#hGmfq467p<7}iEIFr0{FU^o@Y!0;}Tf#F9a14D2W14Bd<14Dfj14CyN14CaF z1H*(U28JI|3=F@b7#O&s85nq@85rcE85k6z85j(r85oSAXUU~SGccq_Gce>wGcc4y zGcc4zL(Z22l>uv`85p)lGcd5mFfa(jFff41V^Fy;HHLv<VGIMq%@_uTdoc_Qg0Tz? zvat*dzOf7p5wQ#mpfVd&cJ#$EFieYuoGVuq$G}h>$G}h*2RT!2KJ*;91JJYM-o`O7 z{EA~>V2Wp8SQO8|uq2*=;Y&ON!}oXwhJW!43`_|O46F$Z4D1OE3_b}A48aKu3?Wbq zI#cd(0t16a1_Og$1_Q(OYzBtg*$fO1vKbhjWHT_V%VA*HmBYYrB8P$DG6?4~Fg(p= zV35vZU{J_oV6e?&VDQglU?|IDV5rSwU}(r=U}(={V7QXcz;H94fx)qWfx)eSf#Gox z1H;=Q1_r@m1_tqB28Mmb3=Bt#85ojF7#MO(7#QxBFfcqWVPM!^&cLw0oPmMAhJit> zhJgVzvbd;*fkB~;fkCZ~fq}W1fq|=;fg!S)fg!G$fq|)&fq}J^fkC#FfkC5{fgz@Y zfg!7dfniMt1H--!1_u331_t9!1_rxM1_q~21_rNA28Mu628Os!28QHL28KVK3=FJY z3=F@!7#RL{F))aCGcd?>Gcee8GcdS7&-L=_hMcVh8r}n)pS8D_fuX;TfnhTATq|}4 z8HQ0j8V1Ct0hS?<UO=r7&`HFbpr;WZ<A<C`e1;!#Vy}@L1B0+S14D>91H(#31_lLa zZO!eBS<8Y>Ck54}pc6_#wI=A4Qsmmw(3gQB)E82_Rr@h8%!Sr)pwmgkp(m8Cf}T<e zs_j50m4a$H&<Uldp{JDcKu;<S41}Ceng~6mbYc(#!-il6hE2f?4EsYF7>+<|r+1-{ zTF47p3-v=!BE1H!eKer8P8IZ2(w)$gNtuvp9nfi{^Pwk_?u&$+L>dG=jkGQbati4? z=t-nP&{`uU8ghcDKlId4Q0WdjDHL0&K0Tg+VSYRVgIxjx!*=K?pqHU1fr3hH&}pDw z5*QdRrZ6yE2A%Ag$G}jR$G~thpMl|AJ_CbU0Rw||0RuxyB?CihB?H5$1_p-H4Gavo z8W<REH$YBCoZH60z}v~dAlivp3I_KvFogFpFckJNFqHP8mwLtw><mL4gK{D@`~b== zpxG8_J_d&6&~v<(3o$UP6k=cqP+?#QQ-Pczy%9R9%MKd3)ns63gpTI^1o5>P7$!qU zapkljqqa?kkWt!0&=J}<Hjq)+%g_;6Vd&_q0CeQl06OYA1v=vT%@s0RsOZDMpy|WF zpyLA>eVqm!dHwFgz`zs4z`z^Czz`qCz)%Llkqivok&skppTNN2n!v!|25md|CNMAr zK-&(wNem2@Nr>|unHg9Z1`e|`{QnQ?WpXfp?s)`VG736(9(1Dt=#+XZh8PAHhI|Il zm5R9xso)zeiWw9b62a%wD=-9u@A@nO-`J4OP|Og6VM+{xF9YZ<0!&k47)lsQ!S_gk zZYoS<0No}9y3H_|Vbm?7;WAXy3o}CyLq0<igET`h11R@EQZy)MfNm54UG@vQ7lxFy zpTgh_HVHFCNXv(g3<V4Y;9E(O!I!0Gf^Vo%U~mER5*a`_75%o+7>020?M^8SF$|8- zR0$f#1zr6Jxq}Rpw~HAP89+P*hJ1!J1_dnn8g%<h3YL65>Nn6`$@t69fsZ#!hJXM6 z|37!eqx(NUI%H(f2#{bX;>zkom-){xz)<0IgH7qhmUL`#0_h=KstlYgpj)j#^&cw( z8v{E72k34RhRJMp+;&Y#kFe?c;VR4fiSgeaY;qD@F1%Od&RxJJXKs>-Q{QKqrM$b6 zjFw^3ch=2G@Kx`r@7Uz3{Y^#xELGc&P40+HiWDOQC(D26kxihs4g@nY{B~O-z2V)2 z1K9MfsbiF>$W>d6O|H?rT2`sfL=~G{KKplhwv{C(u*v<e6wr)|y73vCoUWR%HZFJa za#U(>aW;{`rth5@i|(u!+dg5FGjds@=TUMCBej6i#J0fqdVG3SSl!a<TCIO()vTr1 z%+#*yGPatvLl2vrXH1fbj6hH%Ho04DbrwhTV;Hc>t+7~O?ICzzIySlJfY~<JytU3^ zlbfDZ?SL!HmibI^zR<~*hD~3V&J0(X#jE77$@RK4c&)m7!UCHdTa2!s#EdQ>Y;qTT zz5Q^x#Y`<B5SN@l#{3|=M`yUPnR%jKG~DZ?#Y1dzEpoO|xXd)n%#Y4n$bmKfYK;HI zI-T>ojLpm^7Aq3ZS@kqylbap5ASr0it$*0$GQFFUnb=oN!X`JTa%zglg((i$<YWyt zrQ-5~gWvfyTyh)r?`GhVn_pU-{VIGD*7##L=*w-}E7On7Et|?N=YG-2yM;~8Kxlpu zF8f~SA1b~u>y9`!eTf!)<woXrT(HTtYLu3*c&*TeO>Pa}zw#ZIuW4bEJM8UV7j>Yn z6`P!*#hJP#EGY`u<RE1pc9M}ni-D1Wfk7NJ@dZ@^y5kDO<d$Gy0NsBk*fQgvDCq98 z3ruWrEf<&)T4wz7_hMuS^kQVl*I-~|*!}@*1Zc$`NFQiXBS?UOfdOK~0#>*Y3s~9W zS{ATEj9_C3^kRb;kq>bNP9q99;6@a1u*J0$a6pV;X9)CShZwP(fGZrh;YK)cgDwK& zh8RJDM+ErbMhNh+#kC0VL5v{5BM$`NMm!K;i)(ox05O6Dk8BWz8?ix{Ev{vQFvJKF zJklTrH=;p|Ev}_O3}OTc9tn_y8xbJM7S|FW2{8iGBcn-+h&(cyv_M4%q`V+HX)%CH z4Uk483@)`cFbcK=KuWC*jG#Qin9vgN4^%3FFarZ4XmJ3NCh(<wpc?|21X~XL1($XX zpwiBPDWT=SUyx!w21clDjLe`F1t^-qc3xl-Y%zf7g_o2De?e+Ndi5BX5c)w&5s(c4 z>rY@7Y+3LJY<B`PTU<*5b3)64KOm(r{dx?{NM?Z6F(4TNHsb@cV2c36j1M3)J}@V= z2>b!5L^eZ@fd$zd&_W1=L11$lSOi-deuLf8zyc~DSQ1(qeuEUEo1+K57Z;?Rk(rg9 zlbaXBgki8*0<3~9AAW(&5&#wd0;~xwA3#e;8L*k92fi5>WB}AW<kmabJWzF#05K0< zoh1AMDZ^!+9{6@#WHUi)JV1O{yc@6ywp{oLcB26sTU?6)TSCi)pCDEE%+v$lm5Z<T z%wU9<k{O_Mn864sB}pi&Em+`2Sb(C!f(2p(31u}0JKP8kcDA?{4t9tUm}NE23it*m z+=v^TY;i3&I3Y%m;E@$Pa3famu*J2k;DH!Hf=4R&;YL*Ov&FSk@I#Cs!6P0*a3ef~ z*y36|gdj$c;1LN?xDgVfY;i3Tq7WlU@W=~sxDhYJ+2UGWh(nCP@Cbtdq`(3tR#?Lf zbO$Vd3lB5g2p&*Y=V1mJ0b2M3O0o<L;yB~-4x&AF2b3Z2klr3!gJ_Sf0ky~0klr4v zLA1weK<%*_(%WM`i1wHds6FOGdV5Sp5FUy$f^2auGJ>E`^!LJu2;9N>2GJgS18R@G zA-z4e2hkqe18R@$A-z4;gJ_TSfZAg{qwO(JpJlYEk4Rbr*wn{fSdr9=94)m#bpWJ= zJX&fY!eRxY9$W#c2UmdWL2OA2XGgSx4PFUUfLebQY>-NTgbLjQ(LVA3wU0cY?IRNE z5eY>5NCMP8l7P04NNAb7Kvak?Ko#N((ksLrhzfBBs6yO9dWF~_0uRm(5w^IN4iQLj zlHidDMEfWL)IN%UwvR}N5e+H0D>S6o;#xGMAg;iS5uE7))T0|6`+^iXqXQI(B8TV! z3Th0i;!K^OelRq3!u!FXky*?<g42l6VO2z=4z*!bkjv39B&QNT=72L@j23*Lkc9;2 zXu*dF3%VA3IL9xDFZgg8F<S5;B6X-0d{ij4a2he1v=HfHbgB{&7NZp+A}mHLL_}Cn zp+X!T8bbu<=zu;VEQlY_2kAk>kf!TsPXH7wkgynC{(}gM!Lj^@_|%EB89zEVj)>He zH#ZJCkOSm@WXum<B7(iS=IkZHfNfr&0oecu8)6Lh-T=fH%uzO+#$fMkLX5#2jmBvV z_7aR_W3V^hNHzw0?|@`uuy;O5HU@i%MzS&3n{&8~!P$$%p8T*SJ)9*Q_N3?Ug_-Pd z8i768k+ie{dy*r`BiNH0NglzT)JXCO_GCtqN3bU`l01Svd13Pi&ZLDaU63%hhAUl= zkhE~63(V3CXX?b2E=ceQu5>|yM{uPJ5<G${U69}rT<L-Yk0{8%XFC;S*y36gWJYH@ zSs55dm;Vfk<v*hpBB)sj>4@Sg_(;g?xC%ZJN-bOk9|@%vu7ZyQkKii!Fg=2^LL5z6 zqe%-C0t^hW<<XFAM%Sc;Gj-x>u91*Oa5dL3^9ati7Ov(R37LJg)B+_kQj-=)4;qGy zEMPCSARSH2Siw0YfIWFZjKNG|IE}%c#306CCNrGIU{7Ww8-qQmk!%e1N|Iz_uve5M z8-u;FB-t43r5Y|{(2^dA3rWGm553|n*|4WzY&~k6Mqp39*m~4BjliCAN$OE!Pqo-Q zg0p<Zo?@|i1g8<$Q!6%);4}hzN+ro7*i$J<9>JbMv3Ue%q!ORBaE1l(NeibD#3wDB zMvNvcM3FN%k{0m=AI?Y}opVA&>Ij^3!dYsKCM`s|7~SfN2n(XO`eK{TB(=E)vK9@K zY6Q*%zL*I<#Jm`EHo{`kPl72%>^v?8?L00fedn<=V&}0lXy>sr={t{w5j&5CK|7Cy zN#A+=m=_)vk9pbRS|0O4hTAbaT{!EJ&4`m=HiJ%r*-ZLLFwKaa$IYOf$IYbgJPt;T z4+n#G9tV@Y^H>?N^H>?Q^H`bmoyVhPCn(cGa_VT=i3p2<E;|Vi)?j9MoWmp7`y`OQ zI|;^M@0XBl4EDYW$;M#s`jTu6_U<pq#$fLPlWYw3z6#04VDAd!G6rY8JGwv^Q6P*i z5JrRrMGJ%pmu#5B&>*YPFvJ)-lx(BJ(C`K)(xHElvV?@N!B?`8U<|&J4bvE$CEMsg zA1FIPntj+SQj&&Vu~(wlhF)=YO0ZX;qhrXR&g$r~rQq}NM#{0Jpsb08A+_CT16&+u z9|wE+0jZ`)=;Pq4rbsXbUo}O7G1%8ulI*Dua_}nrgB)92%Lh5om=P{x(2^dA3#llG zA1eXrLBoT?h|zomJ@0xnAI<oOD+AyR8`AR8XybGA^l6e>(by{uY^`XtvK7RIlx*1h zHIRgk*{#Nz&_}z~xEmVS`#O*y#_WOO3}Srk6%vfW*IpsP80<+8m#0AK4Goi8y^j`- zqlF`F3P%>4=T>7c91-VMvrNEs;x+d25Ol0Q<iu;HNw{=^x@<oG!QEH*^&vk0nHZSB zN6<4cFyOQk`!op?12a@7Zr5TT&|zX=f$GHVT2R>rbuGNJ4RS3jR3~oNVlU2^7}%gX zal00K3C6_04%La<wV*-^>RR|kARyOrKy^~%3`CscRoIgRNl6-%HlW8S!qW!m7)8u- z8>cI<ClZoI&9J8yk~{)RHc*eilMRU;!Jd9d@(A{XM3P59DGKTlc#6XA5h~PQIE@%h zTA;=Sq(w2Bv=Cu|z5XI8kBlZQL~xEKEksz1CM`r*j8=$<upp{Jv}Ryn09|<s(gwqz zt0`e@5DmI^5k$i<=z2pK8$^SyUIfuF47z3$#s<-#>lZ;Z41=z>gt0+1=xRz34a1<T zO<`;h4Z21XM8h!XdRiD8M1!v91ko@Iy0Q|+2GO8vMnN<TgRc67u|YKG%1ICn!=URh zVQdgRzqB|TM8h!XN?I5jM1!uj1<^1Jy2cU42GO9aB0)3^gRb6%u|YKG>R1pB!=P() zVQdf$y224e!!YPtSQr~bgRYPT(J&0UUK7R!(V**YK{O15u7`!OK{V)^OArmipsQD5 zY!D5)CK5!$Fz6~u7#l=`uI~lWFbul#6~+e9pzC2lGz^2T28FRfH0WAg5Dmkit7c(r z5DmJ@7evD_=n7338$^SyBnHti4C7DuP{RW1A%d>8g~@?v&=s*D8iqkvs>0YH8gyMR zh=yU%HOe6Nk`Fa3puQrE{{zYgUAqdBhhfl_urM}=23@%eqG1?xZ83}uqCwYpf@l~9 zU8@RXgJ{row;&pZ{|`|BiVIM~85D+~OVY4;W5b6U76qtB#T}pwBnot4o3oc71Ioy1 z-UpCTEFWuF7BCzX2C2ral^2^<kaq0Y5@Z_P@&Er2dxaQ4*T^z6aI&z1uiWNj!Nw*| z6$1lt>Vz2h8L-=f>=t6pLe_(eO@Fh94+~swMiw9X?!UKA&fi3oL)_zV!pkQf8e;p_ z%vvgQ<k8A|SHH2ZTW})rhq&4u`ulPqY)rcQ<=Q37h&7wSB=&up<CV9KGhvd#`#pD0 zIdl0<h+3p}FEnrC;7vWCf{L1<2J-0&C5KEo_J-doPZA2R{S(;cwJbnpR^v2@ck5I# z+^$WlwD{}tfml25ea~~c^>E(&9qne!W=q0Mv%dLx@qBc6Vr0M}w5Fi1&d#LbBe7;7 z=RjO+A%=u=GJiuXdp0Slew*Vr-%eOTLru}^_>v1bb%%aUYi*i*XsJa4DAYhcePz7h z|E-RyhXxb*HgomOX?yayX?KFaHW4)*k%lb?aw0y3=-CtNx*0ux?)I%<a!tv+_KU&p z*d(QEDuN4~a@x){re$2($dI_>`vWVGow!_%EH1<#$-v11!qN<!ETGaE8=F{{A)Abg zO--{vp=+VRz~G?4z~G_5z!0dxz!0Rtz!0gyz!0m!z_3Y!fnl=-1H%pt28O*F3=ABa z3=Eu_3=9&Q3=FcG3=B=03=GYh3=AEb3=ESs85n+PGBEtsWMB}|VqlQfVqln}#lSFC zi-BRe76Zd3Ed~a8Z3YGfZ3c#eE({DOT^Jb7x-c+Ybzxw*=fc2n--UtUxeEisTNeg~ zPc94$hOP_@My?DDmaYs8wyq2e9<B@wQ(YMtrnxdOEOljISn0~Zu*H>u;kzpX!w**m z2Cg^;2H`jc2C+B>2E{lA2K_h&27@>T2Aenr2B$a%2JbiqhJZK*hQK%mhO{^ahMYJC zhSE3&hQ>GshNd_MhK@J}hQ2rkhFNh83=85I7#7AcFf5N_U|1i=z_2@xf#F~r1H+*> z28L^K3=DVT7#Lo}F))0IV_^6SGCP@pAvl?Vp*xv@p(mMvVQMl1gG34ggJcQ=gH#Fw zgHj3uLum>FLs<#~LwyPZ!@Cp)hW9B93?EV$7=ENMFc_sWFc_yYFxaFrFnFagFnFgi zF!-f0FodTuFmR?bFmR<aFbJnJFjQtRFjQqQFw|!-Fo<U|Fi2!FFvw;yFlc5mFlc2l zFlc8nFqmX9FhpfBFhplDFr;KLFeqg+Feqm;Flb~mFwD+oV3?E5z%VzPfnixT14DQY z14Bd(14CjC1H;1{28KsD3=EHR7#QB<Ffe%LGB9}MGBAYXGBB*jWnfsD%fPTImw{n( zE(62ITn2_uxeN?{av2!5<}omA%VS{Jp2xs&Adi6|HlKkZE}wxRBcFj`PCf&}+<XRx zdHD<s%kvo+WC|D<WD6J=)C(9GW)v_m%q(DFm{q{Quoy%aGBC_8WMEiY$iU!U#K7QD z#K3T%h=Ji`5d(u>2?K+E2?K*=2?IlLDFZ`DDFZ`fDFegaQU->7r3?()$`}~-moYH- zmoqQ~lru0yl`}B>FK1w2s9<1VtYBc^s$gK4Q^CM6w}OFTc?AQ*zX}G1{}l`j43!KF zoRtg=Gb<SwW>qpUEUIK+SXjltu&9cGVNDeS14}gn18X${16wr%1AjFG!~bdq28J32 z2Cf<ghV~i;hK?ErhRzxWhDkLH3>Rt`7%tW@Fx;+TVEA0a!0@Gpf#G`%0|P@X14BU_ z14CgQ14DHk1A|>X1A~1%1A{|71A}Kh1H-a<28QMJ3=He*85krQ7#JiQ7#Nfr7#Jot zFfdGNU|^Wuz`zjS$iR@$$iR@;$iR@*$iT3*k%3`bBLl;MMg|6xCI$x6CI$wxCI$xk zCI*H}O$-c|n-~~wH!(0IG&3+HHZw3}H#0DtY-V6M)y%+fuZw}<Sr-Gtk1hs=pIr<L zOx+9&BHauOqTLJ(^4$y!R^1E?*4+#Y?%fOw3Ed0~iQNngsoe|=mE8;sRox5>jol0k z6T2B0CUr9~%<5)fSkTSDu&|qfVRbhH!{%-VhArI;4Ewqn818g4Fx>5CV0hNez`)qU zz`)eQz|h^pz%aRofnjbB1H-%?28QK53=F$_7#Q~SFfg3#VPJUI!@%&qhk@Z&4+8^R zF9QR6F9U->F9U;GF9U;mF9XA>UIvCuy$lTddKnn@_cAb?=w)EI)62kcx0iw8X)goA zuU-a*-@ObB%zX?DvV9B;a(xU88hs25=6wtd7JUp1_I(Ttfqe`NL46Di5q%5{`F#uw z1$_(*Wqk|`y?qP}eSHiJQ~DSfmh>?&EbU`pSkuSAaHx-g;cy=V!?8Y4Y01FA!N9=4 z#E8K2kk}w`YV)TtV%mw#9#X_;VJ5o2ak&TGZe)G5kV7^fnT^jbV%6a@V=&3l+CQ{5 zA75A^+l|b|rw5-Lv1TBvqXnB-H{!CJQvJBhB}N=%_kRcG21bUE1O^B`Si;cH*v|;! zgUZnWXv>}nH0T5pIMT<!FacE3IWRE%{|_35VrK|t$YaQ6$YaQ7C}+q6i-HPYkZKTy zr~;{GU|?eS{~scTV1v}Ui-FdGFfp+)v$C)<F|)K+F@Q#}8bESj^&pEF7#KnrG8u9i zQW=UF6d3#%QW?q_6c~aS@)>d&5*hLs7#K{&CNMHFu(C2TF|xBUv9g2oGB7Z}91r4x zSEL0qR5Ii;Br)VO<S;NW7^{J8=VoJJ0s)-1J2Dh8WHKaz_1Hu8aIr8kGBGi+w1Y<G zK;}d7d?=03qrl+Aki(G3kjwxY3AcvoCuFAwLn=cKLm5LVLkUABLo!1m0|SGn+62Z1 z1}3<Bp~G%3?V)!5XMnJf?FPjWNPj*<3PUP`0)sC@FaraFy(!q|?97}@Osq^SIDPKS zkk3#G_I)Zt5j^Y}7_8aA;SIGHPGN+1I722w9z!}q3Y0EpU|>*UU|}%i=#XIeaDnLw z3*-#R<*%dLI9pTOKDVT{nKD*MGcYU{VPM!%%D}+LV8g(`z{0>R@EdLoNEDPXKo}&b z$jtBo*=ms3C?+-pma-jS-@>qkp@Bij0F-4U8B!P+7$g}O7$zdEzaebe`gm+=5ZQyr zs5uZ6PxqOzsY8hU|1SjP*f9h!6fvYS=rSZT<TK<kq%nX}VJbr&LozrmhcJ{flrZFj z(<dl*S}`avI5QM6<TDgA6f@{D6oB(x2}2rKO)i51g9}3{I8Ws;<TDh2OO!l@5(Wi^ za)wNX5{3-0etiaK25kmys2g}092rs=a>400lcAWQgrSHb5o#+3Lorxq9yo91fXfG{ zwoz(`hQPo73=FIch*S&n2B@rg&^rIqPyY;o)e|`wwADA?GyqKiGlGVqKqV3b!wd#c z?Z&{cfPsMll*nIzOD+b6FAN|v85npN85r0Y7#JiN85lrSlnS)#V8O`1z{$YC-~%-) zf{}rNi-Ccmgpq-Pn}LC$fsuiMhk=2ihmnDSmw|y{1|tIl9|Hr!5=I6F(4@{9Mo_+G zVA#UQzyO-U*#qkGFfcGYVPRm91C{m+3=9E9sk+Jed1<Ldsd>q%3L&K>`9+zDIaUhJ zMft_Wx&=9jC29FZxe6|+WvMy&1-YqtB?{%4B^e6N`p(+g5OY9bz)+N`3o;XAzhg>n zW?p7-Nl{`+ei4I02uK{PCM7o$oelDbUw%<;Vvb%)ehEW9NFL<p;_}SAl+>IYP?iFT zv4HAj152>GL4NVgOfJeV&QB{*2+uD{QLxlAU?>95ZN(HWzQ)YJ0A@Qet@ZtTkP*!O zG|y4463W)wYY_1FAR{O)K<)z3pn3&FgX$I#4U6AVdNc$^Ltr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhm^g#fPpKWIdN>FU|5bM&MICQs*J(AN36&IQ!3M-v0}*$trmbx@x( zg8|Y<F94}!U|?urfQ$k3FfcHH7IIEuU|;~9Lp+B8($`-C9kyP>0O`wbVPIeoV_;y| z!vN{~A7Oxu1@NQw@j-oQryzev7iWK81_lf8_ycIf6x7EBji7>P(0Cq*e#^%R9#;Ux zET~_Ojg}LDjA?*IlqnoL;1Pffi-5ZKpy7{@%#xf`umeE>#K6GNAq*KW0l5P-{0|bg zfR3er`t%?^DEvWVAn^g7F7X~do_^lJ;87aT7>6SR1A~Jw1A`YM#GE1qYq0T}P(H|9 zkiS_O7#QS1<1Y*h3>ge13?&Q&3|0*K4EhYo3}p<(40;U343*%~#SHK$q8>vYc>G-- zst@E2m|3+9MPNJBaM+>4z`&4(WCLg<zlfm(j~$@73DC$U#BP|)6$}O7(Zw<bJ%%cV zOa@Ro0{H>iEnW;EV7Dmaa0_TG7uCPz3?Qfno<9MN&=)i0gI%i!9%;>G0QndaR>=0m zGDLyxQNUpjD1x!ulLQ{41&yBOGvqKJYypkCf<{kE!8W4%OPRq0Y@aL+`#|{yyL}LI zQyDTC3XyCB#T~jGHVk!OI|OmqA&rq%Kp|Jopa&lLEr6yI(D*bc)Jnmkd0^jQhMxk1 z0@yA-9CqRMPdY;hLk@ThI+=if92lg)cCg~GLk*{YKqK3r*Z~d2r7|QlWFXlD@n;G{ zDMK<t2}3c1K0_fx3D}qD;c3pG0k$8sya1HvKw%D|VR=s-r~SDM`QQ`|8b?oL&;yUz zr!(j?K<v(90J#ZbHz-fQLL6j1x*OsdB*AU~O*w+>2B`tjFgM^11LEC~$50G*87QZq z+t1423%36cbQ~Dnemy*40Gg|V%wVABNJyGa0nfG;GZ--#fT2D(Rg{2dMlu;Hu*Qip zgBRF6KXJIn7^izuz;hjm;2D%;hEi}D2@82hydbBE5{7IBeTEc<VupAI5IYrKawUR8 z3lt9MVP(N!0Cw9q9Bu>6!(h+jpqZg!hE#?`h9YQc1<lKVN?4c+L9;XZpn+xZd@m@~ z;?JLM4ANk?e8%AxEsSsim7AdXQP6x;F@qj>wkm}o0~~6IQmz0zw*+!;A~<w(p{0Z| zgAvyFa$*PqyW;~6cgSM6qky5D0c0Ae27}Dlf?Ncd_ey6-Wza*a$uP?$R|XfbeQ$Bt zr-Wf2asEzbsANco`W0I~;bBk*+xrZMy|B6mlxDznKSKyZK0`8tC4(`834<YnAvhO6 z>U<ss6|h+k$TrK60km-hR8GLmx<!Fmp!N&0Syw19%N(i~=B{&4J}5td?0}VPgu}~_ z!3?SwX4VNPpB%GHp?YCv9fI=7G0Oz17iJcyy$kXiIc9;%Gmu`GS=*pylVg?<R4>e| z4NyKgW*I{D!pvF)<&$F;Xzmf>M^$jT2lX33eA3M_KuY%zv*wZQE&~Qcx`&trniD10 zU5IoKF>4Y9?n0z{h*_Zi7rE|2q<e^2Z4|f*k?tX8ftD$e>n=pPhnQ7Gfx8gt9%5Dr z1!f`AJ;W@~iY;>e2ut_83_9R+59(i&V-_gY!^(S@SxIF25o8uD-NVd^p};Iyx`&w+ zMuAzdbPqEtfC95%=^kd57X@a)(ml*9&{zt&@d!)zFth9^a2G7y!_0!kE2-rwC{4i9 zJ<Kea+2ojoNcXznbPpO|ATPWu;N?9p1H>#)e~4VOVBrHZ3p9R1u33n54{?_i+3{!r zZ|A_=B|?E&h;$Ee7ijGZxqd{Xdx%+}m9FHPg-G`hvp{2H<eCLao1k<#(lMwF4GTxm zS|m{08Z>ALTCW9)E6_MAXl)i~+!WL&0j<XZr3cVDEYKQM(3mc0{UT`X5-81yLdS1G zV>=Sib(NrW4H{RHVPIeY_2oe0W}rR}DDNnOSI9CjC^IlHs4y@vs4_4xfbu73+(d(c zfkBgjfdSMH1@((TWq>XN0|RJ00o1<&l@Xva2Nai}v;j(MptK9B13-BTlvhD@o)rTF z1L*J)(73QI0|Nu7yabK&g2q}wW2sII3=GZ;3=E($*_DBT!Ht1|!JUDD!2`4gnSp@; zRPK9&)~hivF!(YsF!(VrF!+Pkm@zOg1Tru%1TipxR~d&eFffENFff4XuW$wih6n}* zhDZhmhA0LGhG+%`22dRt%fP@8$H2e<T09C`a}HYP4628d85qFpP*cI<s0<A0;65k= zLnZ?QLly%Acr7((4R<aB19$~^J_7@IY_yPpfuV?jfdRDA7}RDdWnf?^V_;x_?luGM zC}RM%i=aEjK)b&f>KGUp>Ot%57#J8D85kIv7#J9up=0%}3=9mQ_FX$@oSK1wp_74u zp^Jfmp&PUwkAZ=qmw|x+wDYJRbfzI_%`5{01E`%knSp@;G`2sLfq`Kf0|Uc!(7HVa z28Njo3=Fdv7#L<VFff3|{O2+-Fo4?IpmpP*b%P5T7#J2YFfc3zt?y%CU|7n)z_5&g zfnhlV1H%di28NXk3=E)t!)gWw2GAVAS_TG&bqov)>lqjrKz$R?0UMhb7#KD)Fff4T z4z@BdFo60$+Zh-bb}%q7>||hI*u}uWup2t3u$O^>VIKnn!+r(^h64-?3<nt)7(o5F z!=SZ|3=9lM85kIjF)%P3XJB9e^%YMtFfg2AU|;~*bB2L|;Vc6K1E@cGo`Hek0s{lX zMFs|jOAHJQml+rsKz-h;3=9m{7#J9?GcYjRU|?Xl$-uw>>Q~=pU|_hzz`$^qfq~&3 z0|Uc-1_lOD-~Ay21H&T*28PF=^@|J)3{M#t7(n9#&lwmPK<g=AGB7Z_Vqjo+&A`C$ zhJk?rG-mORfq~&Y0|NtSyyPPT1H&f<1_sa=4rtxwR|W<K(Ad&<1_p*73=9mQF|c0@ z3=E*T5zzSDUyxrI7#Kifg$#@g42+<870}ozBLf5I#1harDjR6MCTOiDXq_f#Z6;`4 zCTNZav>p?*78A4%6SM}Ck%0j;jw}RPhsnsmAi~JNAj-(VAjZhRAkGL`_bJK9z#zrQ zz#z@Yz#zlOzyKQCmSbdKkY{9I0FA3FGBPkIF)}cK#_~byLsc0W7(jCj>WmBw8jK7K zpg9dKMg|6LMg|5QMg|65Mg|5wMg|6bMg|7Zyptg#1A`GG1A{Rm1A_@81A{3e1A`eO z1A{pu0|RKCsU;%=gB2qKgEb=qgAF4CgDoQigB>FSgFPbyg99T2gCipYgA*eIgEJ!o zg9{@AgDWEggBv3QgF7Pwg9jr6gC`?oo&^;Dp!KT0j0_BZj0_C^j0_9`j0_Bcj0_Ax zjF9vZ!pOi7%E-VF#>l`B&d9(3TGtxM$iNWA$iNWI$iNW8$iNT_Rr~k<|Nk(Y1Qi3> z0m9II4s@YFyGruGYr<U_Kx@N`z$FIpwW1gUD<jOIpt_ii6I7c(@)ooxg&TI^eVzqq zeQF9L0|Thv2a<3Bj~#+aK@g90%*DV2w;$vVVocb`z`*bkRB13UFc>m~FeEZ0G2}3S zN?u}gqpIO!038nt+Vumn9kS~ORRt#RG^oz_2N4ekkNc-ExPV9cO5tntA+m%?DF!A+ zP<;)mw?Qr-tOKG#H33xfgVt#WGk|Ob?JNSty(f6z0cei_NCdPO2ecCbq6ZtPK}Ps{ zgRBNM9>8<N=sqXSJr)d1jG%T4$nPMG&5h_{!Hf(He?W~D2GE=@XwOeBLji+7LlU^A zMOTfVFT}va2uksw_7bu7gG>a~=^z?nD`c)GfFU0|at{(G7K<@3GJx!bVQl(f`3^=S zs{us?y~`Y!TSw`E4*^DofB%`eAmtZ&*$ryHqwPm<$xki??UexU*YFJn?NM;aPX=#1 a1hMsC@_H5wUo1C)8mGvKZInIeLI41GX9*|( diff --git a/xpdev/tutorial.ppt b/xpdev/tutorial.ppt deleted file mode 100644 index 58ce1a865f9ec7e520ab7f3b0b2238bbfdcb7af6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84992 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 diff --git a/xpdev/unicode.c b/xpdev/unicode.c deleted file mode 100644 index 96a3337..0000000 --- a/xpdev/unicode.c +++ /dev/null @@ -1,744 +0,0 @@ -/* Synchronet Unicode encode/decode/translate functions */ - -/* $Id: unicode.c,v 1.15 2019/08/30 11:04:53 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "unicode.h" -#include "cp437defs.h" -#include "unicode_defs.h" - -// Want UNICDE encodings of terminal control characters? -#if defined USE_UNICODE_FOR_TERM_CTRL_CHARS -# define UNICODE_TERM_CTRL_CHAR_CODE(x) x -#else -# define UNICODE_TERM_CTRL_CHAR_CODE(x) 0 -#endif - -// CP437 character to/from UNICODE code point conversion -// The CP437 character value is the index into the table. -// If the value at that index is 0, no translation is needed (1:1 mapping). -enum unicode_codepoint cp437_unicode_tbl[] = -{ - /* 0x00 */ UNICODE_UNDEFINED, - /* 0x01 */ UNICODE_WHITE_SMILING_FACE, - /* 0x02 */ UNICODE_BLACK_SMILING_FACE, - /* 0x03 */ UNICODE_BLACK_HEART_SUIT, - /* 0x04 */ UNICODE_BLACK_DIAMOND_SUIT, - /* 0x05 */ UNICODE_BLACK_CLUB_SUIT, - /* 0x06 */ UNICODE_BLACK_SPADE_SUIT, - /* 0x07 '\a' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_BULLET), - /* 0x08 '\b' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_INVERSE_BULLET), - /* 0x09 '\t' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_WHITE_CIRCLE), - /* 0x0A '\n' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_INVERSE_WHITE_CIRCLE), - /* 0x0B */ UNICODE_MALE_SIGN, - /* 0x0C '\f' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_FEMALE_SIGN), - /* 0x0D '\r' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_EIGHTH_NOTE), - /* 0x0E */ UNICODE_BEAMED_EIGHTH_NOTES, - /* 0x0F */ UNICODE_WHITE_SUN_WITH_RAYS, - /* 0x10 */ UNICODE_BLACK_RIGHT_POINTING_POINTER, - /* 0x11 */ UNICODE_BLACK_LEFT_POINTING_POINTER, - /* 0x12 */ UNICODE_UP_DOWN_ARROW, - /* 0x13 */ UNICODE_DOUBLE_EXCLAMATION_MARK, - /* 0x14 */ UNICODE_PILCROW_SIGN, - /* 0x15 */ UNICODE_SECTION_SIGN, - /* 0x16 */ UNICODE_BLACK_RECTANGLE, - /* 0x17 */ UNICODE_UP_DOWN_ARROW_WITH_BASE, - /* 0x18 */ UNICODE_UPWARDS_ARROW, - /* 0x19 */ UNICODE_DOWNWARDS_ARROW, - /* 0x1A */ UNICODE_RIGHTWARDS_ARROW, - /* 0x1B '\e' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_LEFTWARDS_ARROW), - /* 0x1C */ UNICODE_RIGHT_ANGLE, - /* 0x1D */ UNICODE_LEFT_RIGHT_ARROW, - /* 0x1E */ UNICODE_BLACK_UP_POINTING_TRIANGLE, - /* 0x1F */ UNICODE_BLACK_DOWN_POINTING_TRIANGLE, - /* 0x20-0x7E (1:1 with US-ASCII and CP437) */ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - /* 0x7F (DEL) */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_HOUSE), - /* 0x80 */ UNICODE_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA, - /* 0x81 */ UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS, - /* 0x82 */ UNICODE_LATIN_SMALL_LETTER_E_WITH_ACUTE, - /* 0x83 */ UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX, - /* 0x84 */ UNICODE_LATIN_SMALL_LETTER_A_WITH_DIAERESIS, - /* 0x85 */ UNICODE_LATIN_SMALL_LETTER_A_WITH_GRAVE, - /* 0x86 */ UNICODE_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE, - /* 0x87 */ UNICODE_LATIN_SMALL_LETTER_C_WITH_CEDILLA, - /* 0x88 */ UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX, - /* 0x89 */ UNICODE_LATIN_SMALL_LETTER_E_WITH_DIAERESIS, - /* 0x8A */ UNICODE_LATIN_SMALL_LETTER_E_WITH_GRAVE, - /* 0x8B */ UNICODE_LATIN_SMALL_LETTER_I_WITH_DIAERESIS, - /* 0x8C */ UNICODE_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX, - /* 0x8D */ UNICODE_LATIN_SMALL_LETTER_I_WITH_GRAVE, - /* 0x8E */ UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS, - /* 0x8F */ UNICODE_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE, - /* 0x90 */ UNICODE_LATIN_CAPITAL_LETTER_E_WITH_ACUTE, - /* 0x91 */ UNICODE_LATIN_SMALL_LETTER_AE, - /* 0x92 */ UNICODE_LATIN_CAPITAL_LETTER_AE, - /* 0x93 */ UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX, - /* 0x94 */ UNICODE_LATIN_SMALL_LETTER_O_WITH_DIAERESIS, - /* 0x95 */ UNICODE_LATIN_SMALL_LETTER_O_WITH_GRAVE, - /* 0x96 */ UNICODE_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX, - /* 0x97 */ UNICODE_LATIN_SMALL_LETTER_U_WITH_GRAVE, - /* 0x98 */ UNICODE_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS, - /* 0x99 */ UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS, - /* 0x9A */ UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS, - /* 0x9B */ UNICODE_CENT_SIGN, - /* 0x9C */ UNICODE_POUND_SIGN, - /* 0x9D */ UNICODE_YEN_SIGN, - /* 0x9E */ UNICODE_PESETA_SIGN, - /* 0x9F */ UNICODE_LATIN_SMALL_LETTER_F_WITH_HOOK, - /* 0xA0 */ UNICODE_LATIN_SMALL_LETTER_A_WITH_ACUTE, - /* 0xA1 */ UNICODE_LATIN_SMALL_LETTER_I_WITH_ACUTE, - /* 0xA2 */ UNICODE_LATIN_SMALL_LETTER_O_WITH_ACUTE, - /* 0xA3 */ UNICODE_LATIN_SMALL_LETTER_U_WITH_ACUTE, - /* 0xA4 */ UNICODE_LATIN_SMALL_LETTER_N_WITH_TILDE, - /* 0xA5 */ UNICODE_LATIN_CAPITAL_LETTER_N_WITH_TILDE, - /* 0xA6 */ UNICODE_FEMININE_ORDINAL_INDICATOR, - /* 0xA7 */ UNICODE_MASCULINE_ORDINAL_INDICATOR, - /* 0xA8 */ UNICODE_INVERTED_QUESTION_MARK, - /* 0xA9 */ UNICODE_REVERSED_NOT_SIGN, - /* 0xAA */ UNICODE_NOT_SIGN, - /* 0xAB */ UNICODE_VULGAR_FRACTION_ONE_HALF, - /* 0xAC */ UNICODE_VULGAR_FRACTION_ONE_QUARTER, - /* 0xAD */ UNICODE_INVERTED_EXCLAMATION_MARK, - /* 0xAE */ UNICODE_LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK, - /* 0xAF */ UNICODE_RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK, - /* 0xB0 */ UNICODE_LIGHT_SHADE, - /* 0xB1 */ UNICODE_MEDIUM_SHADE, - /* 0xB2 */ UNICODE_DARK_SHADE, - /* 0xB3 */ UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL, - /* 0xB4 */ UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT, - /* 0xB5 */ UNICODE_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE, - /* 0xB6 */ UNICODE_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE, - /* 0xB7 */ 0x2556, - /* 0xB8 */ 0x2555, - /* 0xB9 */ 0x2563, - /* 0xBA */ 0x2551, - /* 0xBB */ 0x2557, - /* 0xBC */ 0x255D, - /* 0xBD */ 0x255C, - /* 0xBE */ 0x255B, - /* 0xBF */ 0x2510, - /* 0xC0 */ 0x2514, - /* 0xC1 */ 0x2534, - /* 0xC2 */ 0x252C, - /* 0xC3 */ 0x251C, - /* 0xC4 */ 0x2500, - /* 0xC5 */ 0x253C, - /* 0xC6 */ 0x255E, - /* 0xC7 */ 0x255F, - /* 0xC8 */ 0x255A, - /* 0xC9 */ 0x2554, - /* 0xCA */ 0x2569, - /* 0xCB */ 0x2566, - /* 0xCC */ 0x2560, - /* 0xCD */ 0x2550, - /* 0xCE */ 0x256C, - /* 0xCF */ 0x2567, - /* 0xD0 */ 0x2568, - /* 0xD1 */ 0x2564, - /* 0xD2 */ 0x2565, - /* 0xD3 */ 0x2559, - /* 0xD4 */ 0x2558, - /* 0xD5 */ 0x2552, - /* 0xD6 */ 0x2553, - /* 0xD7 */ 0x256B, - /* 0xD8 */ 0x256A, - /* 0xD9 */ 0x2518, - /* 0xDA */ 0x250C, - /* 0xDB */ 0x2588, - /* 0xDC */ UNICODE_LOWER_HALF_BLOCK, - /* 0xDD */ 0x258C, - /* 0xDE */ 0x2590, - /* 0xDF */ UNICODE_UPPER_HALF_BLOCK, - /* 0xE0 */ UNICODE_GREEK_SMALL_LETTER_ALPHA, - /* 0xE1 */ UNICODE_GREEK_SMALL_LETTER_BETA, // or UNICODE_LATIN_SMALL_LETTER_SHARP_S - /* 0xE2 */ UNICODE_GREEK_SMALL_LETTER_GAMMA, - /* 0xE3 */ UNICODE_GREEK_SMALL_LETTER_PI, - /* 0xE4 */ UNICODE_GREEK_CAPITAL_LETTER_SIGMA, - /* 0xE5 */ UNICODE_GREEK_SMALL_LETTER_SIGMA, - /* 0xE6 */ UNICODE_GREEK_SMALL_LETTER_MU, // or UNICODE_MICRO_SIGN - /* 0xE7 */ UNICODE_GREEK_SMALL_LETTER_TAU, - /* 0xE8 */ UNICODE_GREEK_CAPITAL_LETTER_PHI, - /* 0xE9 */ UNICODE_GREEK_SMALL_LETTER_THETA, // or UNICODE_GREEK_CAPITAL_LETTER_THETA - /* 0xEA */ UNICODE_GREEK_CAPITAL_LETTER_OMEGA, - /* 0xEB */ UNICODE_GREEK_SMALL_LETTER_DELTA, - /* 0xEC */ UNICODE_INFINITY, - /* 0xED */ UNICODE_GREEK_SMALL_LETTER_PHI, - /* 0xEE */ UNICODE_GREEK_SMALL_LETTER_EPSILON, - /* 0xEF */ UNICODE_INTERSECTION, - /* 0xF0 */ UNICODE_IDENTICAL_TO, // A.K.A. "TRIPLE BAR" - /* 0xF1 */ UNICODE_PLUS_MINUS_SIGN, - /* 0xF2 */ UNICODE_GREATER_THAN_OR_EQUAL_TO, - /* 0xF3 */ UNICODE_LESS_THAN_OR_EQUAL_TO, - /* 0xF4 */ UNICODE_TOP_HALF_INTEGRAL, - /* 0xF5 */ UNICODE_BOTTOM_HALF_INTEGRAL, - /* 0xF6 */ UNICODE_DIVISION_SIGN, - /* 0xF7 */ UNICODE_ALMOST_EQUAL_TO, - /* 0xF8 */ UNICODE_DEGREE_SIGN, - /* 0xF9 */ UNICODE_BULLET_OPERATOR, - /* 0xFA */ UNICODE_MIDDLE_DOT, - /* 0xFB */ UNICODE_SQUARE_ROOT, // or UNICODE_CHECK_MARK - /* 0xFC */ UNICODE_SUPERSCRIPT_LATIN_SMALL_LETTER_N, - /* 0xFD */ UNICODE_SUPERSCRIPT_TWO, - /* 0xFE */ UNICODE_HALFWIDTH_BLACK_SQUARE, // or UNICODE_BLACK_SQUARE - /* 0xFF */ UNICODE_NO_BREAK_SPACE -}; - -size_t unicode_width(enum unicode_codepoint u) -{ - switch(u) { - case UNICODE_UNDEFINED: - case UNICODE_ZERO_WIDTH_SPACE: - case UNICODE_ZERO_WIDTH_NON_JOINER: - case UNICODE_ZERO_WIDTH_JOINER: - case UNICODE_VARIATION_SELECTOR_1: - case UNICODE_VARIATION_SELECTOR_2: - case UNICODE_VARIATION_SELECTOR_3: - case UNICODE_VARIATION_SELECTOR_4: - case UNICODE_VARIATION_SELECTOR_5: - case UNICODE_VARIATION_SELECTOR_6: - case UNICODE_VARIATION_SELECTOR_7: - case UNICODE_VARIATION_SELECTOR_8: - case UNICODE_VARIATION_SELECTOR_9: - case UNICODE_VARIATION_SELECTOR_10: - case UNICODE_VARIATION_SELECTOR_11: - case UNICODE_VARIATION_SELECTOR_12: - case UNICODE_VARIATION_SELECTOR_13: - case UNICODE_VARIATION_SELECTOR_14: - case UNICODE_VARIATION_SELECTOR_15: - case UNICODE_VARIATION_SELECTOR_16: - case UNICODE_ZERO_WIDTH_NO_BREAK_SPACE: - return 0; - default: - if( (u >= UNICODE_BLOCK_CJK_RADICALS_SUPPLEMENT_BEGIN && u <= UNICIDE_BLOCK_YI_RADICALS_END) - || (u >= UNICIDE_BLOCK_HANGUL_SYLLABLES_BEGIN && u <= UNICIDE_BLOCK_HANGUL_SYLLABLES_END) - || (u >= UNICODE_BLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_BEGIN && u <= UNICODE_BLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_END) - || (u >= UNICODE_BLOCK_VERTICAL_FORMS_BEGIN && u <= UNICODE_BLOCK_VERTICAL_FORMS_END) - || (u >= UNICODE_BLOCK_CJK_COMPATIBILITY_FORMS_BEGIN && u <= UNICODE_BLOCK_CJK_COMPATIBILITY_FORMS_END) - || (u >= UNICODE_BLOCK_SMALL_FORM_VARIANTS_BEGIN && u <= UNICODE_BLOCK_SMALL_FORM_VARIANTS_END) - || (u >= UNICODE_SUBBLOCK_FULLWIDTH_CHARS_BEGIN && u <= UNICODE_SUBBLOCK_FULLWIDTH_CHARS_END) - || (u >= UNICODE_SUBBLOCK_FULLWIDTH_SYMBOLS_BEGIN && u <= UNICODE_SUBBLOCK_FULLWIDTH_SYMBOLS_END) - ) - return 2; - return 1; - } -} - -char unicode_to_latin1(enum unicode_codepoint codepoint) -{ - if (codepoint < 0 || codepoint > 255) - return UNICODE_UNDEFINED; - return codepoint; -} - -char unicode_to_cp437(enum unicode_codepoint codepoint) -{ - switch(codepoint) { - case UNICODE_ACUTE_ACCENT: return '\''; - - case UNICODE_BROKEN_BAR: return '|'; - case UNICODE_MACRON: return '~'; - - case UNICODE_CENT_SIGN: return CP437_CENT_SIGN; - case UNICODE_POUND_SIGN: return CP437_POUND_SIGN; - case UNICODE_YEN_SIGN: return CP437_YEN_SIGN; - case UNICODE_SECTION_SIGN: return CP437_SECTION_SIGN; - case UNICODE_DEGREE_CELSIUS: - case UNICODE_DEGREE_FAHRENHEIT: - case UNICODE_DEGREE_SIGN: return CP437_DEGREE_SIGN; - case UNICODE_PLUS_MINUS_SIGN: return CP437_PLUS_MINUS_SIGN; - case UNICODE_SUPERSCRIPT_TWO: return CP437_SUPERSCRIPT_TWO; - case UNICODE_PILCROW_SIGN: return CP437_PILCROW_SIGN; - case UNICODE_INVERTED_QUESTION_MARK: return CP437_INVERTED_QUESTION_MARK; - case UNICODE_INVERTED_EXCLAMATION_MARK: return CP437_INVERTED_EXCLAMATION_MARK; - case UNICODE_DOUBLE_EXCLAMATION_MARK: return CP437_DOUBLE_EXCLAMATION_MARK; - case UNICODE_LEFT_POINTING_ANGLE_BRACKET: return '<'; - case UNICODE_RIGHT_POINTING_ANGLE_BRACKET: return '>'; - case UNICODE_COUNTERSINK: return 'v'; - case UNICODE_APL_FUNCTIONAL_SYMBOL_I_BEAM: return 'I'; - - // Perform Upper -> Lower case mapping where an upper case equivalent doesn't exist in CP437: - case UNICODE_LATIN_CAPITAL_LETTER_A_WITH_GRAVE: return CP437_LATIN_SMALL_LETTER_A_WITH_GRAVE; - case UNICODE_LATIN_CAPITAL_LETTER_A_WITH_ACUTE: return CP437_LATIN_SMALL_LETTER_A_WITH_ACUTE; - case UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX: return CP437_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX; - - case UNICODE_LATIN_CAPITAL_LETTER_E_WITH_GRAVE: return CP437_LATIN_SMALL_LETTER_E_WITH_GRAVE; - case UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX: return CP437_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX; - case UNICODE_LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS: return CP437_LATIN_SMALL_LETTER_E_WITH_DIAERESIS; - - case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_GRAVE: return CP437_LATIN_SMALL_LETTER_I_WITH_GRAVE; - case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_ACUTE: return CP437_LATIN_SMALL_LETTER_I_WITH_ACUTE; - case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX: return CP437_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX; - case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS: return CP437_LATIN_SMALL_LETTER_I_WITH_DIAERESIS; - - case UNICODE_LATIN_CAPITAL_LETTER_O_WITH_GRAVE: return CP437_LATIN_SMALL_LETTER_O_WITH_GRAVE; - case UNICODE_LATIN_CAPITAL_LETTER_O_WITH_ACUTE: return CP437_LATIN_SMALL_LETTER_O_WITH_ACUTE; - case UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX: return CP437_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX; - - case UNICODE_LATIN_CAPITAL_LETTER_U_WITH_GRAVE: return CP437_LATIN_SMALL_LETTER_U_WITH_GRAVE; - case UNICODE_LATIN_CAPITAL_LETTER_U_WITH_ACUTE: return CP437_LATIN_SMALL_LETTER_U_WITH_ACUTE; - case UNICODE_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX: return CP437_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX; - - case UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS: return CP437_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS; - - // Greek letters - case UNICODE_GREEK_CAPITAL_LETTER_ALPHA: - case UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS: return 'A'; - case UNICODE_GREEK_CAPITAL_LETTER_BETA: return 'B'; - case UNICODE_GREEK_CAPITAL_LETTER_GAMMA: - case UNICODE_GREEK_SMALL_LETTER_GAMMA: return CP437_GREEK_CAPITAL_LETTER_GAMMA; - case UNICODE_GREEK_CAPITAL_LETTER_DELTA: - case UNICODE_GREEK_SMALL_LETTER_DELTA: return CP437_GREEK_SMALL_LETTER_DELTA; - case UNICODE_GREEK_CAPITAL_LETTER_EPSILON: - case UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS: - case UNICODE_GREEK_SMALL_LETTER_EPSILON: - case UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_TONOS: return CP437_GREEK_SMALL_LETTER_EPSILION; - case UNICODE_GREEK_CAPITAL_LETTER_ZETA: return 'Z'; - case UNICODE_GREEK_CAPITAL_LETTER_ETA: return 'H'; - case UNICODE_GREEK_CAPITAL_LETTER_THETA: - case UNICODE_GREEK_SMALL_LETTER_THETA: - case UNICODE_GREEK_THETA_SYMBOL: return CP437_GREEK_SMALL_LETTER_THETA; - case UNICODE_GREEK_CAPITAL_LETTER_IOTA: - case UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA: return 'I'; - case UNICODE_GREEK_CAPITAL_LETTER_KAPPA: return 'K'; - case UNICODE_GREEK_CAPITAL_LETTER_MU: return 'M'; - case UNICODE_GREEK_CAPITAL_LETTER_NU: return 'N'; - case UNICODE_GREEK_CAPITAL_LETTER_OMICRON: return 'O'; - case UNICODE_GREEK_CAPITAL_LETTER_PI: - case UNICODE_GREEK_SMALL_LETTER_PI: - case UNICODE_GREEK_PI_SYMBOL: return CP437_GREEK_SMALL_LETTER_PI; - case UNICODE_GREEK_CAPITAL_LETTER_RHO: return 'P'; - case UNICODE_GREEK_CAPITAL_LETTER_SIGMA: return CP437_GREEK_CAPITAL_LETTER_SIGMA; - case UNICODE_GREEK_CAPITAL_LETTER_TAU: - case UNICODE_GREEK_SMALL_LETTER_TAU: - return 'T'; - case UNICODE_GREEK_CAPITAL_LETTER_UPSILON: return 'Y'; - case UNICODE_GREEK_CAPITAL_LETTER_PHI: return CP437_GREEK_CAPITAL_LETTER_PHI; - case UNICODE_GREEK_CAPITAL_LETTER_CHI: return 'X'; - case UNICODE_GREEK_CAPITAL_LETTER_OMEGA: - case UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS: - case UNICODE_GREEK_SMALL_LETTER_OMEGA: - case UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_TONOS: return CP437_GREEK_CAPITAL_LETTER_OMEGA; - case UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA: - return CP437_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS; - case UNICODE_GREEK_SMALL_LETTER_ALPHA: - case UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_TONOS: return CP437_GREEK_SMALL_LETTER_ALPHA; - case UNICODE_GREEK_SMALL_LETTER_BETA: return CP437_GREEK_SMALL_LETTER_BETA; - case UNICODE_GREEK_SMALL_LETTER_MU: return CP437_GREEK_SMALL_LETTER_MU; - case UNICODE_GREEK_SMALL_LETTER_NU: return 'v'; - case UNICODE_GREEK_SMALL_LETTER_OMICRON: return 'o'; - case UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_TONOS: return CP437_LATIN_SMALL_LETTER_O_WITH_ACUTE; - case UNICODE_GREEK_SMALL_LETTER_UPSILON: return 'u'; - case UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_TONOS: return CP437_LATIN_SMALL_LETTER_U_WITH_ACUTE; - case UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA: - case UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS: - return CP437_LATIN_SMALL_LETTER_U_WITH_DIAERESIS; - case UNICODE_GREEK_SMALL_LETTER_IOTA: - case UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_TONOS: return 'i'; - case UNICODE_GREEK_SMALL_LETTER_KAPPA: return 'k'; - case UNICODE_GREEK_SMALL_LETTER_CHI: return 'x'; - case UNICODE_GREEK_SMALL_LETTER_SIGMA: - case UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA: return CP437_GREEK_SMALL_LETTER_SIGMA; - case UNICODE_GREEK_SMALL_LETTER_RHO: return 'p'; - case UNICODE_GREEK_SMALL_LETTER_ZETA: return 'z'; - case UNICODE_GREEK_SMALL_LETTER_ETA: return 'n'; - - case UNICODE_EM_DASH: - return '\xC4'; - - case UNICODE_BULLET: - case UNICODE_BULLET_OPERATOR: return CP437_BULLET_OPERATOR; - - case UNICODE_NO_BREAK_SPACE: - case UNICODE_EN_QUAD: - case UNICODE_EM_QUAD: - case UNICODE_EN_SPACE: - case UNICODE_EM_SPACE: return ' '; - - case UNICODE_SQUARE_ROOT: return CP437_SQUARE_ROOT; - case UNICODE_CHECK_MARK: - case UNICODE_HEAVY_CHECK_MARK: return CP437_CHECK_MARK; - - case UNICODE_MULTIPLICATION_X: - case UNICODE_HEAVY_MULTIPLICATION_X: - case UNICODE_BALLOT_X: - case UNICODE_HEAVY_BALLOT_X: return 'x'; - - case UNICODE_DIVISION_SLASH: return '/'; - case UNICODE_SET_MINUS: return '\\'; - case UNICODE_ASTERISK_OPERATOR: return '*'; - - case UNICODE_DOUBLE_VERTICAL_LINE: return CP437_BOX_DRAWINGS_DOUBLE_VERTICAL; - - case UNICODE_DOUBLE_LOW_LINE: return '='; - case UNICODE_LEFT_SINGLE_QUOTATION_MARK: - case UNICODE_RIGHT_SINGLE_QUOTATION_MARK: - case UNICODE_SINGLE_HIGH_REVERSED_9_QUOTATION_MARK: return '\''; - case UNICODE_SINGLE_LOW_9_QUOTATION_MARK: return ','; - case UNICODE_LEFT_DOUBLE_QUOTATION_MARK: - case UNICODE_RIGHT_DOUBLE_QUOTATION_MARK: - case UNICODE_DOUBLE_LOW_9_QUOTATION_MARK: - case UNICODE_DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK: return '"'; - case UNICODE_DAGGER: return CP437_BOX_DRAWINGS_VERTICAL_AND_HORIZONTAL; - - case UNICODE_BLACK_SQUARE: - case UNICODE_BLACK_SQUARE_CENTERED: - case UNICODE_BLACK_SQUARE_FOR_STOP: - case UNICODE_BLACK_SMALL_SQUARE: - case UNICODE_BLACK_MEDIUM_SQUARE: - case UNICODE_BLACK_LARGE_SQUARE: - case UNICODE_BLACK_MEDIUM_SMALL_SQUARE: - case UNICODE_BLACK_VERY_SMALL_SQUARE: - case UNICODE_HALFWIDTH_BLACK_SQUARE: return CP437_HALFWIDTH_BLACK_SQUARE; - - case UNICODE_HORIZONTAL_BAR: - case UNICODE_OVERLINE: - case 0x2500: // Box Drawings Light Horizontal - case 0x2501: // Box Drawings Heavy Horizontal - case 0x2504: // Box Drawings Light Triple Dash Horizontal - case 0x2505: // Box Drawings Heavy Triple Dash Horizontal - case 0x2508: // Box Drawings Light Quadruple Dash Horizontal - case 0x2509: // Box Drawings Heavy Quadruple Dash Horizontal - case 0x254C: // Box Drawings Light Double Dash Horizontal - case 0x254D: // Box Drawings Heavy Double Dash Horizontal - case 0x2574: // Box Drawings Light Left - case 0x2576: // Box Drawings Light Right - case 0x2578: // Box Drawings Heavy Left - case 0x257A: // Box Drawings Heavy Right - case 0x257C: // Box Drawings Light Left and Heavy Right - case 0x257E: // Box Drawings Heavy Left and Light Right - return '\xC4'; - - case 0x2502: // Box Drawings Light Vertical - case 0x2503: // Box Drawings Heavy Vertical - case 0x2506: // Box Drawings Light Triple Dash Vertical - case 0x2507: // Box Drawings Heavy Triple Dash Vertical - case 0x250A: // Box Drawings Light Quadruple Dash Vertical - case 0x250B: // Box Drawings Heavy Quadruple Dash Vertical - return '\xB3'; - - case 0x250C: // BOX DRAWINGS LIGHT DOWN AND RIGHT - case 0x250D: - case 0x250E: - case 0x250F: // BOX DRAWINGS HEAVY DOWN AND RIGHT - return '\xDA'; - - case 0x2510: // BOX DRAWINGS LIGHT DOWN AND LEFT - case 0x2511: - case 0x2512: - case 0x2513: // BOX DRAWINGS HEAVY DOWN AND LEFT - return '\xBF'; - - case 0x2514: // BOX DRAWINGS LIGHT UP AND RIGHT - case 0x2515: - case 0x2516: - case 0x2517: // BOX DRAWINGS HEAVY UP AND RIGHT - return '\xC0'; - - case 0x2518: // BOX DRAWINGS LIGHT UP AND LEFT - case 0x2519: - case 0x251A: - case 0x251B: // BOX DRAWINGS HEAVY UP AND LEFT - return '\xD9'; - - case 0x251C: // BOX DRAWINGS LIGHT VERTICAL AND RIGHT - case 0x251D: - case 0x251E: - case 0x251F: - case 0x2520: - case 0x2521: - case 0x2522: - case 0x2523: // BOX DRAWINGS HEAVY VERTICAL AND RIGHT - return '\xC3'; - - case 0x2524: // BOX DRAWINGS LIGHT VERTICAL AND LEFT - case 0x2525: - case 0x2526: - case 0x2527: - case 0x2528: - case 0x2529: - case 0x252A: - case 0x252B: - return '\xB4'; - - case 0x252C: // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - case 0x252D: - case 0x252E: - case 0x252F: - case 0x2530: - case 0x2531: - case 0x2532: // BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY - case 0x2533: // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL - return '\xC2'; - - case 0x2534: // BOX DRAWINGS LIGHT UP AND HORIZONTAL - case 0x2535: // BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT - case 0x2536: // BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT - case 0x2537: // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY - case 0x2538: // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT - case 0x2539: // BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY - case 0x253A: // BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY - case 0x253B: // BOX DRAWINGS HEAVY UP AND HORIZONTAL - return '\xC1'; - - case 0x253C: // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - case 0x253D: // BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT - case 0x253E: // BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT - case 0x253F: // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY - case 0x2540: // BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT - case 0x2541: // BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT - case 0x2542: // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT - case 0x2543: // BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT - case 0x2544: // BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT - case 0x2545: // BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT - case 0x2546: // BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT - case 0x2547: // BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY - case 0x2548: // BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY - case 0x2549: // BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY - case 0x254A: // BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY - case 0x254B: // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL - return '\xC5'; - - case 0x254E: // BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL - case 0x254F: // BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL - return '|'; - - case 0x256D: // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT - return '\xDA'; - - case 0x256E: // BOX DRAWINGS LIGHT ARC DOWN AND LEFT - return '\xBF'; - - case 0x256F: // BOX DRAWINGS LIGHT ARC UP AND LEFT - return '\xD9'; - - case 0x2570: // BOX DRAWINGS LIGHT ARC UP AND RIGHT - return '\xC0'; - - case 0x2571: // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT - return '/'; - - case 0x2572: // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT - return '\\'; - - case 0x2573: // BOX DRAWINGS LIGHT DIAGONAL CROSS - return 'X'; - - case 0x2575: // Box Drawings Light Up - case 0x2577: // Box Drawings Light Down - case 0x2579: // Box Drawings Heavy Up - case 0x257B: // Box Drawings Heavy Down - case 0x257D: // Box Drawings Light Up and Heavy Down - case 0x257F: // Box Drawings Heavy Up and Light Down - return '\xB3'; - - case UNICODE_FULL_BLOCK: - return CP437_FULL_BLOCK; - case UNICODE_LOWER_HALF_BLOCK: - return CP437_LOWER_HALF_BLOCK; - case UNICODE_LEFT_HALF_BLOCK: - return CP437_LEFT_HALF_BLOCK; - case UNICODE_RIGHT_HALF_BLOCK: - return CP437_RIGHT_HALF_BLOCK; - case UNICODE_UPPER_HALF_BLOCK: - return CP437_UPPER_HALF_BLOCK; - - case 0x2581: // Lower One Eighth Block - return '_'; - - case 0x2582: // Lower One Quarter Block - case 0x2583: // Lower Three Eighths Block - return '\x16'; - - case 0x2585: // Lower Five Eighths Block - case 0x2586: // Lower Three Quarters Block - case 0x2587: // Lower Seven Eighths Block - return '\xDC'; - - case 0x2589: // Left Seven Eighths Block - return '\xDB'; - - case 0x258A: // Left Three Quarters Block - case 0x258B: // Left Five Eighths Block - case 0x258D: // Left Three Eighths Block - case 0x258E: // Left One Quarter Block - case 0x258F: // Left One Eighth Block - return '\xDD'; - - case 0x2595: // Right One Eighth Block - return '\xDE'; - - case 0x2594: // Upper One Eighth Block - return '\xDF'; - - case UNICODE_KATAKANA_LETTER_TU: return CP437_BLACK_SMILING_FACE; - - case UNICODE_SMALL_COMMA: - case UNICODE_SMALL_IDEOGRAPHIC_COMMA: return ','; - case UNICODE_SMALL_FULL_STOP: return '.'; - case UNICODE_SMALL_SEMICOLON: return ';'; - case UNICODE_SMALL_COLON: return ':'; - case UNICODE_SMALL_QUESTION_MARK: return '?'; - case UNICODE_SMALL_EXCLAMATION_MARK: return '!'; - case UNICODE_SMALL_EM_DASH: return '-'; - case UNICODE_SMALL_LEFT_PARENTHESIS: return '('; - case UNICODE_SMALL_RIGHT_PARENTHESIS: return ')'; - case UNICODE_SMALL_LEFT_CURLY_BRACKET: return '{'; - case UNICODE_SMALL_RIGHT_CURLY_BRACKET: return '}'; - case UNICODE_SMALL_LEFT_TORTOISE_SHELL_BRACKET: return '['; - case UNICODE_SMALL_RIGHT_TORTOISE_SHELL_BRACKET: return ']'; - case UNICODE_SMALL_NUMBER_SIGN: return '#'; - case UNICODE_SMALL_AMPERSAND: return '&'; - case UNICODE_SMALL_ASTERISK: return '*'; - case UNICODE_SMALL_PLUS_SIGN: return '+'; - case UNICODE_SMALL_HYPHEN_MINUS: return '-'; - case UNICODE_SMALL_LESS_THAN_SIGN: return '<'; - case UNICODE_SMALL_GREATER_THAN_SIGN: return '>'; - case UNICODE_SMALL_EQUALS_SIGN: return '='; - case UNICODE_SMALL_REVERSE_SOLIDUS: return '\\'; - case UNICODE_SMALL_DOLLAR_SIGN: return '$'; - case UNICODE_SMALL_PERCENT_SIGN: return '%'; - case UNICODE_SMALL_COMMERCIAL_AT: return '@'; - - default: - { - int i; - - if(codepoint >= UNICODE_FULLWIDTH_EXCLAMATION_MARK && codepoint <= UNICODE_FULLWIDTH_TILDE) - return '!' + (codepoint - UNICODE_FULLWIDTH_EXCLAMATION_MARK); - - // Look for a 1:1 match in the CP437 -> Unicode table - for(i = 1; i < 0x100; i++) { - if(cp437_unicode_tbl[i] == codepoint) - return i; - } - break; - } - } - - return UNICODE_UNDEFINED; // Not-mapped -} diff --git a/xpdev/unicode.h b/xpdev/unicode.h deleted file mode 100644 index 461a4ec..0000000 --- a/xpdev/unicode.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Synchronet Unicode encode/decode/translate functions */ - -/* $Id: unicode.h,v 1.3 2019/07/10 00:02:40 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef UNICODE_H_ -#define UNICODE_H_ - -#include <stdlib.h> -#include "unicode_defs.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -extern enum unicode_codepoint cp437_unicode_tbl[]; -size_t unicode_width(enum unicode_codepoint); -char unicode_to_cp437(enum unicode_codepoint); -char unicode_to_latin1(enum unicode_codepoint); - -#if defined(__cplusplus) -} -#endif - -#endif // Don't add anything after this line diff --git a/xpdev/unicode_defs.h b/xpdev/unicode_defs.h deleted file mode 100644 index 790836f..0000000 --- a/xpdev/unicode_defs.h +++ /dev/null @@ -1,750 +0,0 @@ -/* Synchronet Unicode definitions */ - -/* $Id: unicode_defs.h,v 1.10 2019/08/30 10:48:47 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef UNICODE_DEFS_H_ -#define UNICODE_DEFS_H_ - -enum unicode_codepoint { - UNICODE_UNDEFINED = 0x0000, // UNICODE_NULL() is defined - - UNICODE_NEXT_LINE = 0x0085, - UNICODE_REVERSE_LINE_FEED = 0x008D, - UNICODE_NO_BREAK_SPACE = 0x00A0, - UNICODE_INVERTED_EXCLAMATION_MARK = 0x00A1, - UNICODE_CENT_SIGN = 0x00A2, - UNICODE_POUND_SIGN = 0x00A3, - UNICODE_CURRENCY_SIGN = 0x00A4, - UNICODE_YEN_SIGN = 0x00A5, - UNICODE_BROKEN_BAR = 0x00A6, - UNICODE_SECTION_SIGN = 0x00A7, - UNICODE_COPYRIGHT_SIGN = 0x0A9, - UNICODE_FEMININE_ORDINAL_INDICATOR = 0x00AA, - UNICODE_LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK = 0x00AB, - UNICODE_NOT_SIGN = 0x00AC, - UNICODE_SOFT_HYPHEN = 0x00AD, - UNICODE_REGISTERED_SIGN = 0x00AE, - UNICODE_MACRON = 0x00AF, - UNICODE_DEGREE_SIGN = 0x00B0, - UNICODE_PLUS_MINUS_SIGN = 0x00B1, - UNICODE_SUPERSCRIPT_TWO = 0x00B2, - UNICODE_ACUTE_ACCENT = 0x00B4, - UNICODE_MICRO_SIGN = 0x00B5, - UNICODE_PILCROW_SIGN = 0x00B6, // Paragraph mark - UNICODE_MIDDLE_DOT = 0x00B7, - UNICODE_MASCULINE_ORDINAL_INDICATOR = 0x00BA, - UNICODE_RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK = 0x00BB, - UNICODE_VULGAR_FRACTION_ONE_QUARTER = 0x00BC, - UNICODE_VULGAR_FRACTION_ONE_HALF = 0x00BD, - - UNICODE_INVERTED_QUESTION_MARK = 0x00BF, - - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_GRAVE = 0x00C0, - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_ACUTE = 0x00C1, - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX = 0x00C2, - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_TILDE = 0x00C3, - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS = 0x00C4, - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE = 0x00C5, - UNICODE_LATIN_CAPITAL_LETTER_AE = 0x00C6, - UNICODE_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA = 0x00C7, - UNICODE_LATIN_CAPITAL_LETTER_E_WITH_GRAVE = 0x00C8, - UNICODE_LATIN_CAPITAL_LETTER_E_WITH_ACUTE = 0x00C9, - UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX = 0x00CA, - UNICODE_LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS = 0x00CB, - UNICODE_LATIN_CAPITAL_LETTER_I_WITH_GRAVE = 0x00CC, - UNICODE_LATIN_CAPITAL_LETTER_I_WITH_ACUTE = 0x00CD, - UNICODE_LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX = 0x00CE, - UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS = 0x00CF, - UNICODE_LATIN_CAPITAL_LETTER_ETH = 0x00D0, - UNICODE_LATIN_CAPITAL_LETTER_N_WITH_TILDE = 0x00D1, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_GRAVE = 0x00D2, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_ACUTE = 0x00D3, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX = 0x00D4, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_TILDE = 0x00D5, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS = 0x00D6, - UNICODE_MULTIPLICATION_SIGN = 0x00D7, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_STROKE = 0x00D8, - UNICODE_LATIN_CAPITAL_LETTER_U_WITH_GRAVE = 0x00D9, - UNICODE_LATIN_CAPITAL_LETTER_U_WITH_ACUTE = 0x00DA, - UNICODE_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX = 0x00DB, - UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS = 0x00DC, - UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_ACUTE = 0x00DD, - UNICODE_LATIN_CAPITAL_LETTER_THORN = 0x00DE, - UNICODE_LATIN_SMALL_LETTER_SHARP_S = 0x00DF, - UNICODE_LATIN_SMALL_LETTER_A_WITH_GRAVE = 0x00E0, - UNICODE_LATIN_SMALL_LETTER_A_WITH_ACUTE = 0x00E1, - UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX = 0x00E2, - UNICODE_LATIN_SMALL_LETTER_A_WITH_TILDE = 0x00E3, - UNICODE_LATIN_SMALL_LETTER_A_WITH_DIAERESIS = 0x00E4, - UNICODE_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE = 0x00E5, - UNICODE_LATIN_SMALL_LETTER_AE = 0x00E6, - UNICODE_LATIN_SMALL_LETTER_C_WITH_CEDILLA = 0x00E7, - UNICODE_LATIN_SMALL_LETTER_E_WITH_GRAVE = 0x00E8, - UNICODE_LATIN_SMALL_LETTER_E_WITH_ACUTE = 0x00E9, - UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX = 0x00EA, - UNICODE_LATIN_SMALL_LETTER_E_WITH_DIAERESIS = 0x00EB, - UNICODE_LATIN_SMALL_LETTER_I_WITH_GRAVE = 0x00EC, - UNICODE_LATIN_SMALL_LETTER_I_WITH_ACUTE = 0x00ED, - UNICODE_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX = 0x00EE, - UNICODE_LATIN_SMALL_LETTER_I_WITH_DIAERESIS = 0x00EF, - UNICODE_LATIN_SMALL_LETTER_ETH = 0x00F0, - UNICODE_LATIN_SMALL_LETTER_N_WITH_TILDE = 0x00F1, - UNICODE_LATIN_SMALL_LETTER_O_WITH_GRAVE = 0x00F2, - UNICODE_LATIN_SMALL_LETTER_O_WITH_ACUTE = 0x00F3, - UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX = 0x00F4, - UNICODE_LATIN_SMALL_LETTER_O_WITH_TILDE = 0x00F5, - UNICODE_LATIN_SMALL_LETTER_O_WITH_DIAERESIS = 0x00F6, - UNICODE_DIVISION_SIGN = 0x00F7, - UNICODE_LATIN_SMALL_LETTER_O_WITH_STROKE = 0x00F8, - UNICODE_LATIN_SMALL_LETTER_U_WITH_GRAVE = 0x00F9, - UNICODE_LATIN_SMALL_LETTER_U_WITH_ACUTE = 0x00FA, - UNICODE_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX = 0x00FB, - UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS = 0x00FC, - UNICODE_LATIN_SMALL_LETTER_Y_WITH_ACUTE = 0x00FD, - UNICODE_LATIN_SMALL_LETTER_THORN = 0x00FE, - UNICODE_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS = 0x00FF, - UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS = 0x0178, - UNICODE_LATIN_SMALL_LETTER_F_WITH_HOOK = 0x0192, - - UNICODE_GREEK_CAPITAL_LETTER_HETA = 0x0370, - UNICODE_GREEK_SMALL_LETTER_HETA = 0x0371, - UNICODE_GREEK_CAPITAL_LETTER_ARCHAIC_SAMPI = 0x0372, - UNICODE_GREEK_SMALL_LETTER_ARCHAIC_SAMPI = 0x0373, - UNICODE_GREEK_NUMERAL_SIGN = 0x0374, - UNICODE_GREEK_LOWER_NUMERAL_SIGN = 0x0375, - UNICODE_GREEK_CAPITAL_LETTER_PAMPHYLIAN_DIGAMMA = 0x0376, - UNICODE_GREEK_SMALL_LETTER_PAMPHYLIAN_DIGAMMA = 0x0377, - UNICODE_GREEK_YPOGEGRAMMENI = 0x037A, - UNICODE_GREEK_SMALL_REVERSED_LUNATE_SIGMA_SYMBOL = 0x037B, - UNICODE_GREEK_SMALL_DOTTED_LUNATE_SIGMA_SYMBOL = 0x037C, - UNICODE_GREEK_SMALL_REVERSED_DOTTED_LUNATE_SIGMA_SYMBOL = 0x037D, - UNICODE_GREEK_QUESTION_MARK = 0x037E, - UNICODE_GREEK_CAPITAL_LETTER_YOT = 0x037F, - UNICODE_GREEK_TONOS = 0x0384, - UNICODE_GREEK_DIALYTIKA_TONOS = 0x0385, - UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS = 0x0386, - UNICODE_GREEK_ANO_TELEIA = 0x0387, - UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS = 0x0388, - UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_TONOS = 0x0389, - UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS = 0x038A, - UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS = 0x038C, - UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS = 0x038E, - UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS = 0x038F, - UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS = 0x0390, - UNICODE_GREEK_CAPITAL_LETTER_ALPHA = 0x0391, - UNICODE_GREEK_CAPITAL_LETTER_BETA = 0x0392, - UNICODE_GREEK_CAPITAL_LETTER_GAMMA = 0x0393, - UNICODE_GREEK_CAPITAL_LETTER_DELTA = 0x0394, - UNICODE_GREEK_CAPITAL_LETTER_EPSILON = 0x0395, - UNICODE_GREEK_CAPITAL_LETTER_ZETA = 0x0396, - UNICODE_GREEK_CAPITAL_LETTER_ETA = 0x397, - UNICODE_GREEK_CAPITAL_LETTER_THETA = 0x0398, - UNICODE_GREEK_CAPITAL_LETTER_IOTA = 0x0399, - UNICODE_GREEK_CAPITAL_LETTER_KAPPA = 0x039A, - UNICODE_GREEK_CAPITAL_LETTER_LAMDA = 0x039B, - UNICODE_GREEK_CAPITAL_LETTER_MU = 0x039C, - UNICODE_GREEK_CAPITAL_LETTER_NU = 0x039D, - UNICODE_GREEK_CAPITAL_LETTER_XI = 0x039E, - UNICODE_GREEK_CAPITAL_LETTER_OMICRON = 0x039F, - UNICODE_GREEK_CAPITAL_LETTER_PI = 0x03A0, - UNICODE_GREEK_CAPITAL_LETTER_RHO = 0x03A1, - UNICODE_GREEK_CAPITAL_LETTER_SIGMA = 0x03A3, - UNICODE_GREEK_CAPITAL_LETTER_TAU = 0x03A4, - UNICODE_GREEK_CAPITAL_LETTER_UPSILON = 0x03A5, - UNICODE_GREEK_CAPITAL_LETTER_PHI = 0x03A6, - UNICODE_GREEK_CAPITAL_LETTER_CHI = 0x03A7, - UNICODE_GREEK_CAPITAL_LETTER_PSI = 0x03A8, - UNICODE_GREEK_CAPITAL_LETTER_OMEGA = 0x03A9, - UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA = 0x03AA, - UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA = 0x03AB, - UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_TONOS = 0x03AC, - UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_TONOS = 0x03AD, - UNICODE_GREEK_SMALL_LETTER_ETA_WITH_TONOS = 0x03AE, - UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_TONOS = 0x03AF, - UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS = 0x03B0, - UNICODE_GREEK_SMALL_LETTER_ALPHA = 0x03B1, - UNICODE_GREEK_SMALL_LETTER_BETA = 0x03B2, - UNICODE_GREEK_SMALL_LETTER_GAMMA = 0x03B3, - UNICODE_GREEK_SMALL_LETTER_DELTA = 0x03B4, - UNICODE_GREEK_SMALL_LETTER_EPSILON = 0x03B5, - UNICODE_GREEK_SMALL_LETTER_ZETA = 0x03B6, - UNICODE_GREEK_SMALL_LETTER_ETA = 0x03B7, - UNICODE_GREEK_SMALL_LETTER_THETA = 0x03B8, - UNICODE_GREEK_SMALL_LETTER_IOTA = 0x03B9, - UNICODE_GREEK_SMALL_LETTER_KAPPA = 0x03BA, - UNICODE_GREEK_SMALL_LETTER_LAMDA = 0x03BB, - UNICODE_GREEK_SMALL_LETTER_MU = 0x03BC, - UNICODE_GREEK_SMALL_LETTER_NU = 0x03BD, - UNICODE_GREEK_SMALL_LETTER_XI = 0x03BE, - UNICODE_GREEK_SMALL_LETTER_OMICRON = 0x03BF, - UNICODE_GREEK_SMALL_LETTER_PI = 0x03C0, - UNICODE_GREEK_SMALL_LETTER_RHO = 0x03C1, - UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA = 0x03C2, - UNICODE_GREEK_SMALL_LETTER_SIGMA = 0x03C3, - UNICODE_GREEK_SMALL_LETTER_TAU = 0x03C4, - UNICODE_GREEK_SMALL_LETTER_UPSILON = 0x03C5, - UNICODE_GREEK_SMALL_LETTER_PHI = 0x03C6, - UNICODE_GREEK_SMALL_LETTER_CHI = 0x03C7, - UNICODE_GREEK_SMALL_LETTER_PSI = 0x03C8, - UNICODE_GREEK_SMALL_LETTER_OMEGA = 0x03C9, - UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA = 0x03CA, - UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA = 0x03CB, - UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_TONOS = 0x03CC, - UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_TONOS = 0x03CD, - UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_TONOS = 0x03CE, - UNICODE_GREEK_CAPITLA_KAI_SYMBOL = 0x03CF, - UNICODE_GREEK_BETA_SYMBOL = 0x03D0, - UNICODE_GREEK_THETA_SYMBOL = 0x03D1, - UNICODE_GREEK_UPSILON_WITH_HOOK_SYMBOL = 0x03D2, - UNICODE_GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL = 0x03D3, - UNICODE_GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL = 0x03D4, - UNICODE_GREEK_PHI_SYMBOL = 0x03D5, - UNICODE_GREEK_PI_SYMBOL = 0x03D6, - UNICODE_GREEK_KAI_SYMBOL = 0x03D7, - UNICODE_GREEK_LETTER_ARCHAIC_KOPPA = 0x03D8, - UNICODE_GREEK_SMALL_LETTER_ARCHAIC_KOPPA = 0x03D9, - UNICODE_GREEK_LETTER_STIGMA = 0x03DA, - UNICODE_GREEK_SMALL_LETTER_STIGMA = 0x03DB, - UNICODE_GREEK_LETTER_DIGAMMA = 0x03DC, - UNICODE_GREEK_SMALL_LETTER_DIGAMMA = 0x03DD, - UNICODE_GREEK_LETTER_KOPPA = 0x03DE, - UNICODE_GREEK_SMALL_LETTER_KOPPA = 0x03DF, - UNICODE_GREEK_LETTER_SAMPI = 0x03E0, - UNICODE_GREEK_SMALL_LETTER_SAMPI = 0x03E1, - - UNICODE_EN_QUAD = 0x2000, - UNICODE_EM_QUAD = 0x2001, - UNICODE_EN_SPACE = 0x2002, - UNICODE_EM_SPACE = 0x2003, - UNICODE_ZERO_WIDTH_SPACE = 0x200B, - UNICODE_ZERO_WIDTH_NON_JOINER = 0x200C, - UNICODE_ZERO_WIDTH_JOINER = 0x200D, - UNICODE_EM_DASH = 0x2014, - UNICODE_HORIZONTAL_BAR = 0x2015, - UNICODE_DOUBLE_VERTICAL_LINE = 0x2016, - UNICODE_DOUBLE_LOW_LINE = 0x2017, - UNICODE_LEFT_SINGLE_QUOTATION_MARK = 0x2018, - UNICODE_RIGHT_SINGLE_QUOTATION_MARK = 0x2019, - UNICODE_SINGLE_LOW_9_QUOTATION_MARK = 0x201A, - UNICODE_SINGLE_HIGH_REVERSED_9_QUOTATION_MARK = 0x201B, - UNICODE_LEFT_DOUBLE_QUOTATION_MARK = 0x201C, - UNICODE_RIGHT_DOUBLE_QUOTATION_MARK = 0x201D, - UNICODE_DOUBLE_LOW_9_QUOTATION_MARK = 0x201E, - UNICODE_DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK = 0x201F, - UNICODE_DAGGER = 0x2020, - UNICODE_DOUBLE_DAGGER = 0x2021, - UNICODE_BULLET = 0x2022, - UNICODE_HORIZONTAL_ELLIPSIS = 0x2026, - UNICODE_LINE_SEPARATOR = 0x2028, - UNICODE_DOUBLE_EXCLAMATION_MARK = 0x203c, - UNICODE_OVERLINE = 0x203E, - UNICODE_SUPERSCRIPT_LATIN_SMALL_LETTER_N = 0x207F, - UNICODE_PESETA_SIGN = 0x20A7, - - UNICODE_DEGREE_CELSIUS = 0x2103, - UNICODE_CARE_OF = 0x2105, - UNICODE_DEGREE_FAHRENHEIT = 0x2109, - UNICODE_NUMERO_SIGN = 0x2116, - UNICODE_SOUND_RECORDING_COPYRIGHT = 0x2117, - UNICODE_TRADE_MARK_SIGN = 0x2122, - UNICODE_LEFTWARDS_ARROW = 0x2190, - UNICODE_UPWARDS_ARROW = 0x2191, - UNICODE_RIGHTWARDS_ARROW = 0x2192, - UNICODE_DOWNWARDS_ARROW = 0x2193, - UNICODE_LEFT_RIGHT_ARROW = 0x2194, - UNICODE_UP_DOWN_ARROW = 0x2195, - - UNICODE_UP_DOWN_ARROW_WITH_BASE = 0x21A8, - - UNICODE_DIVISION_SLASH = 0x2215, - UNICODE_SET_MINUS = 0x2216, - UNICODE_ASTERISK_OPERATOR = 0x2217, - UNICODE_RING_OPERATOR = 0x2218, - UNICODE_BULLET_OPERATOR = 0x2219, - UNICODE_SQUARE_ROOT = 0x221A, - UNICODE_INFINITY = 0x221E, - UNICODE_RIGHT_ANGLE = 0x221F, - - UNICODE_INTERSECTION = 0x2229, - - UNICODE_ALMOST_EQUAL_TO = 0x2248, - - UNICODE_IDENTICAL_TO = 0x2261, - UNICODE_LESS_THAN_OR_EQUAL_TO = 0x2264, - UNICODE_GREATER_THAN_OR_EQUAL_TO = 0x2265, - - UNICODE_DIAMETER_SIGN = 0x2300, - UNICODE_ELECTRIC_ARROW = 0x2301, - UNICODE_HOUSE = 0x2302, - UNICODE_UP_ARROWHEAD = 0x2303, - UNICODE_DOWN_ARROWHEAD = 0x2304, - UNICODE_PROJECTIVE = 0x2305, - UNICODE_PERSPECTIVE = 0x2306, - UNICODE_WAVY_LINE = 0x2307, - UNICODE_LEFT_CEILING = 0x2308, - UNICODE_RIGHT_CEILING = 0x2309, - UNICODE_LEFT_FLOOR = 0x230A, - UNICODE_RIGHT_FLOOR = 0x230B, - UNICODE_BOTTOM_RIGHT_CROP = 0x230C, - UNICODE_BOTTOM_LEFT_CROP = 0x230D, - UNICODE_TOP_RIGHT_CROP = 0x230E, - UNICODE_TOP_LEFT_CROP = 0x230F, - UNICODE_REVERSED_NOT_SIGN = 0x2310, - UNICODE_SQUARE_LOZENGE = 0x2311, - UNICODE_ARC = 0x2312, - UNICODE_SEGMENT = 0x2313, - UNICODE_SECTOR = 0x2314, - UNICODE_TELEPHONE_RECORDER = 0x2315, - UNICODE_POSITION_INDICATOR = 0x2316, - UNICODE_VIEWDATA_SQUARE = 0x2317, - UNICODE_PLACE_OF_INTEREST_SIGN = 0x2318, - UNICODE_TURNED_NOT_SIGN = 0x2319, - UNICODE_WATCH = 0x231A, - UNICODE_HOURGLASS = 0x231B, - UNICODE_TOP_LEFT_CORNER = 0x231C, - UNICODE_TOP_RIGHT_CORNER = 0x231D, - UNICODE_BOTTOM_LEFT_CORNER = 0x231E, - UNICODE_BOTTOM_RIGHT_CORNER = 0x231F, - UNICODE_TOP_HALF_INTEGRAL = 0x2320, - UNICODE_BOTTOM_HALF_INTEGRAL = 0x2321, - UNICODE_FROWN = 0x2322, - UNICODE_SMILE = 0x2323, - UNICODE_UP_ARROWHEAD_BETWEEN_TWO_HORIZONTAL_BARS = 0x2324, - UNICODE_OPTION_KEY = 0x2325, - UNICODE_ERASE_TO_THE_RIGHT = 0x2326, - UNICODE_X_IN_A_RECTANGLE_BOX = 0x2327, - UNICODE_KEYBOARD = 0x2328, - UNICODE_LEFT_POINTING_ANGLE_BRACKET = 0x2329, - UNICODE_RIGHT_POINTING_ANGLE_BRACKET = 0x232A, - UNICODE_ERASE_TO_THE_LEFT = 0x232B, - UNICODE_BENZENE_RING = 0x232C, - UNICODE_CYLINDRICITY = 0x232D, - UNICODE_ALL_AROUND_PROFILE = 0x232E, - UNICODE_SYMMETRY = 0x232F, - UNICODE_TOTAL_RUNOUT = 0x2330, - UNICODE_DIMENSION_ORIGIN = 0x2331, - UNICODE_CONICAL_TAPER = 0x2332, - UNICODE_SLOPE = 0x2333, - UNICODE_COUNTERBORE = 0x2334, - UNICODE_COUNTERSINK = 0x2335, - UNICODE_APL_FUNCTIONAL_SYMBOL_I_BEAM = 0x2336, - - UNICODE_ALARM_CLOCK = 0x23F0, - - UNICODE_HOURGLASS_WITH_FLOWING_SAND = 0x23F3, - UNICODE_BLACK_MEDIUM_LEFT_POINTING_TRIANGLE = 0x23F4, - UNICODE_BLACK_MEDIUM_RIGHT_POINTING_TRIANGLE = 0x23F5, - UNICODE_BLACK_MEDIUM_UP_POINTING_TRIANGLE = 0x23F6, - UNICODE_BLACK_MEDIUM_DOWN_POINTING_TRIANGLE = 0x23F7, - UNICODE_DOUBLE_VERTICAL_BAR = 0x23F8, - UNICODE_BLACK_SQUARE_FOR_STOP = 0x23F9, - UNICODE_BLACK_CIRCLE_FOR_RECORD = 0x23FA, - - UNICODE_SYMBOL_FOR_NULL = 0x2400, - UNICODE_SYMBOL_FOR_START_OF_HEADING = 0x2401, - UNICODE_SYMBOL_FOR_START_OF_TEXT = 0x2402, - UNICODE_SYMBOL_FOR_END_OF_TEXT = 0x2403, - UNICODE_SYMBOL_FOR_END_OF_TRANSMISSION = 0x2404, - UNICODE_SYMBOL_FOR_ENQUIRY = 0x2405, - UNICODE_SYMBOL_FOR_ACKNOWLEDGE = 0x2406, - UNICODE_SYMBOL_FOR_BELL = 0x2407, - UNICODE_SYMBOL_FOR_BACKSPACE = 0x2408, - UNICODE_SYMBOL_FOR_HORIZONTAL_TABULATION = 0x2409, - UNICODE_SYMBOL_FOR_LINE_FEED = 0x240A, - UNICODE_SYMBOL_FOR_VERTICAL_TABULATION = 0x240B, - UNICODE_SYMBOL_FOR_FORM_FEED = 0x240C, - UNICODE_SYMBOL_FOR_CARRIAGE_RETURN = 0x240D, - UNICODE_SYMBOL_FOR_SHIFT_OUT = 0x240E, - UNICODE_SYMBOL_FOR_SHIFT_IN = 0x240F, - UNICODE_SYMBOL_FOR_DATA_LINK_ESCAPE = 0x2410, - UNICODE_SYMBOL_FOR_DEVICE_CONTROL_ONE = 0x2411, - UNICODE_SYMBOL_FOR_DEVICE_CONTROL_TWO = 0x2412, - UNICODE_SYMBOL_FOR_DEVICE_CONTROL_THREE = 0x2413, - UNICODE_SYMBOL_FOR_DEVICE_CONTROL_FOUR = 0x2414, - UNICODE_SYMBOL_FOR_NEGATIVE_ACKNOWLEDGE = 0x2415, - UNICODE_SYMBOL_FOR_SYNCHRONOUS_IDLE = 0x2416, - UNICODE_SYMBOL_FOR_END_OF_TRANSMISSION_BLOCK = 0x2417, - UNICODE_SYMBOL_FOR_CANCEL = 0x2418, - UNICODE_SYMBOL_FOR_END_OF_MEDIUM = 0x2419, - UNICODE_SYMBOL_FOR_SUBSTITUTE = 0x241A, - UNICODE_SYMBOL_FOR_ESCAPE = 0x241B, - UNICODE_SYMBOL_FOR_FILE_SEPARATOR = 0x241C, - UNICODE_SYMBOL_FOR_GROUP_SEPARATOR = 0x241D, - UNICODE_SYMBOL_FOR_RECORD_SEPARATOR = 0x241E, - UNICODE_SYMBOL_FOR_UNIT_SEPARATOR = 0x241F, - UNICODE_SYMBOL_FOR_SPACE = 0x2420, - UNICODE_SYMBOL_FOR_DELETE = 0x2421, - UNICODE_BLANK_SYMBOL = 0x2422, - UNICODE_OPEN_BOX = 0x2423, - UNICODE_SYMBOL_FOR_NEWLINE = 0x2424, - UNICODE_SYMBOL_FOR_DELETE_FORM_TWO = 0x2425, - UNICODE_SYMBOL_FOR_SUBSTITUTE_FORM_TWO = 0x2426, - - UNICODE_BOX_DRAWINGS_LIGHT_HORIZONTAL = 0x2500, - UNICODE_BOX_DRAWINGS_HEAVY_HORIZONTAL = 0x2501, - UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL = 0x2502, - UNICODE_BOX_DRAWINGS_HEAVY_VERTICAL = 0x2503, - UNICODE_BOX_DRAWINGS_LIGHT_TRIPLE_DASH_HORIZONTAL = 0x2504, - UNICODE_BOX_DRAWINGS_HEAVY_TRIPLE_DASH_HORIZONTAL = 0x2505, - UNICODE_BOX_DRAWINGS_LIGHT_TRIPLE_DASH_VERTICAL = 0x2506, - UNICODE_BOX_DRAWINGS_HEAVY_TRIPLE_DASH_VERTICAL = 0x2507, - UNICODE_BOX_DRAWINGS_LIGHT_QUADRUPLE_DASH_HORIZONTAL = 0x2508, - UNICODE_BOX_DRAWINGS_HEAVY_QUADRUPLE_DASH_HORIZONTAL = 0x2509, - UNICODE_BOX_DRAWINGS_LIGHT_QUADRUPLE_DASH_VERTICAL = 0x250A, - UNICODE_BOX_DRAWINGS_HEAVY_QUADRUPLE_DASH_VERTICAL = 0x250B, - UNICODE_BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT = 0x250C, - UNICODE_BOX_DRAWINGS_250D = 0x250D, - UNICODE_BOX_DRAWINGS_250E = 0x250E, - UNICODE_BOX_DRAWINGS_HEAVY_DOWN_AND_RIGHT = 0x250F, - UNICODE_BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT = 0x2510, - UNICODE_BOX_DRAWINGS_2511 = 0x2511, - UNICODE_BOX_DRAWINGS_2512 = 0x2512, - UNICODE_BOX_DRAWINGS_HEAVY_DOWN_AND_LEFT = 0x2513, - UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_RIGHT = 0x2514, - UNICODE_BOX_DRAWINGS_2515 = 0x2515, - UNICODE_BOX_DRAWINGS_2516 = 0x2516, - UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_RIGHT = 0x2517, - UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_LEFT = 0x2518, - UNICODE_BOX_DRAWINGS_2519 = 0x2519, - UNICODE_BOX_DRAWINGS_251A = 0x251A, - UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_LEFT = 0x251B, - UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT = 0x251C, - UNICODE_BOX_DRAWINGS_251D = 0x251D, - UNICODE_BOX_DRAWINGS_251E = 0x251E, - UNICODE_BOX_DRAWINGS_251F = 0x251F, - UNICODE_BOX_DRAWINGS_2520 = 0x2520, - UNICODE_BOX_DRAWINGS_2521 = 0x2521, - UNICODE_BOX_DRAWINGS_2522= 0x2522, - UNICODE_BOX_DRAWINGS_HEAVY_VERTICAL_AND_RIGHT = 0x2523, - UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT = 0x2524, - UNICODE_BOX_DRAWINGS_2525 = 0x2525, - UNICODE_BOX_DRAWINGS_2526 = 0x2526, - UNICODE_BOX_DRAWINGS_2527 = 0x2527, - UNICODE_BOX_DRAWINGS_2528 = 0x2528, - UNICODE_BOX_DRAWINGS_2529 = 0x2529, - UNICODE_BOX_DRAWINGS_252A = 0x252A, - UNICODE_BOX_DRAWINGS_252B = 0x252B, - UNICODE_BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL = 0x252C, - UNICODE_BOX_DRAWINGS_252D = 0x252D, - UNICODE_BOX_DRAWINGS_252E = 0x252E, - UNICODE_BOX_DRAWINGS_252F = 0x252F, - UNICODE_BOX_DRAWINGS_2530 = 0x2530, - UNICODE_BOX_DRAWINGS_2531 = 0x2531, - UNICODE_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_DOWN_HEAVY = 0x2532, - UNICODE_BOX_DRAWINGS_HEAVY_DOWN_AND_HORIZONTAL = 0x2533, - UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL = 0x2534, - UNICODE_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_UP_LIGHT = 0x2535, - UNICODE_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_UP_LIGHT = 0x2536, - UNICODE_BOX_DRAWINGS_UP_LIGHT_AND_HORIZONTAL_HEAVY = 0x2537, - UNICODE_BOX_DRAWINGS_UP_HEAVY_AND_HORIZONTAL_LIGHT = 0x2538, - UNICODE_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_UP_HEAVY = 0x2539, - UNICODE_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_UP_HEAVY = 0x253A, - UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_HORIZONTAL = 0x253B, - UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL = 0x253C, - UNICODE_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_VERTICAL_LIGHT = 0x253D, - UNICODE_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_VERTICAL_LIGHT = 0x253E, - UNICODE_BOX_DRAWINGS_VERTICAL_LIGHT_AND_HORIZONTAL_HEAVY = 0x253F, - UNICODE_BOX_DRAWINGS_UP_HEAVY_AND_DOWN_HORIZONTAL_LIGHT = 0x2540, - UNICODE_BOX_DRAWINGS_DOWN_HEAVY_AND_UP_HORIZONTAL_LIGHT = 0x2541, - UNICODE_BOX_DRAWINGS_VERTICAL_HEAVY_AND_HORIZONTAL_LIGHT = 0x2542, - UNICODE_BOX_DRAWINGS_LEFT_UP_HEAVY_AND_RIGHT_DOWN_LIGHT = 0x2543, - UNICODE_BOX_DRAWINGS_RIGHT_UP_HEAVY_AND_LEFT_DOWN_LIGHT = 0x2544, - UNICODE_BOX_DRAWINGS_LEFT_DOWN_HEAVY_AND_RIGHT_UP_LIGHT = 0x2545, - UNICODE_BOX_DRAWINGS_RIGHT_DOWN_HEAVY_AND_LEFT_UP_LIGHT = 0x2546, - UNICODE_BOX_DRAWINGS_DOWN_LIGHT_AND_UP_HORIZONTAL_HEAVY = 0x2547, - UNICODE_BOX_DRAWINGS_UP_LIGHT_AND_DOWN_HORIZONTAL_HEAVY = 0x2548, - UNICODE_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_VERTICAL_HEAVY = 0x2549, - UNICODE_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_VERTICAL_HEAVY = 0x254A, - UNICODE_BOX_DRAWINGS_HEAVY_VERTICAL_AND_HORIZONTAL = 0x254B, - UNICODE_BOX_DRAWINGS_LIGHT_DOUBLE_DASH_HORIZONTAL = 0x254C, - UNICODE_BOX_DRAWINGS_HEAVY_DOUBLE_DASH_HORIZONTAL = 0x254D, - UNICODE_BOX_DRAWINGS_LIGHT_DOUBLE_DASH_VERTICAL = 0x254E, - UNICODE_BOX_DRAWINGS_HEAVY_DOUBLE_DASH_VERTICAL = 0x254F, - UNICODE_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE = 0x2561, - UNICODE_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE = 0x2562, - UNICODE_BOX_DRAWINGS_LIGHT_ARC_DOWN_AND_RIGHT = 0x256D, - UNICODE_BOX_DRAWINGS_LIGHT_ARC_DOWN_AND_LEFT = 0x256E, - UNICODE_BOX_DRAWINGS_LIGHT_ARC_UP_AND_LEFT = 0x256F, - UNICODE_BOX_DRAWINGS_LIGHT_ARC_UP_AND_RIGHT = 0x2570, - UNICODE_BOX_DRAWINGS_LIGHT_DIAGONAL_UPPER_RIGHT_TO_LOWER_LEFT = 0x2571, - UNICODE_BOX_DRAWINGS_LIGHT_DIAGONAL_UPPER_LEFT_TO_LOWER_RIGHT = 0x2572, - UNICODE_BOX_DRAWINGS_LIGHT_DIAGONAL_CROSS = 0x2573, - UNICODE_BOX_DRAWINGS_LIGHT_LEFT = 0x2574, - UNICODE_BOX_DRAWINGS_LIGHT_UP = 0x2575, - UNICODE_BOX_DRAWINGS_LIGHT_RIGHT = 0x2576, - UNICODE_BOX_DRAWINGS_LIGHT_DOWN = 0x2577, - UNICODE_BOX_DRAWINGS_HEAVY_LEFT = 0x2578, - UNICODE_BOX_DRAWINGS_HEAVY_UP = 0x2579, - UNICODE_BOX_DRAWINGS_HEAVY_RIGHT = 0x257A, - UNICODE_BOX_DRAWINGS_HEAVY_DOWN = 0x257B, - UNICODE_BOX_DRAWINGS_LIGHT_LEFT_AND_HEAVY_RIGHT = 0x257C, - UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_HEAVY_DOWN = 0x257D, - UNICODE_BOX_DRAWINGS_HEAVY_LEFT_AND_LIGHT_RIGHT = 0x257E, - UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_LIGHT_DOWN = 0x257F, - - UNICODE_UPPER_HALF_BLOCK = 0x2580, - UNICODE_LOWER_ONE_EIGHTH_BLOCK = 0x2581, - UNICODE_LOWER_ONE_QUARTER_BLOCK = 0x2582, - UNICODE_LOWER_THREE_EIGHTHS_BLOCK = 0x2583, - UNICODE_LOWER_HALF_BLOCK = 0x2584, - UNICODE_LOWER_FIVE_EIGHTHS_BLOCK = 0x2585, - UNICODE_LOWER_THREE_QUARTERS_BLOCK = 0x2586, - UNICODE_LOWER_SEVEN_EIGHTHS_BLOCK = 0x2587, - UNICODE_FULL_BLOCK = 0x2588, - UNICODE_LEFT_SEVEN_EIGHTHS_BLOCK = 0x2589, - UNICODE_LEFT_THREE_QUARTERS_BLOCK = 0x258A, - UNICODE_LEFT_FIVE_EIGHTHS_BLOCK = 0x258B, - UNICODE_LEFT_HALF_BLOCK = 0x258C, - UNICODE_LEFT_THREE_EIGHTHS_BLOCK = 0x258D, - UNICODE_LEFT_ONE_QUARTER_BLOCK = 0x258E, - UNICODE_LEFT_ONE_EIGHTH_BLOCK = 0x258F, - UNICODE_RIGHT_HALF_BLOCK = 0x2590, - UNICODE_LIGHT_SHADE = 0x2591, - UNICODE_MEDIUM_SHADE = 0x2591, - UNICODE_DARK_SHADE = 0x2592, - UNICODE_RIGHT_ONE_EIGHTH_BLOCK = 0x2595, - UNICODE_UPPER_ONE_EIGHTH_BLOCK = 0x2594, - - UNICODE_BLACK_SQUARE = 0x25A0, - UNICODE_BLACK_SMALL_SQUARE = 0x25AA, - UNICODE_BLACK_RECTANGLE = 0x25AC, - UNICODE_BLACK_UP_POINTING_TRIANGLE = 0x25B2, - UNICODE_BLACK_RIGHT_POINTING_POINTER = 0x25BA, - UNICODE_BLACK_DOWN_POINTING_TRIANGLE = 0x25BC, - UNICODE_BLACK_LEFT_POINTING_POINTER = 0x25C4, - UNICODE_WHITE_CIRCLE = 0x25CB, - UNICODE_INVERSE_BULLET = 0x25D8, - UNICODE_INVERSE_WHITE_CIRCLE = 0x25D9, - - UNICODE_BLACK_MEDIUM_SQUARE = 0x25FC, - UNICODE_WHITE_MEDIUM_SMALL_SQUARE = 0x25FD, - UNICODE_BLACK_MEDIUM_SMALL_SQUARE = 0x25FE, - UNICODE_LOWER_RIGHT_TRIANGLE = 0x25FF, - UNICODE_BLACK_SUN_WITH_RAYS = 0x2600, - UNICODE_CLOUD = 0x2601, - UNICODE_UMBRELLA = 0x2602, - UNICODE_SNOWMAN = 0x2603, - UNICODE_COMET = 0x2604, - UNICODE_BLACK_STAR = 0x2605, - UNICODE_WHITE_STAR = 0x2606, - UNICODE_LIGHTNING = 0x2607, - UNICODE_THUNDERSTORM = 0x2608, - UNICODE_SUN = 0x2609, - UNICODE_ASCENDING_NODE = 0x260A, - UNICODE_DESCENDING_NODE = 0x260B, - UNICODE_CONJUNCTION = 0x260C, - UNICODE_OPPOSITION = 0x260D, - UNICODE_BLACK_TELEPHONE = 0x260E, - UNICODE_WHITE_TELEPHONE = 0x260F, - UNICODE_BALLOT_BOX = 0x2610, - UNICODE_BALLOT_BOX_WITH_CHECK = 0x2611, - UNICODE_BALLOT_BOX_WITH_X = 0x2612, - UNICODE_SALTIRE = 0x2613, - UNICODE_UMBRELLA_WITH_RAIN_DROPS = 0x2614, - UNICODE_HOT_BEVERAGE = 0x2615, - UNICODE_WHITE_SHOGI_PIECE = 0x2616, - UNICODE_BLACK_SHOGI_PIECE = 0x2617, - UNICODE_SHAMROCK = 0x2618, - UNICODE_REVERSED_ROTATED_FLORAL_HEART_BULLET = 0x2619, - UNICODE_BLACK_LEFT_POINTING_INDEX = 0x261A, - UNICODE_BLACK_RIGHT_POINTING_INDEX = 0x261B, - UNICODE_WHITE_LEFT_POINTING_INDEX = 0x261C, - UNICODE_WHITE_UP_POINTING_INDEX = 0x261D, - UNICODE_WHITE_RIGHT_POINTING_INDEX = 0x261E, - UNICODE_WHITE_DOWN_POINTING_INDEX = 0x261F, - UNICODE_SKULL_AND_CROSSBONES = 0x2620, - UNICODE_CAUTION_SIGN = 0x2621, - UNICODE_RADIOACTIVE_SIGN = 0x2622, - UNICODE_BIOHAZARD_SIGN = 0x2623, - UNICODE_CADUCEUS = 0x2624, - UNICODE_ANKH = 0x2625, - UNICODE_ORTHODOX_CROSS = 0x2626, - UNICODE_CHI_RHO = 0x2627, - UNICODE_CROSS_OF_LORRAINE = 0x2628, - UNICODE_CROSS_OF_JERUSALEM = 0x2629, - UNICODE_STAR_AND_CRESCENT = 0x262A, - UNICODE_FARSI_SYMBOL = 0x262B, - UNICODE_ADI_SHAKTI = 0x262C, - UNICODE_HAMMER_AND_SICKLE = 0x262D, - UNICODE_PEACE_SYMBOL = 0x262E, - UNICODE_YIN_YANG = 0x262F, - UNICODE_TRIGRAM_FOR_HEAVEN = 0x2630, - UNICODE_TRIGRAM_FOR_LAKE = 0x2631, - UNICODE_TRIGRAM_FOR_FIRE = 0x2632, - UNICODE_TRIGRAM_FOR_THUNDER = 0x2633, - UNICODE_TRIGRAM_FOR_WIND = 0x2634, - UNICODE_TRIGRAM_FOR_WATER = 0x2635, - UNICODE_TRIGRAM_FOR_MOUNTAIN = 0x2636, - UNICODE_TRIGRAM_FOR_EARTH = 0x2637, - UNICODE_WHEEL_OF_DHARMA = 0x2638, - UNICODE_WHITE_FROWNING_FACE = 0x2639, - UNICODE_WHITE_SMILING_FACE = 0x263A, - UNICODE_BLACK_SMILING_FACE = 0x263B, - UNICODE_WHITE_SUN_WITH_RAYS = 0x263C, - UNICODE_FEMALE_SIGN = 0x2640, - UNICODE_EIGHTH_NOTE = 0x266A, - UNICODE_BEAMED_EIGHTH_NOTES = 0x266B, - UNICODE_MALE_SIGN = 0x2642, - UNICODE_BLACK_HEART_SUIT = 0x2665, - UNICODE_BLACK_DIAMOND_SUIT = 0x2666, - UNICODE_BLACK_CLUB_SUIT = 0x2663, - UNICODE_BLACK_SPADE_SUIT = 0x2660, - - UNICODE_CHECK_MARK = 0x2713, - UNICODE_HEAVY_CHECK_MARK = 0x2714, - - UNICODE_MULTIPLICATION_X = 0x2715, - UNICODE_HEAVY_MULTIPLICATION_X = 0x2716, - UNICODE_BALLOT_X = 0x2717, - UNICODE_HEAVY_BALLOT_X = 0x2718, - - UNICODE_BLACK_LARGE_SQUARE = 0x2B1B, - - UNICODE_BLACK_VERY_SMALL_SQUARE = 0x2B1D, - - UNICODE_BLACK_SQUARE_CENTERED = 0x2BC0, - - UNICODE_IDEOGRAPHIC_SPACE = 0x3000, // Fullwidth space - - UNICODE_KATAKANA_LETTER_TU = 0x30C4, - - UNICODE_VARIATION_SELECTOR_1 = 0xFE00, - UNICODE_VARIATION_SELECTOR_2 = 0xFE01, - UNICODE_VARIATION_SELECTOR_3 = 0xFE02, - UNICODE_VARIATION_SELECTOR_4 = 0xFE03, - UNICODE_VARIATION_SELECTOR_5 = 0xFE04, - UNICODE_VARIATION_SELECTOR_6 = 0xFE05, - UNICODE_VARIATION_SELECTOR_7 = 0xFE06, - UNICODE_VARIATION_SELECTOR_8 = 0xFE07, - UNICODE_VARIATION_SELECTOR_9 = 0xFE08, - UNICODE_VARIATION_SELECTOR_10 = 0xFE09, - UNICODE_VARIATION_SELECTOR_11 = 0xFE0A, - UNICODE_VARIATION_SELECTOR_12 = 0xFE0B, - UNICODE_VARIATION_SELECTOR_13 = 0xFE0C, - UNICODE_VARIATION_SELECTOR_14 = 0xFE0D, - UNICODE_VARIATION_SELECTOR_15 = 0xFE0E, - UNICODE_VARIATION_SELECTOR_16 = 0xFE0F, - UNICODE_ZERO_WIDTH_NO_BREAK_SPACE = 0xFEFF, - - UNICODE_SMALL_COMMA = 0xFE50, - UNICODE_SMALL_IDEOGRAPHIC_COMMA = 0xFE51, - UNICODE_SMALL_FULL_STOP = 0xFE52, - UNICODE_SMALL_SEMICOLON = 0xFE54, - UNICODE_SMALL_COLON = 0xFE55, - UNICODE_SMALL_QUESTION_MARK = 0xFE56, - UNICODE_SMALL_EXCLAMATION_MARK = 0xFE57, - UNICODE_SMALL_EM_DASH = 0xFE58, - UNICODE_SMALL_LEFT_PARENTHESIS = 0xFE59, - UNICODE_SMALL_RIGHT_PARENTHESIS = 0xFE5A, - UNICODE_SMALL_LEFT_CURLY_BRACKET = 0xFE5B, - UNICODE_SMALL_RIGHT_CURLY_BRACKET = 0xFE5C, - UNICODE_SMALL_LEFT_TORTOISE_SHELL_BRACKET = 0xFE5D, - UNICODE_SMALL_RIGHT_TORTOISE_SHELL_BRACKET = 0xFE5E, - UNICODE_SMALL_NUMBER_SIGN = 0xFE5F, - UNICODE_SMALL_AMPERSAND = 0xFE60, - UNICODE_SMALL_ASTERISK = 0xFE61, - UNICODE_SMALL_PLUS_SIGN = 0xFE62, - UNICODE_SMALL_HYPHEN_MINUS = 0xFE63, - UNICODE_SMALL_LESS_THAN_SIGN = 0xFE64, - UNICODE_SMALL_GREATER_THAN_SIGN = 0xFE65, - UNICODE_SMALL_EQUALS_SIGN = 0xFE66, - UNICODE_SMALL_REVERSE_SOLIDUS = 0xFE68, - UNICODE_SMALL_DOLLAR_SIGN = 0xFE69, - UNICODE_SMALL_PERCENT_SIGN = 0xFE6A, - UNICODE_SMALL_COMMERCIAL_AT = 0xFE6B, - - UNICODE_FULLWIDTH_EXCLAMATION_MARK = 0xFF01, - UNICODE_FULLWIDTH_TILDE = 0xFF5E, - UNICODE_FULLWIDTH_LEFT_WHITE_PARENTHESIS = 0xFF5F, - UNICODE_FULLWIDTH_RIGHT_WHITE_PARENTHESIS = 0xFF60, - - UNICODE_HALFWIDTH_BLACK_SQUARE = 0xFFED, - UNICODE_HALFWIDTH_WHITE_CIRCLE = 0xFFEE, - - UNICODE_REPLACEMENT_CHARACTER = 0xFFFD -}; - -// Blocks -#define UNICODE_BLOCK_BASIC_LATIN_BEGIN 0x0000 -#define UNICODE_BLOCK_BASIC_LATIN_END 0x007F -#define UNICODE_BLOCK_HANGUL_JAMO_BEGIN 0x1100 -#define UNICODE_BLOCK_HANGUL_JAMO_END 0x11FF -#define UNICODE_BLOCK_CJK_RADICALS_SUPPLEMENT_BEGIN 0x2E80 // Fullwidth -#define UNICODE_BLOCK_CJK_RADICALS_SUPPLEMENT_END 0x2EFF // Fullwidth -#define UNICODE_BLOCK_KANGXI_RADICALS_BEGIN 0x2F00 // Fullwidth -#define UNICODE_BLOCK_KANGXI_RADICALS_END 0x2FDF // Fullwidth -#define UNICODE_BLOCK_IDEOGRAPHIC_DESCRIPTION_CHARACTERS_BEGIN 0x2FF0 // Fullwidth -#define UNICODE_BLOCK_IDEOGRAPHIC_DESCRIPTION_CHARACTERS_END 0x2FFF // Fullwidth -#define UNICODE_BLOCK_CJK_SYMBOLS_AND_PUNCTUATION_BEGIN 0x3000 // Fullwidth 0x3000 - 0x3029 -#define UNICODE_BLOCK_CJK_SYMBOLS_AND_PUNCTUATION_END 0x303F // Fullwidth 0x3030 - 0x303E -#define UNICODE_BLOCK_HIRAGANA_BEGIN 0x3040 // Fullwidth 0x3040 - 0x3098 -#define UNICODE_BLOCK_HIRAGANA_END 0x309F // Fullwidth 0x309B - 0x309F -#define UNICODE_BLOCK_KATAKANA_BEGIN 0x30A0 // Fullwidth -#define UNICODE_BLOCK_KATAKANA_END 0x30FF // Fullwidth -#define UNICODE_BLOCK_BOPOMOFO_BEGIN 0x3100 // Fullwidth -#define UNICODE_BLOCK_BOPOMOFO_END 0x312F // Fullwidth -#define UNICODE_BLOCK_HANGUL_COMPATIBILITY_JAMO_BEGIN 0x3130 // Fullwidth -#define UNICODE_BLOCK_HANGUL_COMPATIBILITY_JAMO_END 0x318F // Fullwidth -#define UNICODE_BLOCK_KANBUN_BEGIN 0x3190 // Fullwidth -#define UNICODE_BLOCK_KANBUN_END 0x319F // Fullwidth -#define UNICODE_BLOCK_BOPOMOFO_EXTENDED_BEGIN 0x31A0 // Fullwidth -#define UNICODE_BLOCK_BOPOMOFO_EXTENDED_END 0x31BF // Fullwidth -#define UNICODE_BLOCK_CJK_STROKES_BEGIN 0x31C0 // Fullwidth -#define UNICODE_BLOCK_CJK_STROKES_END 0x31EF // Fullwidth -#define UNICODE_BLOCK_KATAKANA_PHONETIC_EXTENSIONS_BEGIN 0x31F0 // Fullwidth -#define UNICODE_BLOCK_KATAKANA_PHONETIC_EXTENSIONS_END 0x31FF // Fullwidth -#define UNICIDE_BLOCK_YI_RADICALS_BEGIN 0xA490 // Fullwidth -#define UNICIDE_BLOCK_YI_RADICALS_END 0xA4CF // Fullwidth -#define UNICIDE_BLOCK_HANGUL_SYLLABLES_BEGIN 0xAC00 // Fullwidth -#define UNICIDE_BLOCK_HANGUL_SYLLABLES_END 0xD7AF // Fullwidth -#define UNICODE_BLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_BEGIN 0xF900 // Fullwidth -#define UNICODE_BLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_END 0xFAFF // Fullwidth -#define UNICODE_BLOCK_VERTICAL_FORMS_BEGIN 0xFE10 // Fullwidth -#define UNICODE_BLOCK_VERTICAL_FORMS_END 0xFE1F // Fullwidth -#define UNICODE_BLOCK_CJK_COMPATIBILITY_FORMS_BEGIN 0xFE30 // Fullwidth -#define UNICODE_BLOCK_CJK_COMPATIBILITY_FORMS_END 0xFE4F // Fullwidth -#define UNICODE_BLOCK_SMALL_FORM_VARIANTS_BEGIN 0xFE50 // Fullwidth -#define UNICODE_BLOCK_SMALL_FORM_VARIANTS_END 0xFE6F -#define UNICODE_BLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS_BEGIN 0xFF00 -#define UNICODE_BLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS_END 0xFFEF - -// Sub-Blocks -#define UNICODE_SUBBLOCK_FULLWIDTH_HANGUL_BEGIN 0x1100 -#define UNICODE_SUBBLOCK_FULLWIDTH_HANGUL_END 0x115F -#define UNICODE_SUBBLOCK_FULLWIDTH_CHARS_BEGIN 0xFF01 -#define UNICODE_SUBBLOCK_FULLWIDTH_CHARS_END 0xFF60 -#define UNICODE_SUBBLOCK_FULLWIDTH_SYMBOLS_BEGIN 0xFFE0 -#define UNICODE_SUBBLOCK_FULLWIDTH_SYMBOLS_END 0xFFE6 - -#endif // Don't add anything after this line diff --git a/xpdev/wrapdll.h b/xpdev/wrapdll.h deleted file mode 100644 index 74f9ece..0000000 --- a/xpdev/wrapdll.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Defines DLLEXPORT for cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#if defined(DLLEXPORT) - #undef DLLEXPORT -#endif - -#if defined(_WIN32) && (defined(WRAPPER_IMPORTS) || defined(WRAPPER_EXPORTS)) - #if defined(WRAPPER_IMPORTS) - #define DLLEXPORT __declspec(dllimport) - #else - #define DLLEXPORT __declspec(dllexport) - #endif -#else /* !_WIN32 || !_DLL*/ - #define DLLEXPORT -#endif - diff --git a/xpdev/wraptest.c b/xpdev/wraptest.c deleted file mode 100644 index cf92bf2..0000000 --- a/xpdev/wraptest.c +++ /dev/null @@ -1,418 +0,0 @@ -/* wraptest.c */ - -/* Verification of cross-platform development wrappers */ - -/* $Id: wraptest.c,v 1.45 2019/07/24 04:15:54 rswindell Exp $ */ - -#include <time.h> /* ctime */ - -#include "genwrap.h" -#include "conwrap.h" -#include "dirwrap.h" -#include "filewrap.h" -#include "sockwrap.h" -#include "threadwrap.h" -#include "xpbeep.h" -#include "xpendian.h" - -#define LOCK_FNAME "test.fil" -#define LOCK_OFFSET 0 -#define LOCK_LEN 4 - -static void getkey(void); -static void sem_test_thread(void* arg); -static void sem_test_thread_block(void* arg); -static void sleep_test_thread(void* arg); -static void sopen_test_thread(void* arg); -static void sopen_child_thread(void* arg); -static void lock_test_thread(void* arg); - - -typedef struct { - sem_t parent_sem; - sem_t child_sem; -} thread_data_t; - -int main() -{ - char str[128]; - char compiler[128]; - char fpath[MAX_PATH+1]; - char* path = "."; - char* glob_pattern = "*wrap*"; - int i; - int ch; - uint u; - time_t t; - glob_t g; - DIR* dir; - DIRENT* dirent; - thread_data_t thread_data; - int fd; - int fd2; - int canrelock=0; - clock_t ticks; - - /* Show platform details */ - DESCRIBE_COMPILER(compiler); - printf("%-15s: %s\n","Platform",PLATFORM_DESC); - printf("%-15s: %s\n","Version",os_version(str)); - printf("%-15s: %s\n","Compiler" ,compiler); - printf("%-15s: %ld\n","Random Number",xp_random(1000)); - - for(i=0;i<3;i++) { - if(_beginthread( - sopen_child_thread /* entry point */ - ,0 /* stack size (0=auto) */ - ,(void*)i /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else - SLEEP(1); - } - printf("Waiting for all sopen_child_threads to close...\n"); - SLEEP(5000); /* wait for all threads to quit */ - - /* Exclusive sopen test */ - printf("\nsopen() test\n"); - if((fd=sopen(LOCK_FNAME,O_RDWR|O_CREAT,SH_DENYRW,S_IREAD|S_IWRITE))==-1) { - perror(LOCK_FNAME); - return(errno); - } - printf("%s is opened with an exclusive (read/write) lock\n",LOCK_FNAME); - getkey(); - if(_beginthread( - sopen_test_thread /* entry point */ - ,0 /* stack size (0=auto) */ - ,NULL /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else - SLEEP(1000); - close(fd); - - /* sopen()/lock test */ - printf("\nlock() test\n"); - if((fd=sopen(LOCK_FNAME,O_RDWR|O_CREAT,SH_DENYNO,S_IREAD|S_IWRITE))==-1) { - perror(LOCK_FNAME); - return(errno); - } - write(fd,"lock testing\n",LOCK_LEN); - if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0) - printf("lock() succeeds\n"); - else - printf("!FAILURE: lock() non-functional (or file already locked)\n"); - if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0) { - printf("!FAILURE: Subsequent lock of region was allowed (will skip some tests)\n"); - canrelock=1; - } - - if(_beginthread( - lock_test_thread /* entry point */ - ,0 /* stack size (0=auto) */ - ,NULL /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else - SLEEP(1000); - if(canrelock) - printf("?? Skipping some tests due to inability to detect own locks\n"); - else { - if(lock(fd,LOCK_OFFSET,LOCK_LEN)) - printf("Locks in first thread survive open()/close() in other thread\n"); - else - printf("!FAILURE: lock() in first thread lost by open()/close() in other thread\n"); - if(lock(fd,LOCK_OFFSET+LOCK_LEN+1,LOCK_LEN)) - printf("!FAILURE: file locking\n"); - else - printf("Record locking\n"); - } - if((fd2=sopen(LOCK_FNAME,O_RDWR,SH_DENYRW))==-1) { - printf("Cannot reopen SH_DENYRW while lock is held\n"); - close(fd2); - } - else { - printf("!FAILURE: can reopen SH_DENYRW while lock is held\n"); - } - if(unlock(fd,LOCK_OFFSET,LOCK_LEN)) - printf("!FAILURE: unlock() non-functional\n"); - if(lock(fd,LOCK_OFFSET+LOCK_LEN+1,LOCK_LEN)) - printf("Cannot re-lock after non-overlapping unlock()\n"); - else - printf("!FAILURE: can re-lock after non-overlappping unlock()\n"); - if(lock(fd,LOCK_OFFSET,LOCK_LEN)) - printf("!FAILURE: cannot re-lock unlocked area\n"); - close(fd); - - /* getch test */ - printf("\ngetch() test (ESC to continue)\n"); - do { - ch=getch(); - printf("getch() returned %d\n",ch); - } while(ch!=ESC); - - /* kbhit test */ - printf("\nkbhit() test (any key to continue)\n"); - while(!kbhit()) { - printf("."); - fflush(stdout); - SLEEP(500); - } - getch(); /* remove character from keyboard buffer */ - - /* BEEP test */ - printf("\nBEEP() test\n"); - getkey(); - for(i=750;i>250;i-=5) - BEEP(i,15); - for(;i<1000;i+=5) - BEEP(i,15); - - /* SLEEP test */ - printf("\nSLEEP(5 second) test\n"); - getkey(); - t=time(NULL); - printf("sleeping... "); - fflush(stdout); - ticks=msclock(); - SLEEP(5000); - printf("slept %ld seconds (%ld according to msclock)\n",time(NULL)-t,(msclock()-ticks)/MSCLOCKS_PER_SEC); - - /* Thread SLEEP test */ - printf("\nThread SLEEP(5 second) test\n"); - getkey(); - i=0; - if(_beginthread( - sleep_test_thread /* entry point */ - ,0 /* stack size (0=auto) */ - ,&i /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else { - SLEEP(1); /* yield to child thread */ - while(i==0) { - printf("."); - fflush(stdout); - SLEEP(1000); - } - } - - /* glob test */ - printf("\nglob(%s) test\n",glob_pattern); - getkey(); - i=glob(glob_pattern,GLOB_MARK,NULL,&g); - if(i==0) { - for(u=0;u<g.gl_pathc;u++) - printf("%s\n",g.gl_pathv[u]); - globfree(&g); - } else - printf("glob(%s) returned %d\n",glob_pattern,i); - - /* opendir (and other directory functions) test */ - printf("\nopendir(%s) test\n",path); - getkey(); - printf("\nDirectory of %s\n\n",FULLPATH(fpath,path,sizeof(fpath))); - dir=opendir(path); - while(dir!=NULL && (dirent=readdir(dir))!=NULL) { - t=fdate(dirent->d_name); - printf("%.24s %10lu %06o %s%c\n" - ,ctime(&t) - ,flength(dirent->d_name) - ,getfattr(dirent->d_name) - ,dirent->d_name - ,isdir(dirent->d_name) ? '/':0 - ); - } - if(dir!=NULL) - closedir(dir); - printf("\nFree disk space: %lu kbytes\n",getfreediskspace(path,1024)); - - /* Thread (and inter-process communication) test */ - printf("\nSemaphore test\n"); - getkey(); - if(sem_init(&thread_data.parent_sem - ,0 /* shared between processes */ - ,0 /* initial count */ - )) { - printf("sem_init failed\n"); - } - if(sem_init(&thread_data.child_sem - ,0 /* shared between processes */ - ,0 /* initial count */ - )) { - printf("sem_init failed\n"); - } - if(_beginthread( - sem_test_thread /* entry point */ - ,0 /* stack size (0=auto) */ - ,&thread_data /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else { - sem_wait(&thread_data.child_sem); /* wait for thread to begin */ - for(i=0;i<10;i++) { - printf("<parent>"); - sem_post(&thread_data.parent_sem); - sem_wait(&thread_data.child_sem); - } - sem_wait(&thread_data.child_sem); /* wait for thread to end */ - } - sem_destroy(&thread_data.parent_sem); - sem_destroy(&thread_data.child_sem); - - printf("\nSemaphore blocking test\n"); - getkey(); - sem_init(&thread_data.parent_sem - ,0 /* shared between processes */ - ,0 /* initial count */ - ); - sem_init(&thread_data.child_sem - ,0 /* shared between processes */ - ,0 /* initial count */ - ); - if(_beginthread( - sem_test_thread_block /* entry point */ - ,0 /* stack size (0=auto) */ - ,&thread_data /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else { - sem_wait(&thread_data.child_sem); /* wait for thread to begin */ - for(i=0;i<10;i++) { - printf("<parent>"); - SLEEP(5000); - sem_post(&thread_data.parent_sem); - sem_wait(&thread_data.child_sem); - } - sem_wait(&thread_data.child_sem); /* wait for thread to end */ - } - printf("\nsem_trywait_block test..."); - t=time(NULL); - sem_trywait_block(&thread_data.parent_sem,5000); - printf("\ntimed-out after %ld seconds (should be 5 seconds)\n",time(NULL)-t); - sem_destroy(&thread_data.parent_sem); - sem_destroy(&thread_data.child_sem); - printf("\nendian check..."); - memcpy(&i,"\x01\x02\x03\x04",4); - if(LE_LONG(i)==67305985) { - printf("OK!\n"); - } - else { - printf("FAILED!\n"); - } - return 0; -} - -static void getkey(void) -{ - printf("Hit any key to continue..."); - fflush(stdout); - getch(); - printf("\r%30s\r",""); - fflush(stdout); -} - -static void sleep_test_thread(void* arg) -{ - time_t t=time(NULL); - printf("child sleeping"); - fflush(stdout); - SLEEP(5000); - printf("\nchild awake after %ld seconds\n",time(NULL)-t); - - *(int*)arg=1; /* signal parent: we're done */ -} - -static void sem_test_thread(void* arg) -{ - ulong i; - thread_data_t* data = (thread_data_t*)arg; - - printf("sem_test_thread entry\n"); - sem_post(&data->child_sem); /* signal parent: we've started */ - - for(i=0;i<10;i++) { - sem_wait(&data->parent_sem); - printf(" <child>\n"); - sem_post(&data->child_sem); - } - - printf("sem_test_thread exit\n"); - sem_post(&data->child_sem); /* signal parent: we're done */ -} - -static void sem_test_thread_block(void* arg) -{ - ulong i; - thread_data_t* data = (thread_data_t*)arg; - - printf("sem_test_thread_block entry\n"); - sem_post(&data->child_sem); /* signal parent: we've started */ - - for(i=0;i<10;i++) { - if(sem_trywait_block(&data->parent_sem,500)) { - printf(" sem_trywait_block() timed out"); - sem_wait(&data->parent_sem); - } - else { - printf(" FAILURE: Didn't block"); - } - printf(" <child>\n"); - sem_post(&data->child_sem); - } - - printf("sem_test_thread_block exit\n"); - sem_post(&data->child_sem); /* signal parent: we're done */ -} - -static void lock_test_thread(void* arg) -{ - int fd; - - fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYNO); - if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0) - printf("!FAILURE: Lock not effective between threads\n"); - else - printf("Locks effective between threads\n"); - close(fd); - fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYNO); - if(lock(fd,LOCK_OFFSET,LOCK_LEN)) - printf("Locks survive file open()/close() in other thread\n"); - else - printf("!FAILURE: Locks do not survive file open()/close() in other thread\n"); - close(fd); -} - -static void sopen_test_thread(void* arg) -{ - int fd; - - if((fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYWR))!=-1) - printf("!FAILURE: allowed to reopen with SH_DENYWR\n"); - else if((fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYRW))!=-1) - printf("!FAILURE: allowed to reopen with SH_DENYRW\n"); - else - printf("reopen disallowed\n"); - - if(fd!=-1) - close(fd); -} - -static void sopen_child_thread(void* arg) -{ - int fd; - - printf("sopen_child_thread: %d begin\n",(int)arg); - if((fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYRW))!=-1) { - if(arg) - printf("!FAILURE: was able to reopen in child thread\n"); - else { - SLEEP(5000); - } - close(fd); - } else if(arg==0) - perror(LOCK_FNAME); - printf("sopen_child_thread: %d end\n",(int)arg); -} - -/* End of wraptest.c */ diff --git a/xpdev/xp_dl.c b/xpdev/xp_dl.c deleted file mode 100644 index 11527c6..0000000 --- a/xpdev/xp_dl.c +++ /dev/null @@ -1,76 +0,0 @@ -#include <stdio.h> -#include "dirwrap.h" -#include "xp_dl.h" - -#ifndef STATIC_LINK -#if defined(__unix__) - -DLLEXPORT dll_handle xp_dlopen(const char **names, int mode, int major) -{ - const char *name; - char fname[MAX_PATH+1]; - dll_handle ret=NULL; - int i; - - for(; *names && (*names)[0]; names++) { - name=*names; - /* Try for version match */ - sprintf(fname, "lib%s.so.%d", name, major); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - - /* Try for name match */ - sprintf(fname, "lib%s.so", name); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - - /* Try for name match without the prefix */ - sprintf(fname, "%s.so", name); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - - /* Try all previous major versions */ - for(i=major-1; i>=0; i--) { - sprintf(fname, "lib%s.so.%d", name, i); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - } - -#if defined(__APPLE__) && defined(__MACH__) - /* Try for version match */ - sprintf(fname, "lib%s.%d.dylib", name, major); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - - /* Try for name match */ - sprintf(fname, "lib%s.dylib", name); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - - /* Try all previous major versions */ - for(i=major-1; i>=0; i--) { - sprintf(fname, "lib%s.%d.dylib", name, i); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - } -#endif /* OS X */ - } - - return(NULL); -} -#elif defined(_WIN32) -DLLEXPORT dll_handle xp_dlopen(const char **names, int mode, int major) -{ - char fname[MAX_PATH+1]; - dll_handle ret=NULL; - - for(; *names && (*names)[0]; names++) { - sprintf(fname, "%s.dll", *names); - if((ret=LoadLibrary(fname))!=NULL) - return(ret); - } - return(NULL); -} -#endif /* __unix__,_WIN32 */ - -#endif /* STATIC_LINK */ diff --git a/xpdev/xp_dl.h b/xpdev/xp_dl.h deleted file mode 100644 index 70779a6..0000000 --- a/xpdev/xp_dl.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef _XP_DL_H_ -#define _XP_DL_H_ - -#include "wrapdll.h" - -#ifndef STATIC_LINK -#if defined(__unix__) - #include <dlfcn.h> - - typedef void * dll_handle; - DLLEXPORT dll_handle xp_dlopen(const char **name, int mode, int major); - #define xp_dlsym(handle, name) dlsym(handle, #name) - #define xp_dlclose(handle) dlclose(handle) -#elif defined(_WIN32) - #include <windows.h> - - typedef HMODULE dll_handle; - DLLEXPORT dll_handle xp_dlopen(const char **name, int mode, int major); - #define xp_dlsym(handle, name) ((void *)GetProcAddress(handle, #name)) - #define xp_dlclose(handle) (FreeLibrary(handle)?0:-1) - - /* Unused values for *nix compatability */ - enum { - RTLD_LAZY - ,RTLD_NOW - ,RTLD_GLOBAL - ,RTLD_LOCAL - ,RTLD_TRACE - }; -#endif -#else - typedef void* dll_handle; - - #define xp_dlopen(name, mode, major) (name) - #define xp_dlsym(handle, name) (name) - #define xp_dlclose(handle) (0) -#endif - -#endif diff --git a/xpdev/xp_syslog.h b/xpdev/xp_syslog.h deleted file mode 100644 index 7d9cab5..0000000 --- a/xpdev/xp_syslog.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef XP_SYSLOG_H_ -#define XP_SYSLOG_H_ -#include <stdarg.h> - - -/* priorities */ -#define LOG_EMERG 0 /* system is unusable */ -#define LOG_ALERT 1 /* action must be taken immediately */ -#define LOG_CRIT 2 /* critical conditions */ -#define LOG_ERR 3 /* error conditions */ -#define LOG_WARNING 4 /* warning conditions */ -#define LOG_NOTICE 5 /* normal but significant condition */ -#define LOG_INFO 6 /* informational */ -#define LOG_DEBUG 7 /* debug-level messages */ - -#define LOG_KERN (0<<3) /* kernel messages */ -#define LOG_USER (1<<3) /* random user-level messages */ -#define LOG_MAIL (2<<3) /* mail system */ -#define LOG_DAEMON (3<<3) /* system daemons */ -#define LOG_AUTH (4<<3) /* authorization messages */ -#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ -#define LOG_LPR (6<<3) /* line printer subsystem */ -#define LOG_NEWS (7<<3) /* network news subsystem */ -#define LOG_UUCP (8<<3) /* UUCP subsystem */ -#define LOG_CRON (9<<3) /* clock daemon */ -#define LOG_AUTHPRIV (10<<3) /* authorization messages (private) */ - /* Facility #10 clashes in DEC UNIX, where */ - /* it's defined as LOG_MEGASAFE for AdvFS */ - /* event logging. */ -#define LOG_FTP (11<<3) /* ftp daemon */ -#define LOG_NTP (12<<3) /* NTP subsystem */ -#define LOG_SECURITY (13<<3) /* security subsystems (firewalling, etc.) */ -#define LOG_CONSOLE (14<<3) /* /dev/console output */ - -/* facility codes */ -#define LOG_LOCAL0 (16<<3) /* reserved for local use */ -#define LOG_LOCAL1 (17<<3) /* reserved for local use */ -#define LOG_LOCAL2 (18<<3) /* reserved for local use */ -#define LOG_LOCAL3 (19<<3) /* reserved for local use */ -#define LOG_LOCAL4 (20<<3) /* reserved for local use */ -#define LOG_LOCAL5 (21<<3) /* reserved for local use */ -#define LOG_LOCAL6 (22<<3) /* reserved for local use */ -#define LOG_LOCAL7 (23<<3) /* reserved for local use */ - -/* Masks to extract parts */ -#define LOG_PRIMASK 0x07 /* mask to extract priority part */ -#define LOG_FACMASK 0x03f8 /* mask to extract facility part */ - -/* Logopts for xp_openlog() */ -#define LOG_CONS 0x02 /* log on the console if errors in sending */ -#define LOG_PERROR 0x20 /* log to stderr as well */ - -/* Port number */ -#define SYSLOG_PORT 514 - -void xp_set_loghost(const char *hostname); -void xp_openlog(const char *ident, int logopt, int facility); -void xp_vsyslog(int priority, const char *message, va_list va); -void xp_syslog(int priority, const char *message, ...); - -#endif diff --git a/xpdev/xpbeep.c b/xpdev/xpbeep.c deleted file mode 100644 index 4e8e6ce..0000000 --- a/xpdev/xpbeep.c +++ /dev/null @@ -1,1235 +0,0 @@ -/* $Id: xpbeep.c,v 1.113 2020/05/15 01:12:10 deuce Exp $ */ - -/* TODO: USE PORTAUDIO! */ - -/* standard headers */ -#include <math.h> -#include <stdlib.h> -#include "xp_dl.h" - -#if defined(_WIN32) - #include <windows.h> - #include <mmsystem.h> -#elif defined(__unix__) - #include <fcntl.h> - #include <sys/ioctl.h> - #if SOUNDCARD_H_IN==1 - #include <sys/soundcard.h> - #elif SOUNDCARD_H_IN==2 - #include <soundcard.h> - #elif SOUNDCARD_H_IN==3 - #include <linux/soundcard.h> - #else - #ifndef USE_ALSA_SOUND - #warning Cannot find soundcard.h - #endif - #endif - #ifdef USE_ALSA_SOUND - #include <dlfcn.h> - #include <alsa/asoundlib.h> - #endif - /* KIOCSOUND */ - #if defined(__FreeBSD__) - #include <sys/kbio.h> - #elif defined(__linux__) - #include <sys/kd.h> - #elif defined(__solaris__) - #include <sys/kbio.h> - #include <sys/kbd.h> - #endif - #if (defined(__OpenBSD__) || defined(__NetBSD__)) && defined(HAS_MACHINE_SPKR_H) - #include <machine/spkr.h> - #elif defined(__FreeBSD__) - #if defined(HAS_DEV_SPEAKER_SPEAKER_H) - #include <dev/speaker/speaker.h> - #elif defined(HAS_MACHINE_SPEAKER_H) - #include <machine/speaker.h> - #endif - #endif -#endif - -/* xpdev headers */ -#ifdef WITH_PORTAUDIO -#include <portaudio.h> -#endif - -#ifdef WITH_PULSEAUDIO -#include <pulse/simple.h> -#endif - -#ifdef WITH_SDL_AUDIO -#include "sdlfuncs.h" -#endif - -#include "genwrap.h" -#include "xpbeep.h" - -#define S_RATE 22050 - -#ifdef XPDEV_THREAD_SAFE -#include "threadwrap.h" - -static BOOL sample_thread_running=FALSE; -static sem_t sample_pending_sem; -static sem_t sample_complete_sem; -static pthread_mutex_t sample_mutex; -static pthread_mutex_t handle_mutex; -static const unsigned char *sample_buffer; -static int samples_posted; -static size_t sample_size; - -#endif - -static BOOL sound_device_open_failed=FALSE; -#ifdef USE_ALSA_SOUND -static BOOL alsa_device_open_failed=FALSE; -#endif -#ifdef WITH_SDL_AUDIO -static BOOL sdl_device_open_failed=FALSE; -#endif -#ifdef WITH_PORTAUDIO -static BOOL portaudio_device_open_failed=FALSE; -#endif -#ifdef WITH_PULSEAUDIO -static BOOL pulseaudio_device_open_failed=FALSE; -#endif - -enum { - SOUND_DEVICE_CLOSED - ,SOUND_DEVICE_WIN32 - ,SOUND_DEVICE_ALSA - ,SOUND_DEVICE_OSS - ,SOUND_DEVICE_SDL - ,SOUND_DEVICE_PORTAUDIO - ,SOUND_DEVICE_PULSEAUDIO -}; - -static int handle_type=SOUND_DEVICE_CLOSED; -static int handle_rc; - -#ifdef WITH_PULSEAUDIO -struct pulseaudio_api_struct { - pa_simple* (*simple_new)(const char * server, const char * name, pa_stream_direction_t dir, const char * dev, const char * stream_name, const pa_sample_spec * ss, const pa_channel_map * map, const pa_buffer_attr * attr, int * error); - int (*simple_write)(pa_simple * s, const void * data, size_t bytes, int * error); - int (*simple_drain)(pa_simple * s, int * error); - void (*simple_free)(pa_simple * s); -}; -struct pulseaudio_api_struct *pu_api = NULL; -static pa_simple *pu_handle; -static int pulseaudio_initialized=FALSE; -#endif - -#ifdef WITH_PORTAUDIO -static PaStream *portaudio_stream; -static int portaudio_buf_len=0; -static int portaudio_buf_pos=0; -static const unsigned char *pawave=NULL; -static int portaudio_initialized=FALSE; -#ifndef PaStream // Detect version... defined for 1.8 and not for 1.9 -#define PortAudioCallback void -#define PaTimestamp PaTime -#endif -struct portaudio_api_struct { - PaError (*init)( void ); - PaError (*open)( PaStream** stream, - int numInputChannels, - int numOutputChannels, - PaSampleFormat sampleFormat, - double sampleRate, - unsigned long framesPerBuffer, - unsigned long numberOfBuffers, - PortAudioCallback *callback, - void *userData ); - PaError (*close)( PaStream* ); - PaError (*start)( PaStream *stream ); - PaError (*stop)( PaStream *stream ); - PaError (*active)( PaStream *stream ); - PaError (*write)( PaStream *stream, const void *buf, unsigned long frames ); - int (*version)( void ); - int ver; -}; -struct portaudio_api_struct *pa_api=NULL; -#endif - -#ifdef WITH_SDL_AUDIO -static SDL_AudioSpec spec; -static int sdl_audio_buf_len=0; -static int sdl_audio_buf_pos=0; -static const unsigned char *swave; -static SDL_sem *sdlToneDone; -#endif - -#ifdef _WIN32 -static HWAVEOUT waveOut; -static WAVEHDR wh[2]; -static int curr_wh; -#endif - -#ifdef USE_ALSA_SOUND -static snd_pcm_t *playback_handle; -static snd_pcm_hw_params_t *hw_params=NULL; -#endif - -#ifdef AFMT_U8 -static int dsp; -#endif - -#define WAVE_PI 3.14159265358979323846 -#define WAVE_TPI 6.28318530717958647692 - -#ifdef USE_ALSA_SOUND -struct alsa_api_struct { - int (*snd_pcm_open) - (snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode); - int (*snd_pcm_hw_params_malloc) - (snd_pcm_hw_params_t **ptr); - int (*snd_pcm_hw_params_any) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params); - int (*snd_pcm_hw_params_set_access) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t _access); - int (*snd_pcm_hw_params_set_format) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val); - int (*snd_pcm_hw_params_set_rate_near) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); - int (*snd_pcm_hw_params_set_channels) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val); - int (*snd_pcm_hw_params) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params); - int (*snd_pcm_prepare) - (snd_pcm_t *pcm); - void (*snd_pcm_hw_params_free) - (snd_pcm_hw_params_t *obj); - int (*snd_pcm_close) - (snd_pcm_t *pcm); - snd_pcm_sframes_t (*snd_pcm_writei) - (snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size); - int (*snd_pcm_drain) - (snd_pcm_t *pcm); -}; - -struct alsa_api_struct *alsa_api=NULL; -#endif - -#ifdef XPDEV_THREAD_SAFE -static void init_sample(void); -static BOOL xp_play_sample_locked(const unsigned char *sample, size_t size, BOOL background); -#endif - -/********************************************************************************/ -/* Calculate and generate a sound wave pattern (thanks to Deuce!) */ -/********************************************************************************/ -void xptone_makewave(double freq, unsigned char *wave, int samples, enum WAVE_SHAPE shape) -{ - int i; - int midpoint; - double inc; - double pos; - BOOL endhigh; - int crossings; - int numcross=0; - - if(freq==0) { - memset(wave, 128, samples); - } - else { - midpoint=samples/2; - inc=8.0*atan(1.0); - inc *= ((double)freq / (double)S_RATE); - - for(i=0;i<samples;i++) { - pos=(inc*(double)i); - pos -= (int)(pos/WAVE_TPI)*WAVE_TPI; - switch(shape) { - case WAVE_SHAPE_SINE: - wave[i]=(sin (pos))*127+128; - break; - case WAVE_SHAPE_SINE_HARM: - wave[i]=(sin (pos))*64+128; - wave[i]=(sin ((inc*2)*(double)i))*24; - wave[i]=(sin ((inc*3)*(double)i))*16; - break; - case WAVE_SHAPE_SAWTOOTH: - wave[i]=(WAVE_TPI-pos)*40.5; - break; - case WAVE_SHAPE_SQUARE: - wave[i]=(pos<WAVE_PI)?255:0; - break; - case WAVE_SHAPE_SINE_SAW: - wave[i]=(((sin (pos))*127+128)+((WAVE_TPI-pos)*40.5))/2; - break; - case WAVE_SHAPE_SINE_SAW_CHORD: - wave[i]=(((sin (pos))*64+128)+((WAVE_TPI-pos)*6.2))/2; - wave[i]+=(sin ((inc/2)*(double)i))*24; - wave[i]+=(sin ((inc/3)*(double)i))*16; - break; - case WAVE_SHAPE_SINE_SAW_HARM: - wave[i]=(((sin (pos))*64+128)+((WAVE_TPI-pos)*6.2))/2; - wave[i]+=(sin ((inc*2)*(double)i))*24; - wave[i]+=(sin ((inc*3)*(double)i))*16; - break; - } - } - - /* Now we have a "perfect" wave... - * we must clean it up now to avoid click/pop - */ - if(wave[samples-1]>128) - endhigh=TRUE; - else - endhigh=FALSE; - /* Completely remove the last wave fragment */ - i=samples-1; - if(wave[i]!=128) { - for(;i>midpoint;i--) { - if(endhigh && wave[i]<128) - break; - if(!endhigh && wave[i]>128) - break; - wave[i]=128; - } - } - - /* Number of crossings should be on the order of 5ms worth... according to the ARRL */ - /* We're ASSuming that a full wave crosses twice */ - numcross=freq/100; - if(numcross) { - /* Ramp up and down by one third for three corssings of 128 */ - crossings=0; - for(i=0; i<(samples-1); i++) { - if(((wave[i]<128 && wave[i+1]>=128) || (wave[i]>128 && wave[i+1]<=128)) && i>2) { - crossings++; - if(crossings>=numcross) - break; - } - wave[i]=128+((wave[i]-128)/((numcross-crossings)*(numcross-crossings))); - } - crossings=0; - for(i=samples-1; i>0; i--) { - if(((wave[i]<128 && wave[i-1]>=128) || (wave[i]>128 && wave[i-1]<=128)) && i>2) { - crossings++; - if(crossings>=numcross) - break; - } - wave[i]=128+((wave[i]-128)/((numcross-crossings)*(numcross-crossings))); - } - } - } -} - -#ifdef WITH_PORTAUDIO -/* - * Used by v18 library, not v19! - */ -static int portaudio_callback(void *inputBuffer - , void *outputBuffer - , unsigned long framesPerBuffer - , const PaTimestamp outTime - , void *userData ) -{ - int copylen=framesPerBuffer; - int maxlen=portaudio_buf_len-portaudio_buf_pos; - - if(copylen>maxlen) { - copylen=maxlen; - memset(((char *)outputBuffer)+copylen, 128, framesPerBuffer-copylen); - } - if(copylen) { - memcpy(outputBuffer, (*((unsigned char **)userData))+portaudio_buf_pos, copylen); - portaudio_buf_pos+=copylen; - } - if(portaudio_buf_pos >= portaudio_buf_len) - return(1); - return(0); -} -#endif - -#ifdef WITH_SDL_AUDIO -void sdl_fillbuf(void *userdata, Uint8 *stream, int len) -{ - int copylen=len; - int maxlen=sdl_audio_buf_len-sdl_audio_buf_pos; - - /* Copy in the current buffer */ - if(copylen>maxlen) - copylen=maxlen; - /* Fill with silence */ - if(len>copylen) - memset(stream+copylen, spec.silence, len-copylen); - if(copylen) { - memcpy(stream, swave+sdl_audio_buf_pos, copylen); - sdl_audio_buf_pos+=copylen; - /* If we're done, post the semaphore */ - if(sdl_audio_buf_pos>=sdl_audio_buf_len) { - xpbeep_sdl.SemPost(sdlToneDone); - sdl_audio_buf_len=0; - sdl_audio_buf_pos=0; - free((void *)swave); - } - } -} -#endif - -#ifdef XPDEV_THREAD_SAFE -pthread_once_t sample_initialized_pto = PTHREAD_ONCE_INIT; -#endif -static BOOL -xptone_open_locked(void) -{ -#ifdef _WIN32 - WAVEFORMATEX w; -#endif - -#ifdef AFMT_U8 - int format=AFMT_U8; - int channels=1; - int rate=S_RATE; - int fragsize=0x7fff0004; -#endif - - /* Already open */ - - if(handle_type!=SOUND_DEVICE_CLOSED) { - handle_rc++; - return(TRUE); - } - -#ifdef WITH_PULSEAUDIO - if(!pulseaudio_device_open_failed) { - if(pu_api==NULL) { - dll_handle dl=NULL; - const char *libnames[]={"pulse-simple",NULL}; - if(((pu_api=(struct pulseaudio_api_struct *)malloc(sizeof(struct pulseaudio_api_struct)))==NULL) - || ((dl=xp_dlopen(libnames,RTLD_LAZY,0))==NULL) - || ((pu_api->simple_new=xp_dlsym(dl,pa_simple_new))==NULL) - || ((pu_api->simple_write=xp_dlsym(dl,pa_simple_write))==NULL) - || ((pu_api->simple_drain=xp_dlsym(dl,pa_simple_drain))==NULL) - || ((pu_api->simple_free=xp_dlsym(dl,pa_simple_free))==NULL) - ) { - if(dl) - xp_dlclose(dl); - free(pu_api); - pu_api=NULL; - } - if(pu_api==NULL) { - pulseaudio_device_open_failed=TRUE; - } - } - if(pu_api != NULL) { - handle_type=SOUND_DEVICE_PULSEAUDIO; - handle_rc++; -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_unlock(&handle_mutex); - pthread_mutex_lock(&sample_mutex); - if (samples_posted == 0) - xp_play_sample_locked((unsigned char *)"\x80", 1, FALSE); - pthread_mutex_unlock(&sample_mutex); -#else - xptone(0, 1, WAVE_SHAPE_SQUARE); -#endif - if (pulseaudio_device_open_failed) { - handle_type = SOUND_DEVICE_CLOSED; - } - else { - return(TRUE); - } - } - } -#endif - -#ifdef WITH_PORTAUDIO - if(!portaudio_device_open_failed) { - if(pa_api==NULL) { - dll_handle dl=NULL; - const char *libnames[]={"portaudio",NULL}; - if(((pa_api=(struct portaudio_api_struct *)malloc(sizeof(struct portaudio_api_struct)))==NULL) - || ((dl=xp_dlopen(libnames,RTLD_LAZY,0))==NULL) - || ((pa_api->init=xp_dlsym(dl,Pa_Initialize))==NULL) - || ((pa_api->open=xp_dlsym(dl,Pa_OpenDefaultStream))==NULL) - || ((pa_api->close=xp_dlsym(dl,Pa_CloseStream))==NULL) - || ((pa_api->start=xp_dlsym(dl,Pa_StartStream))==NULL) - || - ( - ((pa_api->active=xp_dlsym(dl,Pa_StreamActive))==NULL) - && ((pa_api->active=xp_dlsym(dl,Pa_IsStreamActive))==NULL) - ) - || ((pa_api->stop=xp_dlsym(dl,Pa_StopStream))==NULL) - ) { - if(dl) - xp_dlclose(dl); - free(pa_api); - pa_api=NULL; - } - else { - /* Get version and other optional pointers */ - pa_api->ver=1800; - if((pa_api->version=xp_dlsym(dl, Pa_GetVersion))!=NULL) { - pa_api->ver=pa_api->version(); - if(pa_api->ver >= 1899) { - if((pa_api->write=xp_dlsym(dl, Pa_WriteStream))==NULL) { - xp_dlclose(dl); - free(pa_api); - pa_api=NULL; - } - } - } - } - if(pa_api==NULL) { - portaudio_device_open_failed=TRUE; - } - } - if(pa_api != NULL) { - if(!portaudio_initialized) { - if(pa_api->init() != paNoError) - portaudio_device_open_failed=TRUE; - else - portaudio_initialized=TRUE; - } - if(portaudio_initialized) { - if(pa_api->open(&portaudio_stream - , 0 /* No input */ - , 1 /* Mono output */ - , paUInt8 - , S_RATE - , 256 - , 0 - , pa_api->ver >= 1899 ? NULL : portaudio_callback - , &pawave) != paNoError) - portaudio_device_open_failed=TRUE; - else { - handle_type=SOUND_DEVICE_PORTAUDIO; - handle_rc++; - return(TRUE); - } - } - } - } -#endif - -#ifdef WITH_SDL_AUDIO - if(!sdl_device_open_failed) { - if(init_sdl_audio()==-1) { - sdl_device_open_failed=TRUE; - } - else { - spec.freq=22050; - spec.format=AUDIO_U8; - spec.channels=1; - spec.samples=256; /* Size of audio buffer */ - spec.size=256; - spec.callback=sdl_fillbuf; - spec.userdata=NULL; - if(xpbeep_sdl.OpenAudio(&spec, NULL)==-1) { - sdl_device_open_failed=TRUE; - } - else { - sdlToneDone=xpbeep_sdl.SDL_CreateSemaphore(0); - sdl_audio_buf_len=0; - sdl_audio_buf_pos=0; - xpbeep_sdl.PauseAudio(FALSE); - handle_type=SOUND_DEVICE_SDL; - handle_rc++; - return(TRUE); - } - } - } -#endif - -#ifdef _WIN32 - if(!sound_device_open_failed) { - w.wFormatTag = WAVE_FORMAT_PCM; - w.nChannels = 1; - w.nSamplesPerSec = S_RATE; - w.wBitsPerSample = 8; - w.nBlockAlign = (w.wBitsPerSample * w.nChannels) / 8; - w.nAvgBytesPerSec = w.nSamplesPerSec * w.nBlockAlign; - - if(!sound_device_open_failed && waveOutOpen(&waveOut, WAVE_MAPPER, &w, 0, 0, 0)!=MMSYSERR_NOERROR) - sound_device_open_failed=TRUE; - if(sound_device_open_failed) - return(FALSE); - memset(&wh, 0, sizeof(wh)); - wh[0].dwBufferLength=S_RATE*15/2+1; - wh[1].dwBufferLength=S_RATE*15/2+1; - handle_type=SOUND_DEVICE_WIN32; - if(!sound_device_open_failed) { - handle_rc++; - return(TRUE); - } - } -#endif - -#ifdef USE_ALSA_SOUND - if(!alsa_device_open_failed) { - if(alsa_api==NULL) { - dll_handle dl=NULL; - const char *libnames[]={"asound", NULL}; - if(((alsa_api=(struct alsa_api_struct *)malloc(sizeof(struct alsa_api_struct)))==NULL) - || ((dl=xp_dlopen(libnames,RTLD_LAZY,2))==NULL) - || ((alsa_api->snd_pcm_open=xp_dlsym(dl,snd_pcm_open))==NULL) - || ((alsa_api->snd_pcm_hw_params_malloc=xp_dlsym(dl,snd_pcm_hw_params_malloc))==NULL) - || ((alsa_api->snd_pcm_hw_params_any=xp_dlsym(dl,snd_pcm_hw_params_any))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_access=xp_dlsym(dl,snd_pcm_hw_params_set_access))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_format=xp_dlsym(dl,snd_pcm_hw_params_set_format))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_rate_near=xp_dlsym(dl,snd_pcm_hw_params_set_rate_near))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_channels=xp_dlsym(dl,snd_pcm_hw_params_set_channels))==NULL) - || ((alsa_api->snd_pcm_hw_params=xp_dlsym(dl,snd_pcm_hw_params))==NULL) - || ((alsa_api->snd_pcm_prepare=xp_dlsym(dl,snd_pcm_prepare))==NULL) - || ((alsa_api->snd_pcm_hw_params_free=xp_dlsym(dl,snd_pcm_hw_params_free))==NULL) - || ((alsa_api->snd_pcm_close=xp_dlsym(dl,snd_pcm_close))==NULL) - || ((alsa_api->snd_pcm_writei=xp_dlsym(dl,snd_pcm_writei))==NULL) - || ((alsa_api->snd_pcm_drain=xp_dlsym(dl,snd_pcm_drain))==NULL) - ) { - if(dl) - xp_dlclose(dl); - free(alsa_api); - alsa_api=NULL; - alsa_device_open_failed=TRUE; - } - if(alsa_api==NULL) - alsa_device_open_failed=TRUE; - } - if(alsa_api!=NULL) { - unsigned int rate=S_RATE; - if((alsa_api->snd_pcm_open(&playback_handle, "default", SND_PCM_STREAM_PLAYBACK, 0)<0) - || (alsa_api->snd_pcm_hw_params_malloc(&hw_params)<0) - || (alsa_api->snd_pcm_hw_params_any(playback_handle, hw_params)<0) - || (alsa_api->snd_pcm_hw_params_set_access(playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) - || (alsa_api->snd_pcm_hw_params_set_format(playback_handle, hw_params, SND_PCM_FORMAT_U8) < 0) - || (alsa_api->snd_pcm_hw_params_set_rate_near(playback_handle, hw_params, &rate, 0) < 0) - || (alsa_api->snd_pcm_hw_params_set_channels(playback_handle, hw_params, 1) < 0) - || (alsa_api->snd_pcm_hw_params(playback_handle, hw_params) < 0) - || (alsa_api->snd_pcm_prepare(playback_handle) < 0)) { - alsa_device_open_failed=TRUE; - if(hw_params!=NULL) - alsa_api->snd_pcm_hw_params_free(hw_params); - if(playback_handle!=NULL) { - alsa_api->snd_pcm_close(playback_handle); - playback_handle=NULL; - } - } - else { - alsa_api->snd_pcm_hw_params_free(hw_params); - handle_type=SOUND_DEVICE_ALSA; - handle_rc++; - return(TRUE); - } - } - } -#endif - -#ifdef AFMT_U8 - if(!sound_device_open_failed) { - if((dsp=open("/dev/dsp",O_WRONLY,0))<0) { - sound_device_open_failed=TRUE; - } - else { - ioctl(dsp, SNDCTL_DSP_SETFRAGMENT, &fragsize); - if((ioctl(dsp, SNDCTL_DSP_SETFMT, &format)==-1) || format!=AFMT_U8) { - sound_device_open_failed=TRUE; - close(dsp); - } - else if((ioctl(dsp, SNDCTL_DSP_CHANNELS, &channels)==-1) || channels!=1) { - sound_device_open_failed=TRUE; - close(dsp); - } - else if((ioctl(dsp, SNDCTL_DSP_SPEED, &rate)==-1) || rate!=S_RATE) { - sound_device_open_failed=TRUE; - close(dsp); - } - } - } - if(sound_device_open_failed) { - return(FALSE); - } - handle_type=SOUND_DEVICE_OSS; - if(!sound_device_open_failed) { - handle_rc++; - return(TRUE); - } -#endif - - return(FALSE); -} - -BOOL -xptone_open(void) -{ - BOOL ret; -#ifdef XPDEV_THREAD_SAFE - pthread_once(&sample_initialized_pto, init_sample); - pthread_mutex_lock(&handle_mutex); -#endif - ret = xptone_open_locked(); -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_unlock(&handle_mutex); -#endif - return ret; -} - -static void -xptone_complete_locked(void) -{ - if(handle_type==SOUND_DEVICE_CLOSED) { - return; - } - -#ifdef WITH_PULSEAUDIO - else if (handle_type == SOUND_DEVICE_PULSEAUDIO) { - int err; - if (pu_handle) - pu_api->simple_drain(pu_handle, &err); - } -#endif - -#ifdef WITH_PORTAUDIO - else if(handle_type==SOUND_DEVICE_PORTAUDIO) { - pa_api->stop(portaudio_stream); - if (pawave) { - free((void *)pawave); - pawave = NULL; - } - } -#endif - -#ifdef WITH_SDL_AUDIO - else if(handle_type==SOUND_DEVICE_SDL) { - while(xpbeep_sdl.GetAudioStatus()==SDL_AUDIO_PLAYING) - SLEEP(1); - } -#endif - -#ifdef _WIN32 - if(handle_type==SOUND_DEVICE_WIN32) { - if(wh[0].dwFlags & WHDR_PREPARED) { - while(waveOutUnprepareHeader(waveOut, &wh[0], sizeof(wh))==WAVERR_STILLPLAYING) - SLEEP(1); - FREE_AND_NULL(wh[0].lpData); - } - if(wh[1].dwFlags & WHDR_PREPARED) { - while(waveOutUnprepareHeader(waveOut, &wh[1], sizeof(wh))==WAVERR_STILLPLAYING) - SLEEP(1); - FREE_AND_NULL(wh[1].lpData); - } - } -#endif - -#ifdef USE_ALSA_SOUND - if(handle_type==SOUND_DEVICE_ALSA) { - if(!alsa_device_open_failed) - alsa_api->snd_pcm_drain(playback_handle); - } -#endif - -#ifdef AFMT_U8 - else if(handle_type==SOUND_DEVICE_OSS) { - ioctl(dsp, SNDCTL_DSP_SYNC, NULL); - } -#endif -} - -void -xptone_complete(void) -{ -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_lock(&handle_mutex); -#endif - xptone_complete_locked(); -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_unlock(&handle_mutex); -#endif -} - -BOOL xptone_close_locked(void) -{ - xptone_complete_locked(); - - if (handle_rc <= 0) - return FALSE; - if (--handle_rc) - return TRUE; - -#ifdef WITH_PORTAUDIO - if(handle_type==SOUND_DEVICE_PORTAUDIO) { - pa_api->close(portaudio_stream); - } -#endif - -#ifdef WITH_PULSEAUDIO - if(handle_type==SOUND_DEVICE_PULSEAUDIO) { - if (pu_handle) - pu_api->simple_free(pu_handle); - pu_handle = NULL; - } -#endif - -#ifdef WITH_SDL_AUDIO - if(handle_type==SOUND_DEVICE_SDL) { - xpbeep_sdl.CloseAudio(); - xpbeep_sdl.SDL_DestroySemaphore(sdlToneDone); - } -#endif - -#ifdef _WIN32 - if(handle_type==SOUND_DEVICE_WIN32) { - waveOutClose(waveOut); - } -#endif - -#ifdef USE_ALSA_SOUND - if(handle_type==SOUND_DEVICE_ALSA) { - alsa_api->snd_pcm_close (playback_handle); - playback_handle=NULL; - } -#endif - -#ifdef AFMT_U8 - if(handle_type==SOUND_DEVICE_OSS) { - close(dsp); - } -#endif - handle_type=SOUND_DEVICE_CLOSED; - sound_device_open_failed=FALSE; -#ifdef USE_ALSA_SOUND - alsa_device_open_failed=FALSE; -#endif -#ifdef WITH_SDL_AUDIO - sdl_device_open_failed=FALSE; -#endif -#ifdef WITH_PORTAUDIO - portaudio_device_open_failed=FALSE; -#endif -#ifdef WITH_PULSEAUDIO - pulseaudio_device_open_failed = FALSE; -#endif - - return(TRUE); -} - -BOOL -xptone_close(void) -{ - BOOL ret; - -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_lock(&handle_mutex); -#endif - ret = xptone_close_locked(); -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_unlock(&handle_mutex); -#endif - return ret; -} - -static BOOL -do_xp_play_sample(const unsigned char *sampo, size_t sz, int *freed) -{ - const unsigned char *samp; - int need_copy = 0; -#ifdef AFMT_U8 - int wr; - int i; -#endif - -#ifdef WITH_PORTAUDIO - if(handle_type==SOUND_DEVICE_PORTAUDIO) { - if(pa_api->ver < 1899) - need_copy = 1; - } -#endif -#ifdef _WIN32 - if(handle_type==SOUND_DEVICE_WIN32) - need_copy = 1; -#endif -#ifdef WITH_SDL_AUDIO - if(handle_type==SOUND_DEVICE_SDL) - need_copy = 1; -#endif - - if (freed) - *freed = need_copy; - if (need_copy) { - if (freed) { - samp = sampo; - } - else { - samp = malloc(sz); - if (!samp) - return FALSE; - memcpy((void *)samp, sampo, sz); - } - } - else { - samp = sampo; - } - -#ifdef WITH_PULSEAUDIO - if(handle_type==SOUND_DEVICE_PULSEAUDIO) { - int err; - pa_sample_spec ss; - ss.format = PA_SAMPLE_U8; - ss.rate = 22050; - ss.channels = 1; - if (pu_handle == NULL) { - if((pu_handle = pu_api->simple_new(NULL, "XPBeep", PA_STREAM_PLAYBACK, NULL, "Beeps and Boops", &ss, NULL, NULL, NULL)) == NULL) { - pulseaudio_device_open_failed=TRUE; - pulseaudio_initialized=FALSE; - xptone_close_locked(); - xptone_open_locked(); - } - else - pulseaudio_initialized=TRUE; - } - if (pulseaudio_initialized) - pu_api->simple_write(pu_handle, sampo, sz, &err); - } -#endif - -#ifdef WITH_PORTAUDIO - if(handle_type==SOUND_DEVICE_PORTAUDIO) { - if(pa_api->ver >= 1899) { - pa_api->start(portaudio_stream); - pa_api->write(portaudio_stream, samp, sz); - } - else { - xptone_complete_locked(); - pawave=samp; - portaudio_buf_pos=0; - portaudio_buf_len=sz; - pa_api->start(portaudio_stream); - } - return TRUE; - } -#endif - -#ifdef WITH_SDL_AUDIO - if(handle_type==SOUND_DEVICE_SDL) { - xpbeep_sdl.LockAudio(); - swave=samp; - sdl_audio_buf_pos=0; - sdl_audio_buf_len=sz; - xpbeep_sdl.UnlockAudio(); - xpbeep_sdl.PauseAudio(FALSE); - xpbeep_sdl.SemWait(sdlToneDone); - xpbeep_sdl.PauseAudio(TRUE); - return TRUE; - } -#endif - -#ifdef _WIN32 - if(handle_type==SOUND_DEVICE_WIN32) { - if(wh[curr_wh].dwFlags & WHDR_PREPARED) { - while(waveOutUnprepareHeader(waveOut, &wh[curr_wh], sizeof(wh[curr_wh]))==WAVERR_STILLPLAYING) - SLEEP(1); - } - free(wh[curr_wh].lpData); - wh[curr_wh].lpData=samp; - wh[curr_wh].dwBufferLength=sz; - if(waveOutPrepareHeader(waveOut, &wh[curr_wh], sizeof(wh[curr_wh]))==MMSYSERR_NOERROR) { - if(waveOutWrite(waveOut, &wh[curr_wh], sizeof(wh[curr_wh]))==MMSYSERR_NOERROR) { - curr_wh ^= 1; - } - } - return TRUE; - } -#endif - -#ifdef USE_ALSA_SOUND - if(handle_type==SOUND_DEVICE_ALSA) { - int ret; - int written=0; - - while (written < sz) { - ret = alsa_api->snd_pcm_writei(playback_handle, samp + written, sz - written); - if (ret < 0) { - if (alsa_api->snd_pcm_prepare(playback_handle) == 0) { - ret = 0; - } - else { - if (written == 0) { - /* Go back and try OSS */ - xptone_close_locked(); - alsa_device_open_failed = TRUE; - xptone_open_locked(); - } - break; - } - } - written += ret; - } - if (written == sz) - return TRUE; - } -#endif - -#ifdef AFMT_U8 - if(handle_type==SOUND_DEVICE_OSS) { - wr=0; - while(wr<sz) { - i=write(dsp, samp+wr, sz-wr); - if(i>=0) - wr+=i; - } - return TRUE; - } -#endif - - return FALSE; -} - -#ifdef XPDEV_THREAD_SAFE -void xp_play_sample_thread(void *data) -{ - BOOL must_close; - BOOL posted_last=TRUE; - BOOL waited=FALSE; - unsigned char *sample=NULL; - size_t this_sample_size; - int freed; - - SetThreadName("Sample Play"); - sample_thread_running=TRUE; - sem_post(&sample_complete_sem); - while(1) { - must_close = FALSE; - if(!waited) { - if(sem_wait(&sample_pending_sem)!=0) - goto error_return; - } - else - waited=FALSE; - posted_last=FALSE; - pthread_mutex_lock(&handle_mutex); - - if(handle_type==SOUND_DEVICE_CLOSED) { - must_close=TRUE; - if(!xptone_open_locked()) { - sem_post(&sample_complete_sem); - pthread_mutex_unlock(&handle_mutex); - continue; - } - } - - if(pthread_mutex_lock(&sample_mutex)!=0) { - pthread_mutex_unlock(&handle_mutex); - goto error_return; - } - this_sample_size=sample_size; - FREE_AND_NULL(sample); - sample=(unsigned char *)malloc(sample_size); - if(sample==NULL) { - sem_post(&sample_complete_sem); - pthread_mutex_unlock(&sample_mutex); - pthread_mutex_unlock(&handle_mutex); - continue; - } - memcpy(sample, sample_buffer, this_sample_size); - pthread_mutex_unlock(&sample_mutex); - - do_xp_play_sample(sample, this_sample_size, &freed); - if (freed) - sample = NULL; - sem_post(&sample_complete_sem); - posted_last=TRUE; - if(must_close) { - if(sem_trywait(&sample_pending_sem)==0) { - waited=TRUE; - } - else { - xptone_close_locked(); - } - } - pthread_mutex_unlock(&handle_mutex); - } - -error_return: -#ifdef _WIN32 - pthread_mutex_lock(&handle_mutex); - if(handle_type==SOUND_DEVICE_WIN32) { - if(wh[curr_wh].dwFlags & WHDR_PREPARED) { - while(waveOutUnprepareHeader(waveOut, &wh[curr_wh], sizeof(wh[curr_wh]))==WAVERR_STILLPLAYING) - SLEEP(1); - } - FREE_AND_NULL(wh[curr_wh].lpData); - } - pthread_mutex_unlock(&handle_mutex); -#endif - - FREE_AND_NULL(sample); - xptone_close(); - if(!posted_last) { - sem_post(&sample_complete_sem); - } - sample_thread_running=FALSE; -} - -static void -init_sample(void) -{ - pthread_mutex_init(&sample_mutex, NULL); - pthread_mutex_init(&handle_mutex, NULL); - sem_init(&sample_pending_sem, 0, 0); - sem_init(&sample_complete_sem, 0, 0); -} - -static BOOL xp_play_sample_locked(const unsigned char *sample, size_t size, BOOL background) -{ - if(!sample_thread_running) { - _beginthread(xp_play_sample_thread, 0,NULL); - sem_wait(&sample_complete_sem); - } - - while(samples_posted > 0) { - pthread_mutex_unlock(&sample_mutex); - sem_wait(&sample_complete_sem); - pthread_mutex_lock(&sample_mutex); - samples_posted--; - } - sample_buffer=sample; - sample_size=size; - samples_posted++; - sem_post(&sample_pending_sem); - if(!background) { - while(samples_posted > 0) { - pthread_mutex_unlock(&sample_mutex); - sem_wait(&sample_complete_sem); - pthread_mutex_lock(&sample_mutex); - samples_posted--; - } - } - return TRUE; -} - -/* - * This MUST not return false after sample goes into the sample buffer in the background. - * If it does, the caller won't be able to free() it. - */ -BOOL xp_play_sample(const unsigned char *sample, size_t size, BOOL background) -{ - BOOL ret; - pthread_once(&sample_initialized_pto, init_sample); - - pthread_mutex_lock(&sample_mutex); - ret = xp_play_sample_locked(sample, size, background); - pthread_mutex_unlock(&sample_mutex); - return(ret); -} -#else -BOOL xp_play_sample(const unsigned char *sample, size_t sample_size, BOOL background) -{ - BOOL must_close=FALSE; - BOOL ret; - - if(handle_type==SOUND_DEVICE_CLOSED) { - must_close=TRUE; - if(!xptone_open()) - return(FALSE); - } - - ret = do_xp_play_sample(sample, sample_size, NULL); - if(must_close) - xptone_close(); - return(ret); -} -#endif - -/********************************************************************************/ -/* Play a tone through the wave/DSP output device (sound card) - Deuce */ -/********************************************************************************/ - -BOOL xptone(double freq, DWORD duration, enum WAVE_SHAPE shape) -{ - unsigned char *wave; - int samples; - BOOL ret; - - wave=(unsigned char *)malloc(S_RATE*15/2+1); - if(!wave) - return FALSE; - if(freq<17 && freq != 0) - freq=17; - samples=S_RATE*duration/1000; - if(freq) { - if(samples<=S_RATE/freq*2) - samples=S_RATE/freq*2; - } - if(freq==0 || samples > S_RATE/freq*2) { - int sample_len; - - xptone_makewave(freq,wave,S_RATE*15/2,shape); - for(sample_len=S_RATE*15/2-1; sample_len && wave[sample_len]==128; sample_len--) - ; - sample_len++; - while(samples > S_RATE*15/2) { - if(!xp_play_sample(wave, sample_len, TRUE)) { - free(wave); - return FALSE; - } - samples -= sample_len; - } - } - xptone_makewave(freq,wave,samples,shape); - ret = xp_play_sample(wave, samples, FALSE); - free(wave); - return ret; -} - -#ifdef __unix__ -/****************************************************************************/ -/* Generate a tone at specified frequency for specified milliseconds */ -/* Thanks to Casey Martin (and Deuce) for this code */ -/****************************************************************************/ -void unix_beep(int freq, int dur) -{ - static int console_fd=-1; - -#if (defined(__FreeBSD__) && defined(HAS_MACHINE_SPEAKER_H)) || ((defined(__OpenBSD__) || defined(__NetBSD__)) && defined(HAS_MACHINE_SPKR_H)) - int speaker_fd=-1; - tone_t tone; - - speaker_fd = open("/dev/speaker", O_WRONLY|O_APPEND); - if(speaker_fd != -1) { - tone.frequency=freq; - tone.duration=dur/10; - ioctl(speaker_fd,SPKRTONE,&tone); - close(speaker_fd); - return; - } -#endif - -#if !defined(__GNU__) && !defined(__QNX__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__APPLE__) && !defined(__CYGWIN__) && !defined(__HAIKU__) - if(console_fd == -1) - console_fd = open("/dev/console", O_NOCTTY); - - if(console_fd != -1) { -#if defined(__solaris__) - ioctl(console_fd, KIOCCMD, KBD_CMD_BELL); -#else - if(freq != 0) /* Don't divide by zero */ - ioctl(console_fd, KIOCSOUND, (int) (1193180 / freq)); -#endif /* solaris */ - SLEEP(dur); -#if defined(__solaris__) - ioctl(console_fd, KIOCCMD, KBD_CMD_NOBELL); /* turn off tone */ -#else - ioctl(console_fd, KIOCSOUND, 0); /* turn off tone */ -#endif /* solaris */ - } -#endif -} - -#endif - -/********************************************************************************/ -/* Play sound through DSP/wave device, if unsuccessful, play through PC speaker */ -/********************************************************************************/ -void xpbeep(double freq, DWORD duration) -{ - if(xptone(freq,duration,WAVE_SHAPE_SINE_SAW_HARM)) - return; - -#if defined(_WIN32) - Beep((DWORD)(freq+.5), duration); -#elif defined(__unix__) - unix_beep((int)(freq+.5),duration); -#endif -} diff --git a/xpdev/xpbeep.h b/xpdev/xpbeep.h deleted file mode 100644 index 93bac7d..0000000 --- a/xpdev/xpbeep.h +++ /dev/null @@ -1,51 +0,0 @@ -/* $Id: xpbeep.h,v 1.16 2020/04/15 15:18:00 deuce Exp $ */ - -#ifndef _XPBEEP_H_ -#define _XPBEEP_H_ - -#include "gen_defs.h" -#include "wrapdll.h" - -#if defined(_WIN32) - #if 0 - #define BEEP(freq,dur) xpbeep((double)(freq),(DWORD)(dur)) - #else - #define BEEP(freq,dur) Beep((DWORD)(freq),(DWORD)(dur)) - #endif -#elif defined(__OS2__) - #define BEEP(freq,dur) DosBeep(freq,dur) -#elif defined(__unix__) || defined(__APPLE__) - #define BEEP(freq,dur) xpbeep((double)(freq),(DWORD)(dur)) -#else - #error "Unsupported Target: Need some macros and/or function prototypes here." -#endif - -enum WAVE_SHAPE { - WAVE_SHAPE_SINE - ,WAVE_SHAPE_SAWTOOTH - ,WAVE_SHAPE_SQUARE - ,WAVE_SHAPE_SINE_SAW - ,WAVE_SHAPE_SINE_HARM - ,WAVE_SHAPE_SINE_SAW_CHORD - ,WAVE_SHAPE_SINE_SAW_HARM -}; - - -#ifdef __cplusplus -extern "C" { -#endif -DLLEXPORT void xptone_makewave(double freq, unsigned char *wave, int samples, enum WAVE_SHAPE shape); -DLLEXPORT BOOL xptone_open(void); -DLLEXPORT BOOL xptone_close(void); -DLLEXPORT void xpbeep(double freq, DWORD duration); -DLLEXPORT BOOL xp_play_sample(const unsigned char *sample, size_t sample_size, BOOL background); -DLLEXPORT void xptone_complete(void); -DLLEXPORT BOOL xptone(double freq, DWORD duration, enum WAVE_SHAPE); -#ifdef __unix__ -DLLEXPORT void unix_beep(int freq, int dur); -#endif -#ifdef __cplusplus -} -#endif - -#endif diff --git a/xpdev/xpdatetime.c b/xpdev/xpdatetime.c deleted file mode 100644 index e27df40..0000000 --- a/xpdev/xpdatetime.c +++ /dev/null @@ -1,457 +0,0 @@ -/* xpdatetime.c */ - -/* Cross-platform (and eXtra Precision) date/time functions */ - -/* $Id: xpdatetime.c,v 1.13 2015/11/25 07:27:07 sbbs Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> /* memset */ -#include "datewrap.h" /* sane_mktime */ -#include "xpdatetime.h" /* xpDateTime_t */ - -/**************************************/ -/* Cross-platform date/time functions */ -/**************************************/ - -xpDateTime_t xpDateTime_create(unsigned year, unsigned month, unsigned day - ,unsigned hour, unsigned minute, float second - ,xpTimeZone_t zone) -{ - xpDateTime_t xpDateTime; - - xpDateTime.date.year = year; - xpDateTime.date.month = month; - xpDateTime.date.day = day; - xpDateTime.time.hour = hour; - xpDateTime.time.minute = minute; - xpDateTime.time.second = second; - xpDateTime.zone = zone; - - return xpDateTime; -} - -xpDateTime_t xpDateTime_now(void) -{ -#if defined(_WIN32) - SYSTEMTIME systime; - - GetLocalTime(&systime); - return(xpDateTime_create(systime.wYear,systime.wMonth,systime.wDay - ,systime.wHour,systime.wMinute,(float)systime.wSecond+(systime.wMilliseconds*0.001F) - ,xpTimeZone_local())); -#else /* !Win32 (e.g. Unix) */ - struct tm tm; - struct timeval tv; - time_t t; - - gettimeofday(&tv, NULL); - t=tv.tv_sec; - localtime_r(&t,&tm); - - return xpDateTime_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday - ,tm.tm_hour,tm.tm_min,(float)tm.tm_sec+(tv.tv_usec*0.00001) - ,xpTimeZone_local()); -#endif -} - -/* Return local timezone offset (in minutes) */ -xpTimeZone_t xpTimeZone_local(void) -{ -#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DARWIN__) || defined(__linux__) - struct tm tm; - time_t t=time(NULL); - - localtime_r(&t, &tm); - return(tm.tm_gmtoff/60); -#elif defined(_WIN32) - TIME_ZONE_INFORMATION tz; - DWORD tzRet; - - /*****************************/ - /* Get Time-zone information */ - /*****************************/ - memset(&tz,0,sizeof(tz)); - tzRet=GetTimeZoneInformation(&tz); - switch(tzRet) { - case TIME_ZONE_ID_DAYLIGHT: - tz.Bias += tz.DaylightBias; - break; - case TIME_ZONE_ID_STANDARD: - tz.Bias += tz.StandardBias; - break; - } - - return -tz.Bias; -#else - -#if defined(__BORLANDC__) || defined(__CYGWIN__) - #define timezone _timezone -#endif - - /* Converts (_)timezone from seconds west of UTC to minutes east of UTC */ - /* Adjust for DST, assuming adjustment is always 60 minutes <sigh> */ - return -((timezone/60) - (daylight*60)); -#endif -} - -/* TODO: Supports local timezone and UTC only, currently */ -time_t xpDateTime_to_time(xpDateTime_t xpDateTime) -{ - struct tm tm; - - ZERO_VAR(tm); - - if(xpDateTime.date.year==0) - return(INVALID_TIME); - - tm.tm_year = xpDateTime.date.year; - tm.tm_mon = xpDateTime.date.month; - tm.tm_mday = xpDateTime.date.day; - - tm.tm_hour = xpDateTime.time.hour; - tm.tm_min = xpDateTime.time.minute; - tm.tm_sec = (int)xpDateTime.time.second; - - if(xpDateTime.zone == xpTimeZone_UTC) - return sane_timegm(&tm); - if(xpDateTime.zone == xpTimeZone_LOCAL || xpDateTime.zone == xpTimeZone_local()) - return sane_mktime(&tm); - return INVALID_TIME; -} - -/* This version ignores the timezone in xpDateTime and always uses mktime() */ -time_t xpDateTime_to_localtime(xpDateTime_t xpDateTime) -{ - xpDateTime.zone = xpTimeZone_LOCAL; - return xpDateTime_to_time(xpDateTime); -} - -xpDateTime_t time_to_xpDateTime(time_t ti, xpTimeZone_t zone) -{ - xpDateTime_t never; - struct tm tm; - - ZERO_VAR(never); - ZERO_VAR(tm); - if(localtime_r(&ti,&tm)==NULL) - return(never); - - return xpDateTime_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday - ,tm.tm_hour,tm.tm_min,(float)tm.tm_sec - ,zone==xpTimeZone_LOCAL ? xpTimeZone_local() : zone); -} - -xpDate_t time_to_xpDate(time_t ti) -{ - xpDate_t never; - struct tm tm; - - ZERO_VAR(never); - ZERO_VAR(tm); - if(localtime_r(&ti,&tm)==NULL) - return never; - - return xpDateTime_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday - ,tm.tm_hour,tm.tm_min,(float)tm.tm_sec, /* zone: */0).date; -} - -xpDateTime_t gmtime_to_xpDateTime(time_t ti) -{ - xpDateTime_t never; - struct tm tm; - - ZERO_VAR(never); - ZERO_VAR(tm); - if(gmtime_r(&ti,&tm)==NULL) - return(never); - - return xpDateTime_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday - ,tm.tm_hour,tm.tm_min,(float)tm.tm_sec - ,xpTimeZone_UTC); -} - -/**********************************************/ -/* Decimal-coded ISO-8601 date/time functions */ -/**********************************************/ - -isoDate_t xpDateTime_to_isoDateTime(xpDateTime_t xpDateTime, isoTime_t* isoTime) -{ - if(isoTime!=NULL) - *isoTime=0; - - if(xpDateTime.date.year==0) - return(0); - - if(isoTime!=NULL) - *isoTime=isoTime_create(xpDateTime.time.hour,xpDateTime.time.minute,xpDateTime.time.second); - - return isoDate_create(xpDateTime.date.year,xpDateTime.date.month,xpDateTime.date.day); -} - -xpDateTime_t isoDateTime_to_xpDateTime(isoDate_t date, isoTime_t ti) -{ - return xpDateTime_create(isoDate_year(date),isoDate_month(date),isoDate_day(date) - ,isoTime_hour(ti),isoTime_minute(ti),(float)isoTime_second(ti),xpTimeZone_local()); -} - -isoDate_t time_to_isoDateTime(time_t ti, isoTime_t* isoTime) -{ - struct tm tm; - - if(isoTime!=NULL) - *isoTime=0; - - ZERO_VAR(tm); - if(localtime_r(&ti,&tm)==NULL) - return(0); - - if(isoTime!=NULL) - *isoTime=isoTime_create(tm.tm_hour,tm.tm_min,tm.tm_sec); - - return isoDate_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday); -} - -isoTime_t time_to_isoTime(time_t ti) -{ - isoTime_t isoTime; - - time_to_isoDateTime(ti,&isoTime); - - return isoTime; -} - -isoDate_t gmtime_to_isoDateTime(time_t ti, isoTime_t* isoTime) -{ - struct tm tm; - - if(isoTime!=NULL) - *isoTime=0; - - ZERO_VAR(tm); - if(gmtime_r(&ti,&tm)==NULL) - return(0); - - if(isoTime!=NULL) - *isoTime=isoTime_create(tm.tm_hour,tm.tm_min,tm.tm_sec); - - return isoDate_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday); -} - -isoTime_t gmtime_to_isoTime(time_t ti) -{ - isoTime_t isoTime; - - gmtime_to_isoDateTime(ti,&isoTime); - - return isoTime; -} - -time_t isoDateTime_to_time(isoDate_t date, isoTime_t ti) -{ - struct tm tm; - - ZERO_VAR(tm); - - if(date==0) - return(INVALID_TIME); - - tm.tm_year = isoDate_year(date); - tm.tm_mon = isoDate_month(date); - tm.tm_mday = isoDate_day(date); - - tm.tm_hour = isoTime_hour(ti); - tm.tm_min = isoTime_minute(ti); - tm.tm_sec = isoTime_second(ti); - - return sane_mktime(&tm); -} - -/****************************************************************************/ -/* Conversion from xpDate/Time/Zone to isoDate/Time/Zone Strings */ -/****************************************************************************/ - -char* xpDate_to_isoDateStr(xpDate_t date, const char* sep, char* str, size_t maxlen) -{ - if(sep==NULL) - sep="-"; - - snprintf(str,maxlen,"%04u%s%02u%s%02u" - ,date.year ,sep - ,date.month ,sep - ,date.day); - - return str; -} - -/* precision example output - * -2 "14" - * -1 "14:02" - * 0 "14:02:39" - * 1 "14:02:39.8" - * 2 "14:02:39.82" - * 3 "14:02:39.829" - */ -char* xpTime_to_isoTimeStr(xpTime_t ti, const char* sep, int precision - ,char* str, size_t maxlen) -{ - if(sep==NULL) - sep=":"; - - if(precision < -1) /* HH */ - snprintf(str, maxlen, "%02u", ti.hour); - else if(precision < 0) /* HH:MM */ - snprintf(str, maxlen, "%02u%s%02u" - ,ti.hour ,sep - ,ti.minute - ); - else /* HH:MM:SS[.fract] */ - snprintf(str, maxlen, "%02u%s%02u%s%0*.*f" - ,ti.hour ,sep - ,ti.minute ,sep - ,precision ? (precision+3) : 2 - ,precision - ,ti.second - ); - - return str; -} - -char* xpTimeZone_to_isoTimeZoneStr(xpTimeZone_t zone, const char* sep - ,char *str, size_t maxlen) -{ - xpTimeZone_t tz=zone; - - if(tz==xpTimeZone_UTC) - return "Z"; - - if(sep==NULL) - sep=":"; - - if(tz<0) - tz=-tz; - - snprintf(str,maxlen,"%c%02u%s%02u" - ,zone < 0 ? '-':'+' - ,tz/60 - ,sep - ,tz%60); - - return str; -} - -char* xpDateTime_to_isoDateTimeStr(xpDateTime_t dt - ,const char* date_sep, const char* datetime_sep, const char* time_sep - ,int precision - ,char* str, size_t maxlen) -{ - char tz_str[16]; - char date_str[16]; - char time_str[16]; - - if(datetime_sep==NULL) datetime_sep="T"; - - snprintf(str,maxlen,"%s%s%s%s" - ,xpDate_to_isoDateStr(dt.date, date_sep, date_str, sizeof(date_str)) - ,datetime_sep - ,xpTime_to_isoTimeStr(dt.time, time_sep, precision, time_str, sizeof(time_str)) - ,xpTimeZone_to_isoTimeZoneStr(dt.zone,time_sep,tz_str,sizeof(tz_str))); - - return str; -} - -/****************************************************************************/ -/* isoDate/Time/Zone String parsing functions */ -/****************************************************************************/ - -BOOL isoTimeZoneStr_parse(const char* str, xpTimeZone_t* zone) -{ - unsigned hour=0,minute=0; - - switch(*str) { - case 0: /* local time-zone */ - *zone = xpTimeZone_local(); - return TRUE; - case 'Z': /* UTC */ - *zone = xpTimeZone_UTC; - return TRUE; - case '+': - case '-': /* "+/- HH[:]MM" */ - if(sscanf(str+1,"%2u%*s%2u",&hour,&minute)>=1) { - *zone = (hour*60) + minute; - if(*str=='-') - *zone = -(*zone); - return TRUE; - } - break; - } - return FALSE; -} - -/* TODO: adjust times in 24:xx:xx format */ -xpDateTime_t isoDateTimeStr_parse(const char* str) -{ - char zone[16]; - xpDateTime_t xpDateTime; - - zone[0]=0; - ZERO_VAR(xpDateTime); - - if((sscanf(str,"%4u-%2u-%2uT%2u:%2u:%f%6s" /* CCYY-MM-DDThh:MM:ss�hhmm */ - ,&xpDateTime.date.year - ,&xpDateTime.date.month - ,&xpDateTime.date.day - ,&xpDateTime.time.hour - ,&xpDateTime.time.minute - ,&xpDateTime.time.second - ,zone)>=2 - || sscanf(str,"%4u%2u%2uT%2u%2u%f%6s" /* CCYYMMDDThhmmss�hhmm */ - ,&xpDateTime.date.year - ,&xpDateTime.date.month - ,&xpDateTime.date.day - ,&xpDateTime.time.hour - ,&xpDateTime.time.minute - ,&xpDateTime.time.second - ,zone)>=4 - || sscanf(str,"%4u%2u%2u%2u%2u%f%6s" /* CCYYMMDDhhmmss�hhmm */ - ,&xpDateTime.date.year - ,&xpDateTime.date.month - ,&xpDateTime.date.day - ,&xpDateTime.time.hour - ,&xpDateTime.time.minute - ,&xpDateTime.time.second - ,zone)>=1 - ) && isoTimeZoneStr_parse(zone,&xpDateTime.zone)) - return xpDateTime; - - return xpDateTime; -} diff --git a/xpdev/xpdatetime.h b/xpdev/xpdatetime.h deleted file mode 100644 index 74f91c2..0000000 --- a/xpdev/xpdatetime.h +++ /dev/null @@ -1,146 +0,0 @@ -/* Cross-platform (and eXtra Precision) date/time functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XPDATETIME_H_ -#define _XPDATETIME_H_ - -#include "gen_defs.h" /* uint32_t and time_t */ -#include "wrapdll.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -/**************************************/ -/* Cross-platform date/time functions */ -/**************************************/ - -#define INVALID_TIME (time_t)-1 /* time_t representation of an invalid date/time */ - -typedef struct { - unsigned year; /* 0-9999 */ - unsigned month; /* 1-12 */ - unsigned day; /* 1-31 */ -} xpDate_t; - -typedef struct { - unsigned hour; /* 0-23 */ - unsigned minute; /* 0-59 */ - float second; /* 0.0-59.999, supports fractional seconds */ -} xpTime_t; - -typedef int xpTimeZone_t; -#define xpTimeZone_UTC 0 -#define xpTimeZone_LOCAL 1 - -typedef struct { - xpDate_t date; - xpTime_t time; - xpTimeZone_t zone; /* minutes +/- UTC */ -} xpDateTime_t; - -DLLEXPORT xpDateTime_t xpDateTime_create(unsigned year, unsigned month, unsigned day - ,unsigned hour, unsigned minute, float second - ,xpTimeZone_t); -DLLEXPORT xpDateTime_t xpDateTime_now(void); -DLLEXPORT time_t xpDateTime_to_time(xpDateTime_t); -DLLEXPORT time_t xpDateTime_to_localtime(xpDateTime_t); -DLLEXPORT xpDate_t time_to_xpDate(time_t); -DLLEXPORT xpDateTime_t time_to_xpDateTime(time_t, xpTimeZone_t); -DLLEXPORT xpDateTime_t gmtime_to_xpDateTime(time_t); -DLLEXPORT xpTimeZone_t xpTimeZone_local(void); - -/**********************************************/ -/* Decimal-coded ISO-8601 date/time functions */ -/**********************************************/ - -typedef uint32_t isoDate_t; /* CCYYMMDD (decimal) */ -typedef uint32_t isoTime_t; /* HHMMSS (decimal) */ - -#define isoDate_create(year,mon,day) (((year)*10000)+((mon)*100)+(day)) -#define isoTime_create(hour,min,sec) (((hour)*10000)+((min)*100)+((unsigned)sec)) - -#define isoDate_year(date) ((date)/10000) -#define isoDate_month(date) (((date)/100)%100) -#define isoDate_day(date) ((date)%100) - -#define isoTime_hour(time) ((time)/10000) -#define isoTime_minute(time) (((time)/100)%100) -#define isoTime_second(time) ((time)%100) - -DLLEXPORT BOOL isoTimeZoneStr_parse(const char* str, xpTimeZone_t*); -DLLEXPORT xpDateTime_t isoDateTimeStr_parse(const char* str); - -/**************************************************************/ -/* Conversion between time_t (local and GMT) and isoDate/Time */ -/**************************************************************/ -DLLEXPORT isoTime_t time_to_isoTime(time_t); -DLLEXPORT isoTime_t gmtime_to_isoTime(time_t); -DLLEXPORT isoDate_t time_to_isoDateTime(time_t, isoTime_t*); -DLLEXPORT isoDate_t gmtime_to_isoDateTime(time_t, isoTime_t*); -DLLEXPORT time_t isoDateTime_to_time(isoDate_t, isoTime_t); -#define time_to_isoDate(t) time_to_isoDateTime(t,NULL) -#define gmtime_to_isoDate(t) gmtime_to_isoDateTime(t,NULL) - -/***************************************************/ -/* Conversion between xpDate/Time and isoDate/Time */ -/***************************************************/ - -#define xpDate_to_isoDate(date) isoDate_create((date).year,(date).month,(date).day) -#define xpTime_to_isoTime(time) isoTime_create((time).hour,(time).minute,(unsigned)((time).second)) - -DLLEXPORT xpDateTime_t isoDateTime_to_xpDateTime(isoDate_t, isoTime_t); -DLLEXPORT isoDate_t xpDateTime_to_isoDateTime(xpDateTime_t, isoTime_t*); - -/*****************************************************************/ -/* Conversion from xpDate/Time/Zone to isoDate/Time/Zone Strings */ -/*****************************************************************/ - -/* NULL sep (separator) values are automatically replaced with ISO-standard separators */ - -/* precision example output - * -2 "14" - * -1 "14:02" - * 0 "14:02:39" - * 1 "14.02:39.8" - * 2 "14.02:39.82" - * 3 "14.02:39.829" - */ -DLLEXPORT char* xpDate_to_isoDateStr(xpDate_t - ,const char* sep - ,char* str, size_t maxlen); -DLLEXPORT char* xpTime_to_isoTimeStr(xpTime_t - ,const char* sep - ,int precision - ,char* str, size_t maxlen); -DLLEXPORT char* xpTimeZone_to_isoTimeZoneStr(xpTimeZone_t - ,const char* sep - ,char *str, size_t maxlen); -DLLEXPORT char* xpDateTime_to_isoDateTimeStr(xpDateTime_t - ,const char* date_sep, const char* datetime_sep, const char* time_sep - ,int precision - ,char* str, size_t maxlen); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/xpendian.h b/xpdev/xpendian.h deleted file mode 100644 index fedf80c..0000000 --- a/xpdev/xpendian.h +++ /dev/null @@ -1,85 +0,0 @@ -/* xpendian.h */ - -/* Macros to convert integer "endianness" */ - -/* $Id: xpendian.h,v 1.6 2018/07/24 01:13:10 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XPENDIAN_H -#define _XPENDIAN_H - -/************************/ -/* byte-swapping macros */ -/************************/ -#define BYTE_SWAP_16(x) ((((short)(x)&0xff00)>>8) | (((short)(x)&0x00ff)<<8)) -#define BYTE_SWAP_32(x) ((((long)(x)&0xff000000)>>24) | (((long)(x)&0x00ff0000)>>8) | (((long)(x)&0x0000ff00)<<8) | (((long)(x)&0x000000ff)<<24)) - -/* these may need to be updated for > 32-bit platforms */ -#define BYTE_SWAP_SHORT(x) BYTE_SWAP_16(x) -#define BYTE_SWAP_LONG(x) BYTE_SWAP_32(x) - -/* auto-detect integer size */ -#define BYTE_SWAP_INT(x) (sizeof(x)==sizeof(short) ? BYTE_SWAP_SHORT(x) : sizeof(x)==sizeof(long) ? BYTE_SWAP_LONG(x) : (x)) - -/********************************/ -/* Architecture-specific macros */ -/********************************/ -#ifdef __BIG_ENDIAN__ /* e.g. Motorola */ - - #define BE_SHORT(x) (x) - #define BE_LONG(x) (x) - #define BE_INT16(x) (x) - #define BE_INT32(x) (x) - #define BE_INT(x) (x) - #define LE_SHORT(x) BYTE_SWAP_SHORT(x) - #define LE_LONG(x) BYTE_SWAP_LONG(x) - #define LE_INT16(x) BYTE_SWAP_16(x) - #define LE_INT32(x) BYTE_SWAP_32(x) - #define LE_INT(x) BYTE_SWAP_INT(x) - -#else /* Little Endian (e.g. Intel) */ - - #define LE_SHORT(x) (x) - #define LE_LONG(x) (x) - #define LE_INT16(x) (x) - #define LE_INT32(x) (x) - #define LE_INT(x) (x) - #define BE_SHORT(x) BYTE_SWAP_SHORT(x) - #define BE_LONG(x) BYTE_SWAP_LONG(x) - #define BE_INT16(x) BYTE_SWAP_16(x) - #define BE_INT32(x) BYTE_SWAP_32(x) - #define BE_INT(x) BYTE_SWAP_INT(x) - -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/xpevent.c b/xpdev/xpevent.c deleted file mode 100644 index 35e5f42..0000000 --- a/xpdev/xpevent.c +++ /dev/null @@ -1,221 +0,0 @@ -/* xpevent.c */ - -/* *nix emulation of Win32 *Event API */ - -/* $Id: xpevent.c,v 1.17 2018/07/24 01:13:10 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdio.h> /* NULL */ -#include <stdlib.h> /* malloc() */ -#include "xpevent.h" -#include "genwrap.h" - -xpevent_t -CreateEvent(void *sec, BOOL bManualReset, BOOL bInitialState, void *name) -{ - xpevent_t event; - - event = (xpevent_t)malloc(sizeof(struct xpevent)); - if (event == NULL) { - errno = ENOSPC; - return(NULL); - } - memset(event,0,sizeof(struct xpevent)); - - /* - * Initialize - */ - if (pthread_mutex_init(&event->lock, NULL) != 0) { - free(event); - errno = ENOSPC; - return(NULL); - } - - if (pthread_cond_init(&event->gtzero, NULL) != 0) { - while(pthread_mutex_destroy(&event->lock)==EBUSY) - SLEEP(1); - free(event); - errno = ENOSPC; - return(NULL); - } - - event->mreset=bManualReset; - event->value=bInitialState; - event->nwaiters = 0; - event->magic=EVENT_MAGIC; - - return(event); -} - -BOOL -SetEvent(xpevent_t event) -{ - if (event==NULL || (event->magic != EVENT_MAGIC)) { - errno = EINVAL; - return(FALSE); - } - - pthread_mutex_lock(&event->lock); - - event->value=TRUE; - if (event->nwaiters > 0) { - /* - * We must use pthread_cond_broadcast() rather than - * pthread_cond_signal() in order to assure that the highest - * priority thread is run by the scheduler, since - * pthread_cond_signal() signals waiting threads in FIFO order. - */ - pthread_cond_broadcast(&event->gtzero); - } - - pthread_mutex_unlock(&event->lock); - - return(TRUE); -} - -BOOL -ResetEvent(xpevent_t event) -{ - if (event==NULL || (event->magic != EVENT_MAGIC)) { - errno = EINVAL; - return(FALSE); - } - - pthread_mutex_lock(&event->lock); - - event->value=FALSE; - - pthread_mutex_unlock(&event->lock); - - return(TRUE); -} - -BOOL -CloseEvent(xpevent_t event) -{ - if (event==NULL || (event->magic != EVENT_MAGIC)) { - errno = EINVAL; - return(FALSE); - } - - /* Make sure there are no waiters. */ - pthread_mutex_lock(&event->lock); - if (event->nwaiters > 0) { - pthread_mutex_unlock(&event->lock); - errno = EBUSY; - return(FALSE); - } - - pthread_mutex_unlock(&event->lock); - - while(pthread_mutex_destroy(&event->lock)==EBUSY) - SLEEP(1); - while(pthread_cond_destroy(&event->gtzero)==EBUSY) - SLEEP(1); - event->magic = 0; - - free(event); - - return(TRUE); -} - -DWORD -WaitForEvent(xpevent_t event, DWORD ms) -{ - DWORD retval=WAIT_FAILED; - struct timespec abstime; - struct timeval currtime; - - if (event==NULL || (event->magic != EVENT_MAGIC)) { - errno = EINVAL; - return(WAIT_FAILED); - } - - if(ms && ms!=INFINITE) { - gettimeofday(&currtime,NULL); - abstime.tv_sec=currtime.tv_sec + ((currtime.tv_usec/1000 + ms)/1000); - abstime.tv_nsec=(currtime.tv_usec*1000 + ms*1000000)%1000000000; - } - - pthread_mutex_lock(&event->lock); - - if(event->value) - retval=WAIT_OBJECT_0; - - while ((!(event->value)) || (event->verify!=NULL && !event->verify(event->cbdata))) { - event->nwaiters++; - switch(ms) { - case 0: - if(event->value) - retval=WAIT_OBJECT_0; - else - retval=WAIT_TIMEOUT; - event->nwaiters--; - goto DONE; - break; - case INFINITE: - retval=pthread_cond_wait(&event->gtzero, &event->lock); - if(retval) { - errno=retval; - retval=WAIT_FAILED; - event->nwaiters--; - goto DONE; - } - break; - default: - retval=pthread_cond_timedwait(&event->gtzero, &event->lock, &abstime); - if(retval) { - if(retval==ETIMEDOUT) - retval=WAIT_TIMEOUT; - else { - errno=retval; - retval=WAIT_FAILED; - } - event->nwaiters--; - goto DONE; - } - } - event->nwaiters--; - } - - DONE: - - if(retval==WAIT_OBJECT_0) { - if(!event->mreset) - event->value=FALSE; - } - - pthread_mutex_unlock(&event->lock); - - return retval; -} diff --git a/xpdev/xpevent.h b/xpdev/xpevent.h deleted file mode 100644 index 01972b9..0000000 --- a/xpdev/xpevent.h +++ /dev/null @@ -1,83 +0,0 @@ -/* xpevent.h */ - -/* *nix emulation of Win32 *Event API */ - -/* $Id: xpevent.h,v 1.6 2018/07/24 01:13:10 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XPEVENT_H_ -#define _XPEVENT_H_ - -#include <pthread.h> -#include "gen_defs.h" - -#if defined(__solaris__) -#include <xpsem.h> /* u_int32_t */ -#endif - -/* Opaque type definition. */ -struct xpevent; -typedef struct xpevent *xpevent_t; - -#if defined(__cplusplus) -extern "C" { -#endif -xpevent_t CreateEvent(void *sec, BOOL bManualReset, BOOL bInitialState, void *name); -BOOL SetEvent(xpevent_t event); -BOOL ResetEvent(xpevent_t event); -BOOL CloseEvent(xpevent_t event); -DWORD WaitForEvent(xpevent_t event, DWORD ms); -#if defined(__cplusplus) -} -#endif - -struct xpevent { -#define EVENT_MAGIC ((u_int32_t) 0x09fa4014) - u_int32_t magic; - pthread_mutex_t lock; - pthread_cond_t gtzero; - BOOL value; - BOOL mreset; - DWORD nwaiters; - void *cbdata; - BOOL (*verify)(void *); -}; - -#define INFINITE ((DWORD)(-1)) -enum { - WAIT_OBJECT_0 - ,WAIT_TIMEOUT - ,WAIT_FAILED -}; - -#endif diff --git a/xpdev/xpmap.c b/xpdev/xpmap.c deleted file mode 100644 index eaf002f..0000000 --- a/xpdev/xpmap.c +++ /dev/null @@ -1,158 +0,0 @@ -/* mmap() style cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "xpmap.h" -#include <stdlib.h> // malloc() - -#if defined(__unix__) - -#include <unistd.h> // close() -#include <fcntl.h> -#include <sys/mman.h> -#include <sys/types.h> -#include <sys/stat.h> - -struct xpmapping* xpmap(const char *filename, enum xpmap_type type) -{ - int fd; - void *addr=NULL; - int oflags; - int mflags; - int mprot; - struct stat sb; - struct xpmapping *ret; - - switch(type) { - case XPMAP_READ: - oflags=O_RDONLY; - mflags=0; - mprot=PROT_READ; - break; - case XPMAP_WRITE: - oflags=O_RDWR; - mflags=MAP_SHARED; - mprot=PROT_READ|PROT_WRITE; - break; - case XPMAP_COPY: - oflags=O_RDWR; - mflags=MAP_PRIVATE; - mprot=PROT_READ|PROT_WRITE; - break; - } - - fd=open(filename, oflags); - if(fd == -1) - return NULL; - if(fstat(fd, &sb)==-1) { - close(fd); - return NULL; - } - addr=mmap(NULL, sb.st_size, mprot, mflags, fd, 0); - if(addr==MAP_FAILED) { - close(fd); - return NULL; - } - ret=(struct xpmapping *)malloc(sizeof(struct xpmapping)); - if(ret==NULL) { - munmap(addr, sb.st_size); - close(fd); - return NULL; - } - ret->addr=addr; - ret->fd=fd; - ret->size=sb.st_size; - return ret; -} - -void xpunmap(struct xpmapping *map) -{ - munmap(map->addr, map->size); - close(map->fd); - free(map); -} - -#elif defined(_WIN32) - -struct xpmapping* xpmap(const char *filename, enum xpmap_type type) -{ - HFILE fd; - HANDLE md; - OFSTRUCT of; - UINT oflags; - DWORD mprot; - DWORD maccess; - DWORD size; - void *addr; - struct xpmapping *ret; - - switch(type) { - case XPMAP_READ: - oflags=OF_READ|OF_SHARE_DENY_NONE; - mprot=PAGE_READONLY; - maccess=FILE_MAP_READ; - break; - case XPMAP_WRITE: - oflags=OF_READWRITE|OF_SHARE_DENY_NONE; - mprot=PAGE_READWRITE; - maccess=FILE_MAP_WRITE; - break; - case XPMAP_COPY: - oflags=OF_READ|OF_SHARE_DENY_NONE; - mprot=PAGE_WRITECOPY; - maccess=FILE_MAP_COPY; - break; - } - - fd=OpenFile(filename, &of, oflags); - if(fd == HFILE_ERROR) - return NULL; - if((size=GetFileSize((HANDLE)fd, NULL))==INVALID_FILE_SIZE) - return NULL; - md=CreateFileMapping((HANDLE)fd, NULL, mprot, 0, size, NULL); - if(md==NULL) - return NULL; - addr=MapViewOfFile(md, maccess, 0, 0, size); - ret=(struct xpmapping *)malloc(sizeof(struct xpmapping)); - if(ret==NULL) { - CloseHandle(md); - UnmapViewOfFile(addr); - return NULL; - } - ret->addr=addr; - ret->fd=(HANDLE)fd; - ret->md=md; - ret->size=size; - return ret; -} - -void xpunmap(struct xpmapping *map) -{ - UnmapViewOfFile(map->addr); - CloseHandle(map->md); - CloseHandle(map->fd); - free(map); -} - -#else - - #error "Need mmap wrappers." - -#endif diff --git a/xpdev/xpmap.h b/xpdev/xpmap.h deleted file mode 100644 index 5f1ffd6..0000000 --- a/xpdev/xpmap.h +++ /dev/null @@ -1,61 +0,0 @@ -/* mmap() style cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XPMAP_H -#define _XPMAP_H - -#include "gen_defs.h" -#include "wrapdll.h" - -enum xpmap_type { - XPMAP_READ, - XPMAP_WRITE, - XPMAP_COPY -}; - -#if defined(__unix__) - -#include <sys/mman.h> -struct xpmapping { - void *addr; - int fd; - size_t size; -}; - -#elif defined(_WIN32) - -struct xpmapping { - void *addr; - HANDLE fd; - HANDLE md; - uint64_t size; -}; - -#else - - #error "Need mmap wrappers." - -#endif - -DLLEXPORT struct xpmapping* xpmap(const char *filename, enum xpmap_type type); -DLLEXPORT void xpunmap(struct xpmapping *map); - -#endif diff --git a/xpdev/xpprintf.c b/xpdev/xpprintf.c deleted file mode 100644 index 7f481e9..0000000 --- a/xpdev/xpprintf.c +++ /dev/null @@ -1,1483 +0,0 @@ -/* xpprintf.c */ -// vi: tabstop=4 - -/* Deuce's vs[n]printf() replacement */ - -/* $Id: xpprintf.c,v 1.62 2018/04/07 07:21:46 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#if defined(__linux__) && !defined(_GNU_SOURCE) - #define _GNU_SOURCE // asprintf() on Linux -#endif -#include <stdarg.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include "genwrap.h" /* alloca() */ - -#include "xpprintf.h" -#include "gen_defs.h" - -#if defined(_MSC_VER) || defined(__MSVCRT__) -int vasprintf(char **strptr, const char *format, va_list va) -{ - va_list va2; - int ret; - - if (strptr == NULL) - return -1; - va_copy(va2, va); - ret = _vscprintf(format, va); - *strptr = (char *)malloc(ret+1); - if (*strptr == NULL) { - va_end(va2); - return -1; - } - ret = vsprintf(*strptr, format, va2); - va_end(va2); - return ret; -} - -int asprintf(char **strptr, const char *format, ...) -{ - va_list va; - int ret; - - if (strptr == NULL) - return -1; - va_start(va, format); - ret=vasprintf(strptr, format, va); - va_end(va); - return ret; -} -#endif - -/* Maximum length of a format specifier including the % */ -#define MAX_FORMAT_LEN 256 - -void xp_asprintf_free(char *format) -{ - free(format); -} - -int xp_printf_get_type(const char *format) -{ - const char *p; - int modifier=0; - int j; - int correct_type=0; - - if(!*(size_t *)format) - return(0); - p=format+*(size_t *)format; - if(*p!='%') - return(0); - p++; - - /* - * Skip flags (zero or more) - */ - j=1; - while(j) { - switch(*p) { - case '#': - p++; - break; - case '-': - p++; - break; - case '+': - p++; - break; - case ' ': - p++; - break; - case '0': - p++; - break; - case '\'': - p++; - break; - default: - j=0; - break; - } - } - if(*p=='*') - return(XP_PRINTF_TYPE_INT); - while(*p>= '0' && *p <= '9') - p++; - if(*p=='.') { - p++; - if(*p=='*') - return(XP_PRINTF_TYPE_INT); - } - while(*p>= '0' && *p <= '9') - p++; - switch(*p) { - case 'h': - modifier='h'; - p++; - if(*p=='h') { - p++; - modifier+='h'<<8; - } - break; - case 'l': - modifier='l'; - p++; - if(*p=='l') { - p++; - modifier+='l'<<8; - } - break; - case 'j': - modifier='j'; - p++; - break; - case 't': - modifier='t'; - p++; - break; - case 'z': - modifier='z'; - p++; - break; - case 'L': - modifier='L'; - p++; - break; - } - /* - * The next char is now the type... if type is auto, - * set type to what it SHOULD be - */ - switch(*p) { - /* INT types */ - case 'd': - case 'i': - switch(modifier) { - case 'h'|'h'<<8: - correct_type=XP_PRINTF_TYPE_SCHAR; - break; - case 'h': - correct_type=XP_PRINTF_TYPE_SHORT; - break; - case 'l': - correct_type=XP_PRINTF_TYPE_LONG; - break; -#if defined(XP_PRINTF_TYPE_ULONGLONG) - case 'l'|'l'<<8: - correct_type=XP_PRINTF_TYPE_LONGLONG; - break; -#endif - case 'j': - correct_type=XP_PRINTF_TYPE_INTMAX; - break; - case 't': - correct_type=XP_PRINTF_TYPE_PTRDIFF; - break; - case 'z': - /* - * ToDo this is a signed type of same size - * as size_t - */ - correct_type=XP_PRINTF_TYPE_LONG; - break; - default: - correct_type=XP_PRINTF_TYPE_INT; - break; - } - break; - case 'o': - case 'u': - case 'x': - case 'X': - switch(modifier) { - case 'h'|'h'<<8: - correct_type=XP_PRINTF_TYPE_UCHAR; - break; - case 'h': - correct_type=XP_PRINTF_TYPE_USHORT; - break; - case 'l': - correct_type=XP_PRINTF_TYPE_ULONG; - break; -#if defined(XP_PRINTF_TYPE_ULONGLONG) - case 'l'|'l'<<8: - correct_type=XP_PRINTF_TYPE_ULONGLONG; - break; -#endif - case 'j': - correct_type=XP_PRINTF_TYPE_UINTMAX; - break; - case 't': - /* - * ToDo this is an unsigned type of same size - * as ptrdiff_t - */ - correct_type=XP_PRINTF_TYPE_ULONG; - break; - case 'z': - correct_type=XP_PRINTF_TYPE_SIZET; - break; - default: - correct_type=XP_PRINTF_TYPE_UINT; - break; - } - break; - case 'a': - case 'A': - case 'e': - case 'E': - case 'f': - case 'F': - case 'g': - case 'G': - switch(modifier) { - case 'L': - correct_type=XP_PRINTF_TYPE_LONGDOUBLE; - break; - case 'l': - default: - correct_type=XP_PRINTF_TYPE_DOUBLE; - break; - } - break; - case 'C': - /* ToDo wide chars... not yet supported */ - correct_type=XP_PRINTF_TYPE_CHAR; - break; - case 'c': - switch(modifier) { - case 'l': - /* ToDo wide chars... not yet supported */ - default: - correct_type=XP_PRINTF_TYPE_CHAR; - } - break; - case 'S': - /* ToDo wide chars... not yet supported */ - correct_type=XP_PRINTF_TYPE_CHARP; - break; - case 's': - switch(modifier) { - case 'l': - /* ToDo wide chars... not yet supported */ - default: - correct_type=XP_PRINTF_TYPE_CHARP; - } - break; - case 'p': - correct_type=XP_PRINTF_TYPE_VOIDP; - break; - } - return(correct_type); -} - -/* - * Performs the next replacement in format using the variable - * specified as the only vararg which is currently the type - * specified in type (defined in xpprintf.h). - * - * Does not currently support the $ argument selector. - * - * Currently, the type is not overly useful, but this could be used for - * automatic type conversions (ie: int to char *). Right now it just assures - * that the type passed to sprintf() is the type passed to - * xp_asprintf_next(). - */ -char* xp_asprintf_next(char *format, int type, ...) -{ - va_list vars; - char *p; - char *newbuf; - int i=0,j; - unsigned int ui=0; - long int l=0; - unsigned long int ul=0; -#if defined(XP_PRINTF_TYPE_LONGLONG) - long long int ll=0; - unsigned long long int ull=0; -#endif - double d=0; - long double ld=0; - char* cp=NULL; - void* pntr=NULL; - size_t s=0; - unsigned long offset=0; - unsigned long offset2=0; - size_t format_len; - size_t this_format_len; - char int_buf[MAX_FORMAT_LEN]; - char *entry; - char this_format[MAX_FORMAT_LEN]; - char *fmt; - int modifier=0; - int correct_type=0; - char num_str[128]; /* More than enough room for a 256-bit int */ - - /* - * Check if we're already done... - */ - if(!*(size_t *) format) - return(format); - - p=format+*(size_t *)format; - offset=p-format; - format_len=*(size_t *)(format+sizeof(size_t))+sizeof(size_t)*2+1; - this_format[0]=0; - fmt=this_format; - *(fmt++)=*(p++); - - /* - * Skip flags (zero or more) - */ - j=1; - while(j) { - switch(*p) { - case '#': - *(fmt++)=*(p++); - break; - case '-': - *(fmt++)=*(p++); - break; - case '+': - *(fmt++)=*(p++); - break; - case ' ': - *(fmt++)=*(p++); - break; - case '0': - *(fmt++)=*(p++); - break; - case '\'': - *(fmt++)=*(p++); - break; - default: - j=0; - break; - } - } - - /* - * If width is '*' then the argument is an int - * which specifies the width. - */ - if(*p=='*') { /* The argument is this width */ - va_start(vars, type); - i=sprintf(int_buf,"%d", va_arg(vars, int)); - va_end(vars); - if(i > 1) { - /* - * We must calculate this before we go mucking about - * with format and p - */ - offset2=p-format; - newbuf=(char *)realloc(format, format_len+i-1 /* -1 for the '*' that's already there */); - if(newbuf==NULL) - return(NULL); - format=newbuf; - p=format+offset2; - /* - * Move trailing end to make space... leaving the * where it - * is so it can be overwritten - */ - memmove(p+i, p+1, format-p+format_len-1); - memcpy(p, int_buf, i); - *(size_t *)(format+sizeof(size_t))+=i-1; - } - else - *p=int_buf[0]; - p=format+offset; - *(size_t *)format=p-format; - return(format); - } - /* Skip width */ - while(*p >= '0' && *p <= '9') - *(fmt++)=*(p++); - /* Check for precision */ - if(*p=='.') { - *(fmt++)=*(p++); - /* - * If the precision is '*' then the argument is an int which - * specifies the precision. - */ - if(*p=='*') { - va_start(vars, type); - i=sprintf(int_buf,"%d", va_arg(vars, int)); - va_end(vars); - if(i > 1) { - /* - * We must calculate this before we go mucking about - * with format and p - */ - offset2=p-format; - newbuf=(char *)realloc(format, format_len+i-1 /* -1 for the '*' that's already there */); - if(newbuf==NULL) - return(NULL); - format=newbuf; - p=format+offset2; - /* - * Move trailing end to make space... leaving the * where it - * is so it can be overwritten - */ - memmove(p+i, p+1, format-p+format_len-1); - memcpy(p, int_buf, i); - *(size_t *)(format+sizeof(size_t))+=i-1; - } - else - *p=int_buf[0]; - p=format+offset; - *(size_t *)format=p-format; - return(format); - } - /* Skip precision */ - while(*p >= '0' && *p <= '9') - *(fmt++)=*(p++); - } - - /* Skip/Translate length modifiers */ - /* - * ToDo: This could (should?) convert the standard ll modifier - * to the MSVC equivilant (I64 or something?) - * if you do this, the calculations using this_format_len will need - * rewriting. - */ - switch(*p) { - case 'h': - modifier='h'; - *(fmt++)=*(p++); - if(*p=='h') { - *(fmt++)=*(p++); - modifier+='h'<<8; - } - break; - case 'l': - modifier='l'; - *(fmt++)=*(p++); - if(*p=='l') { - *(fmt++)=*(p++); - modifier+='l'<<8; - } - break; - case 'j': - modifier='j'; - *(fmt++)=*(p++); - break; - case 't': - modifier='t'; - *(fmt++)=*(p++); - break; - case 'z': - modifier='z'; - *(fmt++)=*(p++); - break; - case 'L': - modifier='L'; - *(fmt++)=*(p++); - break; - } - - /* - * The next char is now the type... if type is auto, - * set type to what it SHOULD be - */ - if(type==XP_PRINTF_TYPE_AUTO || type & XP_PRINTF_CONVERT) { - switch(*p) { - /* INT types */ - case 'd': - case 'i': - switch(modifier) { - case 'h'|'h'<<8: - correct_type=XP_PRINTF_TYPE_SCHAR; - break; - case 'h': - correct_type=XP_PRINTF_TYPE_SHORT; - break; - case 'l': - correct_type=XP_PRINTF_TYPE_LONG; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case 'l'|'l'<<8: - correct_type=XP_PRINTF_TYPE_LONGLONG; - break; -#endif - case 'j': - correct_type=XP_PRINTF_TYPE_INTMAX; - break; - case 't': - correct_type=XP_PRINTF_TYPE_PTRDIFF; - break; - case 'z': - /* - * ToDo this is a signed type of same size - * as size_t - */ - correct_type=XP_PRINTF_TYPE_LONG; - break; - default: - correct_type=XP_PRINTF_TYPE_INT; - break; - } - break; - case 'o': - case 'u': - case 'x': - case 'X': - switch(modifier) { - case 'h'|'h'<<8: - correct_type=XP_PRINTF_TYPE_UCHAR; - break; - case 'h': - correct_type=XP_PRINTF_TYPE_USHORT; - break; - case 'l': - correct_type=XP_PRINTF_TYPE_ULONG; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case 'l'|'l'<<8: - correct_type=XP_PRINTF_TYPE_ULONGLONG; - break; -#endif - case 'j': - correct_type=XP_PRINTF_TYPE_UINTMAX; - break; - case 't': - /* - * ToDo this is an unsigned type of same size - * as ptrdiff_t - */ - correct_type=XP_PRINTF_TYPE_ULONG; - break; - case 'z': - correct_type=XP_PRINTF_TYPE_SIZET; - break; - default: - correct_type=XP_PRINTF_TYPE_UINT; - break; - } - break; - case 'a': - case 'A': - case 'e': - case 'E': - case 'f': - case 'F': - case 'g': - case 'G': - switch(modifier) { - case 'L': - correct_type=XP_PRINTF_TYPE_LONGDOUBLE; - break; - case 'l': - default: - correct_type=XP_PRINTF_TYPE_DOUBLE; - break; - } - break; - case 'C': - /* ToDo wide chars... not yet supported */ - correct_type=XP_PRINTF_TYPE_CHAR; - break; - case 'c': - switch(modifier) { - case 'l': - /* ToDo wide chars... not yet supported */ - default: - correct_type=XP_PRINTF_TYPE_CHAR; - } - break; - case 'S': - /* ToDo wide chars... not yet supported */ - correct_type=XP_PRINTF_TYPE_CHARP; - break; - case 's': - switch(modifier) { - case 'l': - /* ToDo wide chars... not yet supported */ - default: - correct_type=XP_PRINTF_TYPE_CHARP; - } - break; - case 'p': - correct_type=XP_PRINTF_TYPE_VOIDP; - break; - } - } - if(type==XP_PRINTF_TYPE_AUTO) - type=correct_type; - - /* - * Copy the arg to the passed type. - */ - va_start(vars, type); - switch(type & ~XP_PRINTF_CONVERT) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: /* Also includes char and short */ - i=va_arg(vars, int); - break; - case XP_PRINTF_TYPE_UINT: /* Also includes char and short */ - /* - * ToDo: If it's a %c, and the value is 0, should it output [null] - * or should it terminate the string? - */ - ui=va_arg(vars, unsigned int); - break; - case XP_PRINTF_TYPE_LONG: - l=va_arg(vars, long); - break; - case XP_PRINTF_TYPE_ULONG: - ul=va_arg(vars, unsigned long int); - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - ll=va_arg(vars, long long int); - break; - case XP_PRINTF_TYPE_ULONGLONG: - ull=va_arg(vars, unsigned long long int); - break; -#endif - case XP_PRINTF_TYPE_CHARP: - cp=va_arg(vars, char*); - break; - case XP_PRINTF_TYPE_DOUBLE: - d=va_arg(vars, double); - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - ld=va_arg(vars, long double); - break; - case XP_PRINTF_TYPE_VOIDP: - pntr=va_arg(vars, void*); - break; - case XP_PRINTF_TYPE_SIZET: - s=va_arg(vars, size_t); - break; - } - va_end(vars); - - if(type & XP_PRINTF_CONVERT) { - type=type & ~XP_PRINTF_CONVERT; - if(type != correct_type) { - switch(correct_type) { - case XP_PRINTF_TYPE_CHAR: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - break; - case XP_PRINTF_TYPE_UINT: - i=ui; - break; - case XP_PRINTF_TYPE_LONG: - i=l; - break; - case XP_PRINTF_TYPE_ULONG: - i=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - i=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - i=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - if(cp) - i=*cp; - else - i=0; - break; - case XP_PRINTF_TYPE_DOUBLE: - i=(int)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - i=(int)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - i=(long)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - i=s; - break; - } - break; - case XP_PRINTF_TYPE_INT: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - break; - case XP_PRINTF_TYPE_UINT: - i=ui; - break; - case XP_PRINTF_TYPE_LONG: - i=l; - break; - case XP_PRINTF_TYPE_ULONG: - i=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - i=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - i=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - i=strtol(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - i=(int)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - i=(int)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - i=(long)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - i=s; - break; - } - break; - case XP_PRINTF_TYPE_UINT: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - ui=i; - break; - case XP_PRINTF_TYPE_UINT: - break; - case XP_PRINTF_TYPE_LONG: - ui=l; - break; - case XP_PRINTF_TYPE_ULONG: - ui=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - ui=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - ui=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - ui=strtoul(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - ui=(unsigned)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - ui=(unsigned)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - ui=(unsigned long)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - ui=s; - break; - } - break; - case XP_PRINTF_TYPE_LONG: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - l=i; - break; - case XP_PRINTF_TYPE_UINT: - l=ui; - break; - case XP_PRINTF_TYPE_LONG: - break; - case XP_PRINTF_TYPE_ULONG: - l=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - l=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - l=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - l=strtol(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - l=(long)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - l=(long)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - l=(long)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - l=s; - break; - } - break; - case XP_PRINTF_TYPE_ULONG: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - ul=i; - break; - case XP_PRINTF_TYPE_UINT: - ul=ui; - break; - case XP_PRINTF_TYPE_LONG: - ul=l; - break; - case XP_PRINTF_TYPE_ULONG: - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - ul=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - ul=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - ul=strtoul(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - ul=(unsigned long)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - ul=(unsigned long)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - ul=(unsigned long)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - ul=s; - break; - } - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - ll=i; - break; - case XP_PRINTF_TYPE_UINT: - ll=ui; - break; - case XP_PRINTF_TYPE_LONG: - ll=l; - break; - case XP_PRINTF_TYPE_ULONG: - ll=ul; - break; - case XP_PRINTF_TYPE_LONGLONG: - break; - case XP_PRINTF_TYPE_ULONGLONG: - ll=ull; - break; - case XP_PRINTF_TYPE_CHARP: - ll=strtoll(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - ll=d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - ll=ld; - break; - case XP_PRINTF_TYPE_VOIDP: - ll=(long long)((intptr_t)pntr); - break; - case XP_PRINTF_TYPE_SIZET: - ll=s; - break; - } - break; - case XP_PRINTF_TYPE_ULONGLONG: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - ull=i; - break; - case XP_PRINTF_TYPE_UINT: - ull=ui; - break; - case XP_PRINTF_TYPE_LONG: - ull=l; - break; - case XP_PRINTF_TYPE_ULONG: - ull=ul; - break; - case XP_PRINTF_TYPE_LONGLONG: - ull=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - break; - case XP_PRINTF_TYPE_CHARP: - ull=strtoull(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - ull=d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - ull=ld; - break; - case XP_PRINTF_TYPE_VOIDP: - ull=(unsigned long long int)((uintptr_t)pntr); - break; - case XP_PRINTF_TYPE_SIZET: - ull=s; - break; - } - break; -#endif - case XP_PRINTF_TYPE_CHARP: - num_str[0]=0; - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - sprintf(num_str, "%d", i); - cp=num_str; - break; - case XP_PRINTF_TYPE_UINT: - sprintf(num_str, "%u", i); - cp=num_str; - break; - case XP_PRINTF_TYPE_LONG: - sprintf(num_str, "%ld", l); - cp=num_str; - break; - case XP_PRINTF_TYPE_ULONG: - sprintf(num_str, "%lu", ul); - cp=num_str; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - /* ToDo MSVC doesn't like this */ - sprintf(num_str, "%lld", ll); - cp=num_str; - break; - case XP_PRINTF_TYPE_ULONGLONG: - /* ToDo MSVC doesn't like this */ - sprintf(num_str, "%llu", ull); - cp=num_str; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - break; - case XP_PRINTF_TYPE_DOUBLE: - sprintf(num_str, "%f", d); - cp=num_str; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - sprintf(num_str, "%Lf", ld); - cp=num_str; - break; - case XP_PRINTF_TYPE_VOIDP: - /* ToDo: Or should this pretend it's a char *? */ - sprintf(num_str, "%p", pntr); - cp=num_str; - break; - case XP_PRINTF_TYPE_SIZET: - sprintf(num_str, "%zu", s); - cp=num_str; - break; - } - break; - case XP_PRINTF_TYPE_DOUBLE: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - d=i; - break; - case XP_PRINTF_TYPE_UINT: - d=ui; - break; - case XP_PRINTF_TYPE_LONG: - d=l; - break; - case XP_PRINTF_TYPE_ULONG: - d=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - d=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - d=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - d=strtod(cp, NULL); - break; - case XP_PRINTF_TYPE_DOUBLE: - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - d=ld; - break; - case XP_PRINTF_TYPE_VOIDP: - d=(double)((long int)pntr); - break; - case XP_PRINTF_TYPE_SIZET: - d=s; - break; - } - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - ld=i; - break; - case XP_PRINTF_TYPE_UINT: - ld=ui; - break; - case XP_PRINTF_TYPE_LONG: - ld=l; - break; - case XP_PRINTF_TYPE_ULONG: - ld=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - ld=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - ld=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - /* strtold() isn't ubiquitous yet */ - ld=strtod(cp, NULL); - break; - case XP_PRINTF_TYPE_DOUBLE: - ld=d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - break; - case XP_PRINTF_TYPE_VOIDP: - ld=(long double)((long int)pntr); - break; - case XP_PRINTF_TYPE_SIZET: - ld=s; - break; - } - break; - case XP_PRINTF_TYPE_VOIDP: - /* ToDo: this is nasty... */ - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - pntr=(void *)((intptr_t)i); - break; - case XP_PRINTF_TYPE_UINT: - pntr=(void *)((uintptr_t)ui); - break; - case XP_PRINTF_TYPE_LONG: - pntr=(void *)((intptr_t)l); - break; - case XP_PRINTF_TYPE_ULONG: - pntr=(void *)((uintptr_t)ul); - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - pntr=(void *)((intptr_t)ll); - break; - case XP_PRINTF_TYPE_ULONGLONG: - pntr=(void *)((uintptr_t)ull); - break; -#endif - case XP_PRINTF_TYPE_CHARP: - pntr=(void *)(cp); - break; - case XP_PRINTF_TYPE_DOUBLE: - pntr=(void *)((intptr_t)d); - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - pntr=(void *)((intptr_t)ld); - break; - case XP_PRINTF_TYPE_VOIDP: - break; - case XP_PRINTF_TYPE_SIZET: - pntr=(void *)((intptr_t)s); - break; - } - break; - case XP_PRINTF_TYPE_SIZET: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - s=i; - break; - case XP_PRINTF_TYPE_UINT: - s=ui; - break; - case XP_PRINTF_TYPE_LONG: - s=l; - break; - case XP_PRINTF_TYPE_ULONG: - s=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - s=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - s=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - s=strtol(cp, NULL, 0); /* was strtoll */ - break; - case XP_PRINTF_TYPE_DOUBLE: - s=(size_t)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - s=(size_t)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - s=(size_t)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - break; - } - break; - } - type=correct_type; - } - } - - /* The next char is now the type... check the length required to spore the printf()ed string */ - *(fmt++)=*p; - *fmt=0; - entry=NULL; - switch(type) { - case XP_PRINTF_TYPE_CHAR: /* Also includes char and short */ - case XP_PRINTF_TYPE_INT: /* Also includes char and short */ - j=asprintf(&entry, this_format, i); - break; - case XP_PRINTF_TYPE_UINT: /* Also includes char and short */ - j=asprintf(&entry, this_format, ui); - break; - case XP_PRINTF_TYPE_LONG: - j=asprintf(&entry, this_format, l); - break; - case XP_PRINTF_TYPE_ULONG: - j=asprintf(&entry, this_format, ul); - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - j=asprintf(&entry, this_format, ll); - break; - case XP_PRINTF_TYPE_ULONGLONG: - j=asprintf(&entry, this_format, ull); - break; -#endif - case XP_PRINTF_TYPE_CHARP: - if(cp==NULL) - j=asprintf(&entry, this_format, "<null>"); - else - j=asprintf(&entry, this_format, cp); - break; - case XP_PRINTF_TYPE_DOUBLE: - j=asprintf(&entry, this_format, d); - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - j=asprintf(&entry, this_format, ld); - break; - case XP_PRINTF_TYPE_VOIDP: - j=asprintf(&entry, this_format, pntr); - break; - case XP_PRINTF_TYPE_SIZET: - j=asprintf(&entry, this_format, s); - break; - default: - j = -1; - entry = NULL; - break; - } - - if (j<0) { - FREE_AND_NULL(entry); - entry = strdup("<error>"); - j=strlen(entry); - } - - this_format_len=strlen(this_format); - if(j>=0) { - /* - * This isn't necessary if it's already the right size, - * or it's too large... this realloc() should only need to grow - * the string. - */ - if(format_len < (format_len-this_format_len+j)) { - newbuf=(char *)realloc(format, format_len-this_format_len+j); - if(newbuf==NULL) { - FREE_AND_NULL(entry); - return(NULL); - } - format=newbuf; - } - /* Move trailing end to make space */ - memmove(format+offset+j, format+offset+this_format_len, format_len-offset-this_format_len); - memcpy(format+offset, entry, j); - p=format+offset+j; - } - else - p=format+offset+this_format_len; - FREE_AND_NULL(entry); - - *(size_t *)(format+sizeof(size_t))=format_len-this_format_len+j-sizeof(size_t)*2-1; - - /* - * Search for next non-%% separateor and set offset - * to zero if none found for wrappers to know when - * they're done. - */ - for(; *p; p++) { - if(*p=='%') { - if(*(p+1) == '%') - p++; - else - break; - } - } - if(!*p) - *(size_t *)format=0; - else - *(size_t *)format=p-format; - return(format); -} - -char* xp_asprintf_start(const char *format) -{ - char *ret; - char *p; - - ret=(char *)malloc(strlen(format)+1+((sizeof(size_t)*2))); - if(ret==NULL) - return(NULL); - /* Place current offset at the start of the buffer */ - strcpy(ret+sizeof(size_t)*2,format); - /* Place the current length after the offset */ - *(size_t *)(ret+sizeof(size_t))=strlen(format); - - /* - * Find the next non %% format, leaving %% as it is - */ - for(p=ret+sizeof(size_t)*2; *p; p++) { - if(*p=='%') { - if(*(p+1) == '%') - p++; - else - break; - } - } - if(!*p) - *(size_t *)ret=0; - else - *(size_t *)ret=p-ret; - return(ret); -} - -char* xp_asprintf_end(char *format, size_t *lenret) -{ - char *p; - size_t len; - size_t end_len; - - len=*(size_t *)(format+sizeof(size_t)); - end_len=len; - for(p=format+sizeof(size_t)*2; len; p++, len--) { - if(*p=='%' && *(p+1)=='%') { - memmove(p, p+1, len--); - end_len--; - } - } - memmove(format, format+sizeof(size_t)*2, end_len+1); - if(lenret) - *lenret=end_len; - return(format); -} - -char* xp_vasprintf(const char *format, va_list va) -{ - char *working; - char *next; - int type; - - next=xp_asprintf_start(format); - if(next==NULL) - return(NULL); - working=next; - while(*(size_t *)working) { - type=xp_printf_get_type(working); - switch(type) { - case 0: - free(working); - return(NULL); - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: /* Also includes char and short */ - next=xp_asprintf_next(working, type, va_arg(va, int)); - break; - case XP_PRINTF_TYPE_UINT: /* Also includes char and short */ - next=xp_asprintf_next(working, type, va_arg(va, unsigned int)); - break; - case XP_PRINTF_TYPE_LONG: - next=xp_asprintf_next(working, type, va_arg(va, long)); - break; - case XP_PRINTF_TYPE_ULONG: - next=xp_asprintf_next(working, type, va_arg(va, unsigned long)); - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - next=xp_asprintf_next(working, type, va_arg(va, long long)); - break; - case XP_PRINTF_TYPE_ULONGLONG: - next=xp_asprintf_next(working, type, va_arg(va, unsigned long long)); - break; -#endif - case XP_PRINTF_TYPE_CHARP: - next=xp_asprintf_next(working, type, va_arg(va, char *)); - break; - case XP_PRINTF_TYPE_DOUBLE: - next=xp_asprintf_next(working, type, va_arg(va, double)); - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - next=xp_asprintf_next(working, type, va_arg(va, long double)); - break; - case XP_PRINTF_TYPE_VOIDP: - next=xp_asprintf_next(working, type, va_arg(va, void *)); - break; - case XP_PRINTF_TYPE_SIZET: - next=xp_asprintf_next(working, type, va_arg(va, size_t)); - break; - } - if(next==NULL) { - free(working); - return(NULL); - } - working=next; - } - next=xp_asprintf_end(working, NULL); - if(next==NULL) { - free(working); - return(NULL); - } - return(next); -} - -char* xp_asprintf(const char *format, ...) -{ - char *ret; - va_list va; - - va_start(va, format); - ret=xp_vasprintf(format, va); - va_end(va); - return(ret); -} - -#if defined(XP_PRINTF_TEST) - -int main(int argc, char *argv[]) -{ - char *format; - char *p; - int i,j; -#if defined(XP_PRINTF_TYPE_LONGLONG) - long long L; -#endif - long l; - char *cp; - double d; - float f; - long double D; - - p=xp_asprintf("%%%%%*.*f %% %%%ss %cs %*.*lu",3,3,123.123456789,"%llutesting%",32,3,3,123); - printf("%s\n",p); - free(p); - if(argc < 2) - return(1); - - format=argv[1]; - format=xp_asprintf_start(format); - for(j=2; j<argc; j++) { - switch(argv[j][0]) { - case 'f': - f=(float)atof(argv[j]+1); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_FLOAT,f); - break; - case 'd': - d=atof(argv[j]+1); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_DOUBLE,d); - break; - case 'D': - /* Don't know of a thing that converts a string to a long double */ - D=atof(argv[j]+1); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_LONGDOUBLE,D); - break; - case 'i': - i=atoi(argv[j]+1); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,i); - break; - case 'l': - l=atol(argv[j]+1); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_LONG,l); - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case 'L': - L=strtoll(argv[j]+1, NULL, 10); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_LONGLONG,L); - break; -#endif - case 's': - cp=argv[j]+1; - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_CHARP,cp); - break; - } - if(p==NULL) { - printf("Failed converting on item after %s\n",format); - return(1); - } - format=p; - } - p=xp_asprintf_end(format, NULL); - printf("At end, value is: '%s'\n",p); - free(p); -} - -#endif diff --git a/xpdev/xpprintf.h b/xpdev/xpprintf.h deleted file mode 100644 index 940c68e..0000000 --- a/xpdev/xpprintf.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Deuce's vs[n]printf() replacement */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library 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 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XPPRINTF_H_ -#define _XPPRINTF_H_ - -#include <stdarg.h> -#include "wrapdll.h" - -/* Supported printf argument types */ -#define XP_PRINTF_TYPE_AUTO 0 -#define XP_PRINTF_TYPE_INT 1 -#define XP_PRINTF_TYPE_UINT 2 -#define XP_PRINTF_TYPE_CHAR 3 /* Assumes a signed char */ -#define XP_PRINTF_TYPE_SCHAR XP_PRINTF_TYPE_INT -#define XP_PRINTF_TYPE_UCHAR XP_PRINTF_TYPE_UINT -#define XP_PRINTF_TYPE_SHORT XP_PRINTF_TYPE_INT -#define XP_PRINTF_TYPE_USHORT XP_PRINTF_TYPE_UINT -#define XP_PRINTF_TYPE_LONG 4 -#define XP_PRINTF_TYPE_ULONG 5 -#if !defined(_MSC_VER) && !defined(__BORLANDC__) - #define XP_PRINTF_TYPE_LONGLONG 6 - #define XP_PRINTF_TYPE_ULONGLONG 7 -#endif -#define XP_PRINTF_TYPE_CHARP 8 -#define XP_PRINTF_TYPE_DOUBLE 9 -#define XP_PRINTF_TYPE_FLOAT XP_PRINTF_TYPE_DOUBLE /* Floats are promoted to doubles */ -#define XP_PRINTF_TYPE_LONGDOUBLE 10 -#define XP_PRINTF_TYPE_VOIDP 11 -#define XP_PRINTF_TYPE_INTMAX 12 /* Not currently implemented */ -#define XP_PRINTF_TYPE_UINTMAX 13 /* Not currently implemented */ -#define XP_PRINTF_TYPE_PTRDIFF 14 /* Not currently implemented */ -#define XP_PRINTF_TYPE_SIZET 15 - -#define XP_PRINTF_CONVERT (1<<31) /* OR with type to request a conversion - Not implemented */ - -#if defined(__cplusplus) -extern "C" { -#endif -DLLEXPORT void xp_asprintf_free(char *format); -DLLEXPORT char* xp_asprintf_start(const char *format); -DLLEXPORT char* xp_asprintf_next(char *format, int type, ...); -DLLEXPORT char* xp_asprintf_end(char *format, size_t *endlen); -DLLEXPORT char* xp_asprintf(const char *format, ...); -DLLEXPORT char* xp_vasprintf(const char *format, va_list va); -DLLEXPORT int xp_printf_get_type(const char *format); -#if defined(_MSC_VER) || defined(__MSVCRT__) || defined(__BORLANDC__) -DLLEXPORT int vasprintf(char **strptr, const char *format, va_list va); -DLLEXPORT int asprintf(char **strptr, const char *format, ...); -#endif - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/xpdev/xpsem.c b/xpdev/xpsem.c deleted file mode 100644 index 2c63ce7..0000000 --- a/xpdev/xpsem.c +++ /dev/null @@ -1,295 +0,0 @@ -/* - * $Id: xpsem.c,v 1.13 2012/01/26 01:44:02 deuce Exp $ - * - * Copyright (C) 2000 Jason Evans <jasone@freebsd.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice(s), this list of conditions and the following disclaimer as - * the first lines of this file unmodified other than the possible - * addition of one or more copyright notices. - * 2. Redistributions in binary form must reproduce the above copyright - * notice(s), this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/lib/libc_r/uthread/uthread_sem.c,v 1.3.2.1 2000/07/18 02:05:57 jasone Exp $ - */ - -#include <errno.h> -#include "xpsem.h" -#include <pthread.h> -#include <sys/time.h> -#include <stdlib.h> -#include "gen_defs.h" -#include "genwrap.h" - -int -xp_sem_init(xp_sem_t *sem, int pshared, unsigned int value) -{ - int retval; - - /* - * Range check the arguments. - */ - if (pshared != 0) { - /* - * The user wants a semaphore that can be shared among - * processes, which this implementation can't do. Sounds like a - * permissions problem to me (yeah right). - */ - errno = EPERM; - retval = -1; - goto RETURN; - } - - if (value > XP_SEM_VALUE_MAX) { - errno = EINVAL; - retval = -1; - goto RETURN; - } - - *sem = (xp_sem_t)malloc(sizeof(struct xp_sem)); - if (*sem == NULL) { - errno = ENOSPC; - retval = -1; - goto RETURN; - } - - /* - * Initialize the semaphore. - */ - if (pthread_mutex_init(&(*sem)->lock, NULL) != 0) { - free(*sem); - errno = ENOSPC; - retval = -1; - goto RETURN; - } - - if (pthread_cond_init(&(*sem)->gtzero, NULL) != 0) { - while(pthread_mutex_destroy(&(*sem)->lock)==EBUSY) - SLEEP(1); - free(*sem); - errno = ENOSPC; - retval = -1; - goto RETURN; - } - - (*sem)->count = (uint32_t)value; - (*sem)->nwaiters = 0; - (*sem)->magic = XP_SEM_MAGIC; - - retval = 0; - RETURN: - return retval; -} - -int -xp_sem_destroy(xp_sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - /* Make sure there are no waiters. */ - pthread_mutex_lock(&(*sem)->lock); - if ((*sem)->nwaiters > 0) { - pthread_mutex_unlock(&(*sem)->lock); - errno = EBUSY; - retval = -1; - goto RETURN; - } - pthread_mutex_unlock(&(*sem)->lock); - - while(pthread_mutex_destroy(&(*sem)->lock)==EBUSY) - SLEEP(1); - while(pthread_cond_destroy(&(*sem)->gtzero)==EBUSY) - SLEEP(1); - (*sem)->magic = 0; - - free(*sem); - - retval = 0; - RETURN: - return retval; -} - -xp_sem_t * -xp_sem_open(const char *name, int oflag, ...) -{ - errno = ENOSYS; - return XP_SEM_FAILED; -} - -int -xp_sem_close(xp_sem_t *sem) -{ - errno = ENOSYS; - return -1; -} - -int -xp_sem_unlink(const char *name) -{ - errno = ENOSYS; - return -1; -} - -int -xp_sem_wait(xp_sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - - while ((*sem)->count == 0) { - (*sem)->nwaiters++; - pthread_cond_wait(&(*sem)->gtzero, &(*sem)->lock); - (*sem)->nwaiters--; - } - (*sem)->count--; - - pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - - return retval; -} - -int -xp_sem_trywait(xp_sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - - if ((*sem)->count > 0) { - (*sem)->count--; - retval = 0; - } else { - errno = EAGAIN; - retval = -1; - } - - pthread_mutex_unlock(&(*sem)->lock); - - RETURN: - return retval; -} - -int -xp_sem_post(xp_sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - - (*sem)->count++; - if ((*sem)->nwaiters > 0) { - /* - * We must use pthread_cond_broadcast() rather than - * pthread_cond_signal() in order to assure that the highest - * priority thread is run by the scheduler, since - * pthread_cond_signal() signals waiting threads in FIFO order. - */ - pthread_cond_broadcast(&(*sem)->gtzero); - } - - pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - return retval; -} - -int -xp_sem_getvalue(xp_sem_t *sem, int *sval) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - *sval = (int)(*sem)->count; - pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - return retval; -} - -int -xp_sem_setvalue(xp_sem_t *sem, int sval) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - (*sem)->count=(uint32_t)sval; - if (((*sem)->nwaiters > 0) && sval) { - /* - * We must use pthread_cond_broadcast() rather than - * pthread_cond_signal() in order to assure that the highest - * priority thread is run by the scheduler, since - * pthread_cond_signal() signals waiting threads in FIFO order. - */ - pthread_cond_broadcast(&(*sem)->gtzero); - } - pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - return retval; -} - -int -xp_sem_timedwait(xp_sem_t *sem, const struct timespec *abs_timeout) -{ - int retval=0; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - - while ((*sem)->count == 0) { - (*sem)->nwaiters++; - retval=pthread_cond_timedwait(&(*sem)->gtzero, &(*sem)->lock, abs_timeout); - (*sem)->nwaiters--; - if(retval) { - errno=retval; - retval=-1; - break; - } - } - if(retval==0) - (*sem)->count--; - - pthread_mutex_unlock(&(*sem)->lock); - - RETURN: - - return retval; -} diff --git a/xpdev/xpsem.h b/xpdev/xpsem.h deleted file mode 100644 index 1caa83c..0000000 --- a/xpdev/xpsem.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef _XPSEM_H_ -#define _XPSEM_H_ - -/* - * $Id: xpsem.h,v 1.10 2012/01/26 01:44:02 deuce Exp $ - * - * semaphore.h: POSIX 1003.1b semaphores -*/ - -/*- - * Copyright (c) 1996, 1997 - * HD Associates, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by HD Associates, Inc - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD: src/sys/posix4/semaphore.h,v 1.6 2000/01/20 07:55:42 jasone Exp $ - */ - -#include <limits.h> - -#include <sys/types.h> -#include <fcntl.h> -#include <pthread.h> -#include <inttypes.h> - -/* Opaque type definition. */ -struct xp_sem; -typedef struct xp_sem *xp_sem_t; - -#define XP_SEM_FAILED ((xp_sem_t *)0) -#define XP_SEM_VALUE_MAX UINT_MAX - -#if defined(__solaris__) -typedef unsigned int uint32_t; -#endif - -#if defined(__cplusplus) -extern "C" { -#endif -int xp_sem_init (xp_sem_t *, int, unsigned int); -int xp_sem_destroy (xp_sem_t *); -xp_sem_t *xp_sem_open (const char *, int, ...); -int xp_sem_close (xp_sem_t *); -int xp_sem_unlink (const char *); -int xp_sem_wait (xp_sem_t *); -int xp_sem_trywait (xp_sem_t *); -int xp_sem_post (xp_sem_t *); -int xp_sem_getvalue (xp_sem_t *, int *); -int xp_sem_setvalue (xp_sem_t *, int); -int xp_sem_timedwait (xp_sem_t *sem, const struct timespec *abs_timeout); -#if defined(__cplusplus) -} -#endif - -/* -* $Id: xpsem.h,v 1.10 2012/01/26 01:44:02 deuce Exp $ -*/ - -/* Begin thread_private.h kluge */ -/* - * These come out of (or should go into) thread_private.h - rather than have - * to copy (or symlink) the files from the source tree these definitions are - * inlined here. Obviously these go away when this module is part of libc. -*/ - -struct xp_sem { -#define XP_SEM_MAGIC ((uint32_t) 0x09fa4012) - uint32_t magic; - pthread_mutex_t lock; - pthread_cond_t gtzero; - uint32_t count; - uint32_t nwaiters; -}; - -extern pthread_once_t _thread_init_once; -extern int _threads_initialized; -extern void _thread_init (void); -#define THREAD_INIT() \ - (void) pthread_once(&_thread_init_once, _thread_init) -#define THREAD_SAFE() \ - (_threads_initialized != 0) - -#define _SEM_CHECK_VALIDITY(sem) \ - if (sem==NULL || (*(sem))->magic != XP_SEM_MAGIC) { \ - errno = EINVAL; \ - retval = -1; \ - goto RETURN; \ - } - -struct pthread_rwlockattr { - int pshared; - }; - -/* End thread_private.h kluge */ - -#endif /* _XPSEM_H_ */ diff --git a/xpdev/xptime.c b/xpdev/xptime.c deleted file mode 100644 index faa51a6..0000000 --- a/xpdev/xptime.c +++ /dev/null @@ -1,98 +0,0 @@ -/* $Id: xptime.c,v 1.4 2018/02/14 20:44:00 deuce Exp $ */ - -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <string.h> -#ifndef __unix__ -#include <dos.h> -#endif -#include <ctype.h> -#define USE_SNPRINTF /* we don't need safe_snprintf for this project */ -#include "genwrap.h" -#include "datewrap.h" -#include "xpdatetime.h" - -int main(int argc, char **argv) -{ - char str[256]; - char revision[16]; - time_t t; - struct tm* tp; - struct tm tm; - int argn=1; - xpDateTime_t xpDateTime; - - printf("\n"); - DESCRIBE_COMPILER(str); - sscanf("$Revision: 1.4 $", "%*s %s", revision); - - printf("Rev %s Built " __DATE__ " " __TIME__ " with %s\n\n", revision, str); - - if(argc<2) - printf("usage: xptime [-z] <date_str || time_t>\n\n"); - - if(argc>1 && stricmp(argv[1],"-z")==0) { /* zulu/GMT/UTC timezone */ - printf("Setting timezone to Zulu/GMT/UTC\n\n"); - putenv("TZ=UTC0"); - argn++; - } - tzset(); - - if((t=checktime())!=0L) - printf("!time() result diverges from standard by: %ld seconds\n\n",t); - - printf("Current timezone: %d\n", xpTimeZone_local()); - printf("\n"); - - if(argc>argn && strlen(argv[argn]) > 10) { - xpDateTime=isoDateTimeStr_parse(argv[argn]); - t=xpDateTime_to_time(xpDateTime); - printf("Using specified date and time:\n"); - } else if(argc>argn) { - printf("Using specified time_t value:\n"); - t=strtoul(argv[argn],NULL,0); - xpDateTime=time_to_xpDateTime(t,xpTimeZone_LOCAL); - } else { - printf("Using current time:\n"); - xpDateTime=xpDateTime_now(); - t=time(NULL); - } - printf("%-8s %-10ld (0x%08lX) ISO %s\n" - ,"time_t" - ,(long)t, (long)t - ,xpDateTime_to_isoDateTimeStr(xpDateTime - ,NULL, " ", NULL - ,/* precision: */3 - , str, sizeof(str))); - { - const char* fmt="%-8s %.24s ISO %s\n"; - - if((tp=localtime_r(&t, &tm))==NULL) - printf("localtime() failure\n"); - else - printf(fmt - ,"local" - ,asctime(tp) - ,xpDateTime_to_isoDateTimeStr( - time_to_xpDateTime(t, xpTimeZone_LOCAL) - ,NULL, " ", NULL - ,/*precision: */0 - ,str, sizeof(str)) - ); - if((tp=gmtime_r(&t, &tm))==NULL) - printf("gmtime() failure\n"); - else - printf(fmt - ,"GMT" - ,asctime(tp) - ,xpDateTime_to_isoDateTimeStr( - gmtime_to_xpDateTime(t) - ,NULL, " ", NULL - ,/*precision: */0 - ,str, sizeof(str)) - ); - } - - return(0); -} -- GitLab