From 6842a43a3170c6f7a852186d5688baebdac16e2c Mon Sep 17 00:00:00 2001 From: erco77 Date: Tue, 14 Nov 2023 07:01:52 -0800 Subject: Fl_Terminal widget (#800) Pull Fl_Terminal widget from Greg's fork --- test/terminal.fl | 1972 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1972 insertions(+) create mode 100644 test/terminal.fl (limited to 'test/terminal.fl') diff --git a/test/terminal.fl b/test/terminal.fl new file mode 100644 index 000000000..920bfc0b3 --- /dev/null +++ b/test/terminal.fl @@ -0,0 +1,1972 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0400 +utf8_in_src +header_name {.h} +code_name {.cxx} +comment {DEVELOPER README + +APPLICATION +----------- +The Application class encompasses the entire application, +and has the widget hierarchy declared by main_window(). + +SELF TESTS +---------- +The "self tests" are all named test_xxx(), and are static +functions because they were designed that way originally +(testterm.cxx), so they remain static. + +They only need access to the global G_tty to access the +terminal for printing, and handle their own state +information. + +To add /new/ tests: +1. Create the test function similar to existing test_xxx(). +2. Add the function's name to the NextEscapeTest() function's +This makes the new test become part of the self tests. + +NextEscapeTest() keeps track of the last test shown as +a static value internally, and the integer argument +tells it how to advance to the next test, either fwd or back. + +The tests themselves may keep state information, so that +a single test might have several pages. The return value +determines whether to recall the test again, or if it's +on the last page. + +} {in_source not_in_header +} + +decl {\#include } {public global +} + +decl {\#include // rand()} {private global +} + +decl {\#include } {public global +} + +decl {\#include } {public global +} + +decl {\#include } {public global +} + +decl {\#include } {public global +} + +decl {\#include } {public global +} + +decl {\#include } {public global +} + +decl {\#ifdef _WIN32} {public global +} + +decl {\#include // _read()} {public global +} + +decl {\#else} {public global +} + +decl {\#include // read()} {public global +} + +decl {\#endif} {public global +} + +decl {MyTerminal *G_tty;} { + comment {Global access to tty} private global +} + +decl {Application *G_app;} { + comment {Global access to application} private global +} + +decl {////// TERMINAL RING BUFFER DEBUG CLASS //////} {private local +} + +class MyTerminal { + comment {Fl_Terminal derived class that can access ring buffer internals for debugging} open : {public Fl_Terminal} +} { + decl {Fl_Double_Window *ring_debug_win;} {private local + } + decl {Fl_Terminal *debug_tty;} {private local + } + decl {bool interactivecursor;} {private local + } + Function {MyTerminal(int X,int Y,int W,int H, const char *L=0):Fl_Terminal(X,Y,W,H,L)} { + comment CTOR open + } { + code {ring_debug_win = 0; +debug_tty = 0; +interactivecursor = false;} {} + } + Function {show_ring_debug_window()} {open return_type void + } { + code {// Show the internal ring debug window +if (!ring_debug_win) { + ring_debug_win = new Fl_Double_Window(1250,800,"Fl_Terminal Ring Buffer"); + ring_debug_win->resizable(ring_debug_win); + ring_debug_win->callback(debug_winquit_callback, (void*)this); + debug_tty = new Fl_Terminal(0,0,ring_debug_win->w(),ring_debug_win->h()); + debug_tty->textsize(7); + debug_tty->redraw_style(NO_REDRAW); + debug_tty->display_columns(400); + ring_debug_win->end(); +} +ring_debug_win->show(); +// Start timer to update ring debug updates +Fl::add_timeout(.5, ring_debug_timer_callback, (void*)this);} {} + } + Function {interactive_cursor(bool val)} { + comment {Enable/disable interactive cursor movement in test app} open return_type void + } { + code {interactivecursor = val;} {} + } + Function {debug_winquit_callback2()} {return_type void + } { + code {// Hide debug window, disable its update timer +ring_debug_win->hide(); +Fl::remove_timeout(ring_debug_timer_callback, (void*)this);} {} + } + Function {debug_winquit_callback(Fl_Widget*,void *userdata)} {return_type {static void} + } { + code {MyTerminal *o = (MyTerminal*)userdata; +o->debug_winquit_callback2();} {} + } + Function {horiz_bracket(int w)} { + comment {Print a graphic horizontally oriented bracket of width w} return_type void + } { + code {debug_tty->append("┏"); +for (int t=0; tprint_char("━"); } +debug_tty->append("┓");} {} + } + Function {update_ring()} {open return_type void + } { + code {// Handle updating the ring debug window's contents +int m1,m2,m3,m4; +get_selection(m1,m2,m3,m4); + +// These reference the Fl_Terminal base class protected members +int x = 5; +debug_tty->append("\\033c"); // reset terminal (clear screen, history, home) +debug_tty->append("\\033[s"); // save cursor +debug_tty->printf("\\033[%dC \\033[7m Ring Index \\033[0m\\n", x); +debug_tty->printf("\\033[%dC ring_rows(): %-3d Mouse Selection (srow,scol,erow,ecol)\\n", x, ring_rows()); +debug_tty->printf("\\033[%dC ring_cols(): %-3d \\033[7m(%d,%d,%d,%d)\\033[0m\\n", x, ring_cols(), m1,m2,m3,m4); +debug_tty->printf("\\033[%dC offset(): %-3d\\n", x, offset()); +debug_tty->printf("\\033[%dC ", x); +horiz_bracket(disp_cols()); +debug_tty->printf("\\033[u"); // recall cursor + +x += disp_cols() + 11; +debug_tty->printf("\\033[%dC \\033[7m History Index \\033[0m\\n", x); +debug_tty->printf("\\033[%dC hist_rows(): %d hist_srow()=%d\\n", x, hist_rows(), hist_srow()); +debug_tty->printf("\\033[%dC hist_cols(): %d hist_erow()=%d\\n", x, hist_cols(), hist_erow()); +debug_tty->printf("\\033[%dC hist_use(): %d\\n", x, hist_use()); +debug_tty->printf("\\033[%dC ", x); +horiz_bracket(disp_cols()); +debug_tty->append("\\033[u"); // recall cursor + +x += disp_cols() + 11; +debug_tty->printf("\\033[%dC \\033[7m Display Index \\033[0m\\n", x); +debug_tty->printf("\\033[%dC disp_rows(): %d disp_srow()=%d\\n", x, disp_rows(), disp_srow()); +debug_tty->printf("\\033[%dC disp_cols(): %d disp_erow()=%d\\n", x, disp_cols(), disp_erow()); +debug_tty->append("\\n"); +debug_tty->printf("\\033[%dC ", x); +horiz_bracket(disp_cols()); +debug_tty->append("\\n"); + +{ + for ( int row=0; rowprintf("%3d R[", row); + for ( int col=0; coltextattrib(u8c->attrib()); + debug_tty->textfgcolor(u8c->fgcolor()); + debug_tty->textbgcolor(u8c->bgcolor()); + debug_tty->print_char(u8c->text_utf8()); // print the char in current style + } + debug_tty->append("\\033[0m"); // restore default fg/bg/attrib + debug_tty->append("] "); + // SHOW HISTORY + if ( row < hist_rows() ) { + u8c = u8c_ring_row(hist_srow() + row); + debug_tty->printf("%3d H[", row); + for ( int col=0; coltextattrib(u8c->attrib()); + debug_tty->textfgcolor(u8c->fgcolor()); + debug_tty->textbgcolor(u8c->bgcolor()); + debug_tty->print_char(u8c->text_utf8()); // print the char in current style + } + debug_tty->append("\\033[0m"); // restore default fg/bg/attrib + debug_tty->printf("] "); + } else { + debug_tty->append(" "); + for ( int col=0; colappend(" "); } + debug_tty->append(" "); + } + // SHOW DISPLAY + if ( row < disp_rows() ) { + u8c = u8c_ring_row(disp_srow() + row); + debug_tty->printf("%3d D[", row); + for ( int col=0; coltextattrib(u8c->attrib()); + debug_tty->textfgcolor(u8c->fgcolor()); + debug_tty->textbgcolor(u8c->bgcolor()); + debug_tty->print_char(u8c->text_utf8()); // print the char in current style + } + debug_tty->append("\\033[0m"); // restore default fg/bg/attrib + debug_tty->append("]\\033[K\\n"); + } else { + debug_tty->append("\\033[K\\n"); + } + } +} +debug_tty->printf("--- END\\033[0J\\n"); // clear eos} {} + } + Function {ring_debug_timer_callback2()} {open return_type void + } { + code {// Update the ring debug window +update_ring(); + +// Redraw after all changes have been made +ring_debug_win->redraw(); +Fl::repeat_timeout(.10, ring_debug_timer_callback, (void*)this);} {} + } + Function {ring_debug_timer_callback(void* userdata)} {return_type {static void} + } { + code {MyTerminal *o = (MyTerminal*)userdata; +o->ring_debug_timer_callback2();} {} + } + Function {handle(int e)} { + comment {Event handler} return_type int + } { + code {switch (e) { + case FL_KEYBOARD: { + if (interactivecursor) { + switch (Fl::event_key()) { + case FL_Up: cursor_up(1,true); redraw(); return 1; + case FL_Down: cursor_down(1,true); redraw(); return 1; + case FL_Left: cursor_left(); redraw(); return 1; + case FL_Right: cursor_right(); redraw(); return 1; + } + } + break; + } +} +return Fl_Terminal::handle(e);} {} + } +} + +decl {////// APPLICATION CLASS //////} {private local +} + +class Application {open +} { + decl {int G_lines;} { + comment {Line counter for +50 line test +} private local + } + Function {Application()} { + comment {// Ctor} + } { + code {// CTOR +G_lines = 1; +make_window(); + +// Do widget init in make_window()'s extra 'Code' section, not here.} {} + } + Function {show(int argc=0, char **argv=0)} { + comment {Show the app window +} return_type void + } { + code {if (argv) win->show(argc,argv); +else win->show();} {} + } + Function {AppendTty(const char *s)} { + comment {Append text to Fl_Terminal (and stdout if radio button set) +} return_type void + } { + code {// Append to Fl_Terminal +G_tty->append(s); + +// Send to stdout too? +if (G_app->stdout_radio->value()) { + printf("%s", s); + fflush(stdout); +}} {} + } + decl {////// ESC SELF TESTS //////} {private local + } + Function {NextEscapeTest(int dir)} { + comment {Advance/Reverse thru escape code tests} open return_type {static void} + } { + code {// *** ADD NEW TESTS HERE *** +typedef int (TestFunc)(bool); +static int testret = 1; // last test return value +static int testnum = 0; +static TestFunc *tests[] = { + test_firstpage, + test_esc_attr, + test_esc_rgbcolors, + test_esc_fgbg_colors, + test_esc_curpos, + test_esc_tabstops, + test_esc_insert_char, + test_esc_clear_test, + test_esc_delete_row, + test_esc_insert_row, + test_esc_scrolling + // ^^^ INSERT NEW TEST FUNCS ABOVE THIS LINE ^^^ +}; + +int numtests = sizeof(tests) / sizeof(TestFunc*); +testnum += (dir * testret); // advance testnum only if last test isn't recall +if (testnum >= numtests) testnum = 0; +if (testnum < 0) testnum = numtests-1; +if (dir == 10000) { // 1000: special case to reset all tests, run first test + testnum = 0; // run first test + for ( int i=0; icursor_col()!=0) G_tty->append("\\n"); +****/ + +// Run test, save return value +testret = tests[testnum](false); +G_tty->redraw();} {} + } + Function {show_test(const char **test, int &index)} { + comment {Show test in test[] starting at 'index', returns 0 or 1 +} return_type {static int} + } { + code {// Show test in test[] starting at 'index'. +// 'index' is adjusted to point to next test. +// Returns number to add to parent test index: +// 0 - test shown, call here again for next page in this test +// 1 - test shown, move on to next test for next time +// +while (test[index]) { + G_app->AppendTty(test[index++]); + if (strncmp(test[index-1], "--->", 4) == 0 ) { + if (test[index] == NULL) { index = 0; return 1; } // rewind, tell parent to move to next test + else { return 0; } // tell parent to call us again for next test + } +} +index = 0; +return 1; // hit end of test, reset} {} + } + Function {test_firstpage(bool reset)} { + comment {--- 0000: Test unicode alignment} return_type {static int} + } { + code {G_app->AppendTty( + "\\033[0m\\033[H\\033[2J\\033[3J" // color/attr reset, home, cls, clear history + "hello.\\nLine one\\nLine two\\n" + "\\033[0;0;2m Dim text:\\033[31m red\\033[32m grn\\033[33m yel" + "\\033[34m blu\\033[35m mag\\033[36m cyn\\033[37m wht\\n" + "\\033[0;0;0m Normal text:\\033[31m red\\033[32m grn\\033[33m yel" + "\\033[34m blu\\033[35m mag\\033[36m cyn\\033[37m wht\\n" + "\\033[0;0;1m Bold text:\\033[31m red\\033[32m grn\\033[33m yel" + "\\033[34m blu\\033[35m mag\\033[36m cyn\\033[37m wht\\n" + "\\033[0;1;3m Bold Italic text:\\033[31m red\\033[32m grn\\033[33m yel" + "\\033[34m blu\\033[35m mag\\033[36m cyn\\033[37m wht\\n" + "\\033[0m\\n" + // Language Language + // Alignment Alignment + // <-----> <----> + "Here's some utf8: ||| AAA || AAA\\n" + "╳╳ ██ ▏▏┌─┬┐ ┏━┳┓ ╔═╦╗ ██████ ||| AAA Hell Yeah Jim - English || AAA\\n" + "╳╳ ██ ▏▏│ ││ ┃ ┃┃ ║ ║║ ██ ██ ||| AAA Первый рабочий - Russian || AAA\\n" + "╳╳ ██ ▏▏├─┼┤ ┣━╋┫ ╠═╬╣ ██ ██ ||| AAA テキスト処理法 - Japanese || AAA\\n" + "╳╳ ██ ▏▏└─┴┘ ┗━┻┛ ╚═╩╝ ██████ ||| AAA 香港增补字符集 - Chinese || AAA\\n" + " ||| AAA || AAA\\n" + "underbar: ______ ||| AAA || AAA\\n" + " overbar: ‾‾‾‾‾‾ ||| AAA || AAA\\n" + "\\n" + "\\033[23X >> KEYBOARD KEYS: Arrow keys move cursor <<\\n" + "\\033[23X >> 's'=speed test 'c'=colorbars <<\\n" + "\\033[23X >> 'e'=next esc test 'E'=prev esc test <<\\n" + "\\033[23X >> 'q'=quit <<\\n" + "\\033[23X >> <<\\n" + "\\033[23X >> <<\\n" + "\\n" + "Some floating text. >X<\\b\\033[D"); // put cursor between > < using BS and cursor_left +return 1; // tell parent to move to next test} {} + } + Function {test_esc_attr(bool reset)} { + comment {--- 0010: Test attributes} return_type {static int} + } { + code {static int index = 0; +const char *test[] = { + // Screen 10 + "\\033[H\\033[2J" "ESC TEST 0010: Attributes\\n", + " \\033[0;2m Some Dim text \\033[0m \\033[0m Normal text \\033[0m \\033[0;1m Some Bold text \\033[0m\\n" + " \\033[2;3m Dim italic text \\033[0m \\033[3m Normal italic \\033[0m \\033[1;3m Bold italic text \\033[0m\\n" + " \\033[2;4m Dim underline \\033[0m \\033[4m Normal underline \\033[0m \\033[1;4m Bold underline \\033[0m\\n" + " \\033[2;5m Dim blinking \\033[0m \\033[5m Normal blinking \\033[0m \\033[1;5m Bold blinking \\033[0m\\n" + " \\033[2;7m Dim inverse [█] \\033[0m \\033[7m Normal inverse [█] \\033[0m \\033[1;7m Bold inverse [█] \\033[0m\\n" + " \\033[2;9m Dim strikeout \\033[0m \\033[9m Normal strikeout \\033[0m \\033[1;9m Bold strikeout \\033[0m\\n" + "\\n", + "---> Hit 'e' for next test: ", + NULL +}; +if (reset) { index = 0; return 0; } +return show_test(test, index);} {} + } + Function {test_esc_rgbcolors(bool reset)} { + comment {--- 0020: Test RGB Colors} return_type {static int} + } { + code {static int index = 0; +const char *test[] = { + // Screen 20 + "\\033[2J\\033[H" "ESC TEST 0020: RGB Colors\\n", + "\\033[0m\\n", // NORMAL + "\\tNormal Grayscale: \\033[38;2;32;32;32mXXX" "\\033[38;2;64;64;64mXXX" "\\033[38;2;96;96;96mXXX" "\\033[38;2;128;128;128mXXX", + "\\033[38;2;160;160;160mXXX" "\\033[38;2;192;192;192mXXX" "\\033[38;2;224;224;224mXXX" "\\033[38;2;255;255;255mXXX", + "\\033[38;2;255;0;0m\\n", // change to Red for next row + "\\tNormal RedScale: \\033[38;2;32;0;0mXXX" "\\033[38;2;64;0;0mXXX" "\\033[38;2;96;0;0mXXX" "\\033[38;2;128;0;0mXXX", + "\\033[38;2;160;0;0mXXX" "\\033[38;2;192;0;0mXXX" "\\033[38;2;224;0;0mXXX" "\\033[38;2;255;0;0mXXX", + "\\033[38;2;0;255;0m\\n", // change to Grn for next row + "\\tNormal GrnScale: \\033[38;2;0;32;0mXXX" "\\033[38;2;0;64;0mXXX" "\\033[38;2;0;96;0mXXX" "\\033[38;2;0;128;0mXXX", + "\\033[38;2;0;160;0mXXX" "\\033[38;2;0;192;0mXXX" "\\033[38;2;0;224;0mXXX" "\\033[38;2;0;255;0mXXX", + "\\033[38;2;0;0;255m\\n", // change to Blu for next row + "\\tNormal BluScale: \\033[38;2;0;0;32mXXX" "\\033[38;2;0;0;64mXXX" "\\033[38;2;0;0;96mXXX" "\\033[38;2;0;0;128mXXX", + "\\033[38;2;0;0;160mXXX" "\\033[38;2;0;0;192mXXX" "\\033[38;2;0;0;224mXXX" "\\033[38;2;0;0;255mXXX", + "\\n", + "\\033[0;3m\\n", // ITALIC + "\\tItalic Grayscale: \\033[38;2;32;32;32mXXX" "\\033[38;2;64;64;64mXXX" "\\033[38;2;96;96;96mXXX" "\\033[38;2;128;128;128mXXX", + "\\033[38;2;160;160;160mXXX" "\\033[38;2;192;192;192mXXX" "\\033[38;2;224;224;224mXXX" "\\033[38;2;255;255;255mXXX", + "\\033[38;2;255;0;0m\\n", // change to Red for next row + "\\tItalic RedScale: \\033[38;2;32;0;0mXXX" "\\033[38;2;64;0;0mXXX" "\\033[38;2;96;0;0mXXX" "\\033[38;2;128;0;0mXXX", + "\\033[38;2;160;0;0mXXX" "\\033[38;2;192;0;0mXXX" "\\033[38;2;224;0;0mXXX" "\\033[38;2;255;0;0mXXX", + "\\033[38;2;0;255;0m\\n", // change to Grn for next row + "\\tItalic GrnScale: \\033[38;2;0;32;0mXXX" "\\033[38;2;0;64;0mXXX" "\\033[38;2;0;96;0mXXX" "\\033[38;2;0;128;0mXXX", + "\\033[38;2;0;160;0mXXX" "\\033[38;2;0;192;0mXXX" "\\033[38;2;0;224;0mXXX" "\\033[38;2;0;255;0mXXX", + "\\033[38;2;0;0;255m\\n", // change to Blu for next row + "\\tItalic BluScale: \\033[38;2;0;0;32mXXX" "\\033[38;2;0;0;64mXXX" "\\033[38;2;0;0;96mXXX" "\\033[38;2;0;0;128mXXX", + "\\033[38;2;0;0;160mXXX" "\\033[38;2;0;0;192mXXX" "\\033[38;2;0;0;224mXXX" "\\033[38;2;0;0;255mXXX", + "\\n", + "\\033[0;4m\\n", // UNDERLINE + "\\tUnderl Grayscale: \\033[38;2;32;32;32mXXX" "\\033[38;2;64;64;64mXXX" "\\033[38;2;96;96;96mXXX" "\\033[38;2;128;128;128mXXX", + "\\033[38;2;160;160;160mXXX" "\\033[38;2;192;192;192mXXX" "\\033[38;2;224;224;224mXXX" "\\033[38;2;255;255;255mXXX", + "\\033[38;2;255;0;0m\\n", // change to Red for next row + "\\tUnderl RedScale: \\033[38;2;32;0;0mXXX" "\\033[38;2;64;0;0mXXX" "\\033[38;2;96;0;0mXXX" "\\033[38;2;128;0;0mXXX", + "\\033[38;2;160;0;0mXXX" "\\033[38;2;192;0;0mXXX" "\\033[38;2;224;0;0mXXX" "\\033[38;2;255;0;0mXXX", + "\\033[38;2;0;255;0m\\n", // change to Grn for next row + "\\tUnderl GrnScale: \\033[38;2;0;32;0mXXX" "\\033[38;2;0;64;0mXXX" "\\033[38;2;0;96;0mXXX" "\\033[38;2;0;128;0mXXX", + "\\033[38;2;0;160;0mXXX" "\\033[38;2;0;192;0mXXX" "\\033[38;2;0;224;0mXXX" "\\033[38;2;0;255;0mXXX", + "\\033[38;2;0;0;255m\\n", // change to Blu for next row + "\\tUnderl BluScale: \\033[38;2;0;0;32mXXX" "\\033[38;2;0;0;64mXXX" "\\033[38;2;0;0;96mXXX" "\\033[38;2;0;0;128mXXX", + "\\033[38;2;0;0;160mXXX" "\\033[38;2;0;0;192mXXX" "\\033[38;2;0;0;224mXXX" "\\033[38;2;0;0;255mXXX", + "\\n", + "\\033[0;7m\\n", // INVERSE + "\\tInvers Grayscale: \\033[7;38;2;32;32;32mXXX" "\\033[38;2;64;64;64mXXX" "\\033[38;2;96;96;96mXXX" "\\033[38;2;128;128;128mXXX", + "\\033[38;2;160;160;160mXXX" "\\033[38;2;192;192;192mXXX" "\\033[38;2;224;224;224mXXX" "\\033[38;2;255;255;255mXXX", + "\\033[38;2;255;0;0m\\n", // change to Red for next row + "\\tInvers RedScale: \\033[38;2;32;0;0mXXX" "\\033[38;2;64;0;0mXXX" "\\033[38;2;96;0;0mXXX" "\\033[38;2;128;0;0mXXX", + "\\033[38;2;160;0;0mXXX" "\\033[38;2;192;0;0mXXX" "\\033[38;2;224;0;0mXXX" "\\033[38;2;255;0;0mXXX", + "\\033[38;2;0;255;0m\\n", // change to Grn for next row + "\\tInvers GrnScale: \\033[38;2;0;32;0mXXX" "\\033[38;2;0;64;0mXXX" "\\033[38;2;0;96;0mXXX" "\\033[38;2;0;128;0mXXX", + "\\033[38;2;0;160;0mXXX" "\\033[38;2;0;192;0mXXX" "\\033[38;2;0;224;0mXXX" "\\033[38;2;0;255;0mXXX", + "\\033[38;2;0;0;255m\\n", // change to Blu for next row + "\\tInvers BluScale: \\033[38;2;0;0;32mXXX" "\\033[38;2;0;0;64mXXX" "\\033[38;2;0;0;96mXXX" "\\033[38;2;0;0;128mXXX", + "\\033[38;2;0;0;160mXXX" "\\033[38;2;0;0;192mXXX" "\\033[38;2;0;0;224mXXX" "\\033[38;2;0;0;255mXXX", + "\\033[0m\\n\\n", + "---> Hit 'e' for next test: ", + // Screen 21 + "\\033[2J\\033[H" "ESC TEST 0021: RGB Color Ramps\\n", + "\\n", + "Red: ", + "\\033[48;2;0;0;0m.\\033[48;2;1;0;0m.\\033[48;2;2;0;0m.\\033[48;2;3;0;0m.\\033[48;2;4;0;0m.\\033[48;2;5;0;0m.\\033[48;2;6;0;0m.\\033[48;2;7;0;0m.", + "\\033[48;2;8;0;0m.\\033[48;2;9;0;0m.\\033[48;2;10;0;0m.\\033[48;2;11;0;0m.\\033[48;2;12;0;0m.\\033[48;2;13;0;0m.\\033[48;2;14;0;0m.\\033[48;2;15;0;0m.", + "\\033[48;2;16;0;0m.\\033[48;2;17;0;0m.\\033[48;2;18;0;0m.\\033[48;2;19;0;0m.\\033[48;2;20;0;0m.\\033[48;2;21;0;0m.\\033[48;2;22;0;0m.\\033[48;2;23;0;0m.", + "\\033[48;2;24;0;0m.\\033[48;2;25;0;0m.\\033[48;2;26;0;0m.\\033[48;2;27;0;0m.\\033[48;2;28;0;0m.\\033[48;2;29;0;0m.\\033[48;2;30;0;0m.\\033[48;2;31;0;0m.", + "\\033[48;2;32;0;0m.\\033[48;2;33;0;0m.\\033[48;2;34;0;0m.\\033[48;2;35;0;0m.\\033[48;2;36;0;0m.\\033[48;2;37;0;0m.\\033[48;2;38;0;0m.\\033[48;2;39;0;0m.", + "\\033[48;2;40;0;0m.\\033[48;2;41;0;0m.\\033[48;2;42;0;0m.\\033[48;2;43;0;0m.\\033[48;2;44;0;0m.\\033[48;2;45;0;0m.\\033[48;2;46;0;0m.\\033[48;2;47;0;0m.", + "\\033[48;2;48;0;0m.\\033[48;2;49;0;0m.\\033[48;2;50;0;0m.\\033[48;2;51;0;0m.\\033[48;2;52;0;0m.\\033[48;2;53;0;0m.\\033[48;2;54;0;0m.\\033[48;2;55;0;0m.", + "\\033[48;2;56;0;0m.\\033[48;2;57;0;0m.\\033[48;2;58;0;0m.\\033[48;2;59;0;0m.\\033[48;2;60;0;0m.\\033[48;2;61;0;0m.\\033[48;2;62;0;0m.\\033[48;2;63;0;0m.", + "\\033[48;2;64;0;0m.\\033[48;2;65;0;0m.\\033[48;2;66;0;0m.\\033[48;2;67;0;0m.\\033[48;2;68;0;0m.\\033[48;2;69;0;0m.\\033[48;2;70;0;0m.\\033[48;2;71;0;0m.", + "\\033[48;2;72;0;0m.\\033[48;2;73;0;0m.\\033[48;2;74;0;0m.\\033[48;2;75;0;0m.\\033[48;2;76;0;0m.\\033[48;2;77;0;0m.\\033[48;2;78;0;0m.\\033[48;2;79;0;0m.", + "\\033[48;2;80;0;0m.\\033[48;2;81;0;0m.\\033[48;2;82;0;0m.\\033[48;2;83;0;0m.\\033[48;2;84;0;0m.\\033[48;2;85;0;0m.\\033[48;2;86;0;0m.\\033[48;2;87;0;0m.", + "\\033[48;2;88;0;0m.\\033[48;2;89;0;0m.\\033[48;2;90;0;0m.\\033[48;2;91;0;0m.\\033[48;2;92;0;0m.\\033[48;2;93;0;0m.\\033[48;2;94;0;0m.\\033[48;2;95;0;0m.", + "\\033[0m\\n ", + "\\033[48;2;96;0;0m.\\033[48;2;97;0;0m.\\033[48;2;98;0;0m.\\033[48;2;99;0;0m.\\033[48;2;100;0;0m.\\033[48;2;101;0;0m.\\033[48;2;102;0;0m.\\033[48;2;103;0;0m.", + "\\033[48;2;104;0;0m.\\033[48;2;105;0;0m.\\033[48;2;106;0;0m.\\033[48;2;107;0;0m.\\033[48;2;108;0;0m.\\033[48;2;109;0;0m.\\033[48;2;110;0;0m.\\033[48;2;111;0;0m.", + "\\033[48;2;112;0;0m.\\033[48;2;113;0;0m.\\033[48;2;114;0;0m.\\033[48;2;115;0;0m.\\033[48;2;116;0;0m.\\033[48;2;117;0;0m.\\033[48;2;118;0;0m.\\033[48;2;119;0;0m.", + "\\033[48;2;120;0;0m.\\033[48;2;121;0;0m.\\033[48;2;122;0;0m.\\033[48;2;123;0;0m.\\033[48;2;124;0;0m.\\033[48;2;125;0;0m.\\033[48;2;126;0;0m.\\033[48;2;127;0;0m.", + "\\033[48;2;128;0;0m.\\033[48;2;129;0;0m.\\033[48;2;130;0;0m.\\033[48;2;131;0;0m.\\033[48;2;132;0;0m.\\033[48;2;133;0;0m.\\033[48;2;134;0;0m.\\033[48;2;135;0;0m.", + "\\033[48;2;136;0;0m.\\033[48;2;137;0;0m.\\033[48;2;138;0;0m.\\033[48;2;139;0;0m.\\033[48;2;140;0;0m.\\033[48;2;141;0;0m.\\033[48;2;142;0;0m.\\033[48;2;143;0;0m.", + "\\033[48;2;144;0;0m.\\033[48;2;145;0;0m.\\033[48;2;146;0;0m.\\033[48;2;147;0;0m.\\033[48;2;148;0;0m.\\033[48;2;149;0;0m.\\033[48;2;150;0;0m.\\033[48;2;151;0;0m.", + "\\033[48;2;152;0;0m.\\033[48;2;153;0;0m.\\033[48;2;154;0;0m.\\033[48;2;155;0;0m.\\033[48;2;156;0;0m.\\033[48;2;157;0;0m.\\033[48;2;158;0;0m.\\033[48;2;159;0;0m.", + "\\033[48;2;160;0;0m.\\033[48;2;161;0;0m.\\033[48;2;162;0;0m.\\033[48;2;163;0;0m.\\033[48;2;164;0;0m.\\033[48;2;165;0;0m.\\033[48;2;166;0;0m.\\033[48;2;167;0;0m.", + "\\033[48;2;168;0;0m.\\033[48;2;169;0;0m.\\033[48;2;170;0;0m.\\033[48;2;171;0;0m.\\033[48;2;172;0;0m.\\033[48;2;173;0;0m.\\033[48;2;174;0;0m.\\033[48;2;175;0;0m.", + "\\033[48;2;176;0;0m.\\033[48;2;177;0;0m.\\033[48;2;178;0;0m.\\033[48;2;179;0;0m.\\033[48;2;180;0;0m.\\033[48;2;181;0;0m.\\033[48;2;182;0;0m.\\033[48;2;183;0;0m.", + "\\033[48;2;184;0;0m.\\033[48;2;185;0;0m.\\033[48;2;186;0;0m.\\033[48;2;187;0;0m.\\033[48;2;188;0;0m.\\033[48;2;189;0;0m.\\033[48;2;190;0;0m.\\033[48;2;191;0;0m.", + "\\033[0m\\n ", + "\\033[48;2;192;0;0m.\\033[48;2;193;0;0m.\\033[48;2;194;0;0m.\\033[48;2;195;0;0m.\\033[48;2;196;0;0m.\\033[48;2;197;0;0m.\\033[48;2;198;0;0m.\\033[48;2;199;0;0m.", + "\\033[48;2;200;0;0m.\\033[48;2;201;0;0m.\\033[48;2;202;0;0m.\\033[48;2;203;0;0m.\\033[48;2;204;0;0m.\\033[48;2;205;0;0m.\\033[48;2;206;0;0m.\\033[48;2;207;0;0m.", + "\\033[48;2;208;0;0m.\\033[48;2;209;0;0m.\\033[48;2;210;0;0m.\\033[48;2;211;0;0m.\\033[48;2;212;0;0m.\\033[48;2;213;0;0m.\\033[48;2;214;0;0m.\\033[48;2;215;0;0m.", + "\\033[48;2;216;0;0m.\\033[48;2;217;0;0m.\\033[48;2;218;0;0m.\\033[48;2;219;0;0m.\\033[48;2;220;0;0m.\\033[48;2;221;0;0m.\\033[48;2;222;0;0m.\\033[48;2;223;0;0m.", + "\\033[48;2;224;0;0m.\\033[48;2;225;0;0m.\\033[48;2;226;0;0m.\\033[48;2;227;0;0m.\\033[48;2;228;0;0m.\\033[48;2;229;0;0m.\\033[48;2;230;0;0m.\\033[48;2;231;0;0m.", + "\\033[48;2;232;0;0m.\\033[48;2;233;0;0m.\\033[48;2;234;0;0m.\\033[48;2;235;0;0m.\\033[48;2;236;0;0m.\\033[48;2;237;0;0m.\\033[48;2;238;0;0m.\\033[48;2;239;0;0m.", + "\\033[48;2;240;0;0m.\\033[48;2;241;0;0m.\\033[48;2;242;0;0m.\\033[48;2;243;0;0m.\\033[48;2;244;0;0m.\\033[48;2;245;0;0m.\\033[48;2;246;0;0m.\\033[48;2;247;0;0m.", + "\\033[48;2;248;0;0m.\\033[48;2;249;0;0m.\\033[48;2;250;0;0m.\\033[48;2;251;0;0m.\\033[48;2;252;0;0m.\\033[48;2;253;0;0m.\\033[48;2;254;0;0m.\\033[48;2;255;0;0m.", + "\\033[0m\\n", + "\\n", + "Grn: ", + "\\033[48;2;0;0;0m.\\033[48;2;0;1;0m.\\033[48;2;0;2;0m.\\033[48;2;0;3;0m.\\033[48;2;0;4;0m.\\033[48;2;0;5;0m.\\033[48;2;0;6;0m.\\033[48;2;0;7;0m.", + "\\033[48;2;0;8;0m.\\033[48;2;0;9;0m.\\033[48;2;0;10;0m.\\033[48;2;0;11;0m.\\033[48;2;0;12;0m.\\033[48;2;0;13;0m.\\033[48;2;0;14;0m.\\033[48;2;0;15;0m.", + "\\033[48;2;0;16;0m.\\033[48;2;0;17;0m.\\033[48;2;0;18;0m.\\033[48;2;0;19;0m.\\033[48;2;0;20;0m.\\033[48;2;0;21;0m.\\033[48;2;0;22;0m.\\033[48;2;0;23;0m.", + "\\033[48;2;0;24;0m.\\033[48;2;0;25;0m.\\033[48;2;0;26;0m.\\033[48;2;0;27;0m.\\033[48;2;0;28;0m.\\033[48;2;0;29;0m.\\033[48;2;0;30;0m.\\033[48;2;0;31;0m.", + "\\033[48;2;0;32;0m.\\033[48;2;0;33;0m.\\033[48;2;0;34;0m.\\033[48;2;0;35;0m.\\033[48;2;0;36;0m.\\033[48;2;0;37;0m.\\033[48;2;0;38;0m.\\033[48;2;0;39;0m.", + "\\033[48;2;0;40;0m.\\033[48;2;0;41;0m.\\033[48;2;0;42;0m.\\033[48;2;0;43;0m.\\033[48;2;0;44;0m.\\033[48;2;0;45;0m.\\033[48;2;0;46;0m.\\033[48;2;0;47;0m.", + "\\033[48;2;0;48;0m.\\033[48;2;0;49;0m.\\033[48;2;0;50;0m.\\033[48;2;0;51;0m.\\033[48;2;0;52;0m.\\033[48;2;0;53;0m.\\033[48;2;0;54;0m.\\033[48;2;0;55;0m.", + "\\033[48;2;0;56;0m.\\033[48;2;0;57;0m.\\033[48;2;0;58;0m.\\033[48;2;0;59;0m.\\033[48;2;0;60;0m.\\033[48;2;0;61;0m.\\033[48;2;0;62;0m.\\033[48;2;0;63;0m.", + "\\033[48;2;0;64;0m.\\033[48;2;0;65;0m.\\033[48;2;0;66;0m.\\033[48;2;0;67;0m.\\033[48;2;0;68;0m.\\033[48;2;0;69;0m.\\033[48;2;0;70;0m.\\033[48;2;0;71;0m.", + "\\033[48;2;0;72;0m.\\033[48;2;0;73;0m.\\033[48;2;0;74;0m.\\033[48;2;0;75;0m.\\033[48;2;0;76;0m.\\033[48;2;0;77;0m.\\033[48;2;0;78;0m.\\033[48;2;0;79;0m.", + "\\033[48;2;0;80;0m.\\033[48;2;0;81;0m.\\033[48;2;0;82;0m.\\033[48;2;0;83;0m.\\033[48;2;0;84;0m.\\033[48;2;0;85;0m.\\033[48;2;0;86;0m.\\033[48;2;0;87;0m.", + "\\033[48;2;0;88;0m.\\033[48;2;0;89;0m.\\033[48;2;0;90;0m.\\033[48;2;0;91;0m.\\033[48;2;0;92;0m.\\033[48;2;0;93;0m.\\033[48;2;0;94;0m.\\033[48;2;0;95;0m.", + "\\033[0m\\n ", + "\\033[48;2;0;96;0m.\\033[48;2;0;97;0m.\\033[48;2;0;98;0m.\\033[48;2;0;99;0m.\\033[48;2;0;100;0m.\\033[48;2;0;101;0m.\\033[48;2;0;102;0m.\\033[48;2;0;103;0m.", + "\\033[48;2;0;104;0m.\\033[48;2;0;105;0m.\\033[48;2;0;106;0m.\\033[48;2;0;107;0m.\\033[48;2;0;108;0m.\\033[48;2;0;109;0m.\\033[48;2;0;110;0m.\\033[48;2;0;111;0m.", + "\\033[48;2;0;112;0m.\\033[48;2;0;113;0m.\\033[48;2;0;114;0m.\\033[48;2;0;115;0m.\\033[48;2;0;116;0m.\\033[48;2;0;117;0m.\\033[48;2;0;118;0m.\\033[48;2;0;119;0m.", + "\\033[48;2;0;120;0m.\\033[48;2;0;121;0m.\\033[48;2;0;122;0m.\\033[48;2;0;123;0m.\\033[48;2;0;124;0m.\\033[48;2;0;125;0m.\\033[48;2;0;126;0m.\\033[48;2;0;127;0m.", + "\\033[48;2;0;128;0m.\\033[48;2;0;129;0m.\\033[48;2;0;130;0m.\\033[48;2;0;131;0m.\\033[48;2;0;132;0m.\\033[48;2;0;133;0m.\\033[48;2;0;134;0m.\\033[48;2;0;135;0m.", + "\\033[48;2;0;136;0m.\\033[48;2;0;137;0m.\\033[48;2;0;138;0m.\\033[48;2;0;139;0m.\\033[48;2;0;140;0m.\\033[48;2;0;141;0m.\\033[48;2;0;142;0m.\\033[48;2;0;143;0m.", + "\\033[48;2;0;144;0m.\\033[48;2;0;145;0m.\\033[48;2;0;146;0m.\\033[48;2;0;147;0m.\\033[48;2;0;148;0m.\\033[48;2;0;149;0m.\\033[48;2;0;150;0m.\\033[48;2;0;151;0m.", + "\\033[48;2;0;152;0m.\\033[48;2;0;153;0m.\\033[48;2;0;154;0m.\\033[48;2;0;155;0m.\\033[48;2;0;156;0m.\\033[48;2;0;157;0m.\\033[48;2;0;158;0m.\\033[48;2;0;159;0m.", + "\\033[48;2;0;160;0m.\\033[48;2;0;161;0m.\\033[48;2;0;162;0m.\\033[48;2;0;163;0m.\\033[48;2;0;164;0m.\\033[48;2;0;165;0m.\\033[48;2;0;166;0m.\\033[48;2;0;167;0m.", + "\\033[48;2;0;168;0m.\\033[48;2;0;169;0m.\\033[48;2;0;170;0m.\\033[48;2;0;171;0m.\\033[48;2;0;172;0m.\\033[48;2;0;173;0m.\\033[48;2;0;174;0m.\\033[48;2;0;175;0m.", + "\\033[48;2;0;176;0m.\\033[48;2;0;177;0m.\\033[48;2;0;178;0m.\\033[48;2;0;179;0m.\\033[48;2;0;180;0m.\\033[48;2;0;181;0m.\\033[48;2;0;182;0m.\\033[48;2;0;183;0m.", + "\\033[48;2;0;184;0m.\\033[48;2;0;185;0m.\\033[48;2;0;186;0m.\\033[48;2;0;187;0m.\\033[48;2;0;188;0m.\\033[48;2;0;189;0m.\\033[48;2;0;190;0m.\\033[48;2;0;191;0m.", + "\\033[0m\\n ", + "\\033[48;2;0;192;0m.\\033[48;2;0;193;0m.\\033[48;2;0;194;0m.\\033[48;2;0;195;0m.\\033[48;2;0;196;0m.\\033[48;2;0;197;0m.\\033[48;2;0;198;0m.\\033[48;2;0;199;0m.", + "\\033[48;2;0;200;0m.\\033[48;2;0;201;0m.\\033[48;2;0;202;0m.\\033[48;2;0;203;0m.\\033[48;2;0;204;0m.\\033[48;2;0;205;0m.\\033[48;2;0;206;0m.\\033[48;2;0;207;0m.", + "\\033[48;2;0;208;0m.\\033[48;2;0;209;0m.\\033[48;2;0;210;0m.\\033[48;2;0;211;0m.\\033[48;2;0;212;0m.\\033[48;2;0;213;0m.\\033[48;2;0;214;0m.\\033[48;2;0;215;0m.", + "\\033[48;2;0;216;0m.\\033[48;2;0;217;0m.\\033[48;2;0;218;0m.\\033[48;2;0;219;0m.\\033[48;2;0;220;0m.\\033[48;2;0;221;0m.\\033[48;2;0;222;0m.\\033[48;2;0;223;0m.", + "\\033[48;2;0;224;0m.\\033[48;2;0;225;0m.\\033[48;2;0;226;0m.\\033[48;2;0;227;0m.\\033[48;2;0;228;0m.\\033[48;2;0;229;0m.\\033[48;2;0;230;0m.\\033[48;2;0;231;0m.", + "\\033[48;2;0;232;0m.\\033[48;2;0;233;0m.\\033[48;2;0;234;0m.\\033[48;2;0;235;0m.\\033[48;2;0;236;0m.\\033[48;2;0;237;0m.\\033[48;2;0;238;0m.\\033[48;2;0;239;0m.", + "\\033[48;2;0;240;0m.\\033[48;2;0;241;0m.\\033[48;2;0;242;0m.\\033[48;2;0;243;0m.\\033[48;2;0;244;0m.\\033[48;2;0;245;0m.\\033[48;2;0;246;0m.\\033[48;2;0;247;0m.", + "\\033[48;2;0;248;0m.\\033[48;2;0;249;0m.\\033[48;2;0;250;0m.\\033[48;2;0;251;0m.\\033[48;2;0;252;0m.\\033[48;2;0;253;0m.\\033[48;2;0;254;0m.\\033[48;2;0;255;0m.", + "\\033[0m\\n", + "\\n", + "Blu: ", + "\\033[48;2;0;0;0m.\\033[48;2;0;0;1m.\\033[48;2;0;0;2m.\\033[48;2;0;0;3m.\\033[48;2;0;0;4m.\\033[48;2;0;0;5m.\\033[48;2;0;0;6m.\\033[48;2;0;0;7m.", + "\\033[48;2;0;0;8m.\\033[48;2;0;0;9m.\\033[48;2;0;0;10m.\\033[48;2;0;0;11m.\\033[48;2;0;0;12m.\\033[48;2;0;0;13m.\\033[48;2;0;0;14m.\\033[48;2;0;0;15m.", + "\\033[48;2;0;0;16m.\\033[48;2;0;0;17m.\\033[48;2;0;0;18m.\\033[48;2;0;0;19m.\\033[48;2;0;0;20m.\\033[48;2;0;0;21m.\\033[48;2;0;0;22m.\\033[48;2;0;0;23m.", + "\\033[48;2;0;0;24m.\\033[48;2;0;0;25m.\\033[48;2;0;0;26m.\\033[48;2;0;0;27m.\\033[48;2;0;0;28m.\\033[48;2;0;0;29m.\\033[48;2;0;0;30m.\\033[48;2;0;0;31m.", + "\\033[48;2;0;0;32m.\\033[48;2;0;0;33m.\\033[48;2;0;0;34m.\\033[48;2;0;0;35m.\\033[48;2;0;0;36m.\\033[48;2;0;0;37m.\\033[48;2;0;0;38m.\\033[48;2;0;0;39m.", + "\\033[48;2;0;0;40m.\\033[48;2;0;0;41m.\\033[48;2;0;0;42m.\\033[48;2;0;0;43m.\\033[48;2;0;0;44m.\\033[48;2;0;0;45m.\\033[48;2;0;0;46m.\\033[48;2;0;0;47m.", + "\\033[48;2;0;0;48m.\\033[48;2;0;0;49m.\\033[48;2;0;0;50m.\\033[48;2;0;0;51m.\\033[48;2;0;0;52m.\\033[48;2;0;0;53m.\\033[48;2;0;0;54m.\\033[48;2;0;0;55m.", + "\\033[48;2;0;0;56m.\\033[48;2;0;0;57m.\\033[48;2;0;0;58m.\\033[48;2;0;0;59m.\\033[48;2;0;0;60m.\\033[48;2;0;0;61m.\\033[48;2;0;0;62m.\\033[48;2;0;0;63m.", + "\\033[48;2;0;0;64m.\\033[48;2;0;0;65m.\\033[48;2;0;0;66m.\\033[48;2;0;0;67m.\\033[48;2;0;0;68m.\\033[48;2;0;0;69m.\\033[48;2;0;0;70m.\\033[48;2;0;0;71m.", + "\\033[48;2;0;0;72m.\\033[48;2;0;0;73m.\\033[48;2;0;0;74m.\\033[48;2;0;0;75m.\\033[48;2;0;0;76m.\\033[48;2;0;0;77m.\\033[48;2;0;0;78m.\\033[48;2;0;0;79m.", + "\\033[48;2;0;0;80m.\\033[48;2;0;0;81m.\\033[48;2;0;0;82m.\\033[48;2;0;0;83m.\\033[48;2;0;0;84m.\\033[48;2;0;0;85m.\\033[48;2;0;0;86m.\\033[48;2;0;0;87m.", + "\\033[48;2;0;0;88m.\\033[48;2;0;0;89m.\\033[48;2;0;0;90m.\\033[48;2;0;0;91m.\\033[48;2;0;0;92m.\\033[48;2;0;0;93m.\\033[48;2;0;0;94m.\\033[48;2;0;0;95m.", + "\\033[0m\\n ", + "\\033[48;2;0;0;96m.\\033[48;2;0;0;97m.\\033[48;2;0;0;98m.\\033[48;2;0;0;99m.\\033[48;2;0;0;100m.\\033[48;2;0;0;101m.\\033[48;2;0;0;102m.\\033[48;2;0;0;103m.", + "\\033[48;2;0;0;104m.\\033[48;2;0;0;105m.\\033[48;2;0;0;106m.\\033[48;2;0;0;107m.\\033[48;2;0;0;108m.\\033[48;2;0;0;109m.\\033[48;2;0;0;110m.\\033[48;2;0;0;111m.", + "\\033[48;2;0;0;112m.\\033[48;2;0;0;113m.\\033[48;2;0;0;114m.\\033[48;2;0;0;115m.\\033[48;2;0;0;116m.\\033[48;2;0;0;117m.\\033[48;2;0;0;118m.\\033[48;2;0;0;119m.", + "\\033[48;2;0;0;120m.\\033[48;2;0;0;121m.\\033[48;2;0;0;122m.\\033[48;2;0;0;123m.\\033[48;2;0;0;124m.\\033[48;2;0;0;125m.\\033[48;2;0;0;126m.\\033[48;2;0;0;127m.", + "\\033[48;2;0;0;128m.\\033[48;2;0;0;129m.\\033[48;2;0;0;130m.\\033[48;2;0;0;131m.\\033[48;2;0;0;132m.\\033[48;2;0;0;133m.\\033[48;2;0;0;134m.\\033[48;2;0;0;135m.", + "\\033[48;2;0;0;136m.\\033[48;2;0;0;137m.\\033[48;2;0;0;138m.\\033[48;2;0;0;139m.\\033[48;2;0;0;140m.\\033[48;2;0;0;141m.\\033[48;2;0;0;142m.\\033[48;2;0;0;143m.", + "\\033[48;2;0;0;144m.\\033[48;2;0;0;145m.\\033[48;2;0;0;146m.\\033[48;2;0;0;147m.\\033[48;2;0;0;148m.\\033[48;2;0;0;149m.\\033[48;2;0;0;150m.\\033[48;2;0;0;151m.", + "\\033[48;2;0;0;152m.\\033[48;2;0;0;153m.\\033[48;2;0;0;154m.\\033[48;2;0;0;155m.\\033[48;2;0;0;156m.\\033[48;2;0;0;157m.\\033[48;2;0;0;158m.\\033[48;2;0;0;159m.", + "\\033[48;2;0;0;160m.\\033[48;2;0;0;161m.\\033[48;2;0;0;162m.\\033[48;2;0;0;163m.\\033[48;2;0;0;164m.\\033[48;2;0;0;165m.\\033[48;2;0;0;166m.\\033[48;2;0;0;167m.", + "\\033[48;2;0;0;168m.\\033[48;2;0;0;169m.\\033[48;2;0;0;170m.\\033[48;2;0;0;171m.\\033[48;2;0;0;172m.\\033[48;2;0;0;173m.\\033[48;2;0;0;174m.\\033[48;2;0;0;175m.", + "\\033[48;2;0;0;176m.\\033[48;2;0;0;177m.\\033[48;2;0;0;178m.\\033[48;2;0;0;179m.\\033[48;2;0;0;180m.\\033[48;2;0;0;181m.\\033[48;2;0;0;182m.\\033[48;2;0;0;183m.", + "\\033[48;2;0;0;184m.\\033[48;2;0;0;185m.\\033[48;2;0;0;186m.\\033[48;2;0;0;187m.\\033[48;2;0;0;188m.\\033[48;2;0;0;189m.\\033[48;2;0;0;190m.\\033[48;2;0;0;191m.", + "\\033[0m\\n ", + "\\033[48;2;0;0;192m.\\033[48;2;0;0;193m.\\033[48;2;0;0;194m.\\033[48;2;0;0;195m.\\033[48;2;0;0;196m.\\033[48;2;0;0;197m.\\033[48;2;0;0;198m.\\033[48;2;0;0;199m.", + "\\033[48;2;0;0;200m.\\033[48;2;0;0;201m.\\033[48;2;0;0;202m.\\033[48;2;0;0;203m.\\033[48;2;0;0;204m.\\033[48;2;0;0;205m.\\033[48;2;0;0;206m.\\033[48;2;0;0;207m.", + "\\033[48;2;0;0;208m.\\033[48;2;0;0;209m.\\033[48;2;0;0;210m.\\033[48;2;0;0;211m.\\033[48;2;0;0;212m.\\033[48;2;0;0;213m.\\033[48;2;0;0;214m.\\033[48;2;0;0;215m.", + "\\033[48;2;0;0;216m.\\033[48;2;0;0;217m.\\033[48;2;0;0;218m.\\033[48;2;0;0;219m.\\033[48;2;0;0;220m.\\033[48;2;0;0;221m.\\033[48;2;0;0;222m.\\033[48;2;0;0;223m.", + "\\033[48;2;0;0;224m.\\033[48;2;0;0;225m.\\033[48;2;0;0;226m.\\033[48;2;0;0;227m.\\033[48;2;0;0;228m.\\033[48;2;0;0;229m.\\033[48;2;0;0;230m.\\033[48;2;0;0;231m.", + "\\033[48;2;0;0;232m.\\033[48;2;0;0;233m.\\033[48;2;0;0;234m.\\033[48;2;0;0;235m.\\033[48;2;0;0;236m.\\033[48;2;0;0;237m.\\033[48;2;0;0;238m.\\033[48;2;0;0;239m.", + "\\033[48;2;0;0;240m.\\033[48;2;0;0;241m.\\033[48;2;0;0;242m.\\033[48;2;0;0;243m.\\033[48;2;0;0;244m.\\033[48;2;0;0;245m.\\033[48;2;0;0;246m.\\033[48;2;0;0;247m.", + "\\033[48;2;0;0;248m.\\033[48;2;0;0;249m.\\033[48;2;0;0;250m.\\033[48;2;0;0;251m.\\033[48;2;0;0;252m.\\033[48;2;0;0;253m.\\033[48;2;0;0;254m.\\033[48;2;0;0;255m.", + "\\033[0m\\n ", + "\\n", + /** + For generating an HSV hue ramp, see: + https://en.wikipedia.org/wiki/HSL_and_HSV\#/media/File:HSV-RGB-comparison.svg + Basically: + + 255 : RRRRRRR RRRRRRRR + : R R + : R R + : R RED R + : R R + : R R + : R R + 0 : RRRRRRRRRRRRRRRR + :..|......|......|......|......|......|......| + 0 60 120 180 240 300 360 + + + + 255 : GGGGGGGGGGGGGG + : G G + : G G + : G G + : G GREEN G + : G G + : G G + 0 : G GGGGGGGGGGGGGGGG + :..|......|......|......|......|......|......| + 0 60 120 180 240 300 360 + + + 255 : BBBBBBBBBBBBBBB + : B B + : B B + : B BLUE B + : B B + : B B + : B B + 0 : GBBBBBBBBBBBBBB B + :..|......|......|......|......|......|......| + 0 60 120 180 240 300 360 + Here's some perl code that generates the Hue ramp: + $count = 0; + for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",255,$t,0); if ((++$count % 8) == 0) { printf("\\n"); } } + for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",255-$t,255,0); if ((++$count % 8) == 0) { printf("\\n"); } } + for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",0,255,$t); if ((++$count % 8) == 0) { printf("\\n"); } } + for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",0,255-$t,255); if ((++$count % 8) == 0) { printf("\\n"); } } + for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",$t,0,255); if ((++$count % 8) == 0) { printf("\\n"); } } + for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",255,0,255-$t); if ((++$count % 8) == 0) { printf("\\n"); } } +**/ + "Hue: ", + "\\033[48;2;255;000;000m.\\033[48;2;255;001;000m.\\033[48;2;255;002;000m.\\033[48;2;255;003;000m.\\033[48;2;255;004;000m.\\033[48;2;255;005;000m.\\033[48;2;255;006;000m.\\033[48;2;255;007;000m.", + "\\033[48;2;255;008;000m.\\033[48;2;255;009;000m.\\033[48;2;255;010;000m.\\033[48;2;255;011;000m.\\033[48;2;255;012;000m.\\033[48;2;255;013;000m.\\033[48;2;255;014;000m.\\033[48;2;255;015;000m.", + "\\033[48;2;255;016;000m.\\033[48;2;255;017;000m.\\033[48;2;255;018;000m.\\033[48;2;255;019;000m.\\033[48;2;255;020;000m.\\033[48;2;255;021;000m.\\033[48;2;255;022;000m.\\033[48;2;255;023;000m.", + "\\033[48;2;255;024;000m.\\033[48;2;255;025;000m.\\033[48;2;255;026;000m.\\033[48;2;255;027;000m.\\033[48;2;255;028;000m.\\033[48;2;255;029;000m.\\033[48;2;255;030;000m.\\033[48;2;255;031;000m.", + "\\033[48;2;255;032;000m.\\033[48;2;255;033;000m.\\033[48;2;255;034;000m.\\033[48;2;255;035;000m.\\033[48;2;255;036;000m.\\033[48;2;255;037;000m.\\033[48;2;255;038;000m.\\033[48;2;255;039;000m.", + "\\033[48;2;255;040;000m.\\033[48;2;255;041;000m.\\033[48;2;255;042;000m.\\033[48;2;255;043;000m.\\033[48;2;255;044;000m.\\033[48;2;255;045;000m.\\033[48;2;255;046;000m.\\033[48;2;255;047;000m.", + "\\033[48;2;255;048;000m.\\033[48;2;255;049;000m.\\033[48;2;255;050;000m.\\033[48;2;255;051;000m.\\033[48;2;255;052;000m.\\033[48;2;255;053;000m.\\033[48;2;255;054;000m.\\033[48;2;255;055;000m.", + "\\033[48;2;255;056;000m.\\033[48;2;255;057;000m.\\033[48;2;255;058;000m.\\033[48;2;255;059;000m.\\033[48;2;255;060;000m.\\033[48;2;255;061;000m.\\033[48;2;255;062;000m.\\033[48;2;255;063;000m.", + "\\033[48;2;255;064;000m.\\033[48;2;255;065;000m.\\033[48;2;255;066;000m.\\033[48;2;255;067;000m.\\033[48;2;255;068;000m.\\033[48;2;255;069;000m.\\033[48;2;255;070;000m.\\033[48;2;255;071;000m.", + "\\033[48;2;255;072;000m.\\033[48;2;255;073;000m.\\033[48;2;255;074;000m.\\033[48;2;255;075;000m.\\033[48;2;255;076;000m.\\033[48;2;255;077;000m.\\033[48;2;255;078;000m.\\033[48;2;255;079;000m.", + "\\033[48;2;255;080;000m.\\033[48;2;255;081;000m.\\033[48;2;255;082;000m.\\033[48;2;255;083;000m.\\033[48;2;255;084;000m.\\033[48;2;255;085;000m.\\033[48;2;255;086;000m.\\033[48;2;255;087;000m.", + "\\033[48;2;255;088;000m.\\033[48;2;255;089;000m.\\033[48;2;255;090;000m.\\033[48;2;255;091;000m.\\033[48;2;255;092;000m.\\033[48;2;255;093;000m.\\033[48;2;255;094;000m.\\033[48;2;255;095;000m.", + "\\033[0m\\n ", + "\\033[48;2;255;096;000m.\\033[48;2;255;097;000m.\\033[48;2;255;098;000m.\\033[48;2;255;099;000m.\\033[48;2;255;100;000m.\\033[48;2;255;101;000m.\\033[48;2;255;102;000m.\\033[48;2;255;103;000m.", + "\\033[48;2;255;104;000m.\\033[48;2;255;105;000m.\\033[48;2;255;106;000m.\\033[48;2;255;107;000m.\\033[48;2;255;108;000m.\\033[48;2;255;109;000m.\\033[48;2;255;110;000m.\\033[48;2;255;111;000m.", + "\\033[48;2;255;112;000m.\\033[48;2;255;113;000m.\\033[48;2;255;114;000m.\\033[48;2;255;115;000m.\\033[48;2;255;116;000m.\\033[48;2;255;117;000m.\\033[48;2;255;118;000m.\\033[48;2;255;119;000m.", + "\\033[48;2;255;120;000m.\\033[48;2;255;121;000m.\\033[48;2;255;122;000m.\\033[48;2;255;123;000m.\\033[48;2;255;124;000m.\\033[48;2;255;125;000m.\\033[48;2;255;126;000m.\\033[48;2;255;127;000m.", + "\\033[48;2;255;128;000m.\\033[48;2;255;129;000m.\\033[48;2;255;130;000m.\\033[48;2;255;131;000m.\\033[48;2;255;132;000m.\\033[48;2;255;133;000m.\\033[48;2;255;134;000m.\\033[48;2;255;135;000m.", + "\\033[48;2;255;136;000m.\\033[48;2;255;137;000m.\\033[48;2;255;138;000m.\\033[48;2;255;139;000m.\\033[48;2;255;140;000m.\\033[48;2;255;141;000m.\\033[48;2;255;142;000m.\\033[48;2;255;143;000m.", + "\\033[48;2;255;144;000m.\\033[48;2;255;145;000m.\\033[48;2;255;146;000m.\\033[48;2;255;147;000m.\\033[48;2;255;148;000m.\\033[48;2;255;149;000m.\\033[48;2;255;150;000m.\\033[48;2;255;151;000m.", + "\\033[48;2;255;152;000m.\\033[48;2;255;153;000m.\\033[48;2;255;154;000m.\\033[48;2;255;155;000m.\\033[48;2;255;156;000m.\\033[48;2;255;157;000m.\\033[48;2;255;158;000m.\\033[48;2;255;159;000m.", + "\\033[48;2;255;160;000m.\\033[48;2;255;161;000m.\\033[48;2;255;162;000m.\\033[48;2;255;163;000m.\\033[48;2;255;164;000m.\\033[48;2;255;165;000m.\\033[48;2;255;166;000m.\\033[48;2;255;167;000m.", + "\\033[48;2;255;168;000m.\\033[48;2;255;169;000m.\\033[48;2;255;170;000m.\\033[48;2;255;171;000m.\\033[48;2;255;172;000m.\\033[48;2;255;173;000m.\\033[48;2;255;174;000m.\\033[48;2;255;175;000m.", + "\\033[48;2;255;176;000m.\\033[48;2;255;177;000m.\\033[48;2;255;178;000m.\\033[48;2;255;179;000m.\\033[48;2;255;180;000m.\\033[48;2;255;181;000m.\\033[48;2;255;182;000m.\\033[48;2;255;183;000m.", + "\\033[48;2;255;184;000m.\\033[48;2;255;185;000m.\\033[48;2;255;186;000m.\\033[48;2;255;187;000m.\\033[48;2;255;188;000m.\\033[48;2;255;189;000m.\\033[48;2;255;190;000m.\\033[48;2;255;191;000m.", + "\\033[0m\\n ", + "\\033[48;2;255;192;000m.\\033[48;2;255;193;000m.\\033[48;2;255;194;000m.\\033[48;2;255;195;000m.\\033[48;2;255;196;000m.\\033[48;2;255;197;000m.\\033[48;2;255;198;000m.\\033[48;2;255;199;000m.", + "\\033[48;2;255;200;000m.\\033[48;2;255;201;000m.\\033[48;2;255;202;000m.\\033[48;2;255;203;000m.\\033[48;2;255;204;000m.\\033[48;2;255;205;000m.\\033[48;2;255;206;000m.\\033[48;2;255;207;000m.", + "\\033[48;2;255;208;000m.\\033[48;2;255;209;000m.\\033[48;2;255;210;000m.\\033[48;2;255;211;000m.\\033[48;2;255;212;000m.\\033[48;2;255;213;000m.\\033[48;2;255;214;000m.\\033[48;2;255;215;000m.", + "\\033[48;2;255;216;000m.\\033[48;2;255;217;000m.\\033[48;2;255;218;000m.\\033[48;2;255;219;000m.\\033[48;2;255;220;000m.\\033[48;2;255;221;000m.\\033[48;2;255;222;000m.\\033[48;2;255;223;000m.", + "\\033[48;2;255;224;000m.\\033[48;2;255;225;000m.\\033[48;2;255;226;000m.\\033[48;2;255;227;000m.\\033[48;2;255;228;000m.\\033[48;2;255;229;000m.\\033[48;2;255;230;000m.\\033[48;2;255;231;000m.", + "\\033[48;2;255;232;000m.\\033[48;2;255;233;000m.\\033[48;2;255;234;000m.\\033[48;2;255;235;000m.\\033[48;2;255;236;000m.\\033[48;2;255;237;000m.\\033[48;2;255;238;000m.\\033[48;2;255;239;000m.", + "\\033[48;2;255;240;000m.\\033[48;2;255;241;000m.\\033[48;2;255;242;000m.\\033[48;2;255;243;000m.\\033[48;2;255;244;000m.\\033[48;2;255;245;000m.\\033[48;2;255;246;000m.\\033[48;2;255;247;000m.", + "\\033[48;2;255;248;000m.\\033[48;2;255;249;000m.\\033[48;2;255;250;000m.\\033[48;2;255;251;000m.\\033[48;2;255;252;000m.\\033[48;2;255;253;000m.\\033[48;2;255;254;000m.\\033[48;2;255;255;000m.", + "\\033[48;2;255;255;000m.\\033[48;2;254;255;000m.\\033[48;2;253;255;000m.\\033[48;2;252;255;000m.\\033[48;2;251;255;000m.\\033[48;2;250;255;000m.\\033[48;2;249;255;000m.\\033[48;2;248;255;000m.", + "\\033[48;2;247;255;000m.\\033[48;2;246;255;000m.\\033[48;2;245;255;000m.\\033[48;2;244;255;000m.\\033[48;2;243;255;000m.\\033[48;2;242;255;000m.\\033[48;2;241;255;000m.\\033[48;2;240;255;000m.", + "\\033[48;2;239;255;000m.\\033[48;2;238;255;000m.\\033[48;2;237;255;000m.\\033[48;2;236;255;000m.\\033[48;2;235;255;000m.\\033[48;2;234;255;000m.\\033[48;2;233;255;000m.\\033[48;2;232;255;000m.", + "\\033[48;2;231;255;000m.\\033[48;2;230;255;000m.\\033[48;2;229;255;000m.\\033[48;2;228;255;000m.\\033[48;2;227;255;000m.\\033[48;2;226;255;000m.\\033[48;2;225;255;000m.\\033[48;2;224;255;000m.", + "\\033[0m\\n ", + "\\033[48;2;223;255;000m.\\033[48;2;222;255;000m.\\033[48;2;221;255;000m.\\033[48;2;220;255;000m.\\033[48;2;219;255;000m.\\033[48;2;218;255;000m.\\033[48;2;217;255;000m.\\033[48;2;216;255;000m.", + "\\033[48;2;215;255;000m.\\033[48;2;214;255;000m.\\033[48;2;213;255;000m.\\033[48;2;212;255;000m.\\033[48;2;211;255;000m.\\033[48;2;210;255;000m.\\033[48;2;209;255;000m.\\033[48;2;208;255;000m.", + "\\033[48;2;207;255;000m.\\033[48;2;206;255;000m.\\033[48;2;205;255;000m.\\033[48;2;204;255;000m.\\033[48;2;203;255;000m.\\033[48;2;202;255;000m.\\033[48;2;201;255;000m.\\033[48;2;200;255;000m.", + "\\033[48;2;199;255;000m.\\033[48;2;198;255;000m.\\033[48;2;197;255;000m.\\033[48;2;196;255;000m.\\033[48;2;195;255;000m.\\033[48;2;194;255;000m.\\033[48;2;193;255;000m.\\033[48;2;192;255;000m.", + "\\033[48;2;191;255;000m.\\033[48;2;190;255;000m.\\033[48;2;189;255;000m.\\033[48;2;188;255;000m.\\033[48;2;187;255;000m.\\033[48;2;186;255;000m.\\033[48;2;185;255;000m.\\033[48;2;184;255;000m.", + "\\033[48;2;183;255;000m.\\033[48;2;182;255;000m.\\033[48;2;181;255;000m.\\033[48;2;180;255;000m.\\033[48;2;179;255;000m.\\033[48;2;178;255;000m.\\033[48;2;177;255;000m.\\033[48;2;176;255;000m.", + "\\033[48;2;175;255;000m.\\033[48;2;174;255;000m.\\033[48;2;173;255;000m.\\033[48;2;172;255;000m.\\033[48;2;171;255;000m.\\033[48;2;170;255;000m.\\033[48;2;169;255;000m.\\033[48;2;168;255;000m.", + "\\033[48;2;167;255;000m.\\033[48;2;166;255;000m.\\033[48;2;165;255;000m.\\033[48;2;164;255;000m.\\033[48;2;163;255;000m.\\033[48;2;162;255;000m.\\033[48;2;161;255;000m.\\033[48;2;160;255;000m.", + "\\033[48;2;159;255;000m.\\033[48;2;158;255;000m.\\033[48;2;157;255;000m.\\033[48;2;156;255;000m.\\033[48;2;155;255;000m.\\033[48;2;154;255;000m.\\033[48;2;153;255;000m.\\033[48;2;152;255;000m.", + "\\033[48;2;151;255;000m.\\033[48;2;150;255;000m.\\033[48;2;149;255;000m.\\033[48;2;148;255;000m.\\033[48;2;147;255;000m.\\033[48;2;146;255;000m.\\033[48;2;145;255;000m.\\033[48;2;144;255;000m.", + "\\033[48;2;143;255;000m.\\033[48;2;142;255;000m.\\033[48;2;141;255;000m.\\033[48;2;140;255;000m.\\033[48;2;139;255;000m.\\033[48;2;138;255;000m.\\033[48;2;137;255;000m.\\033[48;2;136;255;000m.", + "\\033[48;2;135;255;000m.\\033[48;2;134;255;000m.\\033[48;2;133;255;000m.\\033[48;2;132;255;000m.\\033[48;2;131;255;000m.\\033[48;2;130;255;000m.\\033[48;2;129;255;000m.\\033[48;2;128;255;000m.", + "\\033[0m\\n ", + "\\033[48;2;127;255;000m.\\033[48;2;126;255;000m.\\033[48;2;125;255;000m.\\033[48;2;124;255;000m.\\033[48;2;123;255;000m.\\033[48;2;122;255;000m.\\033[48;2;121;255;000m.\\033[48;2;120;255;000m.", + "\\033[48;2;119;255;000m.\\033[48;2;118;255;000m.\\033[48;2;117;255;000m.\\033[48;2;116;255;000m.\\033[48;2;115;255;000m.\\033[48;2;114;255;000m.\\033[48;2;113;255;000m.\\033[48;2;112;255;000m.", + "\\033[48;2;111;255;000m.\\033[48;2;110;255;000m.\\033[48;2;109;255;000m.\\033[48;2;108;255;000m.\\033[48;2;107;255;000m.\\033[48;2;106;255;000m.\\033[48;2;105;255;000m.\\033[48;2;104;255;000m.", + "\\033[48;2;103;255;000m.\\033[48;2;102;255;000m.\\033[48;2;101;255;000m.\\033[48;2;100;255;000m.\\033[48;2;099;255;000m.\\033[48;2;098;255;000m.\\033[48;2;097;255;000m.\\033[48;2;096;255;000m.", + "\\033[48;2;095;255;000m.\\033[48;2;094;255;000m.\\033[48;2;093;255;000m.\\033[48;2;092;255;000m.\\033[48;2;091;255;000m.\\033[48;2;090;255;000m.\\033[48;2;089;255;000m.\\033[48;2;088;255;000m.", + "\\033[48;2;087;255;000m.\\033[48;2;086;255;000m.\\033[48;2;085;255;000m.\\033[48;2;084;255;000m.\\033[48;2;083;255;000m.\\033[48;2;082;255;000m.\\033[48;2;081;255;000m.\\033[48;2;080;255;000m.", + "\\033[48;2;079;255;000m.\\033[48;2;078;255;000m.\\033[48;2;077;255;000m.\\033[48;2;076;255;000m.\\033[48;2;075;255;000m.\\033[48;2;074;255;000m.\\033[48;2;073;255;000m.\\033[48;2;072;255;000m.", + "\\033[48;2;071;255;000m.\\033[48;2;070;255;000m.\\033[48;2;069;255;000m.\\033[48;2;068;255;000m.\\033[48;2;067;255;000m.\\033[48;2;066;255;000m.\\033[48;2;065;255;000m.\\033[48;2;064;255;000m.", + "\\033[48;2;063;255;000m.\\033[48;2;062;255;000m.\\033[48;2;061;255;000m.\\033[48;2;060;255;000m.\\033[48;2;059;255;000m.\\033[48;2;058;255;000m.\\033[48;2;057;255;000m.\\033[48;2;056;255;000m.", + "\\033[48;2;055;255;000m.\\033[48;2;054;255;000m.\\033[48;2;053;255;000m.\\033[48;2;052;255;000m.\\033[48;2;051;255;000m.\\033[48;2;050;255;000m.\\033[48;2;049;255;000m.\\033[48;2;048;255;000m.", + "\\033[48;2;047;255;000m.\\033[48;2;046;255;000m.\\033[48;2;045;255;000m.\\033[48;2;044;255;000m.\\033[48;2;043;255;000m.\\033[48;2;042;255;000m.\\033[48;2;041;255;000m.\\033[48;2;040;255;000m.", + "\\033[48;2;039;255;000m.\\033[48;2;038;255;000m.\\033[48;2;037;255;000m.\\033[48;2;036;255;000m.\\033[48;2;035;255;000m.\\033[48;2;034;255;000m.\\033[48;2;033;255;000m.\\033[48;2;032;255;000m.", + "\\033[0m\\n ", + "\\033[48;2;031;255;000m.\\033[48;2;030;255;000m.\\033[48;2;029;255;000m.\\033[48;2;028;255;000m.\\033[48;2;027;255;000m.\\033[48;2;026;255;000m.\\033[48;2;025;255;000m.\\033[48;2;024;255;000m.", + "\\033[48;2;023;255;000m.\\033[48;2;022;255;000m.\\033[48;2;021;255;000m.\\033[48;2;020;255;000m.\\033[48;2;019;255;000m.\\033[48;2;018;255;000m.\\033[48;2;017;255;000m.\\033[48;2;016;255;000m.", + "\\033[48;2;015;255;000m.\\033[48;2;014;255;000m.\\033[48;2;013;255;000m.\\033[48;2;012;255;000m.\\033[48;2;011;255;000m.\\033[48;2;010;255;000m.\\033[48;2;009;255;000m.\\033[48;2;008;255;000m.", + "\\033[48;2;007;255;000m.\\033[48;2;006;255;000m.\\033[48;2;005;255;000m.\\033[48;2;004;255;000m.\\033[48;2;003;255;000m.\\033[48;2;002;255;000m.\\033[48;2;001;255;000m.\\033[48;2;000;255;000m.", + "\\033[48;2;000;255;000m.\\033[48;2;000;255;001m.\\033[48;2;000;255;002m.\\033[48;2;000;255;003m.\\033[48;2;000;255;004m.\\033[48;2;000;255;005m.\\033[48;2;000;255;006m.\\033[48;2;000;255;007m.", + "\\033[48;2;000;255;008m.\\033[48;2;000;255;009m.\\033[48;2;000;255;010m.\\033[48;2;000;255;011m.\\033[48;2;000;255;012m.\\033[48;2;000;255;013m.\\033[48;2;000;255;014m.\\033[48;2;000;255;015m.", + "\\033[48;2;000;255;016m.\\033[48;2;000;255;017m.\\033[48;2;000;255;018m.\\033[48;2;000;255;019m.\\033[48;2;000;255;020m.\\033[48;2;000;255;021m.\\033[48;2;000;255;022m.\\033[48;2;000;255;023m.", + "\\033[48;2;000;255;024m.\\033[48;2;000;255;025m.\\033[48;2;000;255;026m.\\033[48;2;000;255;027m.\\033[48;2;000;255;028m.\\033[48;2;000;255;029m.\\033[48;2;000;255;030m.\\033[48;2;000;255;031m.", + "\\033[48;2;000;255;032m.\\033[48;2;000;255;033m.\\033[48;2;000;255;034m.\\033[48;2;000;255;035m.\\033[48;2;000;255;036m.\\033[48;2;000;255;037m.\\033[48;2;000;255;038m.\\033[48;2;000;255;039m.", + "\\033[48;2;000;255;040m.\\033[48;2;000;255;041m.\\033[48;2;000;255;042m.\\033[48;2;000;255;043m.\\033[48;2;000;255;044m.\\033[48;2;000;255;045m.\\033[48;2;000;255;046m.\\033[48;2;000;255;047m.", + "\\033[48;2;000;255;048m.\\033[48;2;000;255;049m.\\033[48;2;000;255;050m.\\033[48;2;000;255;051m.\\033[48;2;000;255;052m.\\033[48;2;000;255;053m.\\033[48;2;000;255;054m.\\033[48;2;000;255;055m.", + "\\033[48;2;000;255;056m.\\033[48;2;000;255;057m.\\033[48;2;000;255;058m.\\033[48;2;000;255;059m.\\033[48;2;000;255;060m.\\033[48;2;000;255;061m.\\033[48;2;000;255;062m.\\033[48;2;000;255;063m.", + "\\033[0m\\n ", + "\\033[48;2;000;255;064m.\\033[48;2;000;255;065m.\\033[48;2;000;255;066m.\\033[48;2;000;255;067m.\\033[48;2;000;255;068m.\\033[48;2;000;255;069m.\\033[48;2;000;255;070m.\\033[48;2;000;255;071m.", + "\\033[48;2;000;255;072m.\\033[48;2;000;255;073m.\\033[48;2;000;255;074m.\\033[48;2;000;255;075m.\\033[48;2;000;255;076m.\\033[48;2;000;255;077m.\\033[48;2;000;255;078m.\\033[48;2;000;255;079m.", + "\\033[48;2;000;255;080m.\\033[48;2;000;255;081m.\\033[48;2;000;255;082m.\\033[48;2;000;255;083m.\\033[48;2;000;255;084m.\\033[48;2;000;255;085m.\\033[48;2;000;255;086m.\\033[48;2;000;255;087m.", + "\\033[48;2;000;255;088m.\\033[48;2;000;255;089m.\\033[48;2;000;255;090m.\\033[48;2;000;255;091m.\\033[48;2;000;255;092m.\\033[48;2;000;255;093m.\\033[48;2;000;255;094m.\\033[48;2;000;255;095m.", + "\\033[48;2;000;255;096m.\\033[48;2;000;255;097m.\\033[48;2;000;255;098m.\\033[48;2;000;255;099m.\\033[48;2;000;255;100m.\\033[48;2;000;255;101m.\\033[48;2;000;255;102m.\\033[48;2;000;255;103m.", + "\\033[48;2;000;255;104m.\\033[48;2;000;255;105m.\\033[48;2;000;255;106m.\\033[48;2;000;255;107m.\\033[48;2;000;255;108m.\\033[48;2;000;255;109m.\\033[48;2;000;255;110m.\\033[48;2;000;255;111m.", + "\\033[48;2;000;255;112m.\\033[48;2;000;255;113m.\\033[48;2;000;255;114m.\\033[48;2;000;255;115m.\\033[48;2;000;255;116m.\\033[48;2;000;255;117m.\\033[48;2;000;255;118m.\\033[48;2;000;255;119m.", + "\\033[48;2;000;255;120m.\\033[48;2;000;255;121m.\\033[48;2;000;255;122m.\\033[48;2;000;255;123m.\\033[48;2;000;255;124m.\\033[48;2;000;255;125m.\\033[48;2;000;255;126m.\\033[48;2;000;255;127m.", + "\\033[48;2;000;255;128m.\\033[48;2;000;255;129m.\\033[48;2;000;255;130m.\\033[48;2;000;255;131m.\\033[48;2;000;255;132m.\\033[48;2;000;255;133m.\\033[48;2;000;255;134m.\\033[48;2;000;255;135m.", + "\\033[48;2;000;255;136m.\\033[48;2;000;255;137m.\\033[48;2;000;255;138m.\\033[48;2;000;255;139m.\\033[48;2;000;255;140m.\\033[48;2;000;255;141m.\\033[48;2;000;255;142m.\\033[48;2;000;255;143m.", + "\\033[48;2;000;255;144m.\\033[48;2;000;255;145m.\\033[48;2;000;255;146m.\\033[48;2;000;255;147m.\\033[48;2;000;255;148m.\\033[48;2;000;255;149m.\\033[48;2;000;255;150m.\\033[48;2;000;255;151m.", + "\\033[48;2;000;255;152m.\\033[48;2;000;255;153m.\\033[48;2;000;255;154m.\\033[48;2;000;255;155m.\\033[48;2;000;255;156m.\\033[48;2;000;255;157m.\\033[48;2;000;255;158m.\\033[48;2;000;255;159m.", + "\\033[0m\\n ", + "\\033[48;2;000;255;160m.\\033[48;2;000;255;161m.\\033[48;2;000;255;162m.\\033[48;2;000;255;163m.\\033[48;2;000;255;164m.\\033[48;2;000;255;165m.\\033[48;2;000;255;166m.\\033[48;2;000;255;167m.", + "\\033[48;2;000;255;168m.\\033[48;2;000;255;169m.\\033[48;2;000;255;170m.\\033[48;2;000;255;171m.\\033[48;2;000;255;172m.\\033[48;2;000;255;173m.\\033[48;2;000;255;174m.\\033[48;2;000;255;175m.", + "\\033[48;2;000;255;176m.\\033[48;2;000;255;177m.\\033[48;2;000;255;178m.\\033[48;2;000;255;179m.\\033[48;2;000;255;180m.\\033[48;2;000;255;181m.\\033[48;2;000;255;182m.\\033[48;2;000;255;183m.", + "\\033[48;2;000;255;184m.\\033[48;2;000;255;185m.\\033[48;2;000;255;186m.\\033[48;2;000;255;187m.\\033[48;2;000;255;188m.\\033[48;2;000;255;189m.\\033[48;2;000;255;190m.\\033[48;2;000;255;191m.", + "\\033[48;2;000;255;192m.\\033[48;2;000;255;193m.\\033[48;2;000;255;194m.\\033[48;2;000;255;195m.\\033[48;2;000;255;196m.\\033[48;2;000;255;197m.\\033[48;2;000;255;198m.\\033[48;2;000;255;199m.", + "\\033[48;2;000;255;200m.\\033[48;2;000;255;201m.\\033[48;2;000;255;202m.\\033[48;2;000;255;203m.\\033[48;2;000;255;204m.\\033[48;2;000;255;205m.\\033[48;2;000;255;206m.\\033[48;2;000;255;207m.", + "\\033[48;2;000;255;208m.\\033[48;2;000;255;209m.\\033[48;2;000;255;210m.\\033[48;2;000;255;211m.\\033[48;2;000;255;212m.\\033[48;2;000;255;213m.\\033[48;2;000;255;214m.\\033[48;2;000;255;215m.", + "\\033[48;2;000;255;216m.\\033[48;2;000;255;217m.\\033[48;2;000;255;218m.\\033[48;2;000;255;219m.\\033[48;2;000;255;220m.\\033[48;2;000;255;221m.\\033[48;2;000;255;222m.\\033[48;2;000;255;223m.", + "\\033[48;2;000;255;224m.\\033[48;2;000;255;225m.\\033[48;2;000;255;226m.\\033[48;2;000;255;227m.\\033[48;2;000;255;228m.\\033[48;2;000;255;229m.\\033[48;2;000;255;230m.\\033[48;2;000;255;231m.", + "\\033[48;2;000;255;232m.\\033[48;2;000;255;233m.\\033[48;2;000;255;234m.\\033[48;2;000;255;235m.\\033[48;2;000;255;236m.\\033[48;2;000;255;237m.\\033[48;2;000;255;238m.\\033[48;2;000;255;239m.", + "\\033[48;2;000;255;240m.\\033[48;2;000;255;241m.\\033[48;2;000;255;242m.\\033[48;2;000;255;243m.\\033[48;2;000;255;244m.\\033[48;2;000;255;245m.\\033[48;2;000;255;246m.\\033[48;2;000;255;247m.", + "\\033[48;2;000;255;248m.\\033[48;2;000;255;249m.\\033[48;2;000;255;250m.\\033[48;2;000;255;251m.\\033[48;2;000;255;252m.\\033[48;2;000;255;253m.\\033[48;2;000;255;254m.\\033[48;2;000;255;255m.", + "\\033[0m\\n ", + "\\033[48;2;000;255;255m.\\033[48;2;000;254;255m.\\033[48;2;000;253;255m.\\033[48;2;000;252;255m.\\033[48;2;000;251;255m.\\033[48;2;000;250;255m.\\033[48;2;000;249;255m.\\033[48;2;000;248;255m.", + "\\033[48;2;000;247;255m.\\033[48;2;000;246;255m.\\033[48;2;000;245;255m.\\033[48;2;000;244;255m.\\033[48;2;000;243;255m.\\033[48;2;000;242;255m.\\033[48;2;000;241;255m.\\033[48;2;000;240;255m.", + "\\033[48;2;000;239;255m.\\033[48;2;000;238;255m.\\033[48;2;000;237;255m.\\033[48;2;000;236;255m.\\033[48;2;000;235;255m.\\033[48;2;000;234;255m.\\033[48;2;000;233;255m.\\033[48;2;000;232;255m.", + "\\033[48;2;000;231;255m.\\033[48;2;000;230;255m.\\033[48;2;000;229;255m.\\033[48;2;000;228;255m.\\033[48;2;000;227;255m.\\033[48;2;000;226;255m.\\033[48;2;000;225;255m.\\033[48;2;000;224;255m.", + "\\033[48;2;000;223;255m.\\033[48;2;000;222;255m.\\033[48;2;000;221;255m.\\033[48;2;000;220;255m.\\033[48;2;000;219;255m.\\033[48;2;000;218;255m.\\033[48;2;000;217;255m.\\033[48;2;000;216;255m.", + "\\033[48;2;000;215;255m.\\033[48;2;000;214;255m.\\033[48;2;000;213;255m.\\033[48;2;000;212;255m.\\033[48;2;000;211;255m.\\033[48;2;000;210;255m.\\033[48;2;000;209;255m.\\033[48;2;000;208;255m.", + "\\033[48;2;000;207;255m.\\033[48;2;000;206;255m.\\033[48;2;000;205;255m.\\033[48;2;000;204;255m.\\033[48;2;000;203;255m.\\033[48;2;000;202;255m.\\033[48;2;000;201;255m.\\033[48;2;000;200;255m.", + "\\033[48;2;000;199;255m.\\033[48;2;000;198;255m.\\033[48;2;000;197;255m.\\033[48;2;000;196;255m.\\033[48;2;000;195;255m.\\033[48;2;000;194;255m.\\033[48;2;000;193;255m.\\033[48;2;000;192;255m.", + "\\033[48;2;000;191;255m.\\033[48;2;000;190;255m.\\033[48;2;000;189;255m.\\033[48;2;000;188;255m.\\033[48;2;000;187;255m.\\033[48;2;000;186;255m.\\033[48;2;000;185;255m.\\033[48;2;000;184;255m.", + "\\033[48;2;000;183;255m.\\033[48;2;000;182;255m.\\033[48;2;000;181;255m.\\033[48;2;000;180;255m.\\033[48;2;000;179;255m.\\033[48;2;000;178;255m.\\033[48;2;000;177;255m.\\033[48;2;000;176;255m.", + "\\033[48;2;000;175;255m.\\033[48;2;000;174;255m.\\033[48;2;000;173;255m.\\033[48;2;000;172;255m.\\033[48;2;000;171;255m.\\033[48;2;000;170;255m.\\033[48;2;000;169;255m.\\033[48;2;000;168;255m.", + "\\033[48;2;000;167;255m.\\033[48;2;000;166;255m.\\033[48;2;000;165;255m.\\033[48;2;000;164;255m.\\033[48;2;000;163;255m.\\033[48;2;000;162;255m.\\033[48;2;000;161;255m.\\033[48;2;000;160;255m.", + "\\033[0m\\n ", + "\\033[48;2;000;159;255m.\\033[48;2;000;158;255m.\\033[48;2;000;157;255m.\\033[48;2;000;156;255m.\\033[48;2;000;155;255m.\\033[48;2;000;154;255m.\\033[48;2;000;153;255m.\\033[48;2;000;152;255m.", + "\\033[48;2;000;151;255m.\\033[48;2;000;150;255m.\\033[48;2;000;149;255m.\\033[48;2;000;148;255m.\\033[48;2;000;147;255m.\\033[48;2;000;146;255m.\\033[48;2;000;145;255m.\\033[48;2;000;144;255m.", + "\\033[48;2;000;143;255m.\\033[48;2;000;142;255m.\\033[48;2;000;141;255m.\\033[48;2;000;140;255m.\\033[48;2;000;139;255m.\\033[48;2;000;138;255m.\\033[48;2;000;137;255m.\\033[48;2;000;136;255m.", + "\\033[48;2;000;135;255m.\\033[48;2;000;134;255m.\\033[48;2;000;133;255m.\\033[48;2;000;132;255m.\\033[48;2;000;131;255m.\\033[48;2;000;130;255m.\\033[48;2;000;129;255m.\\033[48;2;000;128;255m.", + "\\033[48;2;000;127;255m.\\033[48;2;000;126;255m.\\033[48;2;000;125;255m.\\033[48;2;000;124;255m.\\033[48;2;000;123;255m.\\033[48;2;000;122;255m.\\033[48;2;000;121;255m.\\033[48;2;000;120;255m.", + "\\033[48;2;000;119;255m.\\033[48;2;000;118;255m.\\033[48;2;000;117;255m.\\033[48;2;000;116;255m.\\033[48;2;000;115;255m.\\033[48;2;000;114;255m.\\033[48;2;000;113;255m.\\033[48;2;000;112;255m.", + "\\033[48;2;000;111;255m.\\033[48;2;000;110;255m.\\033[48;2;000;109;255m.\\033[48;2;000;108;255m.\\033[48;2;000;107;255m.\\033[48;2;000;106;255m.\\033[48;2;000;105;255m.\\033[48;2;000;104;255m.", + "\\033[48;2;000;103;255m.\\033[48;2;000;102;255m.\\033[48;2;000;101;255m.\\033[48;2;000;100;255m.\\033[48;2;000;099;255m.\\033[48;2;000;098;255m.\\033[48;2;000;097;255m.\\033[48;2;000;096;255m.", + "\\033[48;2;000;095;255m.\\033[48;2;000;094;255m.\\033[48;2;000;093;255m.\\033[48;2;000;092;255m.\\033[48;2;000;091;255m.\\033[48;2;000;090;255m.\\033[48;2;000;089;255m.\\033[48;2;000;088;255m.", + "\\033[48;2;000;087;255m.\\033[48;2;000;086;255m.\\033[48;2;000;085;255m.\\033[48;2;000;084;255m.\\033[48;2;000;083;255m.\\033[48;2;000;082;255m.\\033[48;2;000;081;255m.\\033[48;2;000;080;255m.", + "\\033[48;2;000;079;255m.\\033[48;2;000;078;255m.\\033[48;2;000;077;255m.\\033[48;2;000;076;255m.\\033[48;2;000;075;255m.\\033[48;2;000;074;255m.\\033[48;2;000;073;255m.\\033[48;2;000;072;255m.", + "\\033[48;2;000;071;255m.\\033[48;2;000;070;255m.\\033[48;2;000;069;255m.\\033[48;2;000;068;255m.\\033[48;2;000;067;255m.\\033[48;2;000;066;255m.\\033[48;2;000;065;255m.\\033[48;2;000;064;255m.", + "\\033[0m\\n ", + "\\033[48;2;000;063;255m.\\033[48;2;000;062;255m.\\033[48;2;000;061;255m.\\033[48;2;000;060;255m.\\033[48;2;000;059;255m.\\033[48;2;000;058;255m.\\033[48;2;000;057;255m.\\033[48;2;000;056;255m.", + "\\033[48;2;000;055;255m.\\033[48;2;000;054;255m.\\033[48;2;000;053;255m.\\033[48;2;000;052;255m.\\033[48;2;000;051;255m.\\033[48;2;000;050;255m.\\033[48;2;000;049;255m.\\033[48;2;000;048;255m.", + "\\033[48;2;000;047;255m.\\033[48;2;000;046;255m.\\033[48;2;000;045;255m.\\033[48;2;000;044;255m.\\033[48;2;000;043;255m.\\033[48;2;000;042;255m.\\033[48;2;000;041;255m.\\033[48;2;000;040;255m.", + "\\033[48;2;000;039;255m.\\033[48;2;000;038;255m.\\033[48;2;000;037;255m.\\033[48;2;000;036;255m.\\033[48;2;000;035;255m.\\033[48;2;000;034;255m.\\033[48;2;000;033;255m.\\033[48;2;000;032;255m.", + "\\033[48;2;000;031;255m.\\033[48;2;000;030;255m.\\033[48;2;000;029;255m.\\033[48;2;000;028;255m.\\033[48;2;000;027;255m.\\033[48;2;000;026;255m.\\033[48;2;000;025;255m.\\033[48;2;000;024;255m.", + "\\033[48;2;000;023;255m.\\033[48;2;000;022;255m.\\033[48;2;000;021;255m.\\033[48;2;000;020;255m.\\033[48;2;000;019;255m.\\033[48;2;000;018;255m.\\033[48;2;000;017;255m.\\033[48;2;000;016;255m.", + "\\033[48;2;000;015;255m.\\033[48;2;000;014;255m.\\033[48;2;000;013;255m.\\033[48;2;000;012;255m.\\033[48;2;000;011;255m.\\033[48;2;000;010;255m.\\033[48;2;000;009;255m.\\033[48;2;000;008;255m.", + "\\033[48;2;000;007;255m.\\033[48;2;000;006;255m.\\033[48;2;000;005;255m.\\033[48;2;000;004;255m.\\033[48;2;000;003;255m.\\033[48;2;000;002;255m.\\033[48;2;000;001;255m.\\033[48;2;000;000;255m.", + "\\033[48;2;000;000;255m.\\033[48;2;001;000;255m.\\033[48;2;002;000;255m.\\033[48;2;003;000;255m.\\033[48;2;004;000;255m.\\033[48;2;005;000;255m.\\033[48;2;006;000;255m.\\033[48;2;007;000;255m.", + "\\033[48;2;008;000;255m.\\033[48;2;009;000;255m.\\033[48;2;010;000;255m.\\033[48;2;011;000;255m.\\033[48;2;012;000;255m.\\033[48;2;013;000;255m.\\033[48;2;014;000;255m.\\033[48;2;015;000;255m.", + "\\033[48;2;016;000;255m.\\033[48;2;017;000;255m.\\033[48;2;018;000;255m.\\033[48;2;019;000;255m.\\033[48;2;020;000;255m.\\033[48;2;021;000;255m.\\033[48;2;022;000;255m.\\033[48;2;023;000;255m.", + "\\033[48;2;024;000;255m.\\033[48;2;025;000;255m.\\033[48;2;026;000;255m.\\033[48;2;027;000;255m.\\033[48;2;028;000;255m.\\033[48;2;029;000;255m.\\033[48;2;030;000;255m.\\033[48;2;031;000;255m.", + "\\033[0m\\n ", + "\\033[48;2;032;000;255m.\\033[48;2;033;000;255m.\\033[48;2;034;000;255m.\\033[48;2;035;000;255m.\\033[48;2;036;000;255m.\\033[48;2;037;000;255m.\\033[48;2;038;000;255m.\\033[48;2;039;000;255m.", + "\\033[48;2;040;000;255m.\\033[48;2;041;000;255m.\\033[48;2;042;000;255m.\\033[48;2;043;000;255m.\\033[48;2;044;000;255m.\\033[48;2;045;000;255m.\\033[48;2;046;000;255m.\\033[48;2;047;000;255m.", + "\\033[48;2;048;000;255m.\\033[48;2;049;000;255m.\\033[48;2;050;000;255m.\\033[48;2;051;000;255m.\\033[48;2;052;000;255m.\\033[48;2;053;000;255m.\\033[48;2;054;000;255m.\\033[48;2;055;000;255m.", + "\\033[48;2;056;000;255m.\\033[48;2;057;000;255m.\\033[48;2;058;000;255m.\\033[48;2;059;000;255m.\\033[48;2;060;000;255m.\\033[48;2;061;000;255m.\\033[48;2;062;000;255m.\\033[48;2;063;000;255m.", + "\\033[48;2;064;000;255m.\\033[48;2;065;000;255m.\\033[48;2;066;000;255m.\\033[48;2;067;000;255m.\\033[48;2;068;000;255m.\\033[48;2;069;000;255m.\\033[48;2;070;000;255m.\\033[48;2;071;000;255m.", + "\\033[48;2;072;000;255m.\\033[48;2;073;000;255m.\\033[48;2;074;000;255m.\\033[48;2;075;000;255m.\\033[48;2;076;000;255m.\\033[48;2;077;000;255m.\\033[48;2;078;000;255m.\\033[48;2;079;000;255m.", + "\\033[48;2;080;000;255m.\\033[48;2;081;000;255m.\\033[48;2;082;000;255m.\\033[48;2;083;000;255m.\\033[48;2;084;000;255m.\\033[48;2;085;000;255m.\\033[48;2;086;000;255m.\\033[48;2;087;000;255m.", + "\\033[48;2;088;000;255m.\\033[48;2;089;000;255m.\\033[48;2;090;000;255m.\\033[48;2;091;000;255m.\\033[48;2;092;000;255m.\\033[48;2;093;000;255m.\\033[48;2;094;000;255m.\\033[48;2;095;000;255m.", + "\\033[48;2;096;000;255m.\\033[48;2;097;000;255m.\\033[48;2;098;000;255m.\\033[48;2;099;000;255m.\\033[48;2;100;000;255m.\\033[48;2;101;000;255m.\\033[48;2;102;000;255m.\\033[48;2;103;000;255m.", + "\\033[48;2;104;000;255m.\\033[48;2;105;000;255m.\\033[48;2;106;000;255m.\\033[48;2;107;000;255m.\\033[48;2;108;000;255m.\\033[48;2;109;000;255m.\\033[48;2;110;000;255m.\\033[48;2;111;000;255m.", + "\\033[48;2;112;000;255m.\\033[48;2;113;000;255m.\\033[48;2;114;000;255m.\\033[48;2;115;000;255m.\\033[48;2;116;000;255m.\\033[48;2;117;000;255m.\\033[48;2;118;000;255m.\\033[48;2;119;000;255m.", + "\\033[48;2;120;000;255m.\\033[48;2;121;000;255m.\\033[48;2;122;000;255m.\\033[48;2;123;000;255m.\\033[48;2;124;000;255m.\\033[48;2;125;000;255m.\\033[48;2;126;000;255m.\\033[48;2;127;000;255m.", + "\\033[0m\\n ", + "\\033[48;2;128;000;255m.\\033[48;2;129;000;255m.\\033[48;2;130;000;255m.\\033[48;2;131;000;255m.\\033[48;2;132;000;255m.\\033[48;2;133;000;255m.\\033[48;2;134;000;255m.\\033[48;2;135;000;255m.", + "\\033[48;2;136;000;255m.\\033[48;2;137;000;255m.\\033[48;2;138;000;255m.\\033[48;2;139;000;255m.\\033[48;2;140;000;255m.\\033[48;2;141;000;255m.\\033[48;2;142;000;255m.\\033[48;2;143;000;255m.", + "\\033[48;2;144;000;255m.\\033[48;2;145;000;255m.\\033[48;2;146;000;255m.\\033[48;2;147;000;255m.\\033[48;2;148;000;255m.\\033[48;2;149;000;255m.\\033[48;2;150;000;255m.\\033[48;2;151;000;255m.", + "\\033[48;2;152;000;255m.\\033[48;2;153;000;255m.\\033[48;2;154;000;255m.\\033[48;2;155;000;255m.\\033[48;2;156;000;255m.\\033[48;2;157;000;255m.\\033[48;2;158;000;255m.\\033[48;2;159;000;255m.", + "\\033[48;2;160;000;255m.\\033[48;2;161;000;255m.\\033[48;2;162;000;255m.\\033[48;2;163;000;255m.\\033[48;2;164;000;255m.\\033[48;2;165;000;255m.\\033[48;2;166;000;255m.\\033[48;2;167;000;255m.", + "\\033[48;2;168;000;255m.\\033[48;2;169;000;255m.\\033[48;2;170;000;255m.\\033[48;2;171;000;255m.\\033[48;2;172;000;255m.\\033[48;2;173;000;255m.\\033[48;2;174;000;255m.\\033[48;2;175;000;255m.", + "\\033[48;2;176;000;255m.\\033[48;2;177;000;255m.\\033[48;2;178;000;255m.\\033[48;2;179;000;255m.\\033[48;2;180;000;255m.\\033[48;2;181;000;255m.\\033[48;2;182;000;255m.\\033[48;2;183;000;255m.", + "\\033[48;2;184;000;255m.\\033[48;2;185;000;255m.\\033[48;2;186;000;255m.\\033[48;2;187;000;255m.\\033[48;2;188;000;255m.\\033[48;2;189;000;255m.\\033[48;2;190;000;255m.\\033[48;2;191;000;255m.", + "\\033[48;2;192;000;255m.\\033[48;2;193;000;255m.\\033[48;2;194;000;255m.\\033[48;2;195;000;255m.\\033[48;2;196;000;255m.\\033[48;2;197;000;255m.\\033[48;2;198;000;255m.\\033[48;2;199;000;255m.", + "\\033[48;2;200;000;255m.\\033[48;2;201;000;255m.\\033[48;2;202;000;255m.\\033[48;2;203;000;255m.\\033[48;2;204;000;255m.\\033[48;2;205;000;255m.\\033[48;2;206;000;255m.\\033[48;2;207;000;255m.", + "\\033[48;2;208;000;255m.\\033[48;2;209;000;255m.\\033[48;2;210;000;255m.\\033[48;2;211;000;255m.\\033[48;2;212;000;255m.\\033[48;2;213;000;255m.\\033[48;2;214;000;255m.\\033[48;2;215;000;255m.", + "\\033[48;2;216;000;255m.\\033[48;2;217;000;255m.\\033[48;2;218;000;255m.\\033[48;2;219;000;255m.\\033[48;2;220;000;255m.\\033[48;2;221;000;255m.\\033[48;2;222;000;255m.\\033[48;2;223;000;255m.", + "\\033[0m\\n ", + "\\033[48;2;224;000;255m.\\033[48;2;225;000;255m.\\033[48;2;226;000;255m.\\033[48;2;227;000;255m.\\033[48;2;228;000;255m.\\033[48;2;229;000;255m.\\033[48;2;230;000;255m.\\033[48;2;231;000;255m.", + "\\033[48;2;232;000;255m.\\033[48;2;233;000;255m.\\033[48;2;234;000;255m.\\033[48;2;235;000;255m.\\033[48;2;236;000;255m.\\033[48;2;237;000;255m.\\033[48;2;238;000;255m.\\033[48;2;239;000;255m.", + "\\033[48;2;240;000;255m.\\033[48;2;241;000;255m.\\033[48;2;242;000;255m.\\033[48;2;243;000;255m.\\033[48;2;244;000;255m.\\033[48;2;245;000;255m.\\033[48;2;246;000;255m.\\033[48;2;247;000;255m.", + "\\033[48;2;248;000;255m.\\033[48;2;249;000;255m.\\033[48;2;250;000;255m.\\033[48;2;251;000;255m.\\033[48;2;252;000;255m.\\033[48;2;253;000;255m.\\033[48;2;254;000;255m.\\033[48;2;255;000;255m.", + "\\033[48;2;255;000;255m.\\033[48;2;255;000;254m.\\033[48;2;255;000;253m.\\033[48;2;255;000;252m.\\033[48;2;255;000;251m.\\033[48;2;255;000;250m.\\033[48;2;255;000;249m.\\033[48;2;255;000;248m.", + "\\033[48;2;255;000;247m.\\033[48;2;255;000;246m.\\033[48;2;255;000;245m.\\033[48;2;255;000;244m.\\033[48;2;255;000;243m.\\033[48;2;255;000;242m.\\033[48;2;255;000;241m.\\033[48;2;255;000;240m.", + "\\033[48;2;255;000;239m.\\033[48;2;255;000;238m.\\033[48;2;255;000;237m.\\033[48;2;255;000;236m.\\033[48;2;255;000;235m.\\033[48;2;255;000;234m.\\033[48;2;255;000;233m.\\033[48;2;255;000;232m.", + "\\033[48;2;255;000;231m.\\033[48;2;255;000;230m.\\033[48;2;255;000;229m.\\033[48;2;255;000;228m.\\033[48;2;255;000;227m.\\033[48;2;255;000;226m.\\033[48;2;255;000;225m.\\033[48;2;255;000;224m.", + "\\033[48;2;255;000;223m.\\033[48;2;255;000;222m.\\033[48;2;255;000;221m.\\033[48;2;255;000;220m.\\033[48;2;255;000;219m.\\033[48;2;255;000;218m.\\033[48;2;255;000;217m.\\033[48;2;255;000;216m.", + "\\033[48;2;255;000;215m.\\033[48;2;255;000;214m.\\033[48;2;255;000;213m.\\033[48;2;255;000;212m.\\033[48;2;255;000;211m.\\033[48;2;255;000;210m.\\033[48;2;255;000;209m.\\033[48;2;255;000;208m.", + "\\033[48;2;255;000;207m.\\033[48;2;255;000;206m.\\033[48;2;255;000;205m.\\033[48;2;255;000;204m.\\033[48;2;255;000;203m.\\033[48;2;255;000;202m.\\033[48;2;255;000;201m.\\033[48;2;255;000;200m.", + "\\033[48;2;255;000;199m.\\033[48;2;255;000;198m.\\033[48;2;255;000;197m.\\033[48;2;255;000;196m.\\033[48;2;255;000;195m.\\033[48;2;255;000;194m.\\033[48;2;255;000;193m.\\033[48;2;255;000;192m.", + "\\033[0m\\n ", + "\\033[48;2;255;000;191m.\\033[48;2;255;000;190m.\\033[48;2;255;000;189m.\\033[48;2;255;000;188m.\\033[48;2;255;000;187m.\\033[48;2;255;000;186m.\\033[48;2;255;000;185m.\\033[48;2;255;000;184m.", + "\\033[48;2;255;000;183m.\\033[48;2;255;000;182m.\\033[48;2;255;000;181m.\\033[48;2;255;000;180m.\\033[48;2;255;000;179m.\\033[48;2;255;000;178m.\\033[48;2;255;000;177m.\\033[48;2;255;000;176m.", + "\\033[48;2;255;000;175m.\\033[48;2;255;000;174m.\\033[48;2;255;000;173m.\\033[48;2;255;000;172m.\\033[48;2;255;000;171m.\\033[48;2;255;000;170m.\\033[48;2;255;000;169m.\\033[48;2;255;000;168m.", + "\\033[48;2;255;000;167m.\\033[48;2;255;000;166m.\\033[48;2;255;000;165m.\\033[48;2;255;000;164m.\\033[48;2;255;000;163m.\\033[48;2;255;000;162m.\\033[48;2;255;000;161m.\\033[48;2;255;000;160m.", + "\\033[48;2;255;000;159m.\\033[48;2;255;000;158m.\\033[48;2;255;000;157m.\\033[48;2;255;000;156m.\\033[48;2;255;000;155m.\\033[48;2;255;000;154m.\\033[48;2;255;000;153m.\\033[48;2;255;000;152m.", + "\\033[48;2;255;000;151m.\\033[48;2;255;000;150m.\\033[48;2;255;000;149m.\\033[48;2;255;000;148m.\\033[48;2;255;000;147m.\\033[48;2;255;000;146m.\\033[48;2;255;000;145m.\\033[48;2;255;000;144m.", + "\\033[48;2;255;000;143m.\\033[48;2;255;000;142m.\\033[48;2;255;000;141m.\\033[48;2;255;000;140m.\\033[48;2;255;000;139m.\\033[48;2;255;000;138m.\\033[48;2;255;000;137m.\\033[48;2;255;000;136m.", + "\\033[48;2;255;000;135m.\\033[48;2;255;000;134m.\\033[48;2;255;000;133m.\\033[48;2;255;000;132m.\\033[48;2;255;000;131m.\\033[48;2;255;000;130m.\\033[48;2;255;000;129m.\\033[48;2;255;000;128m.", + "\\033[48;2;255;000;127m.\\033[48;2;255;000;126m.\\033[48;2;255;000;125m.\\033[48;2;255;000;124m.\\033[48;2;255;000;123m.\\033[48;2;255;000;122m.\\033[48;2;255;000;121m.\\033[48;2;255;000;120m.", + "\\033[48;2;255;000;119m.\\033[48;2;255;000;118m.\\033[48;2;255;000;117m.\\033[48;2;255;000;116m.\\033[48;2;255;000;115m.\\033[48;2;255;000;114m.\\033[48;2;255;000;113m.\\033[48;2;255;000;112m.", + "\\033[48;2;255;000;111m.\\033[48;2;255;000;110m.\\033[48;2;255;000;109m.\\033[48;2;255;000;108m.\\033[48;2;255;000;107m.\\033[48;2;255;000;106m.\\033[48;2;255;000;105m.\\033[48;2;255;000;104m.", + "\\033[48;2;255;000;103m.\\033[48;2;255;000;102m.\\033[48;2;255;000;101m.\\033[48;2;255;000;100m.\\033[48;2;255;000;099m.\\033[48;2;255;000;098m.\\033[48;2;255;000;097m.\\033[48;2;255;000;096m.", + "\\033[0m\\n ", + "\\033[48;2;255;000;095m.\\033[48;2;255;000;094m.\\033[48;2;255;000;093m.\\033[48;2;255;000;092m.\\033[48;2;255;000;091m.\\033[48;2;255;000;090m.\\033[48;2;255;000;089m.\\033[48;2;255;000;088m.", + "\\033[48;2;255;000;087m.\\033[48;2;255;000;086m.\\033[48;2;255;000;085m.\\033[48;2;255;000;084m.\\033[48;2;255;000;083m.\\033[48;2;255;000;082m.\\033[48;2;255;000;081m.\\033[48;2;255;000;080m.", + "\\033[48;2;255;000;079m.\\033[48;2;255;000;078m.\\033[48;2;255;000;077m.\\033[48;2;255;000;076m.\\033[48;2;255;000;075m.\\033[48;2;255;000;074m.\\033[48;2;255;000;073m.\\033[48;2;255;000;072m.", + "\\033[48;2;255;000;071m.\\033[48;2;255;000;070m.\\033[48;2;255;000;069m.\\033[48;2;255;000;068m.\\033[48;2;255;000;067m.\\033[48;2;255;000;066m.\\033[48;2;255;000;065m.\\033[48;2;255;000;064m.", + "\\033[48;2;255;000;063m.\\033[48;2;255;000;062m.\\033[48;2;255;000;061m.\\033[48;2;255;000;060m.\\033[48;2;255;000;059m.\\033[48;2;255;000;058m.\\033[48;2;255;000;057m.\\033[48;2;255;000;056m.", + "\\033[48;2;255;000;055m.\\033[48;2;255;000;054m.\\033[48;2;255;000;053m.\\033[48;2;255;000;052m.\\033[48;2;255;000;051m.\\033[48;2;255;000;050m.\\033[48;2;255;000;049m.\\033[48;2;255;000;048m.", + "\\033[48;2;255;000;047m.\\033[48;2;255;000;046m.\\033[48;2;255;000;045m.\\033[48;2;255;000;044m.\\033[48;2;255;000;043m.\\033[48;2;255;000;042m.\\033[48;2;255;000;041m.\\033[48;2;255;000;040m.", + "\\033[48;2;255;000;039m.\\033[48;2;255;000;038m.\\033[48;2;255;000;037m.\\033[48;2;255;000;036m.\\033[48;2;255;000;035m.\\033[48;2;255;000;034m.\\033[48;2;255;000;033m.\\033[48;2;255;000;032m.", + "\\033[48;2;255;000;031m.\\033[48;2;255;000;030m.\\033[48;2;255;000;029m.\\033[48;2;255;000;028m.\\033[48;2;255;000;027m.\\033[48;2;255;000;026m.\\033[48;2;255;000;025m.\\033[48;2;255;000;024m.", + "\\033[48;2;255;000;023m.\\033[48;2;255;000;022m.\\033[48;2;255;000;021m.\\033[48;2;255;000;020m.\\033[48;2;255;000;019m.\\033[48;2;255;000;018m.\\033[48;2;255;000;017m.\\033[48;2;255;000;016m.", + "\\033[48;2;255;000;015m.\\033[48;2;255;000;014m.\\033[48;2;255;000;013m.\\033[48;2;255;000;012m.\\033[48;2;255;000;011m.\\033[48;2;255;000;010m.\\033[48;2;255;000;009m.\\033[48;2;255;000;008m.", + "\\033[48;2;255;000;007m.\\033[48;2;255;000;006m.\\033[48;2;255;000;005m.\\033[48;2;255;000;004m.\\033[48;2;255;000;003m.\\033[48;2;255;000;002m.\\033[48;2;255;000;001m.\\033[48;2;255;000;000m.", + + "\\033[0m\\n", + "\\n", + "---> Hit 'e' for next test: ", + "\\033[2J\\033[H" "ESC TEST 0023: FG/BG Specific Reset\\n", + "\\n", + "Test fg reset: \\033[31mThis is red on norm bg\\033[39m, This is ESC[39m reset (norm fg on norm bg).\\033[m\\n", + "Test bg reset: \\033[41mThis is norm fg on red bg\\033[49m, This is ESC[49m reset (norm fg on norm bg).\\033[m\\n", + "\\n", + "Test fg/bg with fg reset: \\033[32;44mThis is grn on blu\\033[39m, This is ESC[39m reset (norm fg on blu).\\033[m\\n", + "Test fg/bg with bg reset: \\033[32;44mThis is grn on blu\\033[49m, This is ESC[49m reset (grn on norm bg).\\033[m\\n", + "\\n", + "---> Hit 'e' for next test: ", + NULL +}; +if (reset) { index = 0; return 0; } +return show_test(test, index);} {} + } + Function {test_esc_fgbg_colors(bool reset)} { + comment {--- 0030: Test FG/BG Colors} return_type {static int} + } { + code {static int index = 0; +const char *test[] = { + // Screen 30 + "\\033[2J\\033[H" "ESC TEST 0030: FG/BG Colors\\n", + "\\n", + " Foreground Colors:\\n", + " \\033[2;31m" " Dim Red text \\033[0m \\033[0;32m" " Dim Grn text \\033[0m \\033[2;33m" " Dim Yel text \\033[0m\\n", + " \\033[2;34m" " Dim Blu text \\033[0m \\033[0;35m" " Dim Mag text \\033[0m \\033[2;36m" " Dim Cyn text \\033[0m" + " \\033[2;37m" " Dim Wht text \\033[0m\\n", + " \\033[0;31m" " Nor Red text \\033[0m \\033[0;32m" " Nor Grn text \\033[0m \\033[2;33m" " Nor Yel text \\033[0m\\n", + " \\033[0;34m" " Nor Blu text \\033[0m \\033[0;35m" " Nor Mag text \\033[0m \\033[0;36m" " Nor Cyn text \\033[0m" + " \\033[0;37m" " Nor Wht text \\033[0m\\n", + " \\033[1;31m" " Bold Red text \\033[0m \\033[1;32m" " Bold Grn text \\033[0m \\033[1;33m" " Bold Yel text \\033[0m\\n", + " \\033[1;34m" " Bold Blu text \\033[0m \\033[1;35m" " Bold Mag \\033[0m \\033[1;36m" " Bold Cyn text \\033[0m" + " \\033[1;37m" " Bold Wht text \\033[0m\\n", + "\\n", + " Background Colors:\\n", + " \\033[2;37;41m"" Dim Red bg \\033[0m \\033[2;37;42m"" Dim Grn bg \\033[0m \\033[2;37;43m"" Dim Yel bg \\033[0m\\n", + " \\033[2;37;44m"" Dim Blu bg \\033[0m \\033[2;37;45m"" Dim Mag bg \\033[0m \\033[2;37;46m"" Dim Cyn bg \\033[0m" + " \\033[2;37;47m"" Dim Wht bg \\033[0m\\n", + " \\033[0;37;41m"" Nor Red bg \\033[0m \\033[0;37;42m"" Nor Grn bg \\033[0m \\033[0;37;43m"" Nor Yel bg \\033[0m\\n", + " \\033[0;37;44m"" Nor Blu bg \\033[0m \\033[0;37;45m"" Nor Mag bg \\033[0m \\033[0;37;46m"" Nor Cyn bg \\033[0m" + " \\033[0;37;47m"" Nor Wht bg \\033[0m\\n", + " \\033[1;37;41m"" Bold Red bg \\033[0m \\033[1;37;42m"" Bold Grn bg \\033[0m \\033[1;37;43m"" Bold Yel bg \\033[0m\\n", + " \\033[1;37;44m"" Bold Blu bg \\033[0m \\033[1;37;45m"" Bold Mag bg \\033[0m \\033[1;37;46m"" Bold Cyn bg \\033[0m" + " \\033[1;37;47m"" Bold Wht bg \\033[0m\\n", + "\\n", + "---> Hit 'e' for next test: ", + NULL +}; +if (reset) { index = 0; return 0; } +return show_test(test, index);} {} + } + Function {test_esc_curpos(bool reset)} { + comment {--- 0040: Test Cursor Positioning} return_type {static int} + } { + code {static int index = 0; +const char *test[] = { + // Screen 40 + "\\033[2J\\033[H" "ESC TEST 0040: Cursor Positioning\\n", + "2:\\n", + "3: 10 15 20 25 30 35 40 45 50 55 60 65 70\\n", + "4: |----:----|----:----|----:----|----:----|----:----|----:----|\\n", + "5:\\n", + "6:\\n", + "7:\\n", + "\\033[5;10H" "X", "\\033[5;15H" "X", "\\033[5;20H" "X", + "\\033[5;40H" "X", "\\033[5;45H" "X", "\\033[5;50H" "X", + "\\033[6;10H" "|", "\\033[6;15H" "|", "\\033[6;20H" "|", + "\\033[6;40H" "|", "\\033[6;45H" "|", "\\033[6;50H" "|", + "\\033[7;10H" "10,5", "\\033[7;15H" "15,5", "\\033[7;20H" "20,5", + "\\033[7;40H" "40,5", "\\033[7;45H" "45,5", "\\033[7;50H" "50,5", + "\\033[8H\\n", + "---> Hit 'e' for next test: ", + NULL +}; +if (reset) { index = 0; return 0; } +return show_test(test, index);} {} + } + Function {test_esc_tabstops(bool reset)} { + comment {--- 0050: Tabstops: Default Tabstops} return_type {static int} + } { + code {static int index = 0; +const char *test[] = { + // Screen 50 + // We use c to reset the terminal to default tabstops. + "\\033c" "ESC TEST 0050: Tabs: Default Tabstops\\n", + " A B C D E F G H I\\n", + " | | | | | | | | |\\n", + "\\tA\\tB\\tC\\tD-\\tE--\\tF-----\\tG------\\tH-------I\\n", + "\\t\\tB\\t\\tD\\t\\tF\\t\\tH-------I\\n", + "---> Hit 'e' for next test: ", + // We use c to reset the terminal to default tabstops. + // Should also clear screen and home cursor.. + "\\033c" "ESC TEST 0051: Tabs: Change Tabstops\\n", + "\\n", + " 8 16 24 32 40 48 56 64 72\\n", + "--------|-------|-------|-------|-------|-------|-------|-------|-------|\\n", + "\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\n", + "\\n", + "Setting new tabstops..\\033[3g\\n", + ".\\033HT..\\033HT...\\033HT....\\033HT.....\\033HT......\\033HT.......\\033HT........\\033HT.........\\033HT\\n", + "-|--|---|----|-----|------|-------|--------|---------|\\n", + "\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\n", + "---> Hit 'e' for next test: ", + "\\033c" "ESC TEST 0052: Tabs: Default Tabstops Again\\n", + "\\n", + "Back to normal tabstops:\\n", + " 8 16 24 32 40 48 56 64 72\\n", + "--------|-------|-------|-------|-------|-------|-------|-------|-------|\\n", + "\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\n", + "\\n", + "---> Hit 'e' for next test: ", + NULL +}; +if (reset) { index = 0; return 0; } +return show_test(test, index);} {} + } + Function {test_esc_insert_char(bool reset)} { + comment {--- 0060: Insert Char} return_type {static int} + } { + code {static int index = 0; +const char *test[] = { + // Screen 60 + "\\033[2J\\033[HESC TEST 0060: Insert Char (ESC[@)\\n", + "\\n", + " 10> 20> 30> 40> 50> 60> 70> 80>\\n", + "4:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n", + "5:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n", + "6:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n", + "\\033[s\\033[5;29H\\033[1;31m>\\033[0m\\033[u", // save curs, movcur, bold/red, '>', norm, recall curs + "\\n", + "---> Hit 'e' to test INSERT 1 char at row/col 5/30 (right of '>'): \\033[K", + "\\033[5;30H\\033[@\\033[8H", + "---> Hit 'e' to test INSERT 1 char at row/col 5/30 (right of '>'): \\033[K", + "\\033[5;30H\\033[@\\033[8H", + "---> Hit 'e' to test INSERT 4 chars at row/col 5/30 (right of '>'): \\033[K", + "\\033[5;30H\\033[4@\\033[8H", + "---> Hit 'e' to test INSERT 4 chars at row/col 5/30 (right of '>'): \\033[K", + "\\033[5;30H\\033[4@\\033[8H", + "---> Hit 'e' to test DELETE 1 chars at row/col 5/20 (right of '>'): \\033[K", + "\\033[5;30H\\033[P\\033[8H", + "---> Hit 'e' to test DELETE 1 chars at row/col 5/20 (right of '>'): \\033[K", + "\\033[5;30H\\033[P\\033[8H", + "---> Hit 'e' to test DELETE 2 chars at row/col 5/20 (right of '>'): \\033[K", + "\\033[5;30H\\033[2P\\033[8H", + "---> Hit 'e' to test DELETE 4 chars at row/col 5/20 (right of '>'): \\033[K", + "\\033[5;30H\\033[4P\\033[8H", + "---> Hit 'e' to test DELETE 1 char at row/col 5/20 (right of '>'): \\033[K", + "\\033[5;30H\\033[P\\033[8H", + "---> Hit 'e' to test DELETE 1 char at row/col 5/20 (right of '>'): \\033[K", + "\\033[5;30H\\033[P\\033[8H", + "---> Hit 'e' to test DELETE 1 *EXTRA* char at row/col 5/20 (right of '>'): \\033[K", + "\\033[5;30H\\033[P\\033[8H", + "---> Hit 'e' for next test: \\033[K", + NULL +}; +if (reset) { index = 0; return 0; } +return show_test(test, index);} {} + } + Function {test_esc_clear_test(bool reset)} { + comment {--- 0070: Clear Test ESC[K / ESC[K} return_type {static int} + } { + code {static int index = 0; +const char *test[] = { + // Screen 70 + "\\033[2J\\033[H" "ESC TEST 0070: Clear Test (ESC[K / ESC[J)\\n", + "2: 10> 20> 30> 40> 50> 60> 70> 80>\\n", + "3:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n", + "4:3456789012345678901234 ERASE EOL->XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\\n", + "5:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY<-ERASE SOL 012345678901234567890123456789\\n", + "6:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n", + "7:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\\n", + "8:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n", + "9:3456789012345678901234 ERASE EOD->ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n", + "0:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n", + "1:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n", + "2:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n", + "3:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n", + "4:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n", + "5:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n", + "6:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n", + "7:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n", + "\\n", + "---> Hit 'e' to test ERASE EOL (should make X's disappear): ", + "\\033[4;37H\\033[K\\n", // ERASE EOL + "\\033[19H", + "---> Hit 'e' to test ERASE SOL (should make Y's disappear): ", + "\\033[5;37H\\033[1K\\n", // ERASE SOL + "\\033[19H", + "---> Hit 'e' to test ERASE LINE (should make F's disappear): ", + "\\033[7;37H\\033[2K\\n", // ERASE LINE + "\\033[19H", + "---> Hit 'e' to test ERASE EOD (should make Z's disappear): ", + "\\033[9;37H\\033[0J\\n", // ERASE EOD + "\\033[19H", + "---> Hit 'e' for next test: ", + // Screen 71 + "\\033[2J\\033[H" "ESC TEST 0071: Clear Test (ESC[K / ESC[J)\\n", + "2: | | | | | |\\n", + "3:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\\n", + "4:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\\n", + "5:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\\n", + "6:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<-- ERASE SOD 567890123456789\\n", + "7:3456789012345678901234567890123456789012345678901234567890123456789\\n", + "8:3456789012345678901234567890123456789012345678901234567890123456789\\n", + "9:3456789012345678901234567890123456789012345678901234567890123456789\\n", + "\\033[19H", + "---> Hit 'e' to test ERASE SOD (should make X's disappear): ", + "\\033[6;40H\\033[1J\\n", // ERASE SOD + "\\033[19H", + "---> Hit 'e' for next test: \\033[K", + NULL +}; +if (reset) { index = 0; return 0; } +return show_test(test, index);} {} + } + Function {test_esc_delete_row(bool reset)} { + comment {--- 0080: Delete Row - ESC[M} return_type {static int} + } { + code {static int index = 0; +const char *test[] = { + // Screen 80 + "\\033[2J\\033[H" "ESC TEST 0080: Delete Row (ESC[M)\\n", + "02:456789012345678901234567890123456789012345678901234567890123456789\\n", + "03:456789012345678901234567890123456789012345678901234567890123456789\\n", + "04:456789012345678901234567890123456789012345678901234567890123456789\\n", + "05:456789012345678901234567890123456789012345678901234567890123456789\\n", + "06:456789012345678901234567890123456789012345678901234567890123456789\\n", + "07:456789012345678901234567890123456789012345678901234567890123456789\\n", + "08:456789012345678901234567890123456789012345678901234567890123456789\\n", + "09:456789012345678901234567890123456789012345678901234567890123456789\\n", + "10:456789012345678901234567890123456789012345678901234567890123456789\\n", + "\\n", + "\\n", + "\\n", + "\\n", + "\\n", + "\\n", + "\\n", + "\\n", + "\\n", + "\\n", + "\\n", + "\\n", + "\\n", + "24:456789012345678901234567890123456789012345678901234567890123456789\\n", + "25:456789012345678901234567890123456789012345678901234567890123456789", + "\\033[12H", // to prompt row + "---> Hit 'e' to test [1/4] DELETE LINE 3 with ESC[M: \\033[K", + "\\033[2K", // clear prompt + "\\033[3H", // move to line 3 + "\\033[M", // delete line 3 + "\\033[12H", // back to line 12H for prompt + //"\\033[2K\\033[3H\\033[M", // clear prompt, to row 3, delete row + //"\\033[12H", // to prompt row + "---> Hit 'e' to test [2/4] DELETE 3 MORE LINES with ESC[3M: \\033[K", + "\\033[2K\\033[3H\\033[3M", // clear prompt, to row 3, delete 3 rows + "\\033[12H", // to prompt row + "---> Hit 'e' to test [3/4] DELETE 3 MORE LINES with ESC[3M: \\033[K", + "\\033[2K\\033[3H\\033[3M", // clear prompt, to row 3, delete 3 rows + "\\033[12H", // to prompt row + "---> Hit 'e' to test [4/4] DELETE 3 MORE LINES with ESC[3M: \\033[K", + "\\033[2K\\033[3H\\033[3M", // clear prompt, to row 3, delete 3 rows + "\\033[12H", // to prompt row + "---> Hit 'e' for next test: ", + NULL +}; +if (reset) { index = 0; return 0; } +return show_test(test, index);} {} + } + Function {test_esc_insert_row(bool reset)} { + comment {--- 0085: Insert Row - ESC[L} return_type {static int} + } { + code {static int index = 0; +const char *test[] = { + // Screen 71 + "\\033[2J\\033[H" "ESC TEST 0085: Insert Row (ESC[L)\\n", + "2:3456789012345678901234567890123456789012345678901234567890123456789\\n", + "3:3456789012345678901234567890123456789012345678901234567890123456789\\n", + "4:3456789012345678901234567890123456789012345678901234567890123456789\\n", + "\\033[24H", + "24:456789012345678901234567890123456789012345678901234567890123456789\\n", + "25:456789012345678901234567890123456789012345678901234567890123456789", + "\\033[12H", + "---> Hit 'e' to test [1/3] INSERT 1 ROW AT LINE 3 with ESC[L: \\033[K", + "\\033[2K\\033[3H\\033[L", // clear prompt, to row 3, insert row + "\\033[12H", // to prompt row 17 + "---> Hit 'e' to test [2/3] INSERT 3 ROWS AT LINE 3 with ESC[3L: \\033[K", + "\\033[2K\\033[3H\\033[3L", // clear prompt, to row 3, insert 3 rows + "\\033[12H", // to prompt row 17 + "---> Hit 'e' for next test: ", + NULL +}; +if (reset) { index = 0; return 0; } +return show_test(test, index);} {} + } + Function {test_esc_scrolling(bool reset)} { + comment {--- 0090: Scrolling Up/Down - [S / M} return_type {static int} + } { + code {static int index = 0; +const char *test[] = { + // Screen 90 + "\\033[2J\\033[H" "ESC TEST 0090: Scrolling up/down\\n", + "Line 2 🡅\\n", + "Line 3 [A]\\n", + "Line 4 🡅\\n", + "Line 5 [B]\\n", + "Line 6\\n", + "Line 7\\n", + "Line 8\\n", + "Line 9\\n", + "Line 10\\n", + "Line 11\\n", + "Line 12\\n", + // Do this weird thing so the lines still appear in order in our code + "\\033[200H\\033[10ABottom Line -10", + "\\033[200H\\033[9ABottom Line -9", + "\\033[200H\\033[8ABottom Line -8", + "\\033[200H\\033[7ABottom Line -7", + "\\033[200H\\033[6ABottom Line -6", + "\\033[200H\\033[5ABottom Line -5 [D]", + "\\033[200H\\033[4ABottom Line -4 🡇", + "\\033[200H\\033[3ABottom Line -3", + "\\033[200H\\033[2ABottom Line -2 [C]", + "\\033[200H\\033[1ABottom Line -1 🡇", + "\\033[200H" "Bottom Line 0", + "\\033[15H", // Line 15 + "---> Hit 'e' to SCROLL UP 1 with [S so top line at position [A]: \\033[K", + "\\033[H\\033[S\\033[14H", // Line 14 because up one line + "---> Hit 'e' to SCROLL UP 2 with [2S so top line at position [B]: \\033[K", + "\\033[H\\033[2S\\033[12H", // Line 12 because up two more lines + "---> Hit 'e' to SCROLL DOWN 1 with M at screen top: \\033[K", + "\\033[H\\033M\\033[13H", // Line 13 because down 1 line + "---> Hit 'e' to SCROLL DOWN 2 with 2xM: \\033[K", + "\\033[H\\033M\\033M\\033[15H", // Line 15 because down 2 lines + "---> Hit 'e' to SCROLL DOWN 1 with M for bottom line at posn [C]: \\033[K", + "\\033[H\\033M\\033[16H", // Line 16 because down 1 lines + "---> Hit 'e' to SCROLL DOWN 3 with 3xM for bottom line at posn [D]: \\033[K", + "\\033[H\\033M\\033M\\033M\\033[19H", // Line 18 because down 3 lines + //TODO Other ESC commands to scroll up/down? + "---> Hit 'e' for next test: \\033[K", + // Screen 100 + "\\033[2J\\033[HESC TEST 0091: Cursor Save/Restore Test\\n", + "\\n", + " Cursor positon at 'A' was saved with ESC[s.\\n", + "\\033[12;39H>\\033[1;31m\\033[s""A""\\033[0m<\\033[20H", + "---> Hit 'e' to recall cursor position and change 'A' to 'B': \\033[K", + "\\033[u\\033[1;32m""B\\033[0m\\033[20H", + "---> Hit 'e' for next test: \\033[K", + NULL +}; +if (reset) { index = 0; return 0; } +return show_test(test, index);} {} + } + decl {////// OTHER SELF TESTS //////} {private local + } + Function {show_file(const char *filename)} { + comment {Show the specified file in the terminal +} return_type void + } { + code {// If cursor floating, do a crlf first +if (G_tty->cursor_col()!=0) G_tty->append("\\n"); + +char s[1024]; +FILE *fp = fopen(filename, "r"); +if ( fp == NULL ) { + snprintf(s, sizeof(s), "\\033[1;31m%s: %s\\033[0m\\n", filename, strerror(errno)); + s[1023] = 0; + G_tty->append_utf8(s); + return; +} +while ( fgets(s, sizeof(s)-1, fp) ) { + s[1023] = 0; + G_tty->append(s); // append line to display +} +// Last line in file? Done +fclose(fp); +fp = NULL;} {} + } + Function {speed_test()} { + comment {Run full screen random character update} return_type void + } { + code {// 50 iters of WxH random chars (no scrolling) + +// First, switch redraw style to none, so we can handle redraws() +G_tty->redraw_style(Fl_Terminal::NO_REDRAW); + +// Clear screen, do 50 iterations of random chars +G_tty->append("\\033[H"); // home +int rows = G_tty->display_rows(); +int cols = G_tty->display_columns(); +for (int i=0; i<50; i++ ) { + for ( int row=0; rowtextfgcolor_xterm(rand() % 8); // random fg uchar color for each char + G_tty->putchar(c, row, col); + } + } + G_tty->redraw(); + Fl::wait(0.005); +} +// leave test with white on black +G_tty->textfgcolor(0xd0d0d000); +G_tty->textbgcolor(0xffffffff); // special see thru color +// back to rate limited +G_tty->redraw_style(Fl_Terminal::RATE_LIMITED); +// Show the Unicode alignment page +test_firstpage(false);} {} + } + Function {show_colorbars()} { + comment {Show colorbars in terminal +} return_type void + } { + code {// If cursor floating, do a crlf first +if (G_tty->cursor_col()!=0) G_tty->append("\\n"); + +Fl_Color fgsave = G_tty->textfgcolor(); +Fl_Color bgsave = G_tty->textbgcolor(); +// ECR-1-1978 +// grey yellow cyan green magenta red blue +Fl_Color bars1[] = { 0xc0c0c000, 0xbfc03700, 0x2ac0bf00, 0x25c03300, 0xbe00bb00, 0xbd051800, 0x1600ba00 }; +Fl_Color bars2[] = { 0x1600ba00, 0x11111100, 0xbe00bb00, 0x11111100, 0x2ac0bf00, 0x11111100, 0xc0c0c000 }; +Fl_Color boxes[] = { 0x05214a00, 0xffffff00, 0x32006700, 0x11111100, 0x03030300, 0x11111100, 0x1d1d1d00, 0x11111100 }; +// -I 100% wht Q+ superblack black 4% black +// \\________________________________/ +// pluge +const char *bar = "███████████"; +const char *box1= "██████████████"; +const char *box2= "█████████████"; +const char *pluge = "███"; +G_tty->append("\\033[2J\\033[H"); +// Print 75% bars: bars1[] +{ + for ( int y=0; y<16; y++ ) { + for ( int i=0; i<7; i++ ) { + G_tty->textfgcolor(bars1[i]); + G_tty->append(bar); + } + G_tty->append("\\n"); + } +} +// Print strip: bars2[] +{ + for ( int y=0; y<2; y++ ) { + for ( int i=0; i<7; i++ ) { + G_tty->textfgcolor(bars2[i]); + G_tty->append(bar); + } + G_tty->append("\\n"); + } +} +// Bottom boxes +{ + for ( int y=0; y<7; y++ ) { + for ( int i=0; i<8; i++ ) { + G_tty->textfgcolor(boxes[i]); + if ( i < 3 ) G_tty->append(box1); + else if ( i < 4 ) G_tty->append(box2); + else if ( i < 7 ) G_tty->append(pluge); + else G_tty->append(box2); + } + if ( y < 6 ) G_tty->append("\\n"); + } +} +// Restore fg/bg colors +G_tty->textfgcolor(fgsave ); +G_tty->textbgcolor(bgsave );} {} + } + Function {unicode_alignment()} { + comment {Show unicode alignment test +} return_type void + } { + code {test_firstpage(true);} {} + } + Function {add_lines(int count)} { + comment {Add specified number of test lines to tty} return_type void + } { + code {// If cursor floating, do a crlf first +if (G_tty->cursor_col()!=0) G_tty->append("\\n"); +for ( int t=0; tprintf("Line %04d -- AAA BBB CCC DDD\\n", G_lines++);} {} + } + Function {do_command(const char *cmd)} { + comment {Run the command, output appends to terminal +} return_type void + } { + code {// Run command in pipe, return output to tty +// TODO: This should probably be reimplemented as a thread. +// Also, I doubt this will work well on Windows. +// If it's a real problem, open a file and 'tail' it ourselves instead. +// +\#ifdef _WIN32 +\#define POPEN(a,b) _popen(a,b) // effin windows +\#define PCLOSE(a) _pclose(a) +\#define READ(a,b,c) _read(a,b,c) +\#define FILENO(a) _fileno(a) +\#define SSIZE_T int +\#else +\#define POPEN(a,b) popen(a,b) +\#define PCLOSE(a) pclose(a) +\#define READ(a,b,c) read(a,b,c) +\#define FILENO(a) fileno(a) +\#define SSIZE_T ssize_t +\#endif + +// If cursor floating, do a crlf first +if (G_tty->cursor_col()!=0) G_tty->append("\\n"); + +FILE *fp = POPEN(cmd, "r"); +char s[4096]; +if ( fp == NULL ) { + sprintf(s, "\\033[0;31mCan't execute '%.200s': %s\\033[0m\\n", cmd, strerror(errno)); + G_tty->append_utf8(s); + return; +} + +int fd = FILENO(fp); +\#ifndef _WIN32 +// Non-blocking IO keeps interface "alive" during slow commands. +// Too bad Microsoft's implementation of the C library read() call +// is so poor it doesn't properly support non-blocking IO or fcntl(). +// +fcntl(fd, F_SETFL, O_NONBLOCK); +\#endif + +// Read in byte blocks +G_tty->append(NULL); // (clears utf8 cache) +while (1) { + Fl::wait(0.05); + SSIZE_T bytes = READ(fd, s, sizeof(s)); // shout in uppercase so windows can hear us + if (bytes == -1 && errno == EAGAIN) continue; // no data yet + else if (bytes > 0) G_tty->append(s, bytes); // write block to terminal, handles utf8 + else break; // pipe closed +} + +PCLOSE(fp); +G_tty->append_ascii("\\033[33;2m<>\\033[0m\\n"); +G_tty->redraw();} {} + } + decl {////// GUI LAYOUT //////} {private local + } + Function {update_inputs()} { + comment {Resync the inputs with widget's values} return_type void + } { + code {// Scroll History +scrollhistory_input->value( G_tty->history_rows() ); + +// Redraw rate +redraw_rate_spinner->value( G_tty->redraw_rate() ); + +// Font Size +fontsize_input->value( G_tty->textsize() ); + +// Scrollbar Size +scrollbarsize_input->range(0, 80); +scrollbarsize_input->step(1); +scrollbarsize_input->value( G_tty->scrollbar_size() ); + +// show_unknown() enable/disable +showunknown_radio->value( G_tty->show_unknown() ? 1 : 0 ); + +// ansi() enable/disable +ansi_radio->value(tty ->ansi() ? 1 : 0 ); + +// box() choice +switch ( G_tty->box() ) { + case FL_UP_FRAME: box_choice->value(0); break; + case FL_DOWN_FRAME: box_choice->value(1); break; + case FL_THIN_UP_FRAME: box_choice->value(2); break; + case FL_THIN_DOWN_FRAME: box_choice->value(3); break; + case FL_ENGRAVED_FRAME: box_choice->value(4); break; + case FL_EMBOSSED_FRAME: box_choice->value(5); break; + case FL_BORDER_FRAME: box_choice->value(6); break; + // --- + case FL_UP_BOX: box_choice->value(7); break; + case FL_DOWN_BOX: box_choice->value(8); break; + case FL_FLAT_BOX: box_choice->value(9); break; + case FL_THIN_UP_BOX: box_choice->value(10); break; + case FL_THIN_DOWN_BOX: box_choice->value(11); break; + case FL_BORDER_BOX: box_choice->value(12); break; + case FL_NO_BOX: box_choice->value(13); break; + default: box_choice->value(1); break; +} + +// color() +{ + char s[80]; + sprintf(s, "\#%08x", G_tty->color()); + color_input->value(s); +} + +// textfg/bgcolor() +{ + char s[80]; + sprintf(s, "\#%08x", G_tty->textfgcolor()); + textfgcolor_input->value(s); + sprintf(s, "\#%08x", G_tty->textbgcolor()); + textbgcolor_input->value(s); +} + +// cursorfg/bg color +{ + char s[80]; + sprintf(s, "\#%08x", G_tty->cursorfgcolor()); cursorfgcolor_input->value(s); + sprintf(s, "\#%08x", G_tty->cursorbgcolor()); cursorbgcolor_input->value(s); +} + +// Margins +{ + int lt = G_tty->margin_left(); + int rt = G_tty->margin_right(); + int top = G_tty->margin_top(); + int bot = G_tty->margin_bottom(); + char s[100]; + sprintf(s, "%d, %d, %d, %d", lt,rt,top,bot); + margins_input->value(s); +} + +// selectionfg/bgcolor() +{ + char s[80]; + sprintf(s, "\#%08x", G_tty->selectionfgcolor()); + selectionfgcolor_input->value(s); + sprintf(s, "\#%08x", G_tty->selectionbgcolor()); + selectionbgcolor_input->value(s); +}} {} + } + Function {make_window()} {open + } { + Fl_Window win { + label {Fl_Terminal Test} + callback {exit(0);} open selected + xywh {0 0 772 863} type Double visible + } { + Fl_Spinner scrollhistory_input { + label {Scroll History} + callback {int val = int(scrollhistory_input->value() + .5); +G_tty->history_rows(val);} + tooltip {Scrollback history size. +10,000 max.} xywh {115 10 115 20} labelsize 12 minimum 0 maximum 10000 textsize 12 + } + Fl_Spinner fontsize_input { + label {Font Size} + callback {int val = int(fontsize_input->value() + .5); +G_tty->textsize(val);} + xywh {115 38 115 20} labelsize 12 textsize 12 + } + Fl_Spinner scrollbarsize_input { + label {Scrollbar Size} + callback {int val = int(scrollbarsize_input->value() + .5); +G_tty->scrollbar_size(val); G_tty->redraw();} + tooltip {Size of scrollbar width in pixels} xywh {115 67 115 20} labelsize 12 textsize 12 + } + Fl_Spinner redraw_rate_spinner { + label {Min Redraw Time} + callback {float rate = float(redraw_rate_spinner->value()); +//printf("Setting redraw rate to %.2f\\n", rate); +G_tty->redraw_rate(rate);} + tooltip {Minimum time between redraws +Default is 0.10 secs.} xywh {115 94 115 20} type Float labelsize 12 minimum 0.05 maximum 5 step 0.1 textsize 12 + } + Fl_Choice scheme_widget { + label scheme open + tooltip Scheme xywh {115 120 115 23} down_box BORDER_BOX labelsize 12 textsize 12 + class Fl_Scheme_Choice + } {} + Fl_Choice box_choice { + label {box()} open + tooltip {The border box for the Fl_Terminal} xywh {115 147 115 23} down_box BORDER_BOX labelsize 12 textsize 12 + } { + MenuItem {} { + label FL_UP_FRAME + user_data FL_UP_FRAME user_data_type long + callback {G_tty->box(FL_UP_FRAME); G_tty->redraw();} + xywh {10 10 100 20} labelsize 8 + } + MenuItem {} { + label FL_DOWN_FRAME + user_data FL_DOWN_FRAME user_data_type long + callback {G_tty->box(FL_DOWN_FRAME); G_tty->redraw();} + xywh {10 10 100 20} labelsize 8 + } + MenuItem {} { + label FL_THIN_UP_FRAME + user_data FL_THIN_UP_FRAME user_data_type long + callback {G_tty->box(FL_THIN_UP_FRAME); G_tty->redraw();} + xywh {10 10 100 20} labelsize 8 + } + MenuItem {} { + label FL_THIN_DOWN_FRAME + user_data FL_THIN_DOWN_FRAME user_data_type long + callback {G_tty->box(FL_THIN_DOWN_FRAME); G_tty->redraw();} + xywh {10 10 100 20} labelsize 8 + } + MenuItem {} { + label FL_ENGRAVED_FRAME + user_data FL_ENGRAVED_FRAME user_data_type long + callback {G_tty->box(FL_ENGRAVED_FRAME); G_tty->redraw();} + xywh {10 10 100 20} labelsize 8 + } + MenuItem {} { + label FL_EMBOSSED_FRAME + user_data FL_EMBOSSED_FRAME user_data_type long + callback {G_tty->box(FL_EMBOSSED_FRAME); G_tty->redraw();} + xywh {10 10 100 20} labelsize 8 + } + MenuItem {} { + label FL_BORDER_FRAME + user_data FL_BORDER_FRAME user_data_type long + callback {G_tty->box(FL_BORDER_FRAME); G_tty->redraw();} + xywh {10 10 100 20} labelsize 8 divider + } + MenuItem {} { + label FL_UP_BOX + user_data FL_UP_BOX user_data_type long + callback {G_tty->box(FL_UP_BOX); G_tty->redraw();} + xywh {10 10 100 20} labelsize 8 + } + MenuItem {} { + label FL_DOWN_BOX + callback {G_tty->box(FL_DOWN_BOX); G_tty->redraw();} + xywh {20 20 100 20} labelsize 8 + } + MenuItem {} { + label FL_FLAT_BOX + callback {G_tty->box(FL_FLAT_BOX); +G_tty->redraw();} + xywh {30 30 100 20} labelsize 8 + } + MenuItem {} { + label FL_THIN_UP_BOX + callback {G_tty->box(FL_THIN_UP_BOX); G_tty->redraw();} + xywh {40 40 100 20} labelsize 8 + } + MenuItem {} { + label FL_THIN_DOWN_BOX + callback {G_tty->box(FL_THIN_DOWN_BOX); G_tty->redraw();} + xywh {50 50 100 20} labelsize 8 + } + MenuItem {} { + label FL_BORDER_BOX + callback {G_tty->box(FL_BORDER_BOX); G_tty->redraw();} + xywh {0 0 100 20} labelsize 8 + } + MenuItem {} { + label FL_NO_BOX + callback {G_tty->box(FL_NO_BOX); G_tty->redraw();} + xywh {10 10 100 20} labelsize 8 + } + } + Fl_Input selectionfgcolor_input { + label {selectionfgcolor()} + callback {ulong ival; +const char *val_str = selectionfgcolor_input->value(); +if (sscanf(val_str, "\#%lx", &ival) != 1) + if (sscanf(val_str, "%ld", &ival) != 1) { + fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)"); + update_inputs(); + return; +} +G_tty->selectionfgcolor(Fl_Color(ival)); +//DEBUG ::printf("IVAL is %08lx\\n",ival); +G_tty->redraw();} + tooltip {The mouse selection foreground color. +Can be decimal (e.g. 12) or hex (e.g. \#0c, \#0000000c, etc)} xywh {115 185 115 20} labelsize 10 when 28 textfont 4 textsize 12 + } + Fl_Input selectionbgcolor_input { + label {selectionbgcolor()} + callback {ulong ival; +const char *val_str = selectionbgcolor_input->value(); +if (sscanf(val_str, "\#%lx", &ival) != 1) + if (sscanf(val_str, "%ld", &ival) != 1) { + fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)"); + update_inputs(); + return; +} +G_tty->selectionbgcolor(Fl_Color(ival)); +//DEBUG ::printf("IVAL is %08lx\\n",ival); +G_tty->redraw();} + tooltip {The mouse selection background color. +Can be decimal (e.g. 12) or hex (e.g. \#0c, \#0000000c, etc)} xywh {115 210 115 20} labelsize 10 when 28 textfont 4 textsize 12 + } + Fl_Check_Button showunknown_radio { + label {show_unknown()} + callback {G_tty->show_unknown(showunknown_radio->value() ? true : false); +G_tty->redraw();} + tooltip {Shows unknown escape sequences/unprintable chars as "¿" character} xywh {255 9 105 22} down_box DOWN_BOX labelsize 10 + } + Fl_Check_Button interactivecursor_radio { + label {Interactive Cursor} + callback {bool val = interactivecursor_radio->value() ? true : false; +G_tty->interactive_cursor(val);} + tooltip {Allow Up/Dn/Lt/Rt keys to move cursor +when terminal has focus} xywh {365 9 125 22} down_box DOWN_BOX labelsize 10 + } + Fl_Check_Button ansi_radio { + label {ansi()} + callback {G_tty->ansi(ansi_radio->value() ? true : false);} + tooltip {Handle ANSI/xterm escape sequences} xywh {255 30 95 20} down_box DOWN_BOX labelsize 10 + } + Fl_Check_Button stdout_radio { + label {Echo tests to stdout} + tooltip {Also send test output to stdout} xywh {365 28 121 20} down_box DOWN_BOX labelsize 10 + } + Fl_Box {} { + label {Lt, Rt, Top, Bot} + xywh {345 50 145 20} labelsize 10 + } + Fl_Input margins_input { + label Margins + callback {int lt,rt,top,bot; +const char *val = margins_input->value(); +if (sscanf(val, "%d,%d,%d,%d",<,&rt,&top,&bot)!=4) { + fl_alert("Margins: expected four comma separated integers"); + return; +} +G_tty->margin_left(lt); +G_tty->margin_right(rt); +G_tty->margin_top(top); +G_tty->margin_bottom(bot); +G_tty->redraw();} + xywh {345 70 145 20} labelsize 12 when 28 textsize 12 + } + Fl_Input color_input { + label {color()} + callback {ulong ival; +const char *val_str = color_input->value(); +if (sscanf(val_str, "\#%lx", &ival) != 1) + if (sscanf(val_str, "%ld", &ival) != 1) { + fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)"); + update_inputs(); + return; +} +G_tty->color(Fl_Color(ival)); +//DEBUG ::printf("IVAL is %08lx\\n",ival); +G_tty->redraw();} + tooltip {The widget's background color() +Can be decimal (e.g. 12) or hex (e.g. \#0c, \#0000000c, etc)} xywh {345 95 145 20} labelsize 12 when 28 textfont 4 textsize 12 + } + Fl_Input textfgcolor_input { + label {textfgcolor()} + callback {ulong ival; +const char *val_str = textfgcolor_input->value(); +if (sscanf(val_str, "\#%lx", &ival) != 1) + if (sscanf(val_str, "%ld", &ival) != 1) { + fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)"); + update_inputs(); + return; +} +G_tty->textfgcolor(Fl_Color(ival)); +G_tty->textfgcolor_default(Fl_Color(ival)); +//DEBUG ::printf("IVAL is %08lx\\n",ival); +G_tty->redraw();} + tooltip {The text foreground color. +Can be decimal (e.g. 12) or hex (e.g. \#0c, \#0000000c, etc)} xywh {345 120 145 20} labelsize 12 when 28 textfont 4 textsize 12 + } + Fl_Input textbgcolor_input { + label {textbgcolor()} + callback {ulong ival; +const char *val_str = textbgcolor_input->value(); +if (sscanf(val_str, "\#%lx", &ival) != 1) + if (sscanf(val_str, "%ld", &ival) != 1) { + fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)"); + update_inputs(); + return; +} +G_tty->textbgcolor(Fl_Color(ival)); +G_tty->textbgcolor_default(Fl_Color(ival)); +//DEBUG ::printf("IVAL is %08lx\\n",ival); +G_tty->redraw();} + tooltip {The text background color. +Can be decimal (e.g. 12) or hex (e.g. \#0c, \#0000000c, etc)} xywh {345 145 145 20} labelsize 12 when 28 textfont 4 textsize 12 + } + Fl_Input cursorfgcolor_input { + label {cursorfgcolor()} + callback {ulong ival; +const char *val_str = cursorfgcolor_input->value(); +if (sscanf(val_str, "\#%lx", &ival) != 1) + if (sscanf(val_str, "%ld", &ival) != 1) { + fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)"); + update_inputs(); + return; +} +G_tty->cursorfgcolor(Fl_Color(ival)); +//DEBUG ::printf("IVAL is %08lx\\n",ival); +G_tty->redraw();} + tooltip {Foreground color for text under the cursor.} xywh {345 170 145 20} labelsize 12 when 28 textfont 4 textsize 12 + } + Fl_Input cursorbgcolor_input { + label {cursorbgcolor()} + callback {ulong ival; +const char *val_str = cursorbgcolor_input->value(); +if (sscanf(val_str, "\#%lx", &ival) != 1) + if (sscanf(val_str, "%ld", &ival) != 1) { + fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)"); + update_inputs(); + return; +} +G_tty->cursorbgcolor(Fl_Color(ival)); +//DEBUG ::printf("IVAL is %08lx\\n",ival); +G_tty->redraw();} + tooltip {Background color for the cursor. +This is the cursor block's color} xywh {345 195 145 20} labelsize 12 when 28 textfont 4 textsize 12 + } + Fl_Choice {} { + label {Terminal Color} + xywh {345 220 145 20} down_box BORDER_BOX labelsize 12 textsize 12 + } { + MenuItem {} { + label {White on DarkAmber} + callback {G_tty->color(0x30200000); +G_tty->textfgcolor(0xd0d0d000); +G_tty->textbgcolor(0xffffffff); // "see through" color +update_inputs(); +add_lines(50);} + xywh {10 10 100 20} labelsize 9 + } + MenuItem {} { + label {White on Black} + callback {G_tty->textfgcolor(0xd0d0d000); +G_tty->textbgcolor(0xffffffff); +G_tty->color(0x00000000); +update_inputs(); +add_lines(50);} + xywh {20 20 100 20} labelsize 9 + } + MenuItem {} { + label {Black on White} + callback {G_tty->textfgcolor(0x00000000); +G_tty->textbgcolor(0xd0d0d000); +G_tty->color(0xd0d0d000); +update_inputs(); +add_lines(50);} + xywh {20 20 100 20} labelsize 9 + } + MenuItem {} { + label {Green on Dark Green} + callback {G_tty->textfgcolor(0x00d04000); +G_tty->textbgcolor(0x00200800); +G_tty->color(0x00200800); +update_inputs(); +add_lines(50);} + xywh {30 30 100 20} labelsize 9 + } + MenuItem {} { + label {Orange on Dark Orange} + callback {G_tty->textfgcolor(0xd0704000); +G_tty->textbgcolor(0x20100000); +G_tty->color(0x20100000); +update_inputs(); +add_lines(50);} + xywh {40 40 100 20} labelsize 9 + } + } + Fl_Group {} { + label {Terminal Ops} + xywh {505 15 120 210} box ENGRAVED_FRAME labelsize 11 + } { + Fl_Button {} { + label {Clear Screen} + callback {G_tty->append("\\033[H\\033[2J"); // home, cls +G_tty->redraw(); +// Reset the 'Add +50' line counter to 1 +G_lines = 1;} + tooltip {Clear terminal screen. +Moves what was on the screen to the scroll history.} xywh {520 31 90 25} labelsize 11 + } + Fl_Button {} { + label {Clear History} + callback {G_tty->append("\\033[3J"); // clr history +G_tty->redraw();} + tooltip {Clear scrollback history.} xywh {520 62 90 25} labelsize 11 + } + Fl_Button {} { + label {Reset Terminal} + callback {G_tty->append("\\033c"); // reset terminal +G_tty->redraw();} + tooltip {Reset terminal. +Clears: screen, history, sets default tabstops, etc.} xywh {520 93 90 25} labelsize 11 + } + Fl_Button {} { + label {Home Cursor} + callback {G_tty->append("\\033[H");} + tooltip {Moves cursor to home position (top/left) using ESC[H} xywh {520 124 90 25} labelsize 11 + } + Fl_Button {} { + label {Speed Test} + callback {speed_test();} + tooltip {Runs a full screen random chars/colors +Shortcut: S} xywh {520 155 90 25} shortcut 0x73 labelsize 11 + } + Fl_Button {} { + label {Ring Debug} + callback {// Force scroll history to be small so we can see entire ring w/out scrolling +if (scrollhistory_input->value() > 35) { + scrollhistory_input->value(35); + scrollhistory_input->do_callback(); +} + +// Show debug window +G_tty->show_ring_debug_window();} + tooltip {Show the Fl_Terminal raw ring buffer contents. +(Warning: This slows the UI and uses continuous cpu until closed)} xywh {520 187 90 25} labelsize 11 + } + } + Fl_Group {} { + label {Terminal Tests} + xywh {640 15 120 210} box ENGRAVED_FRAME labelsize 11 + } { + Fl_Button {} { + label {Unicode +Alignment} + callback {unicode_alignment();} + tooltip {Show a Unicode screen alignment test +Checks that troublesome Unicode chars don't cause misalignment} xywh {655 25 90 30} labelsize 9 + } + Fl_Button {} { + label {+50 Lines} + callback {add_lines(50);} + tooltip {Add 50 lines of text to terminal. +Tests screen history, scrollup} xywh {655 60 90 30} labelsize 9 + } + Fl_Button {} { + label {Color Bars} + callback {show_colorbars();} + tooltip {Show colorbar test +Tests API for setting colors +Does *NOT* use ESC codes} xywh {655 95 90 30} labelsize 11 + } + Fl_Box {} { + label {Self Tests} + xywh {655 167 90 15} labelsize 10 + } + Fl_Button {} { + label {@<<} + callback {NextEscapeTest(-1);} + comment {Move to previous test} + tooltip {Reverse through the ESC code self tests +Shortcut: SHIFT+E} xywh {655 185 40 30} shortcut 0x10065 labelsize 11 + } + Fl_Button {} { + label {@>>} + callback {NextEscapeTest(1);} + comment {Move to next test} + tooltip {Advance through the ESC code self tests +Shortcut: 'e'} xywh {705 185 40 30} shortcut 0x65 labelsize 11 + } + } + Fl_Input showfile_input { + label {Show File} + callback {showfile_input->deactivate(); // causes focus loss? +command_input->deactivate(); +win->redraw(); +Fl::wait(.01); +show_file(showfile_input->value()); +showfile_input->activate(); +command_input->activate(); +Fl::focus(showfile_input); // return focus +win->redraw();} + tooltip {Type in the pathname of a file to cat to the screen} xywh {109 250 650 25} labelsize 12 when 10 textfont 4 + } + Fl_Input command_input { + label Command + callback {showfile_input->deactivate(); +command_input->deactivate(); // causes focus loss? +win->redraw(); +Fl::wait(.01); +do_command(command_input->value()); +showfile_input->activate(); +command_input->activate(); +Fl::focus(command_input); // return focus +win->redraw();} + tooltip {Command to run. +Hit ENTER to run command. +The command's stdout will appear in terminal.} xywh {109 285 650 25} labelsize 12 when 12 textfont 4 + } + Fl_Group tty {open + xywh {10 320 750 530} box DOWN_FRAME color 0 + class MyTerminal + } {} + } + code {// CTOR +G_tty = tty; // global access +G_tty->color(0x30200000); // dark orange (makes true black easy to see) +G_tty->textsize(12); // smaller text (RGB demo needs this) +win->resizable(tty); +command_input->when(FL_WHEN_ENTER_KEY_ALWAYS); +command_input->take_focus(); // ensure command prompt has keyboard focus on startup + +\#ifdef _WIN32 +showfile_input->value("c:\\\\Windows\\\\system.ini"); +command_input->value("dir c:\\\\windows"); +\#else +showfile_input->value("/etc/login.defs"); +command_input->value("ls -la --color && ping google.com -c 5"); +\#endif + +// Sync input vals with widget's current values +update_inputs();} {} + } +} + +decl {////// MAIN //////} {private local +} + +Function {} {open +} { + code {G_tty = NULL; +Application app; // sets G_tty +G_app = &app; +app.show(argc, argv); +// Run the "firstpage" test +app.test_firstpage(false);} {} +} -- cgit v1.2.3