import std.stdio, std.string, std.conv, std.math, std.algorithm, std.format, std.ascii; import core.thread; const int CROWS = 5; const int CCOLS = 4; const int MAX_LEN = 64; const int RGB_RESULT = 6052991; string[] kbdstr = [ "Off", "C", " 0) { gdisplaystr.length--; displaystr(gdisplaystr.length == 0 ? "0" : gdisplaystr.idup, RGB_RESULT); } break; case 18: if (gdisplaystr.length > 0) { if (gdisplaystr[0] == '-') gdisplaystr = gdisplaystr[1 .. $].dup; else gdisplaystr = '-' ~ gdisplaystr; displaystr(gdisplaystr.idup, RGB_RESULT); } break; case 3, 7, 11, 15: gbinop = kbdstr[idx][0]; gax = to!double(gdisplaystr.length ? gdisplaystr : "0"); gfisnumberentering = false; break; case 19: if (gfisnumberentering) { gbx = to!double(gdisplaystr.length ? gdisplaystr : "0"); gfisnumberentering = false; } if (gbinop == '+') gax += gbx; else if (gbinop == '-') gax -= gbx; else if (gbinop == '*') gax *= gbx; else if (gbinop == '/') gax /= gbx; gdisplaystr = format("%.16g", gax).dup; displaystr(gdisplaystr.idup, RGB_RESULT); break; default: if (!gfisnumberentering) { gdisplaystr = [kbdstr[idx][0]]; gfisnumberentering = true; } else if (gdisplaystr.length < MAX_LEN - 1) { gdisplaystr ~= kbdstr[idx][0]; } displaystr(gdisplaystr.idup, RGB_RESULT); break; } } void main() { char[] buf; while (gfnotexit && stdin.readln(buf)) { string line = buf.strip().idup; if (line == "drawapp") { write("Fo 0 611 3\nFo 2 140 3\nF 0 16777215\nFR 0 0 0 10000 10000\nZ \nB 0 12632256\n"); foreach (i; 0 .. 20) { int r = cast(int)i / CCOLS, c = cast(int)i % CCOLS; writef("F 0 10526880\nFR 0 %d %d %d %d\n", c*2000+220, r*1200+1220, c*2000+2080, r*1200+2280); writef("F 0 986895\nR 0 %d %d %d %d\n", c*2000+200, r*1200+1200, c*2000+2100, r*1200+2300); writef("F 0 %d\nC$ 0 %d %d \"%s\"\n", kbdcolor[i], c*2000+1100, r*1200+1700, kbdstr[i]); } write( "F 0 32385\nC$ 0 5000 800\"D cloud app\"\n" ); stdout.flush(); write( "F 2 255\n" ); write( "C$ 2 5000 7200\"Corrie Zucker Technologies LLC.\"\n" ); write( "C$ 2 5000 7340\"d/b/a CZ Technologies\"\nZ \n" ); stdout.flush(); displaystr(gdisplaystr.length ? gdisplaystr.idup : "0", RGB_RESULT); } else { auto parts = line.split(); if (parts.length < 3) continue; int btn = to!int(parts[0]), x = to!int(parts[1]), y = to!int(parts[2]); if (x >= 0) { int r = (y - 1200) / 1200, c = (x - 200) / 2000; if (r >= 0 && r < CROWS && c >= 0 && c < CCOLS) keyToExe(r * CCOLS + c); } else if (x == -2) { string map = "oc\x08*789/456+123-0.i="; auto idx = indexOf(map, cast(char)std.ascii.toLower(cast(char)btn)); if (idx != -1) keyToExe(idx); } else if (x == -4) { writef("Rz %d %d\n", btn, y ); } else if (x == -5) { writef("Mv %d %d\n", btn, y ); } else if (x == -98) { Thread.sleep(msecs(100 * y)); } } } }