/* Build with `cc -lm -O2 retro-unix.c -o retro` */ #define ENABLE_FLOATS #define ENABLE_FILES #define ENABLE_UNIX #define ENABLE_RNG #define ENABLE_CLOCK #define ENABLE_SCRIPTING #define BIT64 /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ #ifndef MAKEFILE_CONFIG #define ENABLE_FLOATS #define ENABLE_FILES #define ENABLE_UNIX #define ENABLE_RNG #define ENABLE_CLOCK #define ENABLE_SCRIPTING /* #define ENABLE_SOCKETS */ #define ENABLE_SIGNALS #define ENABLE_MULTICORE /* #define ENABLE_FFI */ #define ENABLE_ERROR #define ENABLE_UNSIGNED #define ENABLE_MALLOC #define ENABLE_BLOCKS #define ENABLE_IOCTL #endif #ifdef ENABLE_MULTICORE #define CORES 8 #else #define CORES 1 #endif #if defined(_WIN32) || defined(_WIN64) #define NEEDS_STRL #endif #if defined(__APPLE__) && defined(__MACH__) && defined(NEEDS_STRL) #undef NEEDS_STRL #endif /* Configuration ----------------------------------------------------- */ #ifndef BIT64 #define CELL int32_t #define CELL_MIN INT_MIN + 1 #define CELL_MAX INT_MAX - 1 #else #define CELL int64_t #define CELL_MIN LLONG_MIN + 1 #define CELL_MAX LLONG_MAX - 1 #endif #ifndef IMAGE_SIZE #define IMAGE_SIZE 524288 /* Amount of RAM, in cells */ #endif #ifndef ADDRESSES #define ADDRESSES 256 /* Depth of address stack */ #endif #ifndef STACK_DEPTH #define STACK_DEPTH 256 /* Depth of data stack */ #endif #ifdef BRANCH_PREDICTION /* The Compiler Magic Trick */ #define unlikely(x) __builtin_expect((x),0) #endif #define DEVICE_OUTPUT 0 #define DEVICE_KEYBOARD 1 #define DEVICE_FLOATS 2 #define DEVICE_FILES 4 #define DEVICE_BLOCKS 3 #define DEVICE_CLOCK 5 #define DEVICE_RESERVED6 6 #define DEVICE_SOCKET 7 #define DEVICE_UNIX 8 #define DEVICE_SCRIPTING 9 #define DEVICE_RNG 10 #define DEVICE_RESERVED11 11 #define DEVICE_RESERVED12 12 #define DEVICE_RESERVED13 13 #define DEVICE_IOCTL 14 #define DEVICE_MALLOC 15 #define DEVICE_IMAGE 1000 #define DEVICE_ERROR 1234 #define DEVICE_MULTICORE 8000 #define DEVICE_FFI 8100 #define DEVICE_UNSIGNED 8101 #define ACTIVE vm->cpu[vm->active] #define TIB vm->memory[7] #define TIB_END vm->memory[8] #define MAX_DEVICES 32 #define MAX_OPEN_FILES 32 #include #ifndef CELL #ifndef BIT64 #define CELL int32_t #define CELL_MIN INT_MIN + 1 #define CELL_MAX INT_MAX - 1 #else #define CELL int64_t #define CELL_MIN LLONG_MIN + 1 #define CELL_MAX LLONG_MAX - 1 #endif #endif CELL ngaImageCells = 31962; CELL ngaImage[] = { 1793,12065,31911,31961,202409,422,394,1333,1535,0,12113,0,10,1,10,2,10,3,10, 4,10,5,10,6,10,7,10,8,10,11,10,12,10,13,10,14,10,15,10, 16,10,17,10,18,10,19,10,20,10,21,10,22,10,23,10,24,10,25,68223234, 1,2575,85000450,1,656912,163,180,268505089,65,64,285281281,0,65,2063,10,101384453,0,9,10,68485378, 255,18350338,8,255,1045,18350338,16,255,1045,352393217,24,255,10,268289,-24,68229121,-16,68229121,-8,2577, 2049,58,25,459011,99,524546,99,302256641,1,10,16974595,0,50529798,10,25,524547,118,50529798,10,17108738, 1,251790353,101777669,1,17565186,109,524545,113,66,167838467,-1,134287105,3,61,659457,3,459023,130,2049,58, 25,2049,130,1793,137,2049,137,117506307,0,130,0,524545,28,135,168820993,0,149,1642241,149,134283523, 13,135,1793,130,524545,2049,130,1793,130,16846593,149,163,180,1793,66,16846593,149,135,180,1793, 66,7,10,659713,1,659713,2,659713,3,659713,4,659713,5,659713,6,1793,31023,17108737,3,2, 524559,130,2049,130,2049,130,524545,0,130,524545,0,130,524545,0,130,2049,144,1048838,2,1642241, 10,7,30474,8246457295145463473,167841793,221,11,17826049,0,221,2,15,25,524546,29199,134287105,222,29,2305,223, 459023,231,2049,5044,134287361,222,226,659201,221,10,659969,7,2049,58,25,17694978,58,249,9,84152833, 48,319750404,248,117507601,251,184618754,45,25,16974851,-1,168886532,1,134284289,1,264,134284289,0,251,660227,32, 0,0,115,105,103,105,108,58,105,0,285278479,281,6,2576,524546,104,1641217,1,167838467,278, 2049,293,2049,289,524545,281,241,17826050,280,0,2572,2563,2049,271,1793,156,459023,156,1793,319, 17760513,168,3,194,8,251727617,3,2,2049,182,16,168820993,-1,149,2049,182,2575,2049,241,17563906, 0,333,9,1793,156,285282049,3,2,134287105,149,330,524545,1793,130,16846593,3,0,130,8,659201, 3,524545,28,135,17043201,3,13,2049,135,2049,130,268505092,149,1642241,149,656131,659201,3,524545,13, 135,2049,130,459009,25,135,459009,57,135,459009,21,135,459009,23,135,1793,11426,10,524546,182, 134284303,184,1807,1333,1642241,280,285282049,402,1,459012,397,117509889,221,397,134287105,402,241,16845825,0,410, 394,1793,66,1793,424,17826050,402,299,8,117506305,403,413,66,2116,11340,11700,11400,13685,13104,12432, 12402,9603,9801,11514,11413,11110,12528,11948,10302,13340,9700,13455,12753,10500,10670,12654,13320,11960,13908,10088, 10605,11865,11025,0,2049,241,987393,1,1793,130,524546,500,2049,498,2049,498,17891588,2,500,8, 17045505,-24,-16,17043736,-8,1118488,1793,130,17043202,1,169021201,2049,58,25,33883396,101450758,6404,459011,490,34668804, 2,2049,487,524545,432,490,302056196,432,659969,1,114,101,116,114,111,46,109,117,114,105, 0,0,15,174,509,193489870,17064,100,117,112,0,520,17,174,509,6385162522,17010,100,114,111, 112,0,530,19,174,509,6385706560,20030,115,119,97,112,0,541,27,174,509,6385107969,16142,99, 97,108,108,0,552,29,174,509,193490778,17107,101,113,63,0,563,31,174,509,6383171847,13437, 45,101,113,63,0,573,33,174,509,193498500,17784,108,116,63,0,584,35,174,509,193493055, 17412,103,116,63,0,594,37,174,509,210712273007,17127,102,101,116,99,104,0,604,39,174, 509,210728224082,19991,115,116,111,114,101,0,616,41,174,509,177616,13362,43,0,628,43,174, 509,177618,13400,45,0,636,45,174,509,177615,13342,42,0,644,47,174,509,6383252404,13515,47, 109,111,100,0,652,49,174,509,193486360,15351,97,110,100,0,663,51,174,509,5863686,18339, 111,114,0,673,53,174,509,193511454,20580,120,111,114,0,682,55,174,509,210727785923,19706,115, 104,105,102,116,0,692,388,180,509,6385597157,18439,112,117,115,104,0,704,391,180,509, 193502740,18403,112,111,112,0,715,385,180,509,5861552,13536,48,59,0,725,58,168,509,8246307614109670331, 17146,102,101,116,99,104,45,110,101,120,116,0,734,61,168,509,8246931865698567806,20010,115,116, 111,114,101,45,110,101,120,116,0,751,271,168,509,-4555094569267928757,19533,115,58,116,111,45, 110,117,109,98,101,114,0,768,118,168,509,210726128775,19000,115,58,101,113,63,0,786, 104,168,509,7572865151309012,19237,115,58,108,101,110,103,116,104,0,798,66,168,509,6953390994662,16303, 99,104,111,111,115,101,0,813,76,174,509,5863476,17600,105,102,0,826,74,168,509, 193429569,13457,45,105,102,0,835,310,180,509,229482595734751,0,115,105,103,105,108,58,40,0, 845,149,156,509,7570887965854272,14253,67,111,109,112,105,108,101,114,0,859,3,156,509,6384141667, 14360,72,101,97,112,0,874,130,168,509,177617,13382,44,0,885,144,168,509,5863748,18577, 115,44,0,893,150,180,509,177632,13561,59,0,902,344,180,509,177664,14594,91,0,910, 360,180,509,177666,14611,93,0,918,2,156,509,8244734546833303387,14271,68,105,99,116,105,111,110, 97,114,121,0,926,181,168,509,6953375463185,16789,100,58,108,105,110,107,0,943,182,168, 509,6385101839,16901,100,58,120,116,0,956,184,168,509,229461379705849,16643,100,58,99,108,97,115, 115,0,967,192,168,509,6953375526308,16846,100,58,110,97,109,101,0,981,168,168,509,8246177435876103505, 16384,99,108,97,115,115,58,119,111,114,100,0,994,180,168,509,-4577305721744236665,16348,99,108, 97,115,115,58,109,97,99,114,111,0,1011,156,168,509,8246177435875405519,16323,99,108,97,115, 115,58,100,97,116,97,0,1029,194,168,509,-3503194823018915134,16623,100,58,97,100,100,45,104, 101,97,100,101,114,0,1046,311,180,509,229482595734746,19745,115,105,103,105,108,58,35,0, 1065,317,180,509,229482595734769,19839,115,105,103,105,108,58,58,0,1079,336,180,509,229482595734749,19783, 115,105,103,105,108,58,38,0,1093,315,180,509,229482595734747,19764,115,105,103,105,108,58, 36,0,1107,375,180,509,6953974492262,18517,114,101,112,101,97,116,0,1121,377,180,509,210706394789, 15316,97,103,97,105,110,0,1134,422,168,509,249892712402858498,17674,105,110,116,101,114,112,114, 101,116,0,1146,241,168,509,7572225886563901,16808,100,58,108,111,111,107,117,112,0,1162,174, 168,509,399738814153734542,16366,99,108,97,115,115,58,112,114,105,109,105,116,105,118,101,0, 1177,4,156,509,229445000025131,14576,86,101,114,115,105,111,110,0,1199,469,168,509,177678,17582, 105,0,1213,130,168,509,177673,16588,100,0,1221,463,168,509,177687,18458,114,0,1229,248, 156,509,6383922272,14235,66,97,115,101,0,1237,92,168,509,6385574852,18381,112,97,99,107,0, 1248,78,168,509,6954102567431,20212,117,110,112,97,99,107,0,1259,186,168,509,7572226160734292,16882,100, 58,115,111,117,114,99,101,0,1272,188,168,509,6953375310887,16698,100,58,104,97,115,104, 0,1287,190,168,509,229461398967545,13268,100,58,115,116,97,99,107,0,1300,394,168,509,-3366153855364863819, 13266,101,114,114,58,110,111,116,102,111,117,110,100,0,105,109,97,103,101,58, 115,97,118,101,0,103,101,0,98,108,101,0,46,114,101,116,114,111,0,0, 111,0,95,102,111,117,110,100,0,101,116,114,111,0,46,49,47,83,79,67, 75,69,84,83,46,109,100,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1314,1546,168, 20738,193454822,14306,69,79,77,0,1,-3,15,10,1536,1562,168,20738,210709897370,16954,100,101,112, 116,104,0,1,-1,15,10,1550,1579,168,20738,6953375454647,16717,100,58,108,97,115,116,0, 1,2,15,10,1566,1599,168,20738,249883453713703409,16771,100,58,108,97,115,116,46,120,116,0, 2049,1579,2049,182,15,10,1583,1624,168,20738,-3502687787217310053,16735,100,58,108,97,115,116,46,99, 108,97,115,115,0,2049,1579,2049,184,15,10,1605,1648,168,20738,-4578080011420638202,16753,100,58,108, 97,115,116,46,110,97,109,101,0,2049,1579,2049,192,10,1630,1667,168,20738,229481143079314,18476, 114,101,99,108,97,115,115,0,2049,1579,2049,184,16,10,1653,1689,168,20738,249892660727267252,17638, 105,109,109,101,100,105,97,116,101,0,1,180,2049,1667,10,1673,1705,168,20738,6385144159, 16920,100,97,116,97,0,1,156,2049,1667,10,1694,1726,168,20738,249902713833354782,18422,112,114,105, 109,105,116,105,118,101,0,1,174,2049,1667,10,1710,1742,180,20738,6385302998,17565,104,111, 111,107,0,1,1793,2049,130,1,3,15,1,1,17,2049,130,10,1731,1770,168,20738, 7572920930896175,19687,115,101,116,45,104,111,111,107,0,1,1,17,16,10,1755,1788,168,20738, 6954102295577,20194,117,110,104,111,111,107,0,1,1,17,2,1,1,17,4,16,10,1775, 1806,180,20738,177613,13308,40,0,10,1798,1815,180,20738,177614,13325,41,0,10,1807,1834,168, 20738,-4577149749211730287,16456,99,111,109,112,105,108,101,58,108,105,116,0,1,1,2049,130,2049, 130,10,1816,1860,168,20738,-3471989134310745468,16438,99,111,109,112,105,108,101,58,106,117,109,112, 0,1,1793,2049,130,2049,130,10,1841,1886,168,20738,-3471989134311018844,16420,99,111,109,112,105,108, 101,58,99,97,108,108,0,1,2049,2049,130,2049,130,10,1867,1911,168,20738,-4577149749211723885,16474, 99,111,109,112,105,108,101,58,114,101,116,0,1,10,2049,130,10,1893,1933,168, 20738,8246182162316307558,16491,99,111,109,112,105,108,105,110,103,63,0,1,149,15,10,1916,1951, 180,20738,229482595734807,19912,115,105,103,105,108,58,96,0,2049,271,2049,130,10,1937,1970,180, 20738,229482595734803,19876,115,105,103,105,108,58,92,0,2049,469,10,1956,1987,180,20738,229482595734805,19894, 115,105,103,105,108,58,94,0,2049,463,10,1973,2001,168,20738,6385292201,17530,104,101,114, 101,0,1,3,15,10,1990,2019,180,20738,229482595734775,19857,115,105,103,105,108,58,64,0, 2049,241,2049,182,15,2049,1933,1793,2035,1,3841,2049,130,2049,130,10,1,2028,1793,2041, 15,10,1,2039,2049,66,10,2005,2060,180,20738,229482595734744,19726,115,105,103,105,108,58,33, 0,2049,241,2049,182,15,2049,1933,1793,2076,1,4097,2049,130,2049,130,10,1,2069,1793, 2082,16,10,1,2080,2049,66,10,2046,2102,168,20738,7572225537532823,16662,100,58,99,114,101,97, 116,101,0,1793,2104,1,156,1,0,2049,194,2049,2001,2049,1579,2049,182,16,10,2087, 2130,168,20738,210731100041,20442,118,97,114,45,110,0,2049,2102,2049,130,10,2118,2145,168,20738, 193508814,20424,118,97,114,0,134284289,0,2130,10,2135,2161,168,20738,210709068620,16529,99,111,110,115, 116,0,2049,2102,2049,1579,2049,182,16,10,2149,2180,174,20738,6385740380,20172,116,117,99,107, 0,100926722,10,2169,2193,174,20738,6385561857,18359,111,118,101,114,0,67502597,10,2182,2205,174,20738, 193500364,18266,110,105,112,0,772,10,2195,2223,174,20738,249885844724841747,17028,100,114,111,112,45,112, 97,105,114,0,771,10,2207,2236,174,20738,6383817805,13578,63,100,117,112,0,6402,10,2225, 2253,168,20738,7572302161469511,17084,100,117,112,45,112,97,105,114,0,67502597,67502597,10,2238,2266,168, 20738,193489474,16972,100,105,112,0,525572,6,10,2256,2279,168,20738,193505809,19948,115,105,112,0, 67502597,1,27,2049,2266,10,2269,2294,168,20738,5863248,15485,98,105,0,1,2279,2049,2266,8, 10,2285,2310,168,20738,193487226,15506,98,105,42,0,1,2266,2049,2266,8,10,2300,2326,168, 20738,193487248,15528,98,105,64,0,2,2049,2310,10,2316,2340,168,20738,193507188,20104,116,114,105, 0,1793,2349,1,2279,2049,2266,2049,2279,10,1,2342,2049,2266,8,10,2330,2366,168,20738, 6385737246,20126,116,114,105,42,0,1793,2383,1793,2376,4,1,2266,2049,2266,10,1,2370,2049, 2266,2049,2266,10,1,2368,2049,2266,8,10,2355,2400,168,20738,6385737268,20150,116,114,105,64, 0,2,2,2049,2366,10,2389,2417,168,20738,210732529790,20558,119,104,105,108,101,0,1793,2426, 525570,1639430,3,1,2419,7,10,1,2419,8,3,10,2405,2443,168,20738,210730385457,20234,117,110, 116,105,108,0,1793,2454,525570,385942534,-1,25,3,1,2445,7,10,1,2445,8,3,10, 2431,2473,168,20738,229466054377278,17376,102,111,114,101,118,101,114,0,1793,2477,8,10,1,2475, 2049,2279,1,2473,7,10,2459,2497,168,20738,210729012103,20085,116,105,109,101,115,0,1793,2509, 4,25,33886721,1,2053,1542,1,2500,7,10,1,2499,8,3,10,2485,2528,180,20738,229482595734835, 19930,115,105,103,105,108,58,124,0,2049,241,1793,2536,2049,182,15,10,1,2532,1793, 2544,2049,184,15,10,1,2540,2049,2294,2049,1933,1793,2559,1,156,2049,2266,2049,1886,10, 1,2552,1,27,2049,66,10,2514,2577,168,20738,6384551781,14522,84,82,85,69,0,1,-1, 10,2566,2592,168,20738,210672985680,14324,70,65,76,83,69,0,1,0,10,2580,2606,168,20738, 6385108193,16217,99,97,115,101,0,1793,2611,67502597,11,10,1,2608,2049,2266,4,1793,2623,772, 8,2049,2577,10,1,2618,1793,2631,3,2049,2592,10,1,2627,2049,66,25,6,3,3, 10,2595,2653,168,20738,6953962162094,18743,115,58,99,97,115,101,0,1793,2659,67502597,2049,118,10, 1,2655,2049,2266,4,1793,2671,772,8,2049,2577,10,1,2666,1793,2679,3,2049,2592,10, 1,2675,2049,66,25,6,3,3,10,2640,2698,168,20738,193500566,18303,110,111,116,0,1, -1,23,10,2688,2714,168,20738,210719911674,17804,108,116,101,113,63,0,2049,2253,101516555,22,10, 2702,2731,168,20738,210713982069,17432,103,116,101,113,63,0,4,2049,2714,10,2719,2747,168,20738, 210720171475,17863,110,58,77,65,88,0,1,-5,15,10,2735,2763,168,20738,210720171729,17881,110,58, 77,73,78,0,1,-4,15,10,2751,2781,168,20738,229474321428492,18247,110,58,122,101,114,111, 63,0,1,0,11,10,2767,2800,168,20738,7572649618157049,17844,110,58,45,122,101,114,111,63, 0,1,0,12,10,2785,2822,168,20738,-4562761254435316065,18076,110,58,110,101,103,97,116,105,118, 101,63,0,1,0,13,10,2804,2844,168,20738,-4562757999622951041,18114,110,58,112,111,115,105,116, 105,118,101,63,0,1,-1,14,10,2826,2875,168,20738,-1420858746182909718,18209,110,58,115,116,114, 105,99,116,108,121,45,112,111,115,105,116,105,118,101,63,0,1,0,14,10, 2848,2893,168,20738,229474297120890,17958,110,58,101,118,101,110,63,0,1,2,20,3,2049,2781, 10,2879,2913,168,20738,6953766919107,18095,110,58,111,100,100,63,0,2049,2893,2049,2698,10,2900, 2928,168,20738,193494767,17619,105,102,59,0,67502597,1,76,2049,2266,25,6,771,10,2918,2948, 168,20738,6383175836,13476,45,105,102,59,0,67502597,1,74,2049,2266,2049,2698,25,6,771,10, 2937,2969,174,20738,193504922,18554,114,111,116,0,67503109,10,2959,2979,174,20738,177620,13495,47,0, 197652,10,2971,2991,174,20738,193499461,17824,109,111,100,0,788,10,2981,3005,168,20738,210720211139,18133, 110,58,112,111,119,0,1,1,4,1793,3013,67502597,19,10,1,3010,2049,2497,772,10, 2993,3034,168,20738,7572652137106817,18057,110,58,110,101,103,97,116,101,0,1,-1,19,10,3019, 3053,168,20738,7572652347517886,18190,110,58,115,113,117,97,114,101,0,4866,10,3038,3068,168,20738, 6953767077527,18171,110,58,115,113,114,116,0,1,1,1793,3086,2049,2253,197652,67502597,18,1,2, 197652,25,17,1,3072,7,10,1,3072,8,772,10,3055,3103,168,20738,210720207665,18037,110,58, 109,105,110,0,2049,2253,13,1793,3110,3,10,1,3108,1793,3116,772,10,1,3114,2049, 66,10,3091,3133,168,20738,210720207411,18017,110,58,109,97,120,0,2049,2253,14,1793,3140,3, 10,1,3138,1793,3146,772,10,1,3144,2049,66,10,3121,3163,168,20738,210720194371,17899,110,58, 97,98,115,0,2,2049,2822,1,3034,9,10,3151,3184,168,20738,229474304963756,17996,110,58,108, 105,109,105,116,0,4,5,2049,3103,6,2049,3133,10,3170,3204,168,20738,210720203463,17977,110, 58,105,110,99,0,659713,1,10,3192,3219,168,20738,210720197721,17939,110,58,100,101,99,0, 659969,1,10,3207,3239,168,20738,8246617666422322998,17918,110,58,98,101,116,119,101,101,110,63,0, 67503109,1793,3247,67503109,67503109,2049,3184,10,1,3242,2049,2279,11,10,3222,3269,168,20738,249861296566813883,14486, 83,99,111,112,101,76,105,115,116,0,31538,31669,10,3253,3281,168,20738,5864091,20617,123, 123,0,2049,1579,2,1,3269,2049,61,16,10,3272,3309,168,20738,-6305314778776785742,13420,45,45,45, 114,101,118,101,97,108,45,45,45,0,2049,1579,1,3269,2049,3204,16,10,3290,3326, 168,20738,5864159,20652,125,125,0,1,3269,2049,58,4,15,11,1793,3340,3841,3269,4097,2, 10,1,3335,1793,3366,3841,3269,1793,3361,1,2,983567,1,3269,2049,3204,1641487,3,1,3350, 7,10,1,3348,8,16,10,1,3344,2049,66,10,3317,3382,168,0,0,0,66,121, 116,101,0,10,3371,3399,168,0,0,0,98,121,116,101,45,109,97,115,107,0, 1,255,4,1,8,19,2,1793,3413,2049,3034,24,21,10,1,3408,2049,2266,24,10, 3383,3433,168,0,0,0,114,101,112,108,97,99,101,0,1,0,1793,3462,1793,3457, 1793,3452,1793,3447,3,3841,3382,10,1,3443,2049,2266,10,1,3441,2049,2266,10,1,3439, 2049,2266,10,1,3437,2049,2606,1,1,1793,3488,1793,3483,1793,3478,3,3841,3382,10,1, 3474,2049,2266,10,1,3472,2049,2266,10,1,3470,2049,2606,1,2,1793,3507,1793,3502,3, 3841,3382,10,1,3498,2049,2266,10,1,3496,2049,2606,1,3,1793,3519,3,3841,3382,10, 1,3515,2049,2606,3,10,3317,3549,168,20738,-6972911891006832072,15449,98,58,116,111,45,98,121,116, 101,45,97,100,100,114,101,115,115,0,4865,4,10,3525,3566,168,20738,229458800096267,15371,98, 58,102,101,116,99,104,0,267265,4,134288385,4,2969,266001,2049,3399,10,3552,3589,168,20738, 229458816047342,15410,98,58,115,116,111,114,101,0,1048836,3382,267265,4,1793,3598,134287106,78,10,1, 3595,2049,2266,2049,3433,2049,92,4,16,10,3575,3623,168,20738,229466548904081,17452,104,58,102,101, 116,99,104,0,1,3566,1793,3635,2049,3204,2049,3566,1,-8,24,10,1,3627,2049,2294, 22,10,3609,3655,168,20738,229466564855156,17491,104,58,115,116,111,114,101,0,2049,2253,102039813,255, 2049,3589,2049,3204,18350341,8,255,117507605,3589,10,3641,3683,168,20738,229485920923616,20480,119,58,102,101, 116,99,104,0,1,4,197652,15,10,3669,3702,168,20738,229485936874691,20519,119,58,115,116,111, 114,101,0,1,4,197652,16,10,3688,3726,168,20738,-2542660583859062324,20499,119,58,102,101,116,99, 104,45,110,101,120,116,0,2,1,4,17,4,2049,3683,10,3707,3753,168,20738,-3300792181564964579, 17471,104,58,102,101,116,99,104,45,110,101,120,116,0,2,1,2,17,4,2049, 3623,10,3734,3780,168,20738,-3604044820647325481,15390,98,58,102,101,116,99,104,45,110,101,120,116, 0,2,1,1,17,4,2049,3566,10,3761,3807,168,20738,-2542036332270164849,20538,119,58,115,116,111, 114,101,45,110,101,120,116,0,2,1,4,17,1,3702,2049,2266,10,3788,3835,168, 20738,-3300167929976067104,17510,104,58,115,116,111,114,101,45,110,101,120,116,0,2,1,2,17, 1,3655,2049,2266,10,3816,3863,168,20738,-3603420569058428006,15429,98,58,115,116,111,114,101,45,110, 101,120,116,0,2,1,1,17,1,3589,2049,2266,10,3844,3887,168,20738,7572992899446007,20311,118, 58,105,110,99,45,98,121,0,286196994,659462,10,3872,3905,168,20738,7572992693095753,20274,118,58,100, 101,99,45,98,121,0,68093186,168822290,10,3890,3920,168,20738,210729690831,20293,118,58,105,110,99, 0,1,1,4,2049,3887,10,3908,3938,168,20738,210729685089,20256,118,58,100,101,99,0,1, 1,4,2049,3905,10,3926,3958,168,20738,229484636707508,20330,118,58,108,105,109,105,116,0,251790597, 1542,2049,3184,4100,10,3944,3975,168,20738,6385748402,20368,118,58,111,110,0,2049,2577,4100,10, 3964,3991,168,20738,210729697104,20350,118,58,111,102,102,0,2049,2592,4100,10,3979,4007,168,20738, 210706586657,15333,97,108,108,111,116,0,1,3,2049,3887,10,3995,4029,168,20738,8246989571153063777,20386,118, 58,112,114,101,115,101,114,118,101,0,84869636,1,27,2049,2266,1049606,10,4012,4051,168, 20738,7572993371535704,20405,118,58,117,112,100,97,116,101,0,4,1793,4058,15,4,8,10,1, 4054,2049,2279,16,10,4036,4075,168,20738,6385123360,16548,99,111,112,121,0,1793,4084,285278725,1, 33951492,268767489,1,6,10,1,4077,2049,2497,771,10,4064,4102,156,0,0,0,115,116,97, 114,116,0,0,10,4090,4114,156,0,0,0,101,110,100,0,0,10,4104,4132,168, 0,0,0,116,101,114,109,105,110,97,116,101,0,1,0,3841,4114,16,10,4064, 4157,168,20738,-3513680875729732409,15691,98,117,102,102,101,114,58,115,116,97,114,116,0,3841,4102, 10,4138,4177,168,20738,8246143877888709904,15601,98,117,102,102,101,114,58,101,110,100,0,3841,4114, 10,4160,4197,168,20738,8246143877888705218,15566,98,117,102,102,101,114,58,97,100,100,0,3841,4114, 16,1,4114,2049,3920,2049,4132,10,4180,4224,168,20738,8246143877888711801,15619,98,117,102,102,101,114, 58,103,101,116,0,1,4114,2049,3938,3841,4114,15,2049,4132,10,4207,4253,168,20738,-3513680875746570456, 15584,98,117,102,102,101,114,58,101,109,112,116,121,0,3841,4102,4097,4114,2049,4132, 10,4234,4278,168,20738,-4578413135315348908,15673,98,117,102,102,101,114,58,115,105,122,101,0,3841, 4114,3841,4102,18,10,4260,4301,168,20738,8246143877888724869,15655,98,117,102,102,101,114,58,115,101, 116,0,4097,4102,2049,4253,10,4284,4328,168,20738,-3186446687793719003,15637,98,117,102,102,101,114,58, 112,114,101,115,101,114,118,101,0,3841,4102,3841,4114,1793,4341,1,27,2049,2266,4097, 4102,10,1,4334,2049,2266,4097,4114,10,4306,4366,156,20738,-4600587576916820603,14558,84,101,109,112,83, 116,114,105,110,103,115,0,32,4348,4387,156,20738,7474516786580364824,14540,84,101,109,112,83,116, 114,105,110,103,77,97,120,0,512,4367,4402,168,20738,229440420829967,14468,83,84,82,73,78, 71,83,0,2049,1546,3841,4366,3841,4387,19,18,10,4388,4429,168,0,-4555101230505660792,13261,115,58, 111,118,101,114,115,105,122,101,63,0,2049,104,3841,4387,2049,3219,14,10,4411,4454, 168,0,8246850507793776056,13257,115,58,116,114,117,110,99,97,116,101,0,2,2049,4429,1793,4467, 1,0,67502597,3841,4387,17,16,10,1,4459,9,10,4437,4485,156,0,0,0,67,117, 114,114,101,110,116,0,19,10,4471,4503,168,0,0,0,115,58,112,111,105,110, 116,101,114,0,3841,4485,3841,4387,19,2049,4402,17,10,4487,4525,168,0,0,0,115, 58,110,101,120,116,0,1,4485,2049,3920,3841,4485,3841,4366,11,1793,4541,1,0,4097, 4485,10,1,4536,9,10,4437,4558,168,20738,6953962777192,19495,115,58,116,101,109,112,0,2049, 4454,2,2049,104,2049,3204,2049,4503,4,2049,4075,2049,4503,2049,4525,10,4545,4589,168,20738, 229480754149537,18962,115,58,101,109,112,116,121,0,2049,4503,2049,4525,1,0,67502597,16,10,4575, 4611,168,20738,6953962747657,19395,115,58,115,107,105,112,0,6,1793,4619,68223234,1,786703,0,10, 1,4614,2049,2417,2049,3219,5,10,4598,4640,168,20738,6953962453495,19198,115,58,107,101,101,112, 0,2049,1933,1793,4649,1,4611,2049,1886,10,1,4644,9,2049,2001,1,144,2049,2266,2049, 156,10,4627,4675,180,0,229482595734750,0,115,105,103,105,108,58,39,0,2049,1933,1,4640, 1,4558,2049,66,10,4661,4698,168,20738,229480755051740,19040,115,58,102,101,116,99,104,0,17, 15,10,4684,4715,168,20738,229480771002815,19454,115,58,115,116,111,114,101,0,17,16,10,4701, 4731,168,20738,6953962169596,18772,115,58,99,104,111,112,0,2049,4558,2,2049,104,67502597,17,2049, 3219,1,0,4,16,10,4718,4761,168,20738,249904557751418990,19356,115,58,114,101,118,101,114,115, 101,0,1793,4803,2,2049,4558,2049,4301,1,104,1793,4779,2,2049,104,17,2049,3219,10, 1,4772,2049,2294,4,1793,4793,2,15,2049,4197,2049,3219,10,1,4786,2049,2497,3,2049, 4157,2049,4558,10,1,4763,2049,4328,10,4745,4824,168,20738,249904555657463488,19276,115,58,112,114,101, 112,101,110,100,0,2049,4558,1793,4867,2049,2253,1,104,2049,2326,17,3841,4387,14,1, 2223,1793,4862,2,2049,104,17,1793,4854,2,2049,104,2049,3204,10,1,4848,2049,2266,4, 2049,4075,10,1,4842,2049,66,10,1,4828,2049,2279,10,4808,4887,168,20738,7572864733934314,18703,115, 58,97,112,112,101,110,100,0,4,2049,4824,10,4872,4908,168,20738,8246849907066750743,19080,115,58, 102,111,114,45,101,97,99,104,0,1793,4923,67502597,6415,3,67502597,67502597,251987205,2054,101777670,1, 1,4910,7,10,1,4910,8,771,10,4891,4947,168,20738,-2744677796467205929,19158,115,58,105,110,100, 101,120,47,99,104,97,114,0,4,1793,4970,2049,58,25,4,1793,4959,67502597,12,10, 1,4956,2049,2266,4,25,3,1,4950,7,10,1,4950,1793,4979,18,2049,3219,772,10, 1,4974,1793,4988,2049,104,67502597,11,10,1,4983,2049,2340,1793,4998,3,1,-1,10,1, 4994,9,10,4928,5025,168,20738,-2157201767973730595,18810,115,58,99,111,110,116,97,105,110,115,47, 99,104,97,114,63,0,2049,4947,1,-1,12,10,5002,5044,168,20738,6953962341782,19139,115,58, 104,97,115,104,0,1,5381,4,1793,5052,286458116,33,10,1,5049,2049,4908,10,5031,5067, 156,0,0,0,83,116,114,0,0,5057,5082,168,0,0,0,101,120,116,114,97, 99,116,0,2049,2253,3841,5067,4,2049,4075,3841,5067,67502597,17,1,0,4,16,10,5068, 5110,168,0,0,0,99,104,101,99,107,0,1,5082,2049,2266,1793,5121,1,3204,2049, 2266,10,1,5116,2049,2266,3841,5067,2049,5044,67502597,11,10,5098,5147,168,0,0,0,108, 111,99,97,116,105,111,110,0,67503109,67503109,1793,5180,1793,5175,4,1793,5161,67502597,2049,2781, 21,10,1,5156,2049,2266,4,1793,5171,772,2,10,1,5168,9,10,1,5153,2049,2266, 10,1,5151,2049,2266,10,5132,5197,168,0,0,0,115,101,116,117,112,0,2049,4589, 4097,5067,1,0,67503109,67503109,1,104,1,5044,2049,2294,1793,5217,67502597,2049,104,10,1,5213, 2049,2266,4,10,5031,5244,168,20738,-581580411198892688,19178,115,58,105,110,100,101,120,47,115,116, 114,105,110,103,0,67502597,1793,5263,2049,5197,1793,5256,2049,5110,2049,5147,10,1,5251,2049, 2497,771,3,10,1,5247,2049,2266,18,1,2,18,1,-1,2049,3133,10,5223,5286,156, 0,0,0,83,114,99,0,0,5276,5297,156,0,0,0,84,97,114,0,0,5287, 5308,156,0,0,0,80,97,100,0,0,5298,5317,156,0,0,0,73,0,0,5309, 5326,156,0,0,0,70,0,0,5318,5336,156,0,0,0,65,116,0,0,5327,5353, 168,0,0,0,116,101,114,109,105,110,97,116,101,0,1,0,3841,5308,3841,5297, 2049,104,17,16,10,5337,5378,168,0,0,0,101,120,116,114,97,99,116,0,3841, 5286,3841,5317,17,3841,5308,3841,5297,2049,104,2049,4075,10,5364,5406,168,0,0,0,99, 111,109,112,97,114,101,0,3841,5308,3841,5297,2049,118,3841,5326,22,4097,5326,3841,5326, 1793,5426,3841,5317,4097,5336,10,1,5421,2049,74,10,5392,5442,168,0,0,0,110,101, 120,116,0,1,5317,2049,3920,10,5223,5472,168,20738,-6456227941126558634,18830,115,58,99,111,110,116, 97,105,110,115,47,115,116,114,105,110,103,63,0,4097,5297,4097,5286,2049,4589,4097, 5308,1,0,4097,5317,1,0,4097,5326,3841,5286,2049,104,1793,5503,2049,5378,2049,5353,2049, 5406,2049,5442,10,1,5494,2049,2497,3841,5326,10,5447,5525,168,20738,7572864921182136,19060,115,58,102, 105,108,116,101,114,0,67502597,2049,4429,1793,5535,1,4454,2049,2266,10,1,5530,9,1793, 5566,2049,4589,2049,4301,4,1793,5558,2049,2253,4,8,1,4197,1,17,2049,66,10,1, 5547,2049,4908,3,2049,4157,10,1,5540,2049,4328,10,5510,5583,168,20738,210726137008,19256,115,58, 109,97,112,0,1793,5605,2049,4589,2049,4301,4,1793,5597,67502597,8,2049,4197,10,1,5592, 2049,4908,3,2049,4157,10,1,5585,2049,4328,10,5571,5625,168,20738,7572865443813333,19474,115,58,115, 117,98,115,116,114,0,1793,5631,17,2049,4589,10,1,5627,2049,2266,1793,5643,67502597,1, 4075,2049,2266,10,1,5637,2049,2279,67502597,1793,5656,17,1,0,4,16,10,1,5650,2049, 2266,10,5610,5675,168,20738,229480769412560,19375,115,58,114,105,103,104,116,0,67502597,2049,104,67502597, 18,4,2049,5625,10,5661,5697,168,20738,6953962489469,19217,115,58,108,101,102,116,0,1,0, 4,2049,5625,10,5684,5724,168,20738,-949014848675520942,18723,115,58,98,101,103,105,110,115,45,119, 105,116,104,63,0,2,2049,104,1,19,2049,2266,2049,5697,2049,118,10,5703,5755,168, 20738,-2744863427173801468,18980,115,58,101,110,100,115,45,119,105,116,104,63,0,2,2049,104,1, 19,2049,2266,2049,5675,2049,118,10,5736,5780,168,20738,6953962177261,18850,115,58,99,111,112,121, 0,67502597,2049,104,2049,3204,2049,4075,10,5767,5803,168,20738,7572863551252214,18649,115,58,68,73,71, 73,84,83,0,2049,4611,48,49,50,51,52,53,54,55,56,57,65,66,67,68, 69,70,0,1,5805,10,5788,5849,168,20738,-3174032931242973971,18613,115,58,65,83,67,73,73,45, 76,79,87,69,82,67,65,83,69,0,2049,4611,97,98,99,100,101,102,103,104, 105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,0,1, 5851,10,5825,5905,168,20738,-3174020239987242608,18631,115,58,65,83,67,73,73,45,85,80,80,69, 82,67,65,83,69,0,2049,4611,65,66,67,68,69,70,71,72,73,74,75,76, 77,78,79,80,81,82,83,84,85,86,87,88,89,90,0,1,5907,10,5881,5959, 168,20738,4909441458232360267,18595,115,58,65,83,67,73,73,45,76,69,84,84,69,82,83,0, 2049,4611,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114, 115,116,117,118,119,120,121,122,65,66,67,68,69,70,71,72,73,74,75,76, 77,78,79,80,81,82,83,84,85,86,87,88,89,90,0,1,5961,10,5937,6037, 168,20738,1619870888324870636,18667,115,58,80,85,78,67,84,85,65,84,73,79,78,0,2049,4611, 95,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,58,59,60,61, 62,63,64,91,92,93,94,96,123,124,125,126,0,1,6039,1,95,67502597,16,10, 6017,6098,156,20738,-2745567821320788289,18685,115,58,87,72,73,84,69,83,80,65,67,69,0,32, 9,10,13,0,6079,6111,180,20738,177612,13290,39,0,1,4589,2049,168,10,6103,6124,180, 20738,177609,13272,36,0,1,0,2049,156,10,6116,0,156,20738,249835240931843863,14019,65,83,67,73, 73,58,78,85,76,0,6129,27,156,20738,249835240931833987,13857,65,83,67,73,73,58,69,83, 67,0,6145,8,156,20738,7570764876722141,13641,65,83,67,73,73,58,66,83,0,6161,9,156, 20738,7570764876722340,13965,65,83,67,73,73,58,72,84,0,6176,10,156,20738,7570764876722458,13983,65,83, 67,73,73,58,76,70,0,6191,11,156,20738,7570764876722802,14199,65,83,67,73,73,58,86, 84,0,6206,12,156,20738,7570764876722260,13911,65,83,67,73,73,58,70,70,0,6221,13,156, 20738,7570764876722173,13677,65,83,67,73,73,58,67,82,0,6236,32,156,20738,-4630583730859567212,14109,65,83, 67,73,73,58,83,80,65,67,69,0,6251,127,156,20738,249835240931832445,13767,65,83,67,73, 73,58,68,69,76,0,6269,1,156,20738,249835240931849106,14091,65,83,67,73,73,58,83,79, 72,0,6285,2,156,20738,249835240931849287,14127,65,83,67,73,73,58,83,84,88,0,6301,3, 156,20738,249835240931834041,13893,65,83,67,73,73,58,69,84,88,0,6317,4,156,20738,249835240931833872,13839, 65,83,67,73,73,58,69,79,84,0,6333,5,156,20738,249835240931833836,13821,65,83,67,73, 73,58,69,78,81,0,6349,6,156,20738,249835240931829111,13605,65,83,67,73,73,58,65,67, 75,0,6365,7,156,20738,249835240931830267,13623,65,83,67,73,73,58,66,69,76,0,6381,14, 156,20738,7570764876722698,14073,65,83,67,73,73,58,83,79,0,6397,15,156,20738,7570764876722692,14055,65, 83,67,73,73,58,83,73,0,6412,16,156,20738,249835240931832669,13785,65,83,67,73,73,58, 68,76,69,0,6427,17,156,20738,249835240931832352,13695,65,83,67,73,73,58,68,67,49,0, 6443,18,156,20738,249835240931832353,13713,65,83,67,73,73,58,68,67,50,0,6459,19,156,20738, 249835240931832354,13731,65,83,67,73,73,58,68,67,51,0,6475,20,156,20738,249835240931832355,13749,65,83, 67,73,73,58,68,67,52,0,6491,21,156,20738,249835240931843202,14001,65,83,67,73,73,58, 78,65,75,0,6507,22,156,20738,249835240931849442,14163,65,83,67,73,73,58,83,89,78,0, 6523,23,156,20738,249835240931834019,13875,65,83,67,73,73,58,69,84,66,0,6539,24,156,20738, 249835240931831226,13659,65,83,67,73,73,58,67,65,78,0,6555,25,156,20738,7570764876722234,13803,65,83, 67,73,73,58,69,77,0,6571,26,156,20738,249835240931849298,14145,65,83,67,73,73,58,83, 85,66,0,6586,28,156,20738,7570764876722273,13929,65,83,67,73,73,58,70,83,0,6602,29, 156,20738,7570764876722306,13947,65,83,67,73,73,58,71,83,0,6617,30,156,20738,7570764876722669,14037,65, 83,67,73,73,58,82,83,0,6632,31,156,20738,7570764876722768,14181,65,83,67,73,73,58, 85,83,0,6647,6681,168,20738,-3553210050247798618,15934,99,58,108,111,119,101,114,99,97,115,101, 63,0,1,97,1,122,2049,3239,10,6662,6707,168,20738,-3552791238808663639,16066,99,58,117,112,112, 101,114,99,97,115,101,63,0,1,65,1,90,2049,3239,10,6688,6730,168,20738,249882047462872305, 15915,99,58,108,101,116,116,101,114,63,0,1,6681,1,6707,2049,2294,22,10,6714, 6753,168,20738,7572182947632498,15878,99,58,100,105,103,105,116,63,0,1,48,1,57,2049,3239, 10,6738,6777,168,20738,8246107997572794159,16085,99,58,118,105,115,105,98,108,101,63,0,1,32, 1,126,2049,3239,10,6760,6799,168,20738,7572183659755470,16104,99,58,118,111,119,101,108,63,0, 2049,4611,97,101,105,111,117,65,69,73,79,85,0,1,6801,4,2049,5025,10,6784, 6837,168,20738,-3553628119197217420,15859,99,58,99,111,110,115,111,110,97,110,116,63,0,2,2049, 6730,1793,6847,2049,6799,2049,2698,10,1,6842,1793,6855,3,2049,2592,10,1,6851,2049,66, 10,6818,6880,168,20738,-6558963794062736370,16123,99,58,119,104,105,116,101,115,112,97,99,101,63, 0,1,6098,4,2049,5025,10,6860,6906,168,20738,-6672106426782194349,15764,99,58,45,108,111,119,101, 114,99,97,115,101,63,0,2049,6681,2049,2698,10,6886,6931,168,20738,-6671687615343059370,15783,99,58, 45,117,112,112,101,114,99,97,115,101,63,0,2049,6707,2049,2698,10,6911,6952,168, 20738,249881966047746975,15745,99,58,45,100,105,103,105,116,63,0,2049,6753,2049,2698,10,6936,6978, 168,20738,1197920222559514203,15840,99,58,45,119,104,105,116,101,115,112,97,99,101,63,0,2049, 6880,2049,2698,10,6957,7001,168,20738,-4579699312045814628,15802,99,58,45,118,105,115,105,98,108,101, 63,0,2049,6777,2049,2698,10,6983,7022,168,20738,249881966759869947,15821,99,58,45,118,111,119,101, 108,63,0,2049,6799,2049,2698,10,7006,7047,168,20738,-6672524495731613151,15726,99,58,45,99,111,110, 115,111,110,97,110,116,63,0,2049,6837,2049,2698,10,7027,7069,168,20738,8246107917359977086,16028,99, 58,116,111,45,117,112,112,101,114,0,2,2049,6681,25,3,1,32,18,10,7052, 7095,168,20738,8246107917349275483,15971,99,58,116,111,45,108,111,119,101,114,0,2,2049,6707,25, 3,1,32,17,10,7078,7122,168,20738,-4579599832837481303,16009,99,58,116,111,45,115,116,114,105, 110,103,0,2049,4611,46,0,1,7124,2049,4558,1,39,2049,2279,10,7104,7155,168,20738, -6563237009071717459,16047,99,58,116,111,103,103,108,101,45,99,97,115,101,0,2,2049,6681,1, 7069,1,7095,2049,66,10,7135,7183,168,20738,-4579599833032159941,15990,99,58,116,111,45,110,117,109, 98,101,114,0,2,2049,6753,1793,7192,1,48,18,10,1,7188,1793,7200,3,1,0, 10,1,7196,2049,66,10,7165,7222,168,20738,8246850501110408334,19552,115,58,116,111,45,117,112,112, 101,114,0,1,7069,2049,5583,10,7205,7244,168,20738,8246850501099706731,19514,115,58,116,111,45,108, 111,119,101,114,0,1,7095,2049,5583,10,7227,7267,168,20738,-4555094364049076026,19630,115,58,116,114, 105,109,45,108,101,102,116,0,2049,4558,1793,7281,2049,58,1,6880,1,2800,2049,2294, 21,10,1,7271,2049,2417,2049,3219,10,7249,7307,168,20738,-2744161423935835847,19649,115,58,116,114,105, 109,45,114,105,103,104,116,0,2049,4558,2049,4761,2049,7267,2049,4761,10,7288,7329,168, 20738,6953962791214,19611,115,58,116,114,105,109,0,2049,7307,2049,7267,10,7316,7359,156,20738,-429402327855008236, 14450,82,101,119,114,105,116,101,85,110,100,101,114,115,99,111,114,101,115,0, -1,7334,7370,168,0,0,0,115,117,98,0,1,95,1793,7377,1,32,10,1,7374, 2049,2606,10,7360,7396,168,0,0,0,114,101,119,114,105,116,101,0,3841,7359,1793, 7405,1,7370,2049,5583,10,1,7400,9,10,7382,7422,168,0,0,0,104,97,110,100, 108,101,0,1,4675,8,10,7334,7440,180,20738,229482595734750,19802,115,105,103,105,108,58,39, 0,2049,7396,2049,7422,10,7426,7464,168,20738,-2744210522849075797,19412,115,58,115,112,108,105,116,47, 99,104,97,114,0,2049,2253,2049,4947,772,2049,2253,2049,5697,1,41,2049,2266,10,7445, 7499,168,20738,-72719441055178940,19433,115,58,115,112,108,105,116,47,115,116,114,105,110,103,0, 2049,2253,2049,5244,2049,3204,772,2049,2253,2049,5697,1,41,2049,2266,10,7478,7531,168,20738, 249904557744535982,19314,115,58,114,101,112,108,97,99,101,0,67502597,2049,104,2049,2001,16,1793,7547, 2049,7499,4,2049,2001,15,17,10,1,7539,2049,2266,2049,4824,2049,4887,10,7515,7571,156, 0,0,0,83,112,108,105,116,45,79,110,0,0,7556,7585,168,0,0,0,109, 97,116,99,104,63,0,3841,7571,11,10,7572,7605,168,0,0,0,116,101,114,109, 105,110,97,116,101,0,1,0,67502597,2049,3219,16,10,7589,7623,168,0,0,0,115, 116,101,112,0,1,3204,2049,2266,2049,7585,1793,7637,2,2049,130,2049,7605,10,1,7631, 9,10,7515,7658,168,20738,8246850503517749147,19571,115,58,116,111,107,101,110,105,122,101,0,4097, 7571,2049,4640,2049,2001,1,0,2049,130,1793,7680,2,2049,130,2,1,7623,2049,4908,3, 10,1,7670,2049,2266,2049,2001,67502597,18,2049,3219,67502597,16,10,7641,7706,156,0,0,0, 78,101,101,100,108,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7693,7844,156,0,0, 0,76,101,110,0,0,7834,7858,156,0,0,0,84,111,107,101,110,115,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,7845,7995,156,0,0,0,84,80,0,0,7986,8007,168, 0,0,0,115,97,118,101,0,2049,4640,3841,7995,1,7858,17,2049,3204,16,1,7995, 2049,3920,10,7996,8033,168,0,0,0,110,101,120,116,0,1793,8039,3841,7844,17,10, 1,8035,2049,2279,10,8022,8056,168,0,0,0,100,111,110,101,63,0,2049,104,2049, 2781,10,7641,8088,168,20738,9213749861880762729,19591,115,58,116,111,107,101,110,105,122,101,45,111, 110,45,115,116,114,105,110,103,0,1,0,4097,7995,1793,8102,2,1,7706,2049,5780, 2049,4887,10,1,8094,1793,8111,2049,104,4097,7844,10,1,8106,2049,2294,1793,8128,1,7706, 2049,7499,2049,8007,2049,8033,2049,8056,10,1,8117,2049,2443,1,7858,3841,7995,2049,3219,4097, 7858,772,10,8061,8155,156,0,0,0,83,116,114,105,110,103,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,8142,8238,168,0,0,0,99,104,101,99,107,45,115,105,103,110,0,2049, 2822,1793,8247,1,45,2049,4197,10,1,8242,9,10,8221,8266,168,0,0,0,110,45, 62,100,105,103,105,116,0,2049,5803,17,15,10,8251,8285,168,0,0,0,99,111, 110,118,101,114,116,0,1793,8299,3841,248,20,4,2049,8266,2049,4197,2,2049,2781,10, 1,8287,2049,2443,3,10,8061,8332,168,0,-3499893649969689757,13253,110,58,116,111,45,115,116,114, 105,110,103,47,114,101,118,101,114,115,101,100,0,1793,8346,1,8155,2049,4301,2, 2049,3163,2049,8285,2049,8238,10,1,8334,2049,4328,1,8155,10,8305,8371,168,20738,-4562752463999572364,18228, 110,58,116,111,45,115,116,114,105,110,103,0,2049,8332,2049,4761,10,8353,8387,168, 0,0,0,99,104,97,114,0,1,32,1793,8396,1,95,2049,4197,10,1,8391,2049, 2606,1,114,1793,8409,1,13,2049,4197,10,1,8404,2049,2606,1,110,1793,8422,1,10, 2049,4197,10,1,8417,2049,2606,1,116,1793,8435,1,9,2049,4197,10,1,8430,2049,2606, 1,48,1793,8448,1,0,2049,4197,10,1,8443,2049,2606,1,94,1793,8461,1,27,2049, 4197,10,1,8456,2049,2606,2049,4197,10,8376,8479,168,0,0,0,116,121,112,101,0, 1,99,1793,8487,4,2049,4197,10,1,8483,2049,2606,1,115,1793,8501,4,1,4197,2049, 4908,10,1,8495,2049,2606,1,110,1793,8517,4,2049,8371,1,4197,2049,4908,10,1,8509, 2049,2606,3,10,8468,8536,168,0,0,0,104,97,110,100,108,101,0,1,92,1793, 8545,2049,58,2049,8387,10,1,8540,2049,2606,1,37,1793,8558,2049,58,2049,8479,10,1, 8553,2049,2606,2049,4197,10,8353,8580,168,20738,7572864928505531,19099,115,58,102,111,114,109,97,116, 0,1793,8609,2049,4589,1793,8604,2049,4301,1793,8599,2049,58,25,2049,8536,1,8590,7,10, 1,8590,8,3,10,1,8586,2049,2279,10,1,8582,2049,4328,10,8565,8628,168,20738,229480751847353, 18791,115,58,99,111,110,115,116,0,1,4640,2049,2266,2049,2161,10,8614,8648,156,0, 0,0,86,97,108,117,101,115,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8635,8687,168, 0,0,0,102,114,111,109,0,2049,104,2,1793,8705,1793,8698,1,8648,4113,10,1, 8694,2049,2279,2049,3219,10,1,8692,2049,2497,3,10,8676,8720,168,0,0,0,116,111, 0,2,2049,104,1793,8736,2049,58,1,97,18,2049,3204,1,8648,266001,10,1,8725,2049, 2497,3,10,8614,8756,168,20738,229481157528792,18494,114,101,111,114,100,101,114,0,1,8687,2049, 2266,2049,8720,10,8742,8775,168,20738,210709288570,16568,99,117,114,114,121,0,2049,2001,1793,8785, 4,2049,1834,2049,1860,10,1,8779,2049,2266,10,8763,8801,168,20738,6385158928,16992,100,111,101, 115,0,2049,1599,4,2049,8775,2049,1579,2049,182,16,1,168,2049,1667,10,8790,8833,168, 20738,8246153734800721448,16680,100,58,102,111,114,45,101,97,99,104,0,1,2,1793,8846,6415,2049, 2253,134481157,1542,1,8837,7,10,1,8837,8,3,10,8816,8869,168,20738,-4578079420196310922,16827,100,58, 108,111,111,107,117,112,45,120,116,0,1,0,4,1793,8894,2049,2253,2049,182,2831, 1793,8887,4,1,2205,2049,2266,10,1,8881,1,17,2049,66,10,1,8874,2049,8833,3, 10,8851,8909,168,20738,5863407,17394,103,99,0,1,3,4,2049,4029,10,8900,8930,168,20738, 7572098019335426,15079,97,58,108,101,110,103,116,104,0,15,10,8915,8947,168,20738,7572098062851599,15137,97, 58,109,105,100,100,108,101,0,2049,2001,1793,8970,2,2049,130,1793,8960,2049,3204,17, 10,1,8956,2049,2266,2049,2001,4,2049,4075,10,1,8951,2049,2266,10,8932,8988,168,20738, 6953258052395,15059,97,58,108,101,102,116,0,1,0,4,2049,8947,10,8975,9008,168,20738,229457522989118, 15218,97,58,114,105,103,104,116,0,67502597,2049,8930,67502597,18,4,2049,8947,10,8994,9041, 168,20738,9069136730318539537,14766,97,58,99,111,117,110,116,101,100,45,114,101,115,117,108,116, 115,0,8,2049,2001,1793,9054,2,2049,130,1,130,2049,2497,10,1,9046,2049,2266,10, 9017,9079,168,20738,8526436589641133048,14922,97,58,102,114,111,109,45,115,116,114,105,110,103,0, 2049,2001,1793,9093,2,2049,104,2049,130,1,130,2049,4908,10,1,9083,2049,2266,10,9059, 9115,168,20738,8246014500347515589,14903,97,58,102,111,114,45,101,97,99,104,0,4,2049,58,1, 19,2049,2266,1793,9131,5,2049,58,84018692,525572,1542,10,1,9124,2049,2497,771,10,9098,9149, 168,20738,210704781289,14785,97,58,100,117,112,0,2049,2001,1793,9162,2,15,2049,130,1,130, 2049,9115,10,1,9153,2049,2266,10,9137,9180,168,20738,6953257740187,14747,97,58,99,111,112,121, 0,1,3,1793,9196,4097,3,2,2049,8930,2049,130,1,130,2049,9115,10,1,9184,2049, 4029,10,9167,9219,168,20738,-4582662990808010201,15297,97,58,116,111,45,115,116,114,105,110,103,0, 1,3,1793,9232,2049,9149,1,0,2049,130,2049,3204,10,1,9223,2049,4029,2049,4558,10, 9201,9254,168,20738,7572097601960728,14648,97,58,97,112,112,101,110,100,0,2049,2253,1,37,2049, 2326,17,2049,2001,1793,9279,2049,130,1793,9274,1,130,2049,9115,10,1,9269,2049,2326,10, 1,9265,2049,2266,10,9239,9300,168,20738,249879240302335150,15158,97,58,112,114,101,112,101,110,100, 0,4,2049,9254,10,9284,9317,168,20738,6953257732522,14688,97,58,99,104,111,112,0,2049,9149, 1,-1,2049,4007,2,2049,3938,10,9304,9342,168,20738,7572097789208550,14864,97,58,102,105,108,116, 101,114,0,1793,9357,67502597,1,27,2049,2266,4,1,130,1,17,2049,66,10,1,9344, 2049,8775,2049,2001,1793,9372,67502597,15,2049,130,2049,9115,10,1,9365,2049,2266,2049,2001,67502597, 18,2049,3219,67502597,16,10,9327,9403,168,20738,-4582686815792817282,14727,97,58,99,111,110,116,97,105, 110,115,63,0,1,0,4,1793,9415,4,5,67502597,11,6,22,10,1,9408,2049,9115, 772,10,9385,9446,168,20738,-3160266450763725308,14707,97,58,99,111,110,116,97,105,110,115,47,115, 116,114,105,110,103,63,0,1,0,4,1793,9459,4,5,67502597,2049,118,6,22,10, 1,9451,2049,9115,772,10,9421,9477,168,20738,210704790430,15117,97,58,109,97,112,0,4,1793, 9507,2049,58,1793,9501,1793,9490,15,67502597,8,10,1,9486,2049,2279,1,39,2049,2279,2049, 3204,10,1,9484,2049,2497,771,10,1,9480,2049,2279,10,9465,9528,168,20738,249879242396290652,15199,97, 58,114,101,118,101,114,115,101,0,2049,2001,1793,9562,2049,58,1793,9540,17,2049,3219, 10,1,9536,2049,2279,2,2049,130,1793,9556,2,15,2049,130,2049,3219,10,1,9549,2049, 2497,3,10,1,9532,2049,2266,10,9512,9578,168,20738,6384993884,15277,97,58,116,104,0,17, 2049,3204,10,9567,9596,168,20738,229457508628298,14844,97,58,102,101,116,99,104,0,2049,9578,15, 10,9582,9614,168,20738,229457524579373,15238,97,58,115,116,111,114,101,0,2049,9578,16,10,9600, 9632,168,20738,229457508770408,14884,97,58,102,105,114,115,116,0,1,0,2049,9596,10,9618,9650, 168,20738,6953258048468,15040,97,58,108,97,115,116,0,2,2049,8930,2049,3219,2049,9596,10,9637, 9673,168,20738,7572098253803096,15178,97,58,114,101,100,117,99,101,0,1,19,2049,2266,2049,9115, 10,9658,9691,168,20738,6384048135,14342,70,82,69,69,0,2049,4402,1,1025,18,1,513,1, 12,19,18,2049,2001,18,10,9680,9722,156,0,0,0,78,101,120,116,65,114,114, 97,121,0,10,9706,9736,168,0,0,0,97,114,114,97,121,115,0,2049,9691,2049, 2001,17,10,9680,9755,168,20738,6953258340118,15258,97,58,116,101,109,112,0,3841,9722,2,1, 12,11,1793,9770,3,1,0,2,4097,9722,10,1,9763,9,1,513,19,2049,9736,17, 67502597,2049,8930,2049,3204,2049,4075,3841,9722,1,513,19,2049,9736,17,1,9722,2049,3920,10, 9742,9811,156,0,0,0,67,111,117,110,116,0,3,9799,9826,168,0,0,0,112, 114,101,112,97,114,101,0,1,0,1,9811,16,10,9812,9846,168,0,0,0,114, 101,115,101,114,118,101,0,4,1,0,2049,130,10,9832,9864,168,0,0,0,112, 97,116,99,104,0,2049,2001,67502597,18,2049,3219,67502597,16,10,9852,9887,168,0,0,0, 99,108,101,97,110,117,112,0,2,2049,9755,4,1,3,16,10,9873,9908,168,0, 0,0,114,101,99,111,114,100,0,3841,9811,2049,130,10,9895,9929,168,0,0,0, 105,116,101,114,97,116,101,47,110,0,1793,9941,67502597,11,1,9908,9,1,9811,2049, 3920,10,1,9931,2049,9115,10,9913,9962,168,0,0,0,105,116,101,114,97,116,101, 47,115,0,1793,9975,67502597,2049,118,1,9908,9,1,9811,2049,3920,10,1,9964,2049,9115, 10,9742,9996,168,20738,249879231104077855,15000,97,58,105,110,100,105,99,101,115,0,2049,9826,2049, 2001,1793,10008,2049,9846,2049,9929,3,10,1,10002,2049,2266,2049,9864,2049,9887,10,9980,10040, 168,20738,6001861788990794213,15020,97,58,105,110,100,105,99,101,115,47,115,116,114,105,110,103, 0,2049,9826,2049,2001,1793,10052,2049,9846,2049,9962,3,10,1,10046,2049,2266,2049,9864,2049, 9887,10,10017,10075,168,20738,229457512492152,14960,97,58,105,110,100,101,120,0,1793,10084,2049,9996, 1,0,2049,9596,10,1,10077,2049,8909,10,10061,10110,168,20738,4816227687043827742,14980,97,58,105,110, 100,101,120,47,115,116,114,105,110,103,0,1793,10119,2049,10040,1,0,2049,9596,10, 1,10112,2049,8909,10,10089,10137,168,20738,6953258084126,15098,97,58,109,97,107,101,0,2049,9041, 2,2,1,3,1793,10148,2049,9528,10,1,10145,2049,4029,4,2049,9180,10,10124,10164,180, 20738,177696,20600,123,0,1,344,2049,180,1,1562,2049,168,1,344,2049,180,10,10156,10185, 180,20738,177698,20634,125,0,1,360,2049,180,1,2266,2049,168,1,1562,2049,168,1,19, 2049,174,1,43,2049,174,1,3219,2049,168,1,360,2049,180,1,10137,2049,168,10,10177, 10231,168,20738,6953257904708,14941,97,58,104,97,115,104,0,1,5381,4,1793,10242,4,1,33, 19,17,10,1,10236,2049,9115,10,10218,10259,168,20738,210704782197,14824,97,58,101,113,63,0, 2049,10231,4,2049,10231,11,10,10247,10279,168,20738,6953255788674,14628,97,58,45,101,113,63,0, 2049,10231,4,2049,10231,12,10,10266,10307,168,20738,4448793249567199488,14668,97,58,98,101,103,105,110, 115,45,119,105,116,104,63,0,1,3,1793,10323,2,2049,8930,1,19,2049,2266,2049, 8988,2049,10259,10,1,10311,2049,4029,10,10286,10347,168,20738,-3654621344420884174,14804,97,58,101,110,100, 115,45,119,105,116,104,63,0,1,3,1793,10363,2,2049,8930,1,19,2049,2266,2049, 9008,2049,10259,10,1,10351,2049,4029,10,10328,10385,156,0,0,0,83,117,98,115,116, 105,116,117,116,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,10368,10527,168,0,0,0, 101,120,116,114,97,99,116,0,1,10385,2049,5780,10,10513,10546,168,0,0,0,99, 111,109,98,105,110,101,0,1,10385,2049,4887,2049,4887,10,10532,10568,168,0,0,0, 102,105,110,100,45,101,110,100,0,2,2049,104,1,10385,2049,104,18,67502597,17,10, 10553,10591,168,0,0,0,99,108,101,97,110,0,2049,10568,1,0,4,16,10,10328, 10618,168,20738,1672736740201773236,19335,115,58,114,101,112,108,97,99,101,45,97,108,108,0,1, 3,1793,10641,2049,10527,2049,8088,2049,4589,4,1793,10634,2049,10546,10,1,10631,2049,9115,2049, 10591,10,1,10622,2049,4029,10,10598,10665,168,0,0,0,99,117,114,114,101,110,116, 45,108,105,110,101,0,2049,4402,1,1025,18,10,10646,10690,168,0,0,0,99,111, 117,110,116,45,116,111,107,101,110,115,0,1793,10696,1,32,11,10,1,10692,2049, 5525,2049,104,10,10671,10724,168,0,0,0,112,114,111,99,101,115,115,45,116,111, 107,101,110,115,0,1793,10752,1,32,2049,7464,4,1793,10745,2,2049,104,2049,2800,1, 422,1,17,2049,66,10,1,10733,2049,2266,2049,3204,10,1,10726,2049,2497,2049,422,10, 10598,10776,168,20738,8246849872898570441,19020,115,58,101,118,97,108,117,97,116,101,0,2049,10665,2049, 5780,2049,10665,2,2049,10690,2049,10724,10,10759,10797,156,0,0,0,76,80,0,0,10788, 10810,156,0,0,0,73,110,100,101,120,0,0,15,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,10798,10853,168,0,0,0,110,101,120,116,0,3841,10797,1,10810,17,2049, 3920,10,10842,10872,168,0,0,0,112,114,101,112,0,1,10797,2049,3920,1,0,3841, 10797,1,10810,17,16,10,10861,10896,168,0,0,0,100,111,110,101,0,1,10797,2049, 3938,10,10759,10909,168,20738,177646,14378,73,0,3841,10797,1,10810,17,15,10,10901,10924,168, 20738,177647,14414,74,0,3841,10797,1,10810,17,2049,3219,15,10,10916,10941,168,20738,177648,14432, 75,0,3841,10797,1,10810,17,1,2,18,15,10,10933,10971,168,20738,6047344052022463093,17655,105,110, 100,101,120,101,100,45,116,105,109,101,115,0,2049,10872,4,1793,10987,25,33886721,1, 2053,1542,2049,10853,1,10976,7,10,1,10976,8,3,2049,10896,10,10951,11008,168,20738,229463062432404, 16937,100,101,99,105,109,97,108,0,1,10,4097,248,10,10994,11026,168,20738,6953352993994,15549, 98,105,110,97,114,121,0,1,2,4097,248,10,11013,11043,168,20738,210722874360,18322,111,99, 116,97,108,0,1,8,4097,248,10,11031,11058,168,20738,193493706,17548,104,101,120,0,1, 16,4097,248,10,11048,11075,168,20738,210731100046,20461,118,97,114,45,115,0,1,4640,2049,2266, 2049,2130,10,11063,11101,168,20738,-2634409250251928459,20068,116,97,105,108,45,114,101,99,117,114,115, 101,0,1,1793,2049,2001,1,3,18,16,10,11082,11121,168,20738,6385224492,17166,102,105,108, 108,0,1793,11129,2049,2253,16,2049,3204,10,1,11123,2049,2497,771,10,11110,11154,168,20738, -3171118726347914531,17692,105,111,58,101,110,117,109,101,114,97,116,101,0,27,10,11135,11171,168, 20738,7572505472392333,17728,105,111,58,113,117,101,114,121,0,28,10,11156,11189,168,20738,249892680268169699,17710, 105,111,58,105,110,118,111,107,101,0,29,10,11173,11209,168,20738,-4568031882453442320,17748,105,111, 58,115,99,97,110,45,102,111,114,0,1,-1,4,2049,11154,1793,11240,2049,10909,2049, 11171,772,67502597,11,1793,11236,1793,11231,3,2049,10909,10,1,11227,2049,2266,10,1,11225,9, 10,1,11216,2049,10971,3,10,11191,11258,168,20738,210707166203,15953,99,58,112,117,116,0,1793, 11260,1,0,2049,11189,10,11246,11274,168,20738,5863647,18286,110,108,0,1,10,2049,11258,10, 11265,11288,168,20738,5863816,19974,115,112,0,1,32,2049,11258,10,11279,11303,168,20738,193506620,20051, 116,97,98,0,1,9,2049,11258,10,11293,11320,168,20738,210726140939,19296,115,58,112,117,116, 0,1,11258,2049,4908,10,11308,11337,168,20738,210720211334,18153,110,58,112,117,116,0,2049,8332, 2,2049,104,1,41,2049,2279,2049,3204,1793,11357,2,15,2049,11258,2049,3219,10,1,11350, 2049,2497,3,10,11325,11375,168,20738,210726503048,18534,114,101,115,101,116,0,2049,1562,25,771, 1,11375,7,10,11363,11400,168,20738,8246237009912977886,17047,100,117,109,112,45,115,116,97,99,107, 0,2049,1562,25,134284547,11400,134283782,11337,2049,11288,10,11383,11420,168,20738,193470948,14504,84,73,66, 0,1,7,15,10,1793,11463,2049,4611,69,82,82,79,82,58,32,87,111,114,100, 32,78,111,116,32,70,111,117,110,100,58,32,0,1,11428,2049,11320,2049,11420,2049, 11320,2049,11274,10,1,11426,11410,11477,168,20738,210707155874,15897,99,58,103,101,116,0,1793,11479, 1,1,2049,11209,2049,11189,10,11465,11496,168,20738,193487813,15709,98,121,101,0,26,10,11486, 11513,156,20738,7571133383038306,14396,73,103,110,111,114,105,110,103,0,0,11498,11524,156,0,0, 0,69,79,84,0,0,11514,11539,168,0,0,0,118,101,114,115,105,111,110,0, 3841,4,1,100,20,10,11525,11557,168,0,0,0,100,111,110,101,63,0,2,4097, 11524,1793,11566,1,13,11,10,1,11562,1793,11574,1,10,11,10,1,11570,1793,11582,1, 32,11,10,1,11578,2049,2340,22,22,10,11545,11600,168,0,0,0,101,111,108,63, 0,3841,11524,1793,11608,1,13,11,10,1,11604,1793,11616,1,10,11,10,1,11612,2049, 2294,22,10,11589,11635,168,0,0,0,118,97,108,105,100,63,0,2,2049,104,2049, 2875,10,11622,11657,168,0,0,0,99,104,101,99,107,45,101,111,102,0,2,1793, 11664,1,-1,11,10,1,11660,1793,11672,1,4,11,10,1,11668,2049,2294,22,1,11496, 9,10,11641,11690,168,0,0,0,98,115,0,2049,4278,1,2,2049,2731,1793,11702,2049, 4224,3,10,1,11698,9,2049,4224,3,10,11681,11724,168,0,0,0,99,104,101,99, 107,45,98,115,0,2,1793,11731,1,8,11,10,1,11727,1793,11739,1,127,11,10, 1,11735,2049,2294,22,1,11690,9,10,11709,11760,168,0,0,0,99,104,101,99,107, 0,2049,11657,2049,11724,10,11748,11781,168,0,0,0,99,104,97,114,97,99,116,101, 114,0,2049,11477,2,2049,4197,10,11765,11800,168,0,0,0,98,117,102,102,101,114, 0,1793,11810,2049,11420,2049,4301,8,2049,4157,10,1,11802,2049,4328,10,11787,11832,168,0, 0,0,114,101,97,100,45,116,111,107,101,110,0,1793,11848,1793,11843,2049,11781,2049, 11760,2049,11557,10,1,11836,2049,2443,10,1,11834,2049,11800,2049,4731,10,11815,11867,168,0, 0,0,105,110,112,117,116,0,2049,11832,2049,11635,10,11855,11886,168,0,0,0,112, 114,111,99,101,115,115,0,3841,11513,1793,11904,771,2049,11600,1793,11900,1,11513,2049,3991, 10,1,11895,9,10,1,11890,2049,2928,1,422,1,17,2049,66,10,11498,11932,168,20738, 8246849936849447419,19121,115,58,103,101,116,45,119,111,114,100,0,1793,11960,1,7,15,2049,4301, 1793,11951,2049,11477,2,2049,4197,2049,11724,2049,11557,10,1,11941,2049,2443,2049,4157,2049,4731, 10,1,11934,2049,4328,10,11915,11978,168,20738,6953343520347,15468,98,97,110,110,101,114,0,2049, 11539,2049,4611,82,69,84,82,79,32,49,50,32,40,37,110,46,37,110,41,92, 110,0,1,11982,2049,8580,2049,11320,2049,9691,2049,1546,2049,9691,18,2049,1546,2049,4611,37, 110,32,77,97,120,44,32,37,110,32,85,115,101,100,44,32,37,110,32,70, 114,101,101,92,110,0,1,12018,2049,8580,2049,11320,10,11965,12065,168,20738,6953744547860,17767,108, 105,115,116,101,110,0,2049,11978,2049,11867,2049,11886,1,12067,7,10,12052,12097,156,20738, -213800119713087686,16606,100,58,72,97,115,104,45,70,117,110,99,116,105,111,110,0,5044,12075, 12113,168,20738,7572226109254526,16865,100,58,114,101,104,97,115,104,0,1793,12131,1793,12123,2049,192, 3841,12097,8,10,1,12117,2049,2279,2049,188,16,10,1,12115,2049,8833,10,12098,2,156, 20724,210668957237,14217,66,85,73,76,68,0,12136,12160,168,12654,210709067314,16402,99,111,109,109,97, 0,2049,130,10,12148,12174,168,12654,6385123288,16509,99,111,110,115,0,2049,2001,1793,12184,4, 2049,12160,2049,12160,10,1,12178,2049,2266,10,12163,12199,168,12654,193488123,16160,99,97,114,0, 10,12189,12210,168,12654,193488222,16246,99,100,114,0,2049,3204,10,12200,12224,168,12654,6385108123,16198, 99,97,114,64,0,2049,12199,15,10,12213,12239,168,12654,6385108092,16179,99,97,114,33,0, 2049,12199,16,10,12228,12254,168,12654,6385111390,16284,99,100,114,64,0,2049,12210,15,10,12243, 12269,168,12654,6385111359,16265,99,100,114,33,0,2049,12210,16,10,12258,12283,168,12654,193454780,14289, 69,78,68,0,10,12273,12301,168,12654,8246317064958091121,17205,102,108,108,58,99,114,101,97,116, 101,0,1,12283,2049,12174,10,12284,12314,156,0,177687,0,114,0,29451,12284,12332,168,12654, 8246317065617826724,17337,102,108,108,58,116,111,45,101,110,100,0,2,4097,12314,1793,12357,2049,12254, 2,1,12283,12,2,1793,12350,67502597,4097,12314,10,1,12346,1,2205,2049,66,10,1,12337, 2049,2417,3841,12314,10,12315,12387,168,12654,4204933718218055169,17186,102,108,108,58,97,112,112,101,110, 100,47,118,97,108,117,101,0,1,12283,2049,12174,4,2049,12332,2049,12269,10,12364,12416, 168,12654,-3325079438733587419,17356,102,108,108,58,116,111,45,105,110,100,101,120,0,1,12254,2049, 2497,10,12397,12435,168,12654,229465928290674,17224,102,108,108,58,100,101,108,0,2049,2253,2049,3219, 2049,12416,1793,12448,2049,3204,2049,12416,10,1,12443,2049,2266,2049,12269,10,12421,12468,156,0, 6952054634723,0,65,99,116,105,111,110,0,12832,12421,12488,168,12654,-3325080032762929022,17261,102,108,108,58, 102,111,114,45,101,97,99,104,0,4097,12468,1793,12511,1793,12500,2049,12224,3841,12468,8, 10,1,12494,2049,2279,2049,12254,2,1,12283,12,10,1,12492,2049,2417,3,10,12469,12534, 168,12654,8246317065295222655,17300,102,108,108,58,108,101,110,103,116,104,0,1,0,4,1793,12543, 3,2049,3204,10,1,12539,2049,12488,2049,3219,10,12517,12565,168,12654,7572375633606610,17243,102,108,108, 58,100,114,111,112,0,2,2049,12534,2049,3219,2049,12416,1,12283,4,2049,12269,10,12550, 12586,156,0,177678,0,105,0,0,12550,12604,168,12654,8246317065188343290,17280,102,108,108,58,105,110, 106,101,99,116,0,2049,12301,4097,12586,2049,2253,2049,3219,2049,12416,1,12416,2049,2266,3841, 12586,4,2049,12269,3841,12586,2049,12269,10,12587,12642,168,12654,229465928304278,17319,102,108,108,58,112, 117,116,0,1793,12649,2049,11337,2049,11288,10,1,12644,2049,12488,10,105,110,116,101,114, 102,97,99,101,47,108,108,46,114,101,116,114,111,0,105,110,105,116,0,12673, 12923,12628,12699,156,12901,-2744922491217532500,18888,115,58,100,101,100,117,112,46,100,97,116,97,0, 12678,12680,12709,156,0,5863786,0,116,49,0,522752,12700,12719,156,0,5863787,0,116,50,0, 30448,12680,12743,168,12901,-1192507208876296873,18944,115,58,100,101,100,117,112,46,114,101,103,105,115, 116,101,114,0,2049,4640,3841,12699,4,1,12387,2049,2279,10,12720,12776,168,12901,-1192507805573830048,18906, 115,58,100,101,100,117,112,46,100,101,102,105,110,101,100,63,0,4097,12709,1, 0,4097,12719,3841,12699,1793,12796,3841,12709,2049,118,3841,12719,22,4097,12719,10,1,12786,2049, 12488,3841,12719,10,12753,12822,168,12901,-2744922491217452109,18925,115,58,100,101,100,117,112,46,102,105, 110,100,0,4097,12709,1,0,4097,12719,3841,12699,1793,12849,2,3841,12709,2049,118,1793,12842, 4097,12719,10,1,12839,1,17,2049,66,10,1,12832,2049,12488,3841,12719,10,12803,12870,168, 12901,229480752663076,18869,115,58,100,101,100,117,112,0,2049,4558,2,2049,12776,1,12822,1,12743, 2049,66,10,12856,12898,168,12901,249904561963058472,19668,115,58,117,110,105,113,117,101,63,0,2049, 12776,10,105,110,116,101,114,102,97,99,101,47,100,101,100,117,112,46,114,101, 116,114,111,0,12901,20722,12882,12936,168,0,6385683284,0,115,97,118,101,0,2049,3204,2049, 4731,2049,2001,4,2049,4640,1,17,2049,174,1,2,17,2049,1648,2049,3219,16,10,12925, 12979,168,0,3501352175510017786,0,115,116,97,99,107,45,99,111,109,109,101,110,116,63,0, 2,1,0,2049,4698,1,58,11,10,12882,13002,180,0,229482595734751,19821,115,105,103,105,108, 58,40,0,2049,12979,1,12936,1,17,2049,66,10,12988,13028,168,0,8246153636752806788,13030,100,58, 100,101,115,99,114,105,98,101,0,2049,4611,115,45,0,1,13030,3,2049,241,2049, 11274,2,2049,4611,78,97,109,101,58,32,32,32,32,0,1,13043,2049,11320,2049,192, 2049,11320,2049,11274,2,2049,4611,65,100,100,114,101,115,115,58,32,0,1,13066,2049, 11320,2049,182,15,2049,11337,2049,11274,2,2049,4611,67,108,97,115,115,58,32,32,32, 0,1,13090,2049,11320,2049,184,15,2,2049,11337,2049,8869,2,2049,2800,1793,13124,2049,11288, 2049,192,2049,11320,10,1,13117,1,17,2049,66,2049,11274,2,2049,4611,83,111,117,114, 99,101,58,32,32,0,1,13135,2049,11320,2049,186,15,2,2049,2800,1,11320,1,17, 2049,66,2049,11274,2,2049,4611,83,116,97,99,107,58,32,32,32,0,1,13166,2049, 11320,2049,190,15,2,2049,2800,1,11320,1,17,2049,66,2049,11274,3,10,13011,13222,168, 0,3142032362620974322,13224,100,58,115,101,116,45,115,116,97,99,107,45,99,111,109,109,101, 110,116,0,2049,4611,115,115,45,0,1,13224,3,2049,241,2,2049,2800,1793,13246,2049, 190,1,4640,2049,2266,16,10,1,13238,1,2223,2049,66,10,110,45,115,0,115,45, 115,0,115,45,115,102,0,45,0,97,45,97,0,68,58,32,45,99,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,115,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,110,110,45,110,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,110,110,45,110,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,110,45,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,110,110,45,110,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,110,110,45,102,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,102,113,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 102,113,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110, 109,45,118,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110, 109,45,114,118,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 110,45,110,32,124,124,32,110,45,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,110,45,110,110,32,124,124,32,110,45,110,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45, 110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45, 110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45, 110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45, 97,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,97,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,97,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,45,97,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,97,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,45,97,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,45,97,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,45,97,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,97,97,45,102,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,97,97,45,97,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,97,97,45,102,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,97,45,97,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,115,97,45,102,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,110,97,45,102,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,97,97,45,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,113,45,97,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,97,45,98,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,97,97,45,102,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,97,97,45,102,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,97,110,45,110,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,97,113,45,98,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,97,45,110,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,97,113,45,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,115,45,97,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,97,45,110,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,97,110,45,110,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,97,115,45,110,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,97,118,45,97,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,97,115,45,97,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,97,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,97,110,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,97,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,113,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,97,113,45,98,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,97,102,108,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,97,97,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,112,110,113,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,97,45,98,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,97,110,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,118,97,110,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,97,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,97,110,45,98,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,97,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,45,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,109,45,111,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,97,45,110,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,97,45,97,110,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,97,45,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,110,97,45,97,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,97,45,97,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,120,113,113,45,63,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,120,121,113,113,45,63,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,120,121,113,45,63,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,110,45,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,113,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,97, 45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,97,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,99,45,102,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,99,45,102,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,99,45,102,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,99,45,102,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,99,45,102,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,99,45,102,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,99,45,102,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,99,45,102,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,99,45,102,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,45,99,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,99, 45,102,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,99,45, 102,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,99,45,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,99,45,99,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,99,45,110,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,99,45,115,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,99,45,99,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,99,45,99,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,99,45,102,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,99,45,102,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,99,45,102,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,99,45,102,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,97,45,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,97,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,110,97,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,97,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,110,109,113,45,32,124,124,32,110,109,113,45,110,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,97,45,97,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,110,97,45,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,97,45,110,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,102,113,113,45,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,110,45,32,124,124,32,110,45,110,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,97,45,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,97,45,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,97,45,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,110,45,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,97,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,97,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 110,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,102,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,120,121,45,97,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,110,115,45,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,115,100,108,45,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,110,113,45,113,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,110,45,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,115,97,97,45,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,100,45,97,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,115,45,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,113,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,100,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,45,100,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45, 97,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,115,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,97,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,100,45,97,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,115,45,100,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,97,45,100,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,100,45,115,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,100,45,97,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,100,45,97,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,113,45,110, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,113,45,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,45,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,110,110,45,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,110,45,110,110,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,110,109,45,110,109,110,109,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,110,110,45,102,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,97,45,110,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,97,45,97,110,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,118,112,110,45,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,112,118,45,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,118,45,112,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,112,110,45,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,112,45,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,112,113,45,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,112,110,118,45,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,112,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,112,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,112,45,112,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 112,110,45,112,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 113,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,97,45, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,110,45,102, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,110,45,102, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,97,45,110,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,97,45,97,110,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,97,45,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,97,45,97,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,97,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,115,45,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,102,113,45,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,102,113,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110, 113,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,45, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,110,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,45,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,110,45,109,78,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,110,45,109,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,110,110,45,102,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,110,110,45,102,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,110,109,45,111,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,110,45,102,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,110,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,110,108,117,45,102,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,110,45,109,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,110,45,102,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,110,45,109,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 110,108,117,45,109,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,109,110,45,111,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,109,110,45,111,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,110,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 110,45,102,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110, 45,102,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,45, 102,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,98,112,45, 110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,45,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,45,109,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,45,109,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,110,45,102,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,110,45,115,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,110,45,102,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,110,109,45,109,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,110,45,109,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,45,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,109,110,45,111,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,110,109,45,110,109,110,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,110,110,110,110,45,110,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,45,110,32,32,65,58,32,110,45,32,32,70,58, 32,45,0,68,58,32,45,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,110,45,32,32,65,58,32,45,110,32,32,70,58,32,45,0,68, 58,32,115,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 97,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,46,46, 46,115,115,45,63,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,46,46, 46,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,97,98, 99,45,98,99,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,115,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45, 115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,115,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,115,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,45,115,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,45,115,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,45,115,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,115,115,45,115,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,115,115,45,102,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,115,83,113,45,32,124,124,32,115,83,113,45,115, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,45,115,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,115,45,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,99,45,102,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,115,45,102,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,97,45,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,115,45,115,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,45,97,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,115,45,102,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,115,45,115,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,115,45,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,45,115,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,115,115,45,102,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,115,115,45,102,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,115,45,63,32,32,65,58,32,45,32,32,70,58,32,45,63, 0,68,58,32,115,110,45,110,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,115,113,45,115,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,115,113,45,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,46,46,46,115,45,115,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,115,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,115,99,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,115,115,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,115,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,115,110,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,115,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 115,113,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 115,115,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 115,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,115, 115,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115, 115,115,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 115,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115, 110,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,99,45,115, 115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,115,45, 115,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,99,115, 110,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,102, 108,45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115, 45,115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,45, 115,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,45,110, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,45,115,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,99,45,97,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,115,45,97,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,45,115,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,45,115,32,32,65, 58,32,45,32,32,70,58,32,45,0,68,58,32,115,45,115,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,115,45,102,32,32,65,58,32, 45,32,32,70,58,32,45,0,68,58,32,97,97,45,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,109,110,45,111,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,110,115,45,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,115,45,110,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,115,45,99,32,32,65,58,32,45,32,32,70, 58,32,45,0,68,58,32,115,45,97,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,115,45,115,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,115,45,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,115,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,115,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 115,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,45, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,45,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,115,45,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,110,113,40,63,110,45,63,41, 45,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,97,45,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,97,45,97,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,109,45,109,110,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,45,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,110,113,45,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,120,113,113,113,45,63,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,120,121,122,113,113,113,45,63,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,120,121,122,113,45,63, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,109,45,109, 110,109,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,97,45, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,45,110,110, 110,110,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,113,40, 45,102,41,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32, 97,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,97, 45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,97,45,32, 32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,110,97,45,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,97,108,117,45,32,32, 65,58,32,45,32,32,70,58,32,45,0,68,58,32,97,45,32,32,65,58, 32,45,32,32,70,58,32,45,0,68,58,32,97,45,32,32,65,58,32,45, 32,32,70,58,32,45,0,68,58,32,97,113,45,32,32,65,58,32,45,32, 32,70,58,32,45,0,68,58,32,97,113,45,32,32,65,58,32,45,32,32, 70,58,32,45,0,68,58,32,115,45,32,32,65,58,32,45,32,32,70,58, 32,45,0,68,58,32,110,115,45,32,32,65,58,32,45,32,32,70,58,32, 45,0,68,58,32,115,115,45,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,97,45,110,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,97,45,97,110,32,32,65,58,32,45,32,32,70,58,32,45,0, 68,58,32,110,97,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,110,97,45,97,32,32,65,58,32,45,32,32,70,58,32,45,0,68, 58,32,113,40,45,102,41,45,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,109,110,45,111,32,32,65,58,32,45,32,32,70,58,32,45, 0,68,58,32,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58, 32,45,32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,97, 32,32,65,58,32,45,32,32,70,58,32,45,0,68,58,32,45,32,32,65, 58,32,45,32,32,70,58,32,45,0,13196,20688,168,20698,-3502357327552891667,0,100,58,115,101, 116,45,115,111,117,114,99,101,0,1,12870,2049,2266,2049,241,2049,186,16,10,105, 110,116,101,114,102,97,99,101,47,115,111,117,114,99,101,115,46,114,101,116, 114,111,0,20698,20736,98,117,105,108,100,46,114,101,116,114,111,0,20724,20750,114, 101,116,114,111,46,102,111,114,116,104,0,20738,21271,20669,0,156,21247,-2419379730924625824,20774,68, 69,86,73,67,69,58,79,85,84,80,85,84,0,45,110,0,20752,1,156,21247, 3179875372589939872,20799,68,69,86,73,67,69,58,75,69,89,66,79,65,82,68,0,45,110, 0,20775,2,156,21247,-2419379731287713704,20822,68,69,86,73,67,69,58,70,76,79,65,84,83, 0,45,110,0,20800,4,156,21247,-5104244739232646654,20844,68,69,86,73,67,69,58,70,73,76, 69,83,0,45,110,0,20823,3,156,21247,-2419379731444253395,20867,68,69,86,73,67,69,58,66, 76,79,67,75,83,0,45,110,0,20845,5,156,21247,-5104244739236093413,20889,68,69,86,73,67, 69,58,67,76,79,67,75,0,45,110,0,20868,6,156,21247,-5744567309556069531,20915,68,69,86, 73,67,69,58,82,69,83,69,82,86,69,68,54,0,45,110,0,20890,7,156, 21247,-2419379730775816680,20938,68,69,86,73,67,69,58,83,79,67,75,69,84,0,45,110,0, 20916,8,156,21247,-4626612040269427085,20959,68,69,86,73,67,69,58,85,78,73,88,0,45,110, 0,20939,9,156,21247,-5744565989521702654,20985,68,69,86,73,67,69,58,83,67,82,73,80,84, 73,78,71,0,45,110,0,20960,10,156,21247,8244683305011325430,21005,68,69,86,73,67,69,58, 82,78,71,0,45,110,0,20986,11,156,21247,-5103280478254778479,21032,68,69,86,73,67,69,58, 82,69,83,69,82,86,69,68,49,49,0,45,110,0,21006,12,156,21247,-5103280478254778478,21059, 68,69,86,73,67,69,58,82,69,83,69,82,86,69,68,49,50,0,45,110, 0,21033,13,156,21247,-5103280478254778477,21086,68,69,86,73,67,69,58,82,69,83,69,82,86, 69,68,49,51,0,45,110,0,21060,14,156,21247,-5104244739228882582,21108,68,69,86,73,67,69, 58,73,79,67,84,76,0,45,110,0,21087,15,156,21247,-2419379731026907097,21131,68,69,86,73, 67,69,58,77,65,76,76,79,67,0,45,110,0,21109,1000,156,21247,-5104244739228957070,21153,68, 69,86,73,67,69,58,73,77,65,71,69,0,45,110,0,21132,1234,156,21247,-5104244739233502279, 21175,68,69,86,73,67,69,58,69,82,82,79,82,0,45,110,0,21154,8000,156, 21247,-5744573668168662717,21201,68,69,86,73,67,69,58,77,85,76,84,73,67,79,82,69,0, 45,110,0,21176,8100,156,21247,8244683305011312100,21221,68,69,86,73,67,69,58,70,70,73,0, 45,110,0,21202,8101,156,21247,3179875810170796684,21246,68,69,86,73,67,69,58,85,78,83,73, 71,78,69,68,0,45,110,0,105,110,116,101,114,102,97,99,101,47,100,101, 118,105,99,101,115,46,114,101,116,114,111,0,21247,24452,21222,21295,168,24422,-6845980351726443322,21297, 102,108,111,97,116,58,111,112,101,114,97,116,105,111,110,0,2049,4611,110,45, 0,1,21297,3,1,2,2049,11209,2,2049,2822,1793,21361,3,2049,4611,69,114,114,111, 114,58,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,100,101, 118,105,99,101,32,110,111,116,32,102,111,117,110,100,0,1,21315,2049,11320,2049, 11274,10,1,21312,2049,2928,2049,11189,10,21273,21385,168,24422,8246618443670464787,21387,110,58,116,111,45, 102,108,111,97,116,0,2049,4611,110,45,95,102,58,45,110,0,1,21387,3,1, 0,2049,21295,10,21368,21420,168,24422,8246850501092474552,21422,115,58,116,111,45,102,108,111,97,116, 0,2049,4611,115,45,95,102,58,45,110,0,1,21422,3,1,1,2049,21295,10,21403, 21456,168,24422,-4575005096076366594,21458,102,58,116,111,45,110,117,109,98,101,114,0,2049,4611,102, 58,97,45,95,95,45,110,0,1,21458,3,1,2,2049,21295,10,21438,21493,168,24422, -4575005095881687956,21495,102,58,116,111,45,115,116,114,105,110,103,0,2049,4611,102,58,110,45, 95,95,45,115,0,1,21495,3,2049,4589,2,1,3,2049,21295,10,21475,21525,168,24422, 193490032,21527,102,58,43,0,2049,4611,102,58,97,98,45,99,0,1,21527,3,1,4, 2049,21295,10,21515,21552,168,24422,193490034,21554,102,58,45,0,2049,4611,102,58,97,98,45, 99,0,1,21554,3,1,5,2049,21295,10,21542,21579,168,24422,193490031,21581,102,58,42,0, 2049,4611,102,58,97,98,45,99,0,1,21581,3,1,6,2049,21295,10,21569,21606,168, 24422,193490036,21608,102,58,47,0,2049,4611,102,58,97,98,45,99,0,1,21608,3,1, 7,2049,21295,10,21596,21637,168,24422,229463966214663,21639,102,58,102,108,111,111,114,0,2049,4611, 102,58,97,98,45,99,0,1,21639,3,1,8,2049,21295,10,21623,21670,168,24422,249886255052186944, 21672,102,58,99,101,105,108,105,110,103,0,2049,4611,102,58,102,45,102,0,1, 21672,3,1,9,2049,21295,10,21654,21699,168,24422,6953453994383,21701,102,58,115,113,114,116,0, 2049,4611,102,58,102,45,102,0,1,21701,3,1,10,2049,21295,10,21686,21727,168,24422, 210710711802,21729,102,58,101,113,63,0,2049,4611,102,58,97,98,45,99,0,1,21729,3, 1,11,2049,21295,10,21715,21757,168,24422,6953451465639,21759,102,58,45,101,113,63,0,2049,4611, 102,58,97,98,45,99,0,1,21759,3,1,12,2049,21295,10,21744,21786,168,24422,210710719524, 21788,102,58,108,116,63,0,2049,4611,102,58,97,98,45,99,0,1,21788,3,1, 13,2049,21295,10,21774,21815,168,24422,210710714079,21817,102,58,103,116,63,0,2049,4611,102,58, 97,98,45,99,0,1,21817,3,1,14,2049,21295,10,21803,21846,168,24422,229463963592506,21848,102, 58,100,101,112,116,104,0,2049,4611,45,110,0,1,21848,3,1,15,2049,21295,10, 21832,21871,168,24422,210710710894,21873,102,58,100,117,112,0,2049,4611,102,58,97,45,97,97, 0,1,21873,3,1,16,2049,21295,10,21859,21901,168,24422,6953453456314,21903,102,58,100,114,111, 112,0,2049,4611,102,58,97,45,0,1,21903,3,1,17,2049,21295,10,21888,21929,168, 24422,6953454000352,21931,102,58,115,119,97,112,0,2049,4611,102,58,97,98,45,98,97,0, 1,21931,3,1,18,2049,21295,10,21916,21959,168,24422,210710719399,21961,102,58,108,111,103,0, 2049,4611,102,58,97,98,45,99,0,1,21961,3,1,19,2049,21295,10,21947,21990,168, 24422,229463978190066,21992,102,58,112,111,119,101,114,0,2049,4611,102,58,97,98,45,99,0, 1,21992,3,1,20,2049,21295,10,21976,22019,168,24422,210710726831,22021,102,58,115,105,110,0, 2049,4611,102,58,102,45,102,0,1,22021,3,1,21,2049,21295,10,22007,22047,168,24422, 210710727656,22049,102,58,116,97,110,0,2049,4611,102,58,102,45,102,0,1,22049,3,1, 22,2049,21295,10,22035,22075,168,24422,210710709610,22077,102,58,99,111,115,0,2049,4611,102,58, 102,45,102,0,1,22077,3,1,23,2049,21295,10,22063,22104,168,24422,6953453349392,22106,102,58, 97,115,105,110,0,2049,4611,102,58,102,45,102,0,1,22106,3,1,24,2049,21295, 10,22091,22133,168,24422,6953453332171,22135,102,58,97,99,111,115,0,2049,4611,102,58,102,45, 102,0,1,22135,3,1,25,2049,21295,10,22120,22162,168,24422,6953453350217,22164,102,58,97,116, 97,110,0,2049,4611,102,58,102,45,102,0,1,22164,3,1,26,2049,21295,10,22149, 22191,168,24422,6953453890949,22193,102,58,112,117,115,104,0,2049,4611,102,58,102,45,0,1, 22193,3,1,27,2049,21295,10,22178,22218,168,24422,210710723764,22220,102,58,112,111,112,0,2049, 4611,102,58,45,102,0,1,22220,3,1,28,2049,21295,10,22206,22248,168,24422,7572310679561435,22250, 102,58,97,100,101,112,116,104,0,2049,4611,45,110,0,1,22250,3,1,29,2049, 21295,10,22233,22274,168,24422,6953453855649,22276,102,58,111,118,101,114,0,2049,4611,102,58,97, 98,45,97,98,97,0,1,22276,3,2049,22191,2049,21871,2049,22218,2049,21929,10,22261,22310, 168,24422,6953454034172,22312,102,58,116,117,99,107,0,2049,4611,102,58,97,98,45,98,97, 98,0,1,22312,3,2049,21871,2049,22191,2049,21929,2049,22218,10,22297,22345,168,24422,210710721388,22347, 102,58,110,105,112,0,2049,4611,102,58,97,98,45,98,0,1,22347,3,2049,21929, 2049,21901,10,22333,22380,168,24422,-4575027385529052237,22382,102,58,100,114,111,112,45,112,97,105,114, 0,2049,4611,102,58,97,98,45,0,1,22382,3,2049,21901,2049,21901,10,22362,22413,168, 24422,8246246480203571943,22415,102,58,100,117,112,45,112,97,105,114,0,2049,4611,102,58,97,98, 45,97,98,97,98,0,1,22415,3,2049,22274,2049,22274,10,22396,22445,168,24422,210710725946,22447, 102,58,114,111,116,0,2049,4611,102,58,97,98,99,45,98,99,97,0,1,22447, 3,2049,22191,2049,21929,2049,22218,2049,21929,10,22433,22483,180,24422,229482595734757,22485,115,105,103,105, 108,58,46,0,2049,4611,115,45,95,95,102,58,45,97,0,1,22485,3,2049,1933, 1,4640,1,4558,2049,66,1,21420,2049,168,10,22469,22525,168,24422,7572311399974070,22527,102,58,115, 113,117,97,114,101,0,2049,4611,102,58,110,45,109,0,1,22527,3,2049,21871,2049, 21579,10,22510,22559,168,24422,-4575010631505066633,22561,102,58,112,111,115,105,116,105,118,101,63,0, 2049,4611,45,102,95,95,102,58,97,45,0,1,22561,3,1,0,2049,21385,2049,21815, 10,22541,22598,168,24422,-4575013886317431657,22600,102,58,110,101,103,97,116,105,118,101,63,0,2049, 4611,45,102,95,95,102,58,97,45,0,1,22600,3,1,0,2049,21385,2049,21786,10, 22580,22634,168,24422,7572311189563001,22636,102,58,110,101,103,97,116,101,0,2049,4611,102,58,97, 45,98,0,1,22636,3,1,-1,2049,21385,2049,21579,10,22619,22664,168,24422,210710707003,22666,102, 58,97,98,115,0,2049,4611,102,58,97,45,98,0,1,22666,3,2049,21871,2049,22598, 1,22634,9,10,22652,22695,168,24422,210710723966,22697,102,58,112,117,116,0,2049,4611,102,58, 97,45,0,1,22697,3,2049,21493,2049,11320,10,22683,22721,168,24422,6385172350,22723,102,58,80, 73,0,2049,4611,102,58,45,70,0,1,22723,3,2049,4611,51,46,49,52,49,53, 57,50,54,53,52,0,1,22733,2049,21420,10,22710,22760,168,24422,193490058,22762,102,58,69, 0,2049,4611,102,58,45,70,0,1,22762,3,2049,4611,50,46,55,49,56,50,56, 49,56,50,56,0,1,22772,2049,21420,10,22750,22801,168,24422,210710685186,22803,102,58,78,65, 78,0,2049,4611,102,58,45,110,0,1,22803,3,2049,4611,48,0,1,22813,2049,21420, 2049,4611,48,0,1,22821,2049,21420,2049,21606,10,22789,22842,168,24422,210710680162,22844,102,58,73, 78,70,0,2049,4611,102,58,45,110,0,1,22844,3,2049,4611,49,46,48,0,1, 22854,2049,21420,2049,4611,48,0,1,22864,2049,21420,2049,21606,10,22830,22886,168,24422,6953451433999,22888, 102,58,45,73,78,70,0,2049,4611,102,58,45,110,0,1,22888,3,2049,4611,45, 49,46,48,0,1,22898,2049,21420,2049,4611,48,0,1,22909,2049,21420,2049,21606,10,22873, 22931,168,24422,6953453797089,22933,102,58,110,97,110,63,0,2049,4611,102,58,110,45,44,45, 102,0,1,22933,3,2049,21871,2049,21757,10,22918,22962,168,24422,6953453631297,22964,102,58,105,110, 102,63,0,2049,4611,102,58,110,45,44,45,102,0,1,22964,3,2049,22842,2049,21727, 10,22949,22994,168,24422,229463898507918,22996,102,58,45,105,110,102,63,0,2049,4611,102,58,110, 45,44,45,102,0,1,22996,3,2049,22886,2049,21727,10,22980,23026,168,24422,229463980560013,23028,102, 58,114,111,117,110,100,0,2049,4611,45,124,102,58,97,45,98,0,1,23028,3, 2049,21871,2049,22598,1793,23060,2049,4611,48,46,53,0,1,23047,2049,21420,2049,21552,2049,21670, 10,1,23045,1793,23079,2049,4611,48,46,53,0,1,23066,2049,21420,2049,21525,2049,21637,10, 1,23064,2049,66,10,23012,23096,168,24422,210710720297,23098,102,58,109,105,110,0,2049,4611,102, 58,110,110,45,110,0,1,23098,3,2049,22413,2049,21786,1,21901,1,22345,2049,66,10, 23084,23131,168,24422,210710720043,23133,102,58,109,97,120,0,2049,4611,102,58,110,110,45,110, 0,1,23133,3,2049,22413,2049,21815,1,21901,1,22345,2049,66,10,23119,23168,168,24422,229463973220004, 23170,102,58,108,105,109,105,116,0,2049,4611,102,58,110,108,117,45,110,0,1, 23170,3,2049,21929,2049,22191,2049,23096,2049,22218,2049,23131,10,23154,23209,168,24422,8246246374547107374,23211,102, 58,98,101,116,119,101,101,110,63,0,2049,4611,102,58,110,108,117,45,110,0, 1,23211,3,2049,22445,2049,21871,2049,22191,2049,22445,2049,22445,2049,23168,2049,22218,2049,21727,10, 23192,23251,168,24422,210710716095,23253,102,58,105,110,99,0,2049,4611,102,58,110,45,110,0, 1,23253,3,2049,4611,49,0,1,23264,2049,21420,2049,21525,10,23239,23285,168,24422,210710710353,23287, 102,58,100,101,99,0,2049,4611,102,58,110,45,110,0,1,23287,3,2049,4611,49, 0,1,23298,2049,21420,2049,21552,10,23273,23320,168,24422,6953453401985,23322,102,58,99,97,115,101, 0,2049,4611,102,58,102,102,45,44,113,45,0,1,23322,3,2049,22274,2049,21727,1793, 23346,2049,21901,8,1,-1,10,1,23340,1793,23354,3,1,0,10,1,23350,2049,66,25, 6,771,10,23307,23375,168,24422,6953453985302,23377,102,58,115,105,103,110,0,2049,4611,45,110, 124,102,58,97,45,0,1,23377,3,2049,21871,2049,4611,48,0,1,23392,2049,21420,2049, 21727,1793,23407,1,0,2049,21901,10,1,23402,2049,2928,2049,4611,48,0,1,23413,2049,21420, 2049,21815,1793,23426,1,1,10,1,23423,1793,23433,1,-1,10,1,23430,2049,66,10,23362, 9223372036854775805,156,24422,210709498186,23452,101,58,77,65,88,0,45,110,0,23438,-9223372036854775805,156,24422,210709498440,23467, 101,58,77,73,78,0,45,110,0,23453,-9223372036854775807,156,24422,210709499265,23482,101,58,78,65,78, 0,45,110,0,23468,9223372036854775806,156,24422,210709494241,23497,101,58,73,78,70,0,45,110,0,23483, -9223372036854775806,156,24422,6953412298606,23513,101,58,45,73,78,70,0,45,110,0,23498,23525,168,24422,6385137393, 23527,101,58,110,63,0,2049,4611,117,45,102,0,1,23527,3,1,-9223372036854775805,2049,3204,1, 9223372036854775805,2049,3219,2049,3239,10,23514,23558,168,24422,6953414626089,23560,101,58,109,97,120,63,0,2049, 4611,117,45,102,0,1,23560,3,1,9223372036854775805,11,10,23545,23584,168,24422,6953414634471,23586,101,58, 109,105,110,63,0,2049,4611,117,45,102,0,1,23586,3,1,-9223372036854775805,11,10,23571,23611, 168,24422,229462698216771,23613,101,58,122,101,114,111,63,0,2049,4611,117,45,102,0,1,23613, 3,2049,2781,10,23597,23636,168,24422,6953414661696,23638,101,58,110,97,110,63,0,2049,4611,117, 45,102,0,1,23638,3,1,-9223372036854775807,11,10,23623,23662,168,24422,6953414495904,23664,101,58,105,110, 102,63,0,2049,4611,117,45,102,0,1,23664,3,1,9223372036854775806,11,10,23649,23689,168,24422, 229462607039949,23691,101,58,45,105,110,102,63,0,2049,4611,117,45,102,0,1,23691,3,1, -9223372036854775806,11,10,23675,23715,168,24422,6953414278252,23717,101,58,99,108,105,112,0,2049,4611,117,45, 117,0,1,23717,3,1,-9223372036854775805,1,9223372036854775805,2049,3184,10,23702,23742,168,24422,6385171963,23744,102,58, 69,49,0,2049,4611,45,124,102,58,45,110,41,95,101,45,117,110,105,116,95, 105,110,95,102,108,111,97,0,1,23744,3,1793,23772,2049,4611,49,46,101,53,0, 1,23774,2049,21420,10,23731,23804,168,24422,-1561378222854156682,23806,102,58,115,105,103,110,101,100,45, 115,113,114,116,0,2049,4611,124,102,58,110,45,110,0,1,23806,3,2049,21871,2049, 23375,2049,22664,2049,21699,2049,21385,2049,21579,10,23784,23851,168,24422,-3240429906897787043,23853,102,58,115,105, 103,110,101,100,45,115,113,117,97,114,101,0,2049,4611,124,102,58,110,45,110, 0,1,23853,3,2049,21871,2049,23375,2049,21871,2049,21579,2049,21385,2049,21579,10,23829,23891,168, 0,7572308662409552,0,102,58,45,115,104,105,102,116,0,2049,23742,2049,21579,10,23876,23911,168, 0,7572308584138766,0,102,58,43,115,104,105,102,116,0,2049,23742,2049,21606,10,23896,23932,168, 0,249886182735593054,0,102,58,43,101,110,99,111,100,101,0,2049,23804,2049,23891,10,23916,23953, 168,0,249886185318528992,0,102,58,45,101,110,99,111,100,101,0,2049,21871,2049,23375,2049,23911, 2049,21871,2049,21579,2049,21385,2049,21579,10,23829,23981,168,24422,6953454025850,23983,102,58,116,111,45, 101,0,2049,4611,45,101,124,102,58,110,45,0,1,23983,3,2049,21871,2049,22931,1793, 24005,2049,21901,1,-9223372036854775807,10,1,24000,2049,2928,2049,21871,2049,22962,1793,24020,2049,21901,1,9223372036854775806, 10,1,24015,2049,2928,2049,21871,2049,22994,1793,24035,2049,21901,1,-9223372036854775806,10,1,24030,2049,2928, 2049,23932,2049,23026,2049,21456,2049,23715,1,-9223372036854775805,1,21901,2049,2606,1,9223372036854775805,1,21901,2049,2606, 10,23968,24073,168,24422,6953414890458,24075,101,58,116,111,45,102,0,2049,4611,101,45,124,102, 58,45,110,0,1,24075,3,1,-9223372036854775807,1,22801,2049,2606,1,9223372036854775806,1,22842,2049,2606,1, -9223372036854775806,1,22886,2049,2606,2049,21385,2049,23953,10,24060,24123,168,24422,229463981919218,24125,102,58,115,116, 111,114,101,0,2049,4611,97,45,124,102,58,110,45,0,1,24125,3,1,23981,2049, 2266,16,10,24109,24156,168,24422,229463965968143,24158,102,58,102,101,116,99,104,0,2049,4611,97, 45,124,102,58,45,110,0,1,24158,3,15,2049,24073,10,24142,24192,168,24422,-3401946998789110658,24194, 102,58,100,117,109,112,45,115,116,97,99,107,0,2049,4611,45,0,1,24194,3, 2049,21846,2,1,22191,2049,2497,1793,24217,2049,22218,2049,21871,2049,22695,2049,11288,10,1,24208, 2049,2497,10,24173,24242,168,24422,-1583786518488284545,24244,102,58,100,117,109,112,45,97,115,116,97, 99,107,0,2049,4611,45,0,1,24244,3,2049,22248,2,1,22218,2049,2497,1793,24267,2049, 21871,2049,22695,2049,11288,2049,22191,10,1,24258,2049,2497,10,24222,24284,168,24422,210709538045,24286,101, 58,112,117,116,0,2049,4611,101,45,0,1,24286,3,1,9223372036854775805,1793,24309,2049,4611,101, 58,77,65,88,0,1,24298,2049,11320,10,1,24296,2049,2606,1,-9223372036854775805,1793,24330,2049,4611, 101,58,77,73,78,0,1,24319,2049,11320,10,1,24317,2049,2606,1,0,1793,24349,2049, 4611,101,58,48,0,1,24340,2049,11320,10,1,24338,2049,2606,1,-9223372036854775807,1793,24370,2049,4611, 101,58,78,65,78,0,1,24359,2049,11320,10,1,24357,2049,2606,1,9223372036854775806,1793,24391,2049, 4611,101,58,73,78,70,0,1,24380,2049,11320,10,1,24378,2049,2606,1,-9223372036854775806,1793,24413, 2049,4611,101,58,45,73,78,70,0,1,24401,2049,11320,10,1,24399,2049,2606,2049,24073, 2049,22695,10,105,110,116,101,114,102,97,99,101,47,102,108,111,97,116,105,110, 103,112,111,105,110,116,46,114,101,116,114,111,0,24422,25543,24272,24475,168,25516,8056574075740390096, 24477,102,105,108,101,58,111,112,101,114,97,116,105,111,110,0,2049,4611,45,110, 0,1,24477,3,1,4,2049,11209,2,2049,2822,1793,24532,3,2049,4611,69,114,114,111, 114,58,32,102,105,108,101,115,32,100,101,118,105,99,101,32,110,111,116,32, 102,111,117,110,100,0,1,24495,2049,11320,2049,11274,10,1,24492,2049,2928,2049,11189,10, 24454,0,156,25516,6953509466161,24554,102,105,108,101,58,82,0,45,110,0,24539,1,156,25516, 6953509466166,24570,102,105,108,101,58,87,0,45,110,0,24555,2,156,25516,6953509466144,24586,102,105, 108,101,58,65,0,45,110,0,24571,3,156,25516,229465812383356,24603,102,105,108,101,58,82, 43,0,45,110,0,24587,24620,168,25516,249888269686595441,24622,102,105,108,101,58,111,112,101,110, 0,2049,4611,115,109,45,104,0,1,24622,3,1,0,2049,24475,10,24604,24652,168,25516, 8246312899643285909,24654,102,105,108,101,58,99,108,111,115,101,0,2049,4611,104,45,0,1,24654, 3,1,1,2049,24475,10,24635,24681,168,25516,249888269686691131,24683,102,105,108,101,58,114,101,97, 100,0,2049,4611,104,45,99,0,1,24683,3,1,2,2049,24475,10,24665,24712,168,25516, 8246312899667213450,24714,102,105,108,101,58,119,114,105,116,101,0,2049,4611,99,104,45,0,1, 24714,3,1,3,2049,24475,10,24695,24742,168,25516,249888269686763376,24744,102,105,108,101,58,116,101, 108,108,0,2049,4611,104,45,110,0,1,24744,3,1,4,2049,24475,10,24726,24772,168, 25516,249888269686727207,24774,102,105,108,101,58,115,101,101,107,0,2049,4611,110,104,45,0,1, 24774,3,1,5,2049,24475,10,24756,24802,168,25516,249888269686732250,24804,102,105,108,101,58,115,105, 122,101,0,2049,4611,104,45,110,0,1,24804,3,1,6,2049,24475,10,24786,24834,168, 25516,-4572835417384127758,24836,102,105,108,101,58,100,101,108,101,116,101,0,2049,4611,115,45,0, 1,24836,3,1,7,2049,24475,10,24816,24864,168,25516,8246312899646850209,24866,102,105,108,101,58,102, 108,117,115,104,0,2049,4611,102,45,0,1,24866,3,1,8,2049,24475,10,24847,24899, 168,25516,7612651040925696305,24901,102,105,108,101,58,114,101,97,100,47,98,121,116,101,115,0, 2049,4611,112,110,102,45,0,1,24901,3,1,9,2049,24475,10,24877,24937,168,25516,-7028659436281878592, 24939,102,105,108,101,58,119,114,105,116,101,47,98,121,116,101,115,0,2049,4611, 112,110,102,45,0,1,24939,3,1,10,2049,24475,10,24914,24970,168,25516,-4572835416836630931,24972,102, 105,108,101,58,114,101,97,100,47,99,0,2049,4611,104,45,99,0,1,24972,3, 1,11,2049,24475,10,24952,25003,168,25516,-3329616158956188292,25005,102,105,108,101,58,119,114,105,116, 101,47,99,0,2049,4611,99,104,45,99,0,1,25005,3,1,12,2049,24475,10,24984, 25037,168,25516,-3329616181967816770,25039,102,105,108,101,58,101,120,105,115,116,115,63,0,2049,4611, 115,45,102,0,1,25039,3,1,0,2049,24620,2,2049,2800,1793,25060,2049,24652,2049,2577, 10,1,25055,1793,25068,3,2049,2592,10,1,25064,2049,66,10,25018,25101,168,25516,-4283841618960457812,25103, 102,105,108,101,58,111,112,101,110,45,102,111,114,45,114,101,97,100,105,110, 103,0,2049,4611,115,45,110,110,0,1,25103,3,1,0,2049,24620,2,2049,24802,4, 10,25073,25147,168,25516,2106155595587003402,25149,102,105,108,101,58,111,112,101,110,45,102,111,114, 45,97,112,112,101,110,100,0,2049,4611,115,45,110,110,0,1,25149,3,1,2, 2049,24620,2,2049,24802,4,10,25120,25194,168,25516,-4283841611984295498,25196,102,105,108,101,58,111,112, 101,110,45,102,111,114,45,119,114,105,116,105,110,103,0,2049,4611,115,45,110, 0,1,25196,3,1,1,2049,24620,10,25166,25218,156,0,193455704,0,70,73,68,0,0, 25208,25230,156,0,6384542144,0,83,105,122,101,0,0,25219,25244,156,0,6952054634723,0,65,99, 116,105,111,110,0,0,25231,25257,168,0,210644670123,0,45,101,111,102,63,0,3841,25218, 2049,24742,3841,25230,13,10,25245,25280,168,0,7572809360530097,0,112,114,101,115,101,114,118,101, 0,1,25218,1793,25291,1,25230,1,27,2049,4029,10,1,25284,2049,4029,10,25166,25317,168, 25516,8056577820387649264,25319,102,105,108,101,58,114,101,97,100,45,108,105,110,101,0,2049,4611, 102,45,115,0,1,25319,3,2049,2001,4,1,13,2049,24475,2049,2001,10,25296,25361,168, 25516,-8859848394595038695,25363,102,105,108,101,58,102,111,114,45,101,97,99,104,45,108,105,110, 101,0,2049,4611,115,113,45,0,1,25363,3,1793,25401,4097,25244,2049,25101,4097,25218,4097, 25230,1793,25392,3841,25218,2049,25317,3841,25244,8,2049,25257,10,1,25382,2049,2417,3841,25218,2049, 24652,10,1,25372,2049,25280,10,25336,25416,156,0,193455704,0,70,73,68,0,0,25336,25434, 168,25516,8246312899662267157,25436,102,105,108,101,58,115,108,117,114,112,0,2049,4611,97,115,45, 0,1,25436,3,1793,25470,4,2049,4301,2049,25101,4097,25416,1793,25461,3841,25416,2049,24681,2049, 4197,10,1,25454,2049,2497,3841,25416,2049,24652,10,1,25445,2049,4328,10,25417,25491,168,25516, 249888269686739198,25493,102,105,108,101,58,115,112,101,119,0,2049,4611,115,115,45,0,1,25493, 3,2049,25194,4,1793,25509,67502597,2049,24712,10,1,25505,2049,4908,2049,24652,10,105,110,116, 101,114,102,97,99,101,47,102,105,108,101,115,121,115,116,101,109,46,114,101, 116,114,111,0,25516,26504,25475,25567,168,26483,4299348465103751587,25569,105,111,58,117,110,105,120,45, 115,121,115,99,97,108,108,0,2049,4611,110,45,0,1,25569,3,1,8,2049,11209, 2,2049,2822,1793,25623,3,2049,4611,69,114,114,111,114,58,32,85,78,73,88,32, 100,101,118,105,99,101,32,110,111,116,32,102,111,117,110,100,0,1,25587,2049, 11320,2049,11274,10,1,25584,2049,2928,2049,11189,10,25545,25648,168,26483,-4549633084047572696,25650,117,110,105, 120,58,115,121,115,116,101,109,0,2049,4611,115,45,0,1,25650,3,1,0,2049, 25567,10,25630,25677,168,26483,249909575776928405,25679,117,110,105,120,58,102,111,114,107,0,2049,4611, 45,110,0,1,25679,3,1,1,2049,25567,10,25661,25707,168,26483,8247016000637760504,25709,117,110,105, 120,58,101,120,101,99,48,0,2049,4611,115,45,0,1,25709,3,1,2,2049,25567, 10,25690,25737,168,26483,8247016000637760505,25739,117,110,105,120,58,101,120,101,99,49,0,2049,4611, 115,115,45,0,1,25739,3,1,3,2049,25567,10,25720,25768,168,26483,8247016000637760506,25770,117,110, 105,120,58,101,120,101,99,50,0,2049,4611,115,115,115,45,0,1,25770,3,1, 4,2049,25567,10,25751,25800,168,26483,8247016000637760507,25802,117,110,105,120,58,101,120,101,99,51, 0,2049,4611,115,115,115,115,45,0,1,25802,3,1,5,2049,25567,10,25783,25832,168, 26483,249909575776901981,25834,117,110,105,120,58,101,120,105,116,0,2049,4611,110,45,0,1,25834, 3,1,6,2049,25567,10,25816,25863,168,26483,-4549633084540884128,25865,117,110,105,120,58,103,101,116, 112,105,100,0,2049,4611,45,110,0,1,25865,3,1,7,2049,25567,10,25845,25892,168, 26483,249909575777523800,25894,117,110,105,120,58,119,97,105,116,0,2049,4611,45,110,0,1,25894, 3,1,8,2049,25567,10,25876,25921,168,26483,249909575777101359,25923,117,110,105,120,58,107,105,108, 108,0,2049,4611,110,110,45,0,1,25923,3,1,9,2049,25567,10,25905,25952,168,26483, 8247016000650494309,25954,117,110,105,120,58,112,111,112,101,110,0,2049,4611,115,110,45,110,0, 1,25954,3,1,10,2049,25567,10,25935,25985,168,26483,-4549633084191325687,25987,117,110,105,120,58,112, 99,108,111,115,101,0,2049,4611,110,45,0,1,25987,3,1,11,2049,25567,10,25967, 26015,168,26483,8247016000634812845,26017,117,110,105,120,58,99,104,100,105,114,0,2049,4611,115,45, 0,1,26017,3,1,13,2049,25567,10,25998,26046,168,26483,-4549633084540895924,26048,117,110,105,120,58, 103,101,116,101,110,118,0,2049,4611,115,97,45,0,1,26048,3,1,14,2049,25567, 10,26028,26078,168,26483,-4549633084169702651,26080,117,110,105,120,58,112,117,116,101,110,118,0,2049, 4611,115,45,0,1,26080,3,1,15,2049,25567,10,26060,26108,168,26483,8247016000653932284,26110,117,110, 105,120,58,115,108,101,101,112,0,2049,4611,110,45,0,1,26110,3,1,16,2049, 25567,10,26091,26140,168,26483,-2563939202030369066,26142,117,110,105,120,58,101,120,101,99,117,116,101, 0,2049,4611,115,45,0,1,26142,3,1,17,2049,25567,10,26121,26169,168,26483,249909575777281169,26171, 117,110,105,120,58,112,105,112,101,0,2049,4611,115,45,115,0,1,26171,3,1, 0,2049,25952,1,25317,1,25985,2049,2294,10,26153,26208,168,26483,-2563939200175176882,26210,117,110,105,120, 58,103,101,116,45,99,119,100,0,2049,4611,45,115,41,0,1,26210,3,2049,4611, 112,119,100,0,1,26219,2049,26169,2049,7329,2049,4611,47,0,1,26231,2049,4887,10,26189, 26268,168,26483,-2316844556017942917,26270,117,110,105,120,58,99,111,117,110,116,45,102,105,108,101, 115,45,105,110,45,99,119,100,0,2049,4611,45,110,0,1,26270,3,2049,4611,108, 115,32,45,49,32,124,32,119,99,32,45,108,0,1,26278,2049,26169,2049,7329,2049, 271,10,26238,26326,168,26483,-4594486429310984907,26328,117,110,105,120,58,102,111,114,45,101,97,99, 104,45,102,105,108,101,0,2049,4611,113,45,0,1,26328,3,2049,4611,108,115,32, 45,49,32,45,112,0,1,26336,1,0,2049,25952,2049,26268,1793,26369,1793,26364,2049,25317, 2049,4558,67502597,8,10,1,26357,2049,2279,10,1,26355,2049,2497,2049,25985,3,10,26301,26389, 168,0,210728208851,0,115,116,97,114,116,0,4,2049,4301,1,0,2049,25952,10,26377,26408, 168,0,6385651009,0,114,101,97,100,0,2,2049,24681,2,2049,4197,2049,2781,10,26397,26430, 168,0,6953509544294,0,102,105,110,105,115,104,0,2049,25985,2049,4278,10,26301,26457,168,26483, 1204178398703148788,26459,117,110,105,120,58,115,108,117,114,112,45,112,105,112,101,0,2049,4611, 97,115,45,110,0,1,26459,3,1793,26478,2049,26389,1,26408,2049,2443,2049,26430,10,1, 26469,2049,4328,10,105,110,116,101,114,102,97,99,101,47,117,110,105,120,46,114, 101,116,114,111,0,26483,26603,26435,26521,168,26583,7572652289159374,26523,110,58,114,97,110,100,111, 109,0,2049,4611,45,110,0,1,26523,3,1,10,2049,11209,2,2049,2822,1793,26576,3, 2049,4611,69,114,114,111,114,58,32,82,78,71,32,100,101,118,105,99,101,32, 110,111,116,32,102,111,117,110,100,0,1,26541,2049,11320,2049,11274,10,1,26538,2049, 2928,2049,11189,10,105,110,116,101,114,102,97,99,101,47,114,110,103,46,114,101, 116,114,111,0,26583,27140,26506,26627,168,27118,4482520117059041020,26629,99,108,111,99,107,58,111,112, 101,114,97,116,105,111,110,0,2049,4611,110,45,0,1,26629,3,1,5,2049,11209, 2,2049,2822,1793,26684,3,2049,4611,69,114,114,111,114,58,32,99,108,111,99,107, 32,100,101,118,105,99,101,32,110,111,116,32,102,111,117,110,100,0,1,26647, 2049,11320,2049,11274,10,1,26644,2049,2928,2049,11189,10,26605,26713,168,27118,4482526860617352831,26715,99,108, 111,99,107,58,116,105,109,101,115,116,97,109,112,0,2049,4611,45,110,0,1, 26715,3,1,0,2049,26627,10,26691,26742,168,27118,249884182168395049,26744,99,108,111,99,107,58,100, 97,121,0,2049,4611,45,110,0,1,26744,3,1,1,2049,26627,10,26726,26773,168,27118, -4577286724249897519,26775,99,108,111,99,107,58,109,111,110,116,104,0,2049,4611,45,110,0,1, 26775,3,1,2,2049,26627,10,26755,26803,168,27118,8246178011557794972,26805,99,108,111,99,107,58,121, 101,97,114,0,2049,4611,45,110,0,1,26805,3,1,3,2049,26627,10,26786,26833,168, 27118,8246178011557195593,26835,99,108,111,99,107,58,104,111,117,114,0,2049,4611,45,110,0,1, 26835,3,1,4,2049,26627,10,26816,26865,168,27118,-3476509310577319139,26867,99,108,111,99,107,58,109, 105,110,117,116,101,0,2049,4611,45,110,0,1,26867,3,1,5,2049,26627,10,26846, 26897,168,27118,-3476509310347652505,26899,99,108,111,99,107,58,115,101,99,111,110,100,0,2049,4611, 45,110,0,1,26899,3,1,6,2049,26627,10,26878,26930,168,27118,-4044342796047171665,26932,99,108,111, 99,107,58,117,116,99,58,100,97,121,0,2049,4611,45,110,0,1,26932,3,1, 7,2049,26627,10,26910,26965,168,27118,4482528721224061399,26967,99,108,111,99,107,58,117,116,99,58, 109,111,110,116,104,0,2049,4611,45,110,0,1,26967,3,1,8,2049,26627,10,26943, 26999,168,27118,-4336103753589045278,27001,99,108,111,99,107,58,117,116,99,58,121,101,97,114,0, 2049,4611,45,110,0,1,27001,3,1,9,2049,26627,10,26978,27033,168,27118,-4336103753589644657,27035,99, 108,111,99,107,58,117,116,99,58,104,111,117,114,0,2049,4611,45,110,0,1, 27035,3,1,10,2049,26627,10,27012,27069,168,27118,349495210710499299,27071,99,108,111,99,107,58,117, 116,99,58,109,105,110,117,116,101,0,2049,4611,45,110,0,1,27071,3,1,11, 2049,26627,10,27046,27105,168,27118,349495210940165933,27107,99,108,111,99,107,58,117,116,99,58,115, 101,99,111,110,100,0,2049,4611,45,110,0,1,27107,3,1,12,2049,26627,10,105, 110,116,101,114,102,97,99,101,47,99,108,111,99,107,46,114,101,116,114,111, 0,27118,27631,27082,27165,168,0,1976442044545254821,0,115,99,114,105,112,116,58,111,112,101,114, 97,116,105,111,110,0,1,9,2049,11209,2,2049,2822,1793,27218,3,2049,4611,69,114, 114,111,114,58,32,115,99,114,105,112,116,105,110,103,32,100,101,118,105,99, 101,32,110,111,116,32,102,111,117,110,100,0,1,27177,2049,11320,2049,11274,10,1, 27174,2049,2928,2049,11189,10,27082,27248,168,27605,1976422442775525130,27250,115,99,114,105,112,116,58,97, 114,103,117,109,101,110,116,115,0,2049,4611,45,110,0,1,27250,3,1,0,2049, 27165,10,27225,27287,168,27605,7012485947518414468,27289,115,99,114,105,112,116,58,103,101,116,45,97, 114,103,117,109,101,110,116,0,2049,4611,110,45,115,0,1,27289,3,2049,4589,4, 1,1,2049,27165,10,27261,27318,168,27605,229469872107401,27320,105,110,99,108,117,100,101,0,2049, 4611,115,45,0,1,27320,3,1,2,2049,27165,10,27304,27349,168,27605,-4553194680242110987,27351,115,99, 114,105,112,116,58,110,97,109,101,0,2049,4611,45,115,0,1,27351,3,2049,4589, 1,3,2049,27165,10,27331,27390,168,27605,6834827170184619652,27392,115,99,114,105,112,116,58,99,117, 114,114,101,110,116,45,102,105,108,101,0,2049,4611,45,115,0,1,27392,3,2049, 4589,1,4,2049,27165,10,27364,27431,180,27605,6834827170184835340,27433,115,99,114,105,112,116,58,99, 117,114,114,101,110,116,45,108,105,110,101,0,2049,4611,45,110,0,1,27433,3, 1,5,2049,27165,2049,156,10,27405,27473,168,27605,-4964876483161304491,27475,115,99,114,105,112,116,58, 105,103,110,111,114,101,45,116,111,45,101,111,108,0,2049,4611,45,0,1,27475, 3,1,6,2049,27165,10,27446,27512,168,27605,-112287744780050755,27514,115,99,114,105,112,116,58,97, 98,111,114,116,45,105,110,99,108,117,100,101,0,2049,4611,45,0,1,27514,3, 1,7,2049,27165,10,27485,27536,168,27605,210706230653,27538,97,98,111,114,116,0,2049,4611,45, 0,1,27538,3,1,149,2049,3991,1,8,2049,27165,10,27524,27583,168,27605,-7741142524340576066,27585,115, 99,114,105,112,116,58,99,117,114,114,101,110,116,45,108,105,110,101,45,116, 101,120,116,0,2049,4611,45,115,0,1,27585,3,2049,4589,1793,27600,1,9,2049,27165, 10,1,27595,2049,2279,10,105,110,116,101,114,102,97,99,101,47,115,99,114,105, 112,116,105,110,103,46,114,101,116,114,111,0,27605,28204,27552,27656,168,28206,1183117598919957017,27658, 115,111,99,107,101,116,58,111,112,101,114,97,116,105,111,110,0,2049,4611,110, 45,0,1,27658,3,1,7,2049,11209,2,2049,2822,1793,27821,3,2049,4611,69,114,114, 111,114,58,32,115,111,99,107,101,116,32,100,101,118,105,99,101,32,110,111, 116,32,102,111,117,110,100,0,1,27676,2049,11320,2049,11274,2049,4611,83,101,101,32, 104,116,116,112,115,58,47,47,114,101,116,114,111,102,111,114,116,104,46,111, 114,103,47,115,117,112,112,111,114,116,47,50,48,50,50,46,49,47,83,79, 67,75,69,84,83,46,109,100,0,1,27715,2049,11320,2049,11274,2049,4611,102,111,114, 32,105,110,115,116,114,117,99,116,105,111,110,115,32,111,110,32,101,110,97, 98,108,105,110,103,32,115,111,99,107,101,116,115,46,0,1,27776,2049,11320,2049, 11274,10,1,27673,2049,2928,2049,11189,10,27633,27855,168,28180,-7671511728383126910,27857,115,111,99,107,101, 116,58,103,101,116,104,111,115,116,98,121,110,97,109,101,0,2049,4611,97,115, 45,0,1,27857,3,1,0,2049,27656,10,27828,27889,168,28180,4328757989659661596,27891,115,111,99,107, 101,116,58,99,114,101,97,116,101,0,2049,4611,45,110,0,1,27891,3,1,1, 2049,27656,10,27869,27920,168,28180,-4552658767528245371,27922,115,111,99,107,101,116,58,98,105,110,100, 0,2049,4611,115,110,45,110,0,1,27922,3,1,2,2049,27656,10,27902,27955,168,28180, 4328757990001730167,27957,115,111,99,107,101,116,58,108,105,115,116,101,110,0,2049,4611,110,110, 45,110,110,0,1,27957,3,1,3,2049,27656,10,27935,27991,168,28180,4328757989563534360,27993,115,111, 99,107,101,116,58,97,99,99,101,112,116,0,2049,4611,110,45,110,110,0,1, 27993,3,1,4,2049,27656,10,27971,28027,168,28180,-4724938931013862254,28029,115,111,99,107,101,116,58, 99,111,110,110,101,99,116,0,2049,4611,110,45,110,110,0,1,28029,3,1,5, 2049,27656,10,28006,28060,168,28180,-4552658767527638798,28062,115,111,99,107,101,116,58,115,101,110,100, 0,2049,4611,115,110,45,110,110,0,1,28062,3,1,6,2049,27656,10,28042,28094,168, 28180,-4552658767527675080,28096,115,111,99,107,101,116,58,114,101,99,118,0,2049,4611,97,110,110, 45,110,110,0,1,28096,3,1,7,2049,27656,10,28076,28130,168,28180,-2663786738754388898,28132,115,111, 99,107,101,116,58,99,108,111,115,101,0,2049,4611,110,45,0,1,28132,3,1, 8,2049,27656,10,28111,28166,168,28180,1183100690560715498,28168,115,111,99,107,101,116,58,99,111,110, 102,105,103,117,114,101,0,2049,4611,115,115,45,0,1,28168,3,1,9,2049,27656, 10,105,110,116,101,114,102,97,99,101,47,115,111,99,107,101,116,115,46,114, 101,116,114,111,0,28180,28223,115,111,99,107,101,116,58,111,112,101,114,97,116, 105,111,110,0,28206,28507,28143,28239,168,28481,229469862290528,28241,105,111,58,99,111,114,101,0, 2049,4611,110,45,0,1,28241,3,1,8000,2049,11209,2049,11189,10,28225,28270,168,28481,249884313919988732, 28272,99,111,114,101,58,105,110,105,116,0,2049,4611,110,45,0,1,28272,3,1, 0,2049,28239,10,28254,28300,168,28481,8246182359371694326,28302,99,111,114,101,58,115,116,97,114,116, 0,2049,4611,97,110,45,0,1,28302,3,1,1,2049,28239,10,28283,28331,168,28481,8246182359367475558, 28333,99,111,114,101,58,112,97,117,115,101,0,2049,4611,110,45,0,1,28333,3, 1,2,2049,28239,10,28314,28369,168,28481,8337299194488917014,28371,99,111,114,101,58,112,97,117,115, 101,45,99,117,114,114,101,110,116,0,2049,4611,45,0,1,28371,3,1,3,2049, 28239,10,28344,28399,168,28481,-4577143246433635687,28401,99,111,114,101,58,114,101,115,117,109,101,0, 2049,4611,110,45,0,1,28401,3,1,4,2049,28239,10,28381,28432,168,28481,-3888095465377135055,28434,99, 111,114,101,58,114,101,97,100,47,114,101,103,0,2049,4611,110,45,118,0,1, 28434,3,1,5,2049,28239,10,28412,28467,168,28481,820065755623810592,28469,99,111,114,101,58,119,114, 105,116,101,47,114,101,103,0,2049,4611,118,110,45,0,1,28469,3,1,6,2049, 28239,10,105,110,116,101,114,102,97,99,101,47,109,117,108,116,105,99,111,114, 101,46,114,101,116,114,111,0,28481,28704,28446,28529,168,28684,644988671245709381,28531,102,102,105,58, 111,112,101,114,97,116,105,111,110,0,2049,4611,110,45,63,0,1,28531,3,1, 8100,2049,11209,2,2049,2822,1793,28585,3,2049,4611,69,114,114,111,114,58,32,70,70, 73,32,100,101,118,105,99,101,32,110,111,116,32,102,111,117,110,100,0,1, 28550,2049,11320,2049,11274,10,1,28547,2049,2928,2049,11189,10,28509,28607,168,28684,7572367767785414,28609,102, 102,105,58,111,112,101,110,0,2049,4611,115,45,110,0,1,28609,3,1,0,2049, 28529,10,28592,28639,168,28684,-4572980637897979592,28641,102,102,105,58,109,97,112,45,115,121,109,0, 2049,4611,115,110,45,110,0,1,28641,3,1,1,2049,28529,10,28621,28671,168,28684,8246308498881747296, 28673,102,102,105,58,105,110,118,111,107,101,0,2049,4611,110,45,0,1,28673,3, 1,2,2049,28529,10,105,110,116,101,114,102,97,99,101,47,102,102,105,46,114, 101,116,114,111,0,28684,29161,28654,28723,168,29136,8247016409221251463,28725,117,110,115,105,103,110,101, 100,58,43,0,2049,4611,110,110,45,110,0,1,28725,3,1,0,1,8101,2049,11209, 2049,11189,17,10,28706,28760,168,29136,8247016409221251465,28762,117,110,115,105,103,110,101,100,58,45, 0,2049,4611,110,110,45,110,0,1,28762,3,1,0,1,8101,2049,11209,2049,11189,18, 10,28743,28797,168,29136,8247016409221251462,28799,117,110,115,105,103,110,101,100,58,42,0,2049,4611, 110,110,45,110,0,1,28799,3,1,0,1,8101,2049,11209,2049,11189,19,10,28780,28837, 168,29136,7638409966457829387,28839,117,110,115,105,103,110,101,100,58,47,109,111,100,0,2049,4611, 110,110,45,110,110,0,1,28839,3,1,0,1,8101,2049,11209,2049,11189,20,10,28817, 28877,168,29136,-2563494254608726831,28879,117,110,115,105,103,110,101,100,58,101,113,63,0,2049,4611, 110,110,45,102,0,1,28879,3,1,0,1,8101,2049,11209,2049,11189,11,10,28858,28917, 168,29136,7638409966457748830,28919,117,110,115,105,103,110,101,100,58,45,101,113,63,0,2049,4611, 110,110,45,102,0,1,28919,3,1,0,1,8101,2049,11209,2049,11189,12,10,28897,28956, 168,29136,-2563494254608719109,28958,117,110,115,105,103,110,101,100,58,108,116,63,0,2049,4611,110, 110,45,102,0,1,28958,3,1,0,1,8101,2049,11209,2049,11189,13,10,28937,28995,168, 29136,-2563494254608724554,28997,117,110,115,105,103,110,101,100,58,103,116,63,0,2049,4611,110,110, 45,102,0,1,28997,3,1,0,1,8101,2049,11209,2049,11189,14,10,28976,29036,168,29136, -6186888138744896262,29038,117,110,115,105,103,110,101,100,58,115,104,105,102,116,0,2049,4611,110, 110,45,110,0,1,29038,3,1,0,1,8101,2049,11209,2049,11189,24,10,29015,29077,168, 29136,-6186888138833512267,29079,117,110,115,105,103,110,101,100,58,42,47,109,111,100,0,2049,4611, 110,110,110,45,110,110,0,1,29079,3,1,1,1,0,1,8101,2049,11209,2,2049, 11189,2049,11189,10,29056,29115,168,29136,210639169918,29117,42,47,109,111,100,0,2049,4611,110,110, 110,45,110,110,0,1,29117,3,1,1,1,8101,2049,11209,2049,11189,10,105,110,116, 101,114,102,97,99,101,47,117,110,115,105,103,110,101,100,46,114,101,116,114, 111,0,29136,29303,29103,29182,168,29280,-3502245454587251943,29184,100,58,117,115,101,45,104,97,115,104, 101,115,0,2049,4611,45,0,1,29184,3,1,29,1,241,1,5,18,16,1793,29203, 2049,188,15,10,1,29199,1,241,1,8,18,16,1,2049,1,241,16,1,5044,1, 241,2049,3204,16,10,29163,29244,168,29280,-4893635544173424761,29246,100,58,117,115,101,45,115,116,114, 105,110,103,115,0,2049,4611,45,0,1,29246,3,1,118,1,241,1,5,18,16, 1,192,1,241,1,8,18,16,1,0,1,241,16,1,0,1,241,2049,3204,16, 10,105,110,116,101,114,102,97,99,101,47,102,117,116,117,114,101,46,114,101, 116,114,111,0,29280,29451,29224,29324,168,0,-3527051417241377258,0,98,108,111,99,107,58,105,110, 118,111,107,101,0,1,3,2049,11209,2049,11189,10,29224,29348,168,29428,8246131600073141446,29350,98,108, 111,99,107,58,114,101,97,100,0,2049,4611,110,97,45,0,1,29350,3,1,0, 2049,29324,10,29331,29380,168,29428,-4578818303223200395,29382,98,108,111,99,107,58,119,114,105,116,101, 0,2049,4611,110,97,45,0,1,29382,3,1,1,2049,29324,10,29362,29415,168,29428,-4036225629868593021, 29417,98,108,111,99,107,58,115,101,116,45,102,105,108,101,0,2049,4611,115,45, 0,1,29417,3,1,2,2049,29324,10,105,110,116,101,114,102,97,99,101,47,98, 108,111,99,107,115,46,114,101,116,114,111,0,29428,30472,29394,29475,168,29732,4283726481136624767,29477, 101,114,114,58,115,101,116,45,104,97,110,100,108,101,114,0,2049,4611,110,110, 45,0,1,29477,3,1,1234,2049,11209,2,2049,2822,1793,29542,3,2049,4611,69,114,114, 111,114,58,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,32,100, 101,118,105,99,101,32,110,111,116,32,102,111,117,110,100,0,1,29496,2049,11320, 2049,11274,10,1,29493,2049,2928,1,0,4,2049,11189,10,29453,29566,168,29732,229464878751060,29568,101, 114,114,58,100,115,117,0,2049,4611,45,0,1,29568,3,2049,11375,2049,11274,2049,4611, 69,82,82,79,82,58,32,68,83,85,58,32,68,65,84,65,32,83,84,65, 67,75,32,85,78,68,69,82,70,76,79,87,0,1,29579,2049,11320,2049,11274,2049, 11496,10,29552,29635,168,29732,229464878751054,29637,101,114,114,58,100,115,111,0,2049,4611,45,0, 1,29637,3,2049,11375,2049,11274,2049,4611,69,82,82,79,82,58,32,68,83,79,58, 32,68,65,84,65,32,83,84,65,67,75,32,79,86,69,82,70,76,79,87, 0,1,29648,2049,11320,2049,11274,2049,11496,10,29621,29712,168,29732,-6210978877792005319,29714,101,114,114,58, 115,101,116,45,100,101,102,97,117,108,116,115,0,2049,4611,45,0,1,29714,3, 1,29566,1,1,2049,29475,1,29635,1,2,2049,29475,10,105,110,116,101,114,102,97, 99,101,47,101,114,114,111,114,46,114,101,116,114,111,0,29689,29776,168,0,-1159954141530329845, 29778,105,111,99,116,108,58,111,112,101,114,97,116,105,111,110,0,2049,4611,110, 45,0,1,29778,3,1,14,2049,11209,2,2049,2822,1793,29833,3,2049,4611,69,114,114, 111,114,58,32,105,111,99,116,108,32,100,101,118,105,99,101,32,110,111,116, 32,102,111,117,110,100,0,1,29796,2049,11320,2049,11274,10,1,29793,2049,2928,2049,11189, 10,29754,29862,168,0,-1159947561758408230,29864,105,111,99,116,108,58,116,101,114,109,45,115,105, 122,101,0,2049,4611,45,110,110,0,1,29864,3,1,0,2049,29776,10,29840,29899,168, 0,-1384827797416383269,29901,105,111,99,116,108,58,115,101,116,45,99,98,114,101,97,107,0, 2049,4611,45,0,1,29901,3,1,1,2049,29776,10,29876,29934,168,0,-1384827797064164732,29936,105,111, 99,116,108,58,115,101,116,45,108,98,114,101,97,107,0,2049,4611,45,0,1, 29936,3,1,2,2049,29776,10,29911,29969,168,0,-1384833267584846441,29971,105,111,99,116,108,58,115, 97,118,101,45,115,116,97,116,101,0,2049,4611,45,0,1,29971,3,1,3,2049, 29776,10,29946,30007,168,0,1092846777098631660,30009,105,111,99,116,108,58,114,101,115,116,111,114, 101,45,115,116,97,116,101,0,2049,4611,45,0,1,30009,3,1,4,2049,29776,10, 1793,30040,1,194,1,2,17,8,2049,1579,2049,192,3841,12097,8,2049,1579,2049,188,16, 10,1,30021,29981,30053,168,30448,6384117006,30055,72,79,77,69,0,2049,4611,45,115,0,1, 30055,3,2049,2001,1,4096,17,10,37,115,47,46,99,111,110,102,105,103,47,114, 101,116,114,111,102,111,114,116,104,47,108,105,98,114,97,114,121,47,37,115, 46,114,101,116,114,111,0,30042,30067,156,30448,6061648467740287960,30130,108,105,98,114,97,114,121, 58,46,67,79,78,70,73,71,0,45,115,0,46,47,108,105,98,114,97,114, 121,47,37,115,46,114,101,116,114,111,0,30106,30131,156,30448,-4563659402581934926,30170,108,105,98, 114,97,114,121,58,67,87,68,0,45,115,0,30150,30189,168,30448,-4563659402581898990,30191,108,105, 98,114,97,114,121,58,99,119,100,0,2049,4611,115,45,115,0,1,30191,3,1, 30131,2049,8580,10,30171,30225,168,30448,6061648469031755928,30227,108,105,98,114,97,114,121,58,46,99, 111,110,102,105,103,0,2049,4611,45,115,0,1,30227,3,2049,4611,72,79,77,69, 0,1,30235,2049,30053,2049,26046,2049,30053,1,30067,2049,8580,10,30203,30276,168,30448,-2879782938503308011,30278, 108,105,98,114,97,114,121,58,102,105,108,101,110,97,109,101,0,2049,4611,115, 45,115,0,1,30278,3,2,2049,30189,2,2049,25037,1,2205,2049,2928,3,2049,30225,2, 2049,25037,1793,30304,10,1,30303,2049,2928,3,2049,4589,10,30253,30336,168,30448,-2799120562421764174,30338,108, 105,98,114,97,114,121,58,99,111,110,116,97,105,110,115,63,0,2049,4611,115, 45,102,0,1,30338,3,1,30189,1,30225,2049,2294,1,25037,2049,2326,22,10,30312,30376, 168,30448,-3026807695525939020,30378,108,105,98,114,97,114,121,58,108,111,97,100,0,2049,4611,115, 45,0,1,30378,3,2,2049,30336,1793,30394,2049,30276,2049,27318,10,1,30389,1793,30443,2049, 4611,69,82,82,79,82,58,32,76,105,98,114,97,114,121,32,96,37,115,96, 32,119,97,115,32,110,111,116,32,102,111,117,110,100,0,1,30400,2049,8580,2049, 11320,2049,11274,10,1,30398,2049,66,10,105,110,116,101,114,102,97,99,101,47,108, 105,98,114,97,114,121,46,114,101,116,114,111,0,30448,12283,30357,30491,168,30783,8246457295145463473, 30493,105,109,97,103,101,58,115,97,118,101,0,2049,4611,115,45,0,1,30493,3, 1,1000,2049,11209,2049,11189,10,30474,30518,168,0,210711039690,0,101,100,105,116,63,0,2, 1793,30525,1,8,11,10,1,30521,1793,30533,1,127,11,10,1,30529,2049,2294,22,10, 30506,30552,168,0,6953475974244,0,101,110,100,101,100,63,0,2049,4278,3841,4387,2049,2731,10, 30539,30569,168,0,193486030,0,97,100,100,0,2049,30552,1,17,1,4197,2049,66,10,30559, 30591,168,0,6953539406400,0,103,97,116,104,101,114,0,2049,30518,1,17,1,30569,2049,66, 10,30578,30612,168,0,210709415765,0,99,121,99,108,101,0,2049,11477,2049,2253,4,8,2049, 2698,25,3,2049,30591,1,30612,7,10,30474,30646,168,30783,-4557881830897049127,30648,112,97,114,115,101, 45,117,110,116,105,108,0,2049,4611,113,45,115,0,1,30648,3,1793,30667,2049,4589, 2049,4301,2049,30612,771,2049,4157,10,1,30657,2049,4328,10,30628,30684,168,30783,210726130610,30686,115, 58,103,101,116,0,2049,4611,45,115,0,1,30686,3,1793,30714,1793,30700,1,13,11, 10,1,30696,1793,30708,1,10,11,10,1,30704,2049,2294,22,10,1,30694,2049,30646,10, 30672,30731,168,30783,210708950412,30733,99,108,101,97,114,0,2049,4611,45,0,1,30733,3,2049, 4611,92,94,91,50,74,92,94,91,48,59,48,72,0,1,30740,2049,8580,2049,11320, 10,30719,30769,180,30783,5861507,30771,47,47,0,2049,4611,45,0,1,30771,3,2049,27473,1, 11513,2049,3975,10,105,110,116,101,114,102,97,99,101,47,114,101,116,114,111,45, 117,110,105,120,46,114,101,116,114,111,0,30760,30824,156,0,229441520490121,0,83,111,117, 114,99,101,115,0,3,31076,31297,31574,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,30810,30965,168,0,6953711201841,0,107, 110,111,119,110,63,0,2,1,30824,2049,9446,10,30952,30983,168,0,210716136861,0,105,110, 100,101,120,0,1,30824,4,2049,10110,1,30824,4,2049,9596,10,30971,31007,168,0,6953974036516, 0,114,101,99,111,114,100,0,2049,4640,2,1,30824,2049,3920,3841,30824,1,30824,17, 16,10,1793,31074,2049,27390,2049,30965,1793,31032,2049,30983,10,1,31029,1793,31039,2049,31007,10, 1,31036,2049,66,1793,31052,1,194,1,2,17,8,10,1,31045,2049,2266,2049,1579,2049, 186,16,2049,1579,2049,192,3841,12097,8,2049,1579,2049,188,16,10,1,31023,100,105,99, 116,45,119,111,114,100,115,45,108,105,115,116,105,110,103,46,102,111,114,116, 104,0,30760,31115,168,31076,229461403550098,31117,100,58,119,111,114,100,115,0,2049,4611,45,0, 1,31117,3,1793,31131,2049,192,2049,11320,2049,11288,10,1,31124,2049,8833,10,31101,31155,168, 31076,-3502157631813457253,31157,100,58,119,111,114,100,115,45,119,105,116,104,0,2049,4611,115,45, 0,1,31157,3,2049,2001,2049,5780,1793,31194,2049,192,2,2049,2001,2049,5472,1793,31183,2049, 11320,2049,11288,10,1,31178,1793,31189,3,10,1,31187,2049,66,10,1,31169,2049,8833,10, 31136,31221,168,31076,2818131571306626127,0,100,105,115,112,108,97,121,45,105,102,45,108,101,102, 116,0,2,2049,2001,2049,5724,1793,31233,2049,11320,2049,11288,10,1,31228,1793,31239,3,10, 1,31237,2049,66,10,31136,31273,168,31076,2947807019553410009,31275,100,58,119,111,114,100,115,45,98, 101,103,105,110,110,105,110,103,45,119,105,116,104,0,2049,4611,115,45,0,1, 31275,3,2049,2001,2049,5780,1793,31292,2049,192,2049,31221,10,1,31287,2049,8833,10,101,120, 116,101,110,115,105,111,110,115,47,100,111,117,98,108,101,46,114,101,116,114, 111,0,31244,31338,168,31297,8246228896775126019,31340,100,111,117,98,108,101,58,118,97,114,0,2049, 4611,110,110,115,45,0,1,31340,3,2049,2102,4,2049,130,2049,130,10,31321,31375,168, 31297,-3421095308458227740,31377,100,111,117,98,108,101,58,102,101,116,99,104,0,2049,4611,97,45, 110,110,0,1,31377,3,2049,58,4,15,10,31356,31409,168,31297,-3421095308442276665,31411,100,111,117, 98,108,101,58,115,116,111,114,101,0,2049,4611,110,110,97,45,0,1,31411,3, 1,19,2049,2266,2049,61,16,10,31390,31446,168,31297,-3421095308461432127,31448,100,111,117,98,108,101, 58,99,111,110,115,116,0,2049,4611,110,110,115,45,0,1,31448,3,2049,31338,1, 31375,2049,8801,10,31427,31481,168,31297,-4575607512064199915,31483,100,111,117,98,108,101,58,115,119,97, 112,0,2049,4611,110,110,109,109,45,109,109,110,110,0,1,31483,3,67503109,5,67503109, 6,10,31463,31518,168,31297,8246228896775106679,31520,100,111,117,98,108,101,58,100,105,112,0,2049, 4611,109,110,113,45,109,110,0,1,31520,3,67503109,67503109,5,5,8,6,6,10,31501, 31555,168,31297,8246228896775123014,31557,100,111,117,98,108,101,58,115,105,112,0,2049,4611,109,110, 113,45,109,110,0,1,31557,3,1,2253,2049,2266,2049,31518,10,101,120,116,101,110, 115,105,111,110,115,47,109,97,108,108,111,99,46,114,101,116,114,111,0,31538, 31615,168,31574,8246632143337714634,0,109,101,109,58,105,110,118,111,107,101,0,1,15,2049,11209, 2049,11189,10,31598,0,156,31574,210667451248,0,65,76,76,79,67,0,31622,1,156,31574,6384048135, 0,70,82,69,69,0,31634,2,156,31574,210689088690,0,83,84,79,82,69,0,31645,3, 156,31574,210673137615,0,70,69,84,67,72,0,31657,4,156,31574,6952683137271,0,82,69,83,73, 90,69,0,31538,31698,168,31574,249897943727936361,31700,109,101,109,58,97,108,108,111,99,0,2049, 4611,110,45,45,97,0,1,31700,3,1,0,2049,31615,10,31682,31729,168,31574,249897943749573803,31731, 109,101,109,58,115,116,111,114,101,0,2049,4611,97,110,45,45,0,1,31731,3, 1,2,2049,31615,10,31713,31760,168,31574,249897943733622728,31762,109,101,109,58,102,101,116,99,104, 0,2049,4611,97,45,45,110,0,1,31762,3,1,3,2049,31615,10,31744,31790,168,31574, 7572664961638592,31792,109,101,109,58,102,114,101,101,0,2049,4611,97,45,45,0,1,31792,3, 1,1,2049,31615,10,31775,31821,168,31574,8246632143679146032,31823,109,101,109,58,114,101,115,105,122, 101,0,2049,4611,97,110,45,45,0,1,31823,3,1,4,2049,31615,10,31804,31852,168, 31574,249897943730056489,31854,109,101,109,58,99,101,108,108,43,0,2049,4611,110,110,45,110,0, 1,31854,3,1,8,19,17,10,31836,31890,168,31574,1050530996183190288,31892,109,101,109,58,102,101, 116,99,104,45,100,111,117,98,108,101,0,2049,4611,110,45,110,110,0,1,31892, 3,2,1,1,2049,31852,15,5,2049,31760,6,10,31867,31934,168,31574,1730340976492540563,31936,109,101, 109,58,115,116,111,114,101,45,100,111,117,98,108,101,0,2049,4611,97,110,110, 45,110,110,0,1,31936,3,5,5,2049,2253,1,1,2049,31852,6,2049,31729,6,2049, 31729,10,0 }; typedef struct NgaState NgaState; typedef void (*Handler)(NgaState *); struct NgaCore { CELL sp, rp, ip; /* Stack & instruction pointers */ CELL active; /* Is core active? */ CELL u; /* Should next operation be */ /* unsigned? */ CELL data[STACK_DEPTH]; /* The data stack */ CELL address[ADDRESSES]; /* The address stack */ #ifdef ENABLE_MULTICORE CELL registers[24]; /* Internal Registers */ #endif }; struct NgaState { /* System Memory */ CELL memory[IMAGE_SIZE + 1]; /* CPU Cores */ struct NgaCore cpu[CORES]; int active; /* I/O Devices */ int devices; Handler IO_deviceHandlers[MAX_DEVICES]; Handler IO_queryHandlers[MAX_DEVICES]; CELL Dictionary, interpret; /* Interfacing */ char string_data[8192]; #ifdef ENABLE_FLOATS double Floats[256], AFloats[256]; /* Floating Point */ CELL fsp, afsp; #endif #ifdef ENABLE_BLOCKS char BlockFile[1025]; #endif #ifdef ENABLE_ERROR CELL ErrorHandlers[64]; #endif /* Scripting */ char **sys_argv; int sys_argc; char scripting_sources[64][8192]; char line[4096]; int current_source; int perform_abort; int interactive; CELL currentLine; CELL ignoreToEOL, ignoreToEOF; /* Configuration of code & test fences for Unu */ char code_start[256], code_end[256]; char test_start[256], test_end[256]; int codeBlocks; FILE *OpenFileHandles[MAX_OPEN_FILES]; }; #define V void #define IO(name) void io_name(NgaState *); void query_name(NgaState *); /* Function Prototypes ----------------------------------------------- */ V handle_error(NgaState *, CELL); CELL stack_pop(NgaState *); V stack_push(NgaState *, CELL); CELL string_inject(NgaState *, char *, CELL); char *string_extract(NgaState *, CELL); V update_rx(NgaState *); V include_file(NgaState *, char *, int); V include_plain_file(NgaState *, char *, int); V register_device(NgaState *, V *, V *); IO(output) IO(keyboard) IO(filesystem) IO(scripting) IO(rng) IO(unsigned) #ifdef ENABLE_UNIX IO(unix) #endif #ifdef ENABLE_FLOATS IO(floatingpoint) #endif #ifdef ENABLE_SOCKETS IO(socket) #endif #ifdef ENABLE_MALLOC #ifdef BIT64 IO(malloc) #endif #endif #ifdef ENABLE_BLOCKS IO(blocks) #endif #ifdef ENABLE_IOCTL IO(ioctl) #endif IO(image) V load_embedded_image(NgaState *); CELL load_image(NgaState *, char *); V prepare_vm(NgaState *); V process_opcode_bundle(NgaState *, CELL); #ifndef BRANCH_PREDICTION V validate_opcode_bundle(NgaState *, CELL); #endif #ifdef NEEDS_STRL size_t strlcat(char *dst, const char *src, size_t dsize); size_t strlcpy(char *dst, const char *src, size_t dsize); #endif V i_no(NgaState *); V i_li(NgaState *); V i_du(NgaState *); V i_dr(NgaState *); V i_sw(NgaState *); V i_pu(NgaState *); V i_po(NgaState *); V i_ju(NgaState *); V i_ca(NgaState *); V i_cc(NgaState *); V i_re(NgaState *); V i_eq(NgaState *); V i_ne(NgaState *); V i_lt(NgaState *); V i_gt(NgaState *); V i_fe(NgaState *); V i_st(NgaState *); V i_ad(NgaState *); V i_su(NgaState *); V i_mu(NgaState *); V i_di(NgaState *); V i_an(NgaState *); V i_or(NgaState *); V i_xo(NgaState *); V i_sh(NgaState *); V i_zr(NgaState *); V i_ha(NgaState *); V i_ie(NgaState *); V i_iq(NgaState *); V i_ii(NgaState *); /* Image, Stack, and VM variables ------------------------------------ */ #define TOS ACTIVE.data[ACTIVE.sp] #define NOS ACTIVE.data[ACTIVE.sp-1] #define TORS ACTIVE.address[ACTIVE.rp] /* Global Variables -------------------------------------------------- */ int verbose; #ifndef BRANCH_PREDICTION V guard(NgaState *vm, int n, int m, int diff) { if (ACTIVE.sp < n) { #ifdef ENABLE_ERROR if (vm->ErrorHandlers[1] != 0) { handle_error(vm, 1); } #else printf("E: Data Stack Underflow"); ACTIVE.sp = 0; return; #endif } if (((ACTIVE.sp + m) - n) > (STACK_DEPTH - 1)) { #ifdef ENABLE_ERROR if (vm->ErrorHandlers[2] != 0) { handle_error(vm, 2); } #else printf("E: Data Stack Overflow"); ACTIVE.sp = 0; return; #endif } if (diff) { if (ACTIVE.rp + diff < 0) { #ifdef ENABLE_ERROR if (vm->ErrorHandlers[3] != 0) { handle_error(vm, 3); } #else return; #endif } if (ACTIVE.rp + diff > (ADDRESSES - 1)) { #ifdef ENABLE_ERROR if (vm->ErrorHandlers[1] != 4) { handle_error(vm, 4); } #else return; #endif } } } #else V guard(NgaState *vm, int n, int m, int diff) { if (unlikely(ACTIVE.sp < n)) { #ifdef ENABLE_ERROR if (vm->ErrorHandlers[1] != 0) { handle_error(vm, 1); } #else printf("E: Data Stack Underflow"); ACTIVE.sp = 0; return; #endif } if (unlikely(((ACTIVE.sp + m) - n) > (STACK_DEPTH - 1))) { #ifdef ENABLE_ERROR if (vm->ErrorHandlers[2] != 0) { handle_error(vm, 2); } #else printf("E: Data Stack Overflow"); ACTIVE.sp = 0; return; #endif } if (unlikely(ACTIVE.rp + diff < 0)) { #ifdef ENABLE_ERROR if (vm->ErrorHandlers[3] != 0) { handle_error(vm, 3); } #else return; #endif } if (unlikely(ACTIVE.rp + diff > (ADDRESSES - 1))) { #ifdef ENABLE_ERROR if (vm->ErrorHandlers[1] != 4) { handle_error(vm, 4); } #else return; #endif } } #endif #ifdef ENABLE_IOCTL /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ #ifdef ENABLE_IOCTL #include #include void ioctl_get_terminal_size(NgaState *vm) { struct winsize size; ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); stack_push(vm, size.ws_row); stack_push(vm, size.ws_col); } void ioctl_set_character_breaking_mode(NgaState *vm) { struct termios term; tcgetattr(STDIN_FILENO, &term); term.c_lflag &=(~ICANON & ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &term); } void ioctl_set_line_buffered_mode(NgaState *vm) { struct termios term; tcgetattr(STDIN_FILENO, &term); term.c_lflag |= ICANON; term.c_lflag |= ECHO; tcsetattr(STDIN_FILENO, TCSANOW, &term); } struct termios savedTermState; void ioctl_save_current_state(NgaState *vm) { tcgetattr(STDIN_FILENO, &savedTermState); } void ioctl_restore_saved_state(NgaState *vm) { tcsetattr(STDIN_FILENO, TCSANOW, &savedTermState); } Handler IOCTLActions[] = { ioctl_get_terminal_size, ioctl_set_character_breaking_mode, ioctl_set_line_buffered_mode, ioctl_save_current_state, ioctl_restore_saved_state }; V query_ioctl(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_IOCTL); } V io_ioctl(NgaState *vm) { IOCTLActions[stack_pop(vm)](vm); } #endif #endif #ifdef ENABLE_MALLOC #ifdef BIT64 /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ #ifdef ENABLE_MALLOC #ifdef BIT64 typedef union { V* val; struct { CELL msw; CELL lsw; }; } double_cell; V double_add(NgaState *vm) { double_cell a; double_cell b; double_cell c; b.msw = stack_pop(vm); b.lsw = stack_pop(vm); a.msw = stack_pop(vm); a.lsw = stack_pop(vm); } V double_sub(NgaState *vm) { } V double_mul(NgaState *vm) { } V double_divmod(NgaState *vm) { } V malloc_allocate(NgaState *vm) { stack_push(vm, (CELL)malloc(stack_pop(vm))); } V malloc_free(NgaState *vm) { free((CELL*)stack_pop(vm)); } V malloc_store(NgaState *vm) { CELL value = stack_pop(vm); double_cell addr; *(CELL *) stack_pop(vm) = value; } V malloc_fetch(NgaState *vm) { double_cell addr; CELL value = *(CELL *)stack_pop(vm); stack_push(vm, value); } V malloc_realloc(NgaState *vm) { CELL bytes = stack_pop(vm); CELL* addr1; addr1 = (CELL*)stack_pop(vm); CELL* addr2; addr2 = (CELL*)realloc(addr1, bytes); stack_push(vm, (CELL)addr2); } V query_malloc(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_MALLOC); } V io_malloc(NgaState *vm) { int i = stack_pop(vm); switch (i) { case 0: malloc_allocate(vm); return; case 1: malloc_free(vm); return; case 2: malloc_store(vm); return; case 3: malloc_fetch(vm); return; case 4: malloc_realloc(vm); return; } stack_push(vm, -1); } #endif #endif #endif #endif #ifdef ENABLE_ERROR /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ /* | 001 | Data Stack Underflow | | 002 | Data Stack Overflow | | 003 | Address Stack Underflow | | 004 | Address Stack Overflow | | 005 | Invalid Memory Access | | 006 | Division by Zero | */ #ifdef ENABLE_ERROR V execute(NgaState *vm, CELL cell); V handle_error(NgaState *vm, CELL error) { CELL saved_ip = vm->cpu[vm->active].ip; if (vm->ErrorHandlers[error] != 0) { printf("\nHandling %lld\n", (long long)error); execute(vm, vm->ErrorHandlers[error]); } vm->cpu[vm->active].ip = saved_ip; } V register_error_handler(NgaState *vm) { CELL ErrorID = stack_pop(vm); CELL ErrorHandler = stack_pop(vm); vm->ErrorHandlers[ErrorID] = ErrorHandler; printf("Assigned %lld to %lld\n", (long long)ErrorID, (long long)ErrorHandler); } V io_error(NgaState *vm) { switch (stack_pop(vm)) { case 0: register_error_handler(vm); break; default: break; } } V query_error(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_ERROR); } #endif #endif #ifdef ENABLE_BLOCKS /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ V read_block(NgaState *vm) { CELL buffer = stack_pop(vm); CELL block = stack_pop(vm); int32_t m[1024]; int fp = open(vm->BlockFile, O_RDONLY, 0666); lseek(fp, 4096 * block, SEEK_SET); read(fp, m, 4096); for (int i = 0; i < 1024; i++) { vm->memory[buffer + i] = (CELL)m[i]; } close(fp); } V write_block(NgaState *vm) { CELL buffer = stack_pop(vm); CELL block = stack_pop(vm); int32_t m[1024]; int fp = open(vm->BlockFile, O_WRONLY, 0666); lseek(fp, 4096 * block, SEEK_SET); for (int i = 0; i < 1024; i++) { m[i] = (int32_t)vm->memory[buffer + i]; } write(fp, m, 4096); close(fp); } V set_block_file(NgaState *vm) { CELL buffer = stack_pop(vm); strlcpy(vm->BlockFile, string_extract(vm, buffer), 1024); } V io_blocks(NgaState *vm) { switch (stack_pop(vm)) { case 0: read_block(vm); break; case 1: write_block(vm); break; case 2: set_block_file(vm); break; } } V query_blocks(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_BLOCKS); } #endif #ifdef ENABLE_FILES /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ V utf32_to_utf8(uint32_t, unsigned char*, int*); int fread_character(FILE *); /*--------------------------------------------------------------------- I keep an array of file handles. RETRO will use the index number as its representation of the file. ---------------------------------------------------------------------*/ /*--------------------------------------------------------------------- `files_get_handle()` returns a file handle, or 0 if there are no available handle slots in the array. ---------------------------------------------------------------------*/ CELL files_get_handle(NgaState *vm) { for(CELL i = 1; i < MAX_OPEN_FILES; i++) { if (vm->OpenFileHandles[i] == 0) { return i; } } return 0; } /*--------------------------------------------------------------------- `file_open()` opens a file. This pulls from the RETRO data stack: - mode (number, TOS) - filename (string, NOS) Modes are: | Mode | Corresponds To | Description | | ---- | -------------- | -------------------- | | 0 | rb | Open for reading | | 1 | w | Open for writing | | 2 | a | Open for append | | 3 | rb+ | Open for read/update | The file name should be a NULL terminated string. This will attempt to open the requested file and will return a handle (index number into the `OpenFileHandles` array). ---------------------------------------------------------------------*/ V file_open(NgaState *vm) { CELL slot = files_get_handle(vm); CELL mode = stack_pop(vm); CELL name = stack_pop(vm); char *modes[] = {"rb", "w", "a", "rb+"}; char *request = string_extract(vm, name); if (slot > 0) { vm->OpenFileHandles[slot] = fopen(request, modes[mode]); } if (vm->OpenFileHandles[slot] == NULL) { vm->OpenFileHandles[slot] = 0; slot = 0; } stack_push(vm, slot); // FILE *file = (slot > 0) ? fopen(request, modes[mode]) : NULL; // vm->OpenFileHandles[slot] = (file != NULL) ? file : 0; // stack_push(vm, slot); } /*--------------------------------------------------------------------- `file_read()` reads a byte from a file. This takes a file pointer from the stack and pushes the character that was read to the stack. ---------------------------------------------------------------------*/ V file_read(NgaState *vm) { CELL slot = stack_pop(vm); FILE *file = vm->OpenFileHandles[slot]; if (slot <= 0 || slot > MAX_OPEN_FILES || file == 0) { printf("\nERROR (nga/file_read): Invalid file handle\n"); exit(1); } stack_push(vm, feof(file) ? 0 : fgetc(file)); } /*-------------------------------------------------------------- `file_write()` writes a byte to a file. This takes a file pointer (TOS) and a byte (NOS) from the stack. It does not return any values on the stack. ------------------------------------------------------------*/ V file_write(NgaState *vm) { CELL slot = stack_pop(vm); FILE *file = vm->OpenFileHandles[slot]; if (slot <= 0 || slot > MAX_OPEN_FILES || file == 0) { printf("\nERROR (nga/file_write): Invalid file handle\n"); exit(1); } fputc(stack_pop(vm), file); } /*-------------------------------------------------------------- `file_close()` closes a file. This takes a file handle from the stack and does not return anything on the stack. ------------------------------------------------------------*/ V file_close(NgaState *vm) { CELL slot = stack_pop(vm); FILE *file = vm->OpenFileHandles[slot]; if (slot <= 0 || slot > MAX_OPEN_FILES || file == 0) { printf("\nERROR (nga/file_close): Invalid file handle\n"); exit(1); } fclose(file); vm->OpenFileHandles[slot] = 0; } /*-------------------------------------------------------------- `file_get_position()` provides the current index into a file. This takes the file handle from the stack and returns the offset. ------------------------------------------------------------*/ V file_get_position(NgaState *vm) { CELL slot = stack_pop(vm); if (slot <= 0 || slot > MAX_OPEN_FILES || vm->OpenFileHandles[slot] == 0) { printf("\nERROR (nga/file_get_position): Invalid file handle\n"); exit(1); } stack_push(vm, (CELL) ftell(vm->OpenFileHandles[slot])); } /*-------------------------------------------------------------- `file_set_position()` changes the current index into a file to the specified one. This takes a file handle (TOS) and new offset (NOS) from the stack. ------------------------------------------------------------*/ V file_set_position(NgaState *vm) { CELL slot, pos; slot = stack_pop(vm); pos = stack_pop(vm); if (slot <= 0 || slot > MAX_OPEN_FILES || vm->OpenFileHandles[slot] == 0) { printf("\nERROR (nga/file_set_position): Invalid file handle\n"); exit(1); } fseek(vm->OpenFileHandles[slot], pos, SEEK_SET); } /*-------------------------------------------------------------- `file_get_size()` returns the size of a file, or 0 if empty. If the file is a directory, it returns -1. It takes a file handle from the stack. ------------------------------------------------------------*/ V file_get_size(NgaState *vm) { CELL slot, current, r, size; struct stat buffer; slot = stack_pop(vm); if (slot <= 0 || slot > MAX_OPEN_FILES || vm->OpenFileHandles[slot] == 0) { printf("\nERROR (nga/file_get_size): Invalid file handle\n"); exit(1); } fstat(fileno(vm->OpenFileHandles[slot]), &buffer); if (!S_ISDIR(buffer.st_mode)) { current = ftell(vm->OpenFileHandles[slot]); r = fseek(vm->OpenFileHandles[slot], 0, SEEK_END); size = ftell(vm->OpenFileHandles[slot]); fseek(vm->OpenFileHandles[slot], current, SEEK_SET); } else { r = -1; size = 0; } stack_push(vm, (r == 0) ? size : 0); } /*-------------------------------------------------------------- `file_delete()` removes a file. This takes a file name (as a string) from the stack. ------------------------------------------------------------*/ V file_delete(NgaState *vm) { char *request; CELL name = stack_pop(vm); request = string_extract(vm, name); unlink(request); } /*-------------------------------------------------------------- `file_flush()` flushes any pending writes to disk. This takes a file handle from the stack. ------------------------------------------------------------*/ V file_flush(NgaState *vm) { CELL slot; slot = stack_pop(vm); if (slot <= 0 || slot > MAX_OPEN_FILES || vm->OpenFileHandles[slot] == 0) { printf("\nERROR (nga/file_flush): Invalid file handle\n"); exit(1); } fflush(vm->OpenFileHandles[slot]); } char file_bytes[32769]; V file_read_bytes(NgaState *vm) { CELL slot = stack_pop(vm); CELL size = stack_pop(vm); CELL dest = stack_pop(vm); CELL z = fread((char *)file_bytes, 1, size, vm->OpenFileHandles[slot]); for (CELL i = 0; i < size; i++) { CELL x = file_bytes[i]; vm->memory[dest + i] = x; } stack_push(vm, z); } V file_write_bytes(NgaState *vm) { CELL slot = stack_pop(vm); CELL size = stack_pop(vm); CELL src = stack_pop(vm); for (CELL i = 0; i < size; i++) { char x = vm->memory[src + i]; file_bytes[i] = x; } CELL z = fwrite(&file_bytes, 1, size, vm->OpenFileHandles[slot]); stack_push(vm, z); } V file_read_character(NgaState *vm) { CELL c; CELL slot = stack_pop(vm); if (slot <= 0 || slot > MAX_OPEN_FILES || vm->OpenFileHandles[slot] == 0) { printf("\nERROR (nga/file_read): Invalid file handle\n"); exit(1); } c = fread_character(vm->OpenFileHandles[slot]); stack_push(vm, feof(vm->OpenFileHandles[slot]) ? 0 : c); } V file_write_character(NgaState *vm) { unsigned char utf8_bytes[4]; int num_bytes; CELL slot, c, r; utf32_to_utf8(stack_pop(vm), utf8_bytes, &num_bytes); slot = stack_pop(vm); if (slot <= 0 || slot > MAX_OPEN_FILES || vm->OpenFileHandles[slot] == 0) { printf("\nERROR (nga/file_write): Invalid file handle\n"); exit(1); } r = fwrite(&utf8_bytes, num_bytes, 1, vm->OpenFileHandles[slot]); } V file_read_line(NgaState *vm) { CELL slot = stack_pop(vm); CELL targ = stack_pop(vm); CELL c; if (slot <= 0 || slot > MAX_OPEN_FILES || vm->OpenFileHandles[slot] == 0) { printf("\nERROR (nga/file_read): Invalid file handle\n"); exit(1); } c = fread_character(vm->OpenFileHandles[slot]); vm->memory[targ] = c; targ++; while (c != 10 && c != 13 && c != 0) { c = fread_character(vm->OpenFileHandles[slot]); vm->memory[targ] = c; targ++; } vm->memory[targ - 1] = 0; } V file_write_line(NgaState *vm) { } Handler FileActions[] = { file_open, file_close, file_read, file_write, file_get_position, file_set_position, file_get_size, file_delete, file_flush, file_read_bytes, file_write_bytes, file_read_character,file_write_character, file_read_line, file_write_line, }; V query_filesystem(NgaState *vm) { stack_push(vm, 3); stack_push(vm, DEVICE_FILES); } V io_filesystem(NgaState *vm) { FileActions[stack_pop(vm)](vm); } #endif #ifdef ENABLE_MULTICORE /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ /* Multi Core Support ------------------------------------------------ */ #ifdef ENABLE_MULTICORE void init_core(NgaState *vm, CELL x) { int y; vm->cpu[x].sp = 0; vm->cpu[x].rp = 0; vm->cpu[x].ip = 0; vm->cpu[x].active = 0; vm->cpu[x].u = 0; for (y = 0; y < STACK_DEPTH; y++) { vm->cpu[x].data[y] = 0; }; for (y = 0; y < ADDRESSES; y++) { vm->cpu[x].address[y] = 0; }; for (y = 0; y < 24; y++) { vm->cpu[x].registers[y] = 0; }; } void start_core(NgaState *vm, CELL x, CELL ip) { vm->cpu[x].ip = ip; vm->cpu[x].rp = 1; vm->cpu[x].active = -1; } void pause_core(NgaState *vm, CELL x) { vm->cpu[x].active = 0; } void resume_core(NgaState *vm, CELL x) { vm->cpu[x].active = -1; } void switch_core(NgaState *vm) { vm->active += 1; if (vm->active >= CORES) { vm->active = 0; } if (!vm->cpu[vm->active].active) { switch_core(vm); } } void io_multicore(NgaState *vm) { int x, y, z; x = stack_pop(vm); switch(x) { case 0: y = stack_pop(vm); init_core(vm, y); break; case 1: y = stack_pop(vm); z = stack_pop(vm); start_core(vm, y, z); break; case 2: y = stack_pop(vm); pause_core(vm, y); break; case 3: pause_core(vm, vm->active); break; case 4: y = stack_pop(vm); resume_core(vm, y); break; case 5: y = stack_pop(vm); stack_push(vm, vm->cpu[vm->active].registers[y]); break; case 6: y = stack_pop(vm); z = stack_pop(vm); vm->cpu[vm->active].registers[y] = z; break; } } void query_multicore(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_MULTICORE); } #endif #endif #ifdef ENABLE_FFI /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ #ifdef ENABLE_FFI #include typedef void (*External)(void *); V *handles[32]; External funcs[32000]; int nlibs, nffi; V open_library(NgaState *vm) { handles[nlibs] = dlopen(string_extract(vm, stack_pop(vm)), RTLD_LAZY); stack_push(vm, nlibs); nlibs++; } V map_symbol(NgaState *vm) { int h; h = stack_pop(vm); char *s = string_extract(vm, stack_pop(vm)); funcs[nffi] = dlsym(handles[h], s); stack_push(vm, nffi); nffi++; } V invoke(NgaState *vm) { funcs[stack_pop(vm)](vm); } V io_ffi(NgaState *vm) { switch (stack_pop(vm)) { case 0: open_library(vm); break; case 1: map_symbol(vm); break; case 2: invoke(vm); break; } } V query_ffi(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_FFI); } #endif #endif #ifdef ENABLE_FLOATS /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ #ifdef ENABLE_FLOATS #include /* Floating Point ---------------------------------------------------- */ void float_guard(NgaState *vm) { if (vm->fsp < 0 || vm->fsp > 255) { printf("\nERROR (nga/float_guard): Float Stack Limits Exceeded!\n"); printf("At %lld, fsp = %lld\n", (long long)vm->cpu[vm->active].ip, (long long)vm->fsp); exit(1); } if (vm->afsp < 0 || vm->afsp > 255) { printf("\nERROR (nga/float_guard): Alternate Float Stack Limits Exceeded!\n"); printf("At %lld, afsp = %lld\n", (long long)vm->cpu[vm->active].ip, (long long)vm->afsp); exit(1); } } /*--------------------------------------------------------------------- The first two functions push a float to the stack and pop a value off the stack. ---------------------------------------------------------------------*/ void float_push(NgaState *vm, double value) { vm->fsp++; float_guard(vm); vm->Floats[vm->fsp] = value; } double float_pop(NgaState *vm) { vm->fsp--; float_guard(vm); return vm->Floats[vm->fsp + 1]; } void float_to_alt(NgaState *vm) { vm->afsp++; float_guard(vm); vm->AFloats[vm->afsp] = float_pop(vm); } void float_from_alt(NgaState *vm) { float_push(vm, vm->AFloats[vm->afsp]); vm->afsp--; float_guard(vm); } /*--------------------------------------------------------------------- RETRO operates on 32-bit signed integer values. This function just pops a number from the data stack, casts it to a float, and pushes it to the float stack. ---------------------------------------------------------------------*/ void float_from_number(NgaState *vm) { float_push(vm, (double)stack_pop(vm)); } /*--------------------------------------------------------------------- To get a float from a string in the image, I provide this function. I cheat: using `atof()` takes care of the details, so I don't have to. ---------------------------------------------------------------------*/ void float_from_string(NgaState *vm) { float_push(vm, atof(string_extract(vm, stack_pop(vm)))); } /*--------------------------------------------------------------------- Converting a floating point into a string is slightly more work. Here I pass it off to `snprintf()` to deal with. ---------------------------------------------------------------------*/ void float_to_string(NgaState *vm) { snprintf(vm->string_data, 8192, "%f", float_pop(vm)); string_inject(vm, vm->string_data, stack_pop(vm)); } /*--------------------------------------------------------------------- Converting a floating point back into a standard number requires a little care due to the signed nature. This makes adjustments for the max & min value, and then casts (rounding) the float back to a normal number. ---------------------------------------------------------------------*/ void float_to_number(NgaState *vm) { double a = float_pop(vm); if (a > 2147483647) a = 2147483647; if (a < -2147483648) a = -2147483648; stack_push(vm, (CELL)round(a)); } void float_add(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); float_push(vm, a+b); } void float_sub(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); float_push(vm, b-a); } void float_mul(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); float_push(vm, a*b); } void float_div(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); float_push(vm, b/a); } void float_floor(NgaState *vm) { float_push(vm, floor(float_pop(vm))); } void float_ceil(NgaState *vm) { float_push(vm, ceil(float_pop(vm))); } void float_eq(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); if (a == b) stack_push(vm, -1); else stack_push(vm, 0); } void float_neq(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); if (a != b) stack_push(vm, -1); else stack_push(vm, 0); } void float_lt(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); if (b < a) stack_push(vm, -1); else stack_push(vm, 0); } void float_gt(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); if (b > a) stack_push(vm, -1); else stack_push(vm, 0); } void float_depth(NgaState *vm) { stack_push(vm, vm->fsp); } void float_adepth(NgaState *vm) { stack_push(vm, vm->afsp); } void float_dup(NgaState *vm) { double a = float_pop(vm); float_push(vm, a); float_push(vm, a); } void float_drop(NgaState *vm) { float_pop(vm); } void float_swap(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); float_push(vm, a); float_push(vm, b); } void float_log(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); float_push(vm, log(b) / log(a)); } void float_sqrt(NgaState *vm) { float_push(vm, sqrt(float_pop(vm))); } void float_pow(NgaState *vm) { double a = float_pop(vm); double b = float_pop(vm); float_push(vm, pow(b, a)); } void float_sin(NgaState *vm) { float_push(vm, sin(float_pop(vm))); } void float_cos(NgaState *vm) { float_push(vm, cos(float_pop(vm))); } void float_tan(NgaState *vm) { float_push(vm, tan(float_pop(vm))); } void float_asin(NgaState *vm) { float_push(vm, asin(float_pop(vm))); } void float_acos(NgaState *vm) { float_push(vm, acos(float_pop(vm))); } void float_atan(NgaState *vm) { float_push(vm, atan(float_pop(vm))); } /*--------------------------------------------------------------------- With this finally done, I implement the FPU instructions. ---------------------------------------------------------------------*/ Handler FloatHandlers[] = { float_from_number, float_from_string, float_to_number, float_to_string, float_add, float_sub, float_mul, float_div, float_floor, float_ceil, float_sqrt, float_eq, float_neq, float_lt, float_gt, float_depth, float_dup, float_drop, float_swap, float_log, float_pow, float_sin, float_tan, float_cos, float_asin, float_acos, float_atan, float_to_alt, float_from_alt, float_adepth, }; void query_floatingpoint(NgaState *vm) { stack_push(vm, 1); stack_push(vm, DEVICE_FLOATS); } void io_floatingpoint(NgaState *vm) { FloatHandlers[stack_pop(vm)](vm); } #endif #endif #ifdef ENABLE_CLOCK /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ #ifdef ENABLE_CLOCK time_t current_time; V clock_time(NgaState *vm) { stack_push(vm, (CELL)time(NULL)); } V clock_day(NgaState *vm) { stack_push(vm, (CELL)localtime(¤t_time)->tm_mday); } V clock_month(NgaState *vm) { stack_push(vm, (CELL)localtime(¤t_time)->tm_mon + 1); } V clock_year(NgaState *vm) { stack_push(vm, (CELL)localtime(¤t_time)->tm_year + 1900); } V clock_hour(NgaState *vm) { stack_push(vm, (CELL)localtime(¤t_time)->tm_hour); } V clock_minute(NgaState *vm) { stack_push(vm, (CELL)localtime(¤t_time)->tm_min); } V clock_second(NgaState *vm) { stack_push(vm, (CELL)localtime(¤t_time)->tm_sec); } V clock_day_utc(NgaState *vm) { stack_push(vm, (CELL)gmtime(¤t_time)->tm_mday); } V clock_month_utc(NgaState *vm) { stack_push(vm, (CELL)gmtime(¤t_time)->tm_mon + 1); } V clock_year_utc(NgaState *vm) { stack_push(vm, (CELL)gmtime(¤t_time)->tm_year + 1900); } V clock_hour_utc(NgaState *vm) { stack_push(vm, (CELL)gmtime(¤t_time)->tm_hour); } V clock_minute_utc(NgaState *vm) { stack_push(vm, (CELL)gmtime(¤t_time)->tm_min); } V clock_second_utc(NgaState *vm) { stack_push(vm, (CELL)gmtime(¤t_time)->tm_sec); } Handler ClockActions[] = { clock_time, clock_day, clock_month, clock_year, clock_hour, clock_minute, clock_second, clock_day_utc, clock_month_utc, clock_year_utc, clock_hour_utc, clock_minute_utc, clock_second_utc }; V query_clock(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_CLOCK); } V io_clock(NgaState *vm) { current_time = time(NULL); ClockActions[stack_pop(vm)](vm); } #endif #endif #ifdef ENABLE_RNG /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ #ifdef ENABLE_RNG V io_rng(NgaState *vm) { int64_t r = 0; char buffer[8]; int i; ssize_t ignore; int fd = open("/dev/urandom", O_RDONLY); ignore = read(fd, buffer, 8); close(fd); for(i = 0; i < 8; ++i) { r = r << 8; r += ((int64_t)buffer[i] & 0xFF); } #ifndef BIT64 stack_push(vm, (CELL)abs((CELL)r)); #else stack_push(vm, (CELL)llabs((CELL)r)); #endif } V query_rng(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_RNG); } #endif #endif #ifdef ENABLE_SOCKETS /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ #ifdef ENABLE_SOCKETS #include #include #include #include /*--------------------------------------------------------------------- BSD Sockets ---------------------------------------------------------------------*/ int SocketID[16]; struct sockaddr_in Sockets[16]; struct addrinfo hints, *res; V socket_getaddrinfo(NgaState *vm) { char host[1025], port[6]; strlcpy(port, string_extract(vm, stack_pop(vm)), 5); strlcpy(host, string_extract(vm, stack_pop(vm)), 1024); getaddrinfo(host, port, &hints, &res); } V socket_get_host(NgaState *vm) { struct hostent *hp; struct in_addr **addr_list; hp = gethostbyname(string_extract(vm, stack_pop(vm))); if (hp == NULL) { vm->memory[stack_pop(vm)] = 0; return; } addr_list = (struct in_addr **)hp->h_addr_list; string_inject(vm, inet_ntoa(*addr_list[0]), stack_pop(vm)); } V socket_create(NgaState *vm) { int i; int sock = socket(PF_INET, SOCK_STREAM, 0); for (i = 0; i < 16; i++) { if (SocketID[i] == 0 && sock != 0) { SocketID[i] = sock; stack_push(vm, (CELL)i); sock = 0; } } } V socket_bind(NgaState *vm) { int sock, port; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; sock = stack_pop(vm); port = stack_pop(vm); getaddrinfo(NULL, string_extract(vm, port), &hints, &res); stack_push(vm, (CELL) bind(SocketID[sock], res->ai_addr, res->ai_addrlen)); stack_push(vm, errno); } V socket_listen(NgaState *vm) { int sock = stack_pop(vm); int backlog = stack_pop(vm); stack_push(vm, listen(SocketID[sock], backlog)); stack_push(vm, errno); } V socket_accept(NgaState *vm) { int i; int sock = stack_pop(vm); struct sockaddr_storage their_addr; socklen_t addr_size = sizeof their_addr; int new_fd = accept(SocketID[sock], (struct sockaddr *)&their_addr, &addr_size); for (i = 0; i < 16; i++) { if (SocketID[i] == 0 && new_fd != 0) { SocketID[i] = new_fd; stack_push(vm, (CELL)i); new_fd = 0; } } stack_push(vm, errno); } V socket_connect(NgaState *vm) { stack_push(vm, (CELL)connect(SocketID[stack_pop(vm)], res->ai_addr, res->ai_addrlen)); stack_push(vm, errno); } V socket_send(NgaState *vm) { int sock = stack_pop(vm); char *buf = string_extract(vm, stack_pop(vm)); stack_push(vm, send(SocketID[sock], buf, strlen(buf), 0)); stack_push(vm, errno); } V socket_recv(NgaState *vm) { char buf[8193]; int sock = stack_pop(vm); int limit = stack_pop(vm); int dest = stack_pop(vm); int len = recv(SocketID[sock], buf, limit, 0); if (len > 0) buf[len] = '\0'; if (len > 0) string_inject(vm, buf, dest); stack_push(vm, len); stack_push(vm, errno); } V socket_close(NgaState *vm) { int sock = stack_pop(vm); close(SocketID[sock]); SocketID[sock] = 0; } Handler SocketActions[] = { socket_get_host, socket_create, socket_bind, socket_listen, socket_accept, socket_connect, socket_send, socket_recv, socket_close, socket_getaddrinfo }; V io_socket(NgaState *vm) { SocketActions[stack_pop(vm)](vm); } V query_socket(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_SOCKETS); } #endif #endif #ifdef ENABLE_UNIX /************************************************************** _ __ _ _ _ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__ | '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \ | | | __/ |_| | | (_) | _| (_) | | | |_| | | | |_| \___|\__|_| \___/|_| \___/|_| \__|_| |_| for nga (c) Charles Childers, Luke Parrish, Marc Simpsonn, Jay Skeer, Kenneth Keating **************************************************************/ #ifdef ENABLE_UNIX #include #include /*-------------------------------------------------------------- `unix_open_pipe()` is like `file_open()`, but for pipes. This pulls from the data stack: - mode (number, TOS) - executable (string, NOS) Modes are: | Mode | Corresponds To | Description | | ---- | -------------- | -------------------- | | 0 | r | Open for reading | | 1 | w | Open for writing | | 3 | r+ | Open for read/update | The file name should be a NULL terminated string. This will attempt to open the requested file and will return a handle (index number into the `OpenFileHandles` array). Once opened, you can use the standard file words to read/write to the process. ------------------------------------------------------------*/ V unix_open_pipe(NgaState *vm) { CELL slot, mode, name; char *request; const char *modes[] = {"r", "w", "", "r+"}; slot = files_get_handle(vm); mode = stack_pop(vm); name = stack_pop(vm); request = string_extract(vm, name); if (slot > 0) { vm->OpenFileHandles[slot] = popen(request, modes[mode]); } if (vm->OpenFileHandles[slot] == NULL) { vm->OpenFileHandles[slot] = 0; slot = 0; } stack_push(vm, slot); } V unix_close_pipe(NgaState *vm) { pclose(vm->OpenFileHandles[TOS]); vm->OpenFileHandles[TOS] = 0; stack_pop(vm); } V unix_system(NgaState *vm) { int ignore = 0; ignore = system(string_extract(vm, stack_pop(vm))); } V unix_fork(NgaState *vm) { stack_push(vm, fork()); } V unix_run_external(NgaState *vm) { char *line, *args[128]; int i, status; pid_t pid; char **argv = args; line = string_extract(vm, stack_pop(vm)); for(i = 0; i < 128; i++) args[i] = 0; while (*line != '\0') { while (*line == ' ' || *line == '\t' || *line == '\n') *line++ = '\0'; *argv++ = line; while (*line != '\0' && *line != ' ' && *line != '\t' && *line != '\n') line++; } if ((pid = fork()) < 0) { printf("*** ERROR: forking child process failed\n"); exit(1); } else if (pid == 0) { int e = execvp(*args, args); if (e < 0) { printf("*** ERROR: exec failed with %d\n", e); exit(1); } } else { while (wait(&status) != pid) ; } } /*-------------------------------------------------------------- UNIX provides `execl` to execute a file, with various forms for arguments provided. Retro wraps this in several functions, one for each number of passed arguments. See the Glossary for details on what each takes from the stack. Each of these will return the error code if the execution fails. ------------------------------------------------------------*/ V unix_exec0(NgaState *vm) { char path[1025]; strlcpy(path, string_extract(vm, stack_pop(vm)), 1024); execl(path, path, (char *)0); stack_push(vm, errno); } V unix_exec1(NgaState *vm) { char path[1025]; char arg0[1025]; strlcpy(arg0, string_extract(vm, stack_pop(vm)), 1024); strlcpy(path, string_extract(vm, stack_pop(vm)), 1024); execl(path, path, arg0, (char *)0); stack_push(vm, errno); } V unix_exec2(NgaState *vm) { char path[1025]; char arg0[1025], arg1[1025]; strlcpy(arg1, string_extract(vm, stack_pop(vm)), 1024); strlcpy(arg0, string_extract(vm, stack_pop(vm)), 1024); strlcpy(path, string_extract(vm, stack_pop(vm)), 1024); execl(path, path, arg0, arg1, (char *)0); stack_push(vm, errno); } V unix_exec3(NgaState *vm) { char path[1025]; char arg0[1025], arg1[1025], arg2[1025]; strlcpy(arg2, string_extract(vm, stack_pop(vm)), 1024); strlcpy(arg1, string_extract(vm, stack_pop(vm)), 1024); strlcpy(arg0, string_extract(vm, stack_pop(vm)), 1024); strlcpy(path, string_extract(vm, stack_pop(vm)), 1024); execl(path, path, arg0, arg1, arg2, (char *)0); stack_push(vm, errno); } V unix_exit(NgaState *vm) { exit(stack_pop(vm)); } V unix_getpid(NgaState *vm) { stack_push(vm, getpid()); } V unix_wait(NgaState *vm) { int a; stack_push(vm, wait(&a)); } V unix_kill(NgaState *vm) { CELL a = stack_pop(vm); kill(stack_pop(vm), a); } V unix_write(NgaState *vm) { ssize_t ignore; CELL c = stack_pop(vm); CELL b = stack_pop(vm); CELL a = stack_pop(vm); ignore = write(fileno(vm->OpenFileHandles[c]), string_extract(vm, a), b); } V unix_chdir(NgaState *vm) { int ignore = chdir(string_extract(vm, stack_pop(vm))); } V unix_getenv(NgaState *vm) { CELL a = stack_pop(vm); CELL b = stack_pop(vm); string_inject(vm, getenv(string_extract(vm, b)), a); } V unix_putenv(NgaState *vm) { putenv(string_extract(vm, stack_pop(vm))); } V unix_sleep(NgaState *vm) { sleep(stack_pop(vm)); } Handler UnixActions[] = { unix_system, unix_fork, unix_exec0, unix_exec1, unix_exec2, unix_exec3, unix_exit, unix_getpid, unix_wait, unix_kill, unix_open_pipe, unix_close_pipe, unix_write, unix_chdir, unix_getenv, unix_putenv, unix_sleep, unix_run_external }; V query_unix(NgaState *vm) { stack_push(vm, 3); stack_push(vm, DEVICE_UNIX); } V io_unix(NgaState *vm) { UnixActions[stack_pop(vm)](vm); } #endif #endif /*--------------------------------------------------------------------- Now on to I/O and extensions! ---------------------------------------------------------------------*/ V display_utf8(const unsigned char* utf8_bytes, int num_bytes) { if (write(STDOUT_FILENO, utf8_bytes, num_bytes) == -1) { perror("Error writing to /dev/stdout"); } } V utf32_to_utf8(uint32_t utf32_char, unsigned char* utf8_bytes, int* num_bytes) { if (utf32_char < 0x80) { utf8_bytes[0] = (unsigned char)utf32_char; *num_bytes = 1; } else if (utf32_char < 0x800) { utf8_bytes[0] = (unsigned char)(0xC0 | (utf32_char >> 6)); utf8_bytes[1] = (unsigned char)(0x80 | (utf32_char & 0x3F)); *num_bytes = 2; } else if (utf32_char < 0x10000) { utf8_bytes[0] = (unsigned char)(0xE0 | (utf32_char >> 12)); utf8_bytes[1] = (unsigned char)(0x80 | ((utf32_char >> 6) & 0x3F)); utf8_bytes[2] = (unsigned char)(0x80 | (utf32_char & 0x3F)); *num_bytes = 3; } else if (utf32_char < 0x110000) { utf8_bytes[0] = (unsigned char)(0xF0 | (utf32_char >> 18)); utf8_bytes[1] = (unsigned char)(0x80 | ((utf32_char >> 12) & 0x3F)); utf8_bytes[2] = (unsigned char)(0x80 | ((utf32_char >> 6) & 0x3F)); utf8_bytes[3] = (unsigned char)(0x80 | (utf32_char & 0x3F)); *num_bytes = 4; } else { *num_bytes = 0; } } V io_output(NgaState *vm) { unsigned char utf8_bytes[4]; int num_bytes; utf32_to_utf8(stack_pop(vm), utf8_bytes, &num_bytes); display_utf8(utf8_bytes, num_bytes); fflush(stdout); } V query_output(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_OUTPUT); } /*=====================================================================*/ int read_character(int from) { unsigned char utf8_bytes[4] = { 0 }; int utf32_char, i, num_bytes; if (read(from, &utf8_bytes[0], 1) != 1) { return 0; } if ((utf8_bytes[0] & 0x80) == 0x00) { num_bytes = 1; } else if ((utf8_bytes[0] & 0xE0) == 0xC0) { num_bytes = 2; } else if ((utf8_bytes[0] & 0xF0) == 0xE0) { num_bytes = 3; } else if ((utf8_bytes[0] & 0xF8) == 0xF0) { num_bytes = 4; } else { return 0; } for (i = 1; i < num_bytes; i++) { if (read(from, &utf8_bytes[i], 1) != 1) { return 0; } } if (num_bytes == 1) { utf32_char = utf8_bytes[0]; } else if (num_bytes == 2) { utf32_char = ((uint32_t)(utf8_bytes[0] & 0x1F) << 6) | (utf8_bytes[1] & 0x3F); } else if (num_bytes == 3) { utf32_char = ((uint32_t)(utf8_bytes[0] & 0x0F) << 12) | ((uint32_t)(utf8_bytes[1] & 0x3F) << 6) | (utf8_bytes[2] & 0x3F); } else if (num_bytes == 4) { utf32_char = ((uint32_t)(utf8_bytes[0] & 0x07) << 18) | ((uint32_t)(utf8_bytes[1] & 0x3F) << 12) | ((uint32_t)(utf8_bytes[2] & 0x3F) << 6) | (utf8_bytes[3] & 0x3F); } else { return 0; } return utf32_char; } int fread_character(FILE *from) { unsigned char utf8_bytes[4] = { 0 }; int utf32_char, i, num_bytes; if (fread(&utf8_bytes[0], 1, 1, from) != 1) { return 0; } if ((utf8_bytes[0] & 0x80) == 0x00) { num_bytes = 1; } else if ((utf8_bytes[0] & 0xE0) == 0xC0) { num_bytes = 2; } else if ((utf8_bytes[0] & 0xF0) == 0xE0) { num_bytes = 3; } else if ((utf8_bytes[0] & 0xF8) == 0xF0) { num_bytes = 4; } else { return 0; } for (i = 1; i < num_bytes; i++) { if (fread(&utf8_bytes[i], 1, 1, from) != 1) { return 0; } } if (num_bytes == 1) { utf32_char = utf8_bytes[0]; } else if (num_bytes == 2) { utf32_char = ((uint32_t)(utf8_bytes[0] & 0x1F) << 6) | (utf8_bytes[1] & 0x3F); } else if (num_bytes == 3) { utf32_char = ((uint32_t)(utf8_bytes[0] & 0x0F) << 12) | ((uint32_t)(utf8_bytes[1] & 0x3F) << 6) | (utf8_bytes[2] & 0x3F); } else if (num_bytes == 4) { utf32_char = ((uint32_t)(utf8_bytes[0] & 0x07) << 18) | ((uint32_t)(utf8_bytes[1] & 0x3F) << 12) | ((uint32_t)(utf8_bytes[2] & 0x3F) << 6) | (utf8_bytes[3] & 0x3F); } else { return 0; } return utf32_char; } V io_keyboard(NgaState *vm) { stack_push(vm, read_character(STDIN_FILENO)); if (TOS == 127) TOS = 8; } V query_keyboard(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_KEYBOARD); } /*=====================================================================*/ #ifdef ENABLE_UNSIGNED V io_unsigned(NgaState *vm) { int x, y, z; long c; switch (stack_pop(vm)) { case 0: ACTIVE.u = 1; break; case 1: c = 0; z = stack_pop(vm); y = stack_pop(vm); x = stack_pop(vm); if (ACTIVE.u != 0) { c = (unsigned)x * (unsigned)y; stack_push(vm, (unsigned)c % (unsigned)z); stack_push(vm, (unsigned)c / (unsigned)z); } else { c = x * y; stack_push(vm, c % z); stack_push(vm, c / z); } ACTIVE.u = 0; break; } } V query_unsigned(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_UNSIGNED); } #endif /*=====================================================================*/ V io_image(NgaState *vm) { FILE *fp; char *f = string_extract(vm, stack_pop(vm)); if ((fp = fopen(f, "wb")) == NULL) { printf("\nERROR (nga/io_image): Unable to save the image: %s!\n", f); exit(2); } fwrite(vm->memory, sizeof(CELL), vm->memory[3] + 1, fp); fclose(fp); } V query_image(NgaState *vm) { stack_push(vm, 0); stack_push(vm, DEVICE_IMAGE); } /*=====================================================================*/ /*--------------------------------------------------------------------- Scripting Support ---------------------------------------------------------------------*/ V scripting_arg(NgaState *vm) { CELL a, b; a = stack_pop(vm); b = stack_pop(vm); stack_push(vm, string_inject(vm, vm->sys_argv[a + 2], b)); } V scripting_arg_count(NgaState *vm) { if ((vm->sys_argc - 2) <= 0) stack_push(vm, 0); else stack_push(vm, vm->sys_argc - 2); } V scripting_include(NgaState *vm) { include_file(vm, string_extract(vm, stack_pop(vm)), 0); } V scripting_include_plain(NgaState *vm) { include_plain_file(vm, string_extract(vm, stack_pop(vm)), 0); } V scripting_name(NgaState *vm) { if (vm->sys_argc == 1) stack_push(vm, string_inject(vm, "", stack_pop(vm))); else stack_push(vm, string_inject(vm, vm->sys_argv[1], stack_pop(vm))); } /* addeded in scripting i/o device, revision 1 */ V scripting_source(NgaState *vm) { stack_push(vm, string_inject(vm, vm->scripting_sources[vm->current_source], stack_pop(vm))); } V scripting_line(NgaState *vm) { stack_push(vm, vm->currentLine); } V scripting_ignore_to_eol(NgaState *vm) { vm->ignoreToEOL = -1; } V scripting_ignore_to_eof(NgaState *vm) { vm->ignoreToEOF = -1; } V scripting_abort(NgaState *vm) { scripting_ignore_to_eol(vm); scripting_ignore_to_eof(vm); vm->perform_abort = -1; } V carry_out_abort(NgaState *vm) { ACTIVE.ip = IMAGE_SIZE + 1; ACTIVE.rp = 0; ACTIVE.sp = 0; #ifdef ENABLE_FLOATS vm->fsp = 0; vm->afsp = 0; #endif if (vm->current_source > 0) { scripting_abort(vm); return; } vm->perform_abort = 0; vm->current_source = 0; } V scripting_line_text(NgaState *vm) { CELL target = stack_pop(vm); string_inject(vm, vm->line, target); } Handler ScriptingActions[] = { scripting_arg_count, scripting_arg, scripting_include, scripting_name, scripting_source, scripting_line, scripting_ignore_to_eol, scripting_ignore_to_eof, scripting_abort, scripting_line_text, scripting_include_plain }; V query_scripting(NgaState *vm) { stack_push(vm, 3); stack_push(vm, DEVICE_SCRIPTING); } V io_scripting(NgaState *vm) { ScriptingActions[stack_pop(vm)](vm); } /*=====================================================================*/ /*--------------------------------------------------------------------- With these out of the way, I implement `execute`, which takes an address and runs the code at it. This has a couple of interesting bits. This will also exit if the address stack depth is zero (meaning that the word being run, and it's dependencies) are finished. ---------------------------------------------------------------------*/ V invalid_opcode(NgaState *vm, CELL opcode) { CELL a, i; printf("\nERROR (nga/execute): Invalid instruction!\n"); printf("At %lld, opcode %lld\n", (long long)ACTIVE.ip, (long long)opcode); printf("Instructions: "); a = opcode; for (i = 0; i < 4; i++) { printf("%lldd ", (long long)a & 0xFF); a = a >> 8; } printf("\n"); exit(1); } V execute(NgaState *vm, CELL cell) { CELL opcode; if (ACTIVE.rp == 0) ACTIVE.rp = 1; ACTIVE.ip = cell; while (ACTIVE.ip < IMAGE_SIZE) { if (vm->perform_abort == 0) { opcode = vm->memory[ACTIVE.ip]; #ifndef BRANCH_PREDICTION validate_opcode_bundle(vm, opcode); #endif process_opcode_bundle(vm, opcode); #ifndef ENABLE_ERROR if (ACTIVE.sp < 0 || ACTIVE.sp > STACK_DEPTH) { printf("\nERROR (nga/execute): Stack Limits Exceeded!\n"); printf("At %lld, opcode %lld. sp = %lld, core = %lld\n", (long long)ACTIVE.ip, (long long)opcode, (long long)ACTIVE.sp, (long long)vm->active); exit(1); } if (ACTIVE.rp < 0 || ACTIVE.rp > ADDRESSES) { printf("\nERROR (nga/execute): Address Stack Limits Exceeded!\n"); printf("At %lld, opcode %lld. rp = %lld\n", (long long)ACTIVE.ip, (long long)opcode, (long long)ACTIVE.rp); exit(1); } #endif ACTIVE.ip++; #ifdef ENABLE_MULTICORE switch_core(vm); #endif if (ACTIVE.rp == 0) ACTIVE.ip = IMAGE_SIZE; } else { carry_out_abort(vm); } } } ; /*--------------------------------------------------------------------- RETRO's `interpret` word expects a token on the stack. This next function copies a token to the `TIB` (text input buffer) and then calls `interpret` to process it. ---------------------------------------------------------------------*/ V evaluate(NgaState *vm, char *s) { if (strlen(s) == 0) return; if (strlen(s) > (TIB_END - TIB)) { s[TIB_END - TIB] = 0; } string_inject(vm, s, TIB); stack_push(vm, TIB); execute(vm, vm->interpret); } /*--------------------------------------------------------------------- `read_token` reads a token from the specified file. It will stop on a whitespace or newline. It also tries to handle backspaces, though the success of this depends on how your terminal is configured. ---------------------------------------------------------------------*/ int not_eol(int c) { return (c != 9) && (c != 10) && (c != 13) && (c != 32) && (c != EOF) && (c != 0); } V read_token(FILE *file, char *token_buffer) { int ch = fread_character(file); int count = 0; while (not_eol(ch)) { if ((ch == 8 || ch == 127) && count > 0) { count--; } else { token_buffer[count++] = ch; } ch = fread_character(file); } token_buffer[count] = '\0'; } V skip_indent(FILE *fp) { int ch = getc(fp); while (ch == ' ') { ch = getc(fp); } ungetc(ch, fp); } /*--------------------------------------------------------------------- Display the Stack Contents ---------------------------------------------------------------------*/ V dump_stack(NgaState *vm) { if (ACTIVE.sp == 0) return; printf("\nStack: "); for (CELL i = 1; i <= ACTIVE.sp; i++) { if (i == ACTIVE.sp) printf("[ TOS: %lld ]", (long long)ACTIVE.data[i]); else printf("%lld ", (long long)ACTIVE.data[i]); } printf("\n"); } V dump_astack(NgaState *vm) { if (ACTIVE.rp == 0) return; printf("\nAddress Stack: "); for (CELL i = 1; i <= ACTIVE.rp; i++) { if (i == ACTIVE.rp) printf("[ TOS: %lld ]", (long long)ACTIVE.address[i]); else printf("%lld ", (long long)ACTIVE.address[i]); } printf("\n"); } /*--------------------------------------------------------------------- RRE is primarily intended to be used in a batch or scripting model. The `include_file()` function will be used to read the code in the file, evaluating it as encountered. I enforce a literate model, with code in fenced blocks. E.g., # This is a test Display "Hello, World!" ~~~ 'Hello,_World! puts nl ~~~ RRE will ignore anything outside the `~~~` blocks. To identify if the current token is the start or end of a block, I provide a `fenced()` function. ---------------------------------------------------------------------*/ /* Check to see if a line is a fence boundary. This will check code blocks in all cases, and test blocks if tests_enabled is set to a non-zero value. */ int fence_boundary(NgaState *vm, char *buffer, int tests_enabled) { int flag = 1; if (strcmp(buffer, vm->code_start) == 0) { flag = -1; } if (strcmp(buffer, vm->code_end) == 0) { flag = -1; } if (strcmp(buffer, vm->test_start) == 0) { if (vm->codeBlocks == 0) { vm->codeBlocks++; } } if (tests_enabled == 0) { return flag; } if (strcmp(buffer, vm->test_start) == 0) { flag = -1; } if (strcmp(buffer, vm->test_end) == 0) { flag = -1; } return flag; } /*--------------------------------------------------------------------- And now for the actual `include_file()` function. ---------------------------------------------------------------------*/ V read_line(NgaState *vm, FILE *file, char *token_buffer) { int ch = getc(file); int count = 0; token_buffer[0] = '\0'; while ((ch != 10) && (ch != 13) && (ch != EOF) && (ch != 0)) { token_buffer[count++] = ch; ch = fread_character(file); } token_buffer[count] = '\0'; } int count_tokens(char *line) { int count = 1; while (*line++) { if (isspace(line[0])) count++; } return count; } V include_file(NgaState *vm, char *fname, int run_tests) { int inBlock = 0; /* Tracks status of in/out of block */ int priorBlocks = 0; char source[64 * 1024]; /* Token buffer [about 64K] */ char fence[33]; /* Used with `fence_boundary()` */ CELL ReturnStack[ADDRESSES]; CELL arp, aip; long offset = 0; CELL at = 0; int tokens = 0; FILE *fp; /* Open the file. If not found, */ fp = fopen(fname, "r"); /* exit. */ if (fp == NULL) { printf("File `%s` not found. Exiting.\n", fname); exit(1); } priorBlocks = vm->codeBlocks; vm->codeBlocks = 0; arp = ACTIVE.rp; aip = ACTIVE.ip; for(ACTIVE.rp = 0; ACTIVE.rp <= arp; ACTIVE.rp++) ReturnStack[ACTIVE.rp] = ACTIVE.address[ACTIVE.rp]; ACTIVE.rp = 0; vm->current_source++; strlcpy(vm->scripting_sources[vm->current_source], fname, 8192); vm->ignoreToEOF = 0; while (!feof(fp) && (vm->ignoreToEOF == 0)) { /* Loop through the file */ vm->ignoreToEOL = 0; offset = ftell(fp); read_line(vm, fp, vm->line); at++; fseek(fp, offset, SEEK_SET); skip_indent(fp); tokens = count_tokens(vm->line); while (tokens > 0 && vm->ignoreToEOL == 0) { tokens--; read_token(fp, source); strlcpy(fence, source, 32); /* Copy the first three characters */ if (fence_boundary(vm, fence, run_tests) == -1) { if (inBlock == 0) { inBlock = 1; vm->codeBlocks++; } else { inBlock = 0; } } else { if (inBlock == 1) { vm->currentLine = at; evaluate(vm, source); vm->currentLine = at; } } } if (vm->ignoreToEOL == -1) { read_line(vm, fp, vm->line); } } vm->current_source--; vm->ignoreToEOF = 0; fclose(fp); if (vm->perform_abort == -1) { carry_out_abort(vm); } for(ACTIVE.rp = 0; ACTIVE.rp <= arp; ACTIVE.rp++) ACTIVE.address[ACTIVE.rp] = ReturnStack[ACTIVE.rp]; ACTIVE.rp = arp; ACTIVE.ip = aip; if (vm->codeBlocks == 0) { printf("warning: no code or test blocks found!\n"); printf(" filename: %s\n", fname); printf(" see http://unu.retroforth.org for a brief summary of\n"); printf(" the unu code format used by retro\n"); } vm->codeBlocks = priorBlocks; } V include_plain_file(NgaState *vm, char *fname, int run_tests) { char source[64 * 1024]; /* Token buffer [about 64K] */ CELL ReturnStack[ADDRESSES]; CELL arp, aip; long offset = 0; CELL at = 0; int tokens = 0; FILE *fp; /* Open the file. If not found, */ fp = fopen(fname, "r"); /* exit. */ if (fp == NULL) { printf("File `%s` not found. Exiting.\n", fname); exit(1); } arp = ACTIVE.rp; aip = ACTIVE.ip; for(ACTIVE.rp = 0; ACTIVE.rp <= arp; ACTIVE.rp++) ReturnStack[ACTIVE.rp] = ACTIVE.address[ACTIVE.rp]; ACTIVE.rp = 0; vm->current_source++; strlcpy(vm->scripting_sources[vm->current_source], fname, 8192); vm->ignoreToEOF = 0; while (!feof(fp) && (vm->ignoreToEOF == 0)) { /* Loop through the file */ vm->ignoreToEOL = 0; offset = ftell(fp); read_line(vm, fp, vm->line); at++; fseek(fp, offset, SEEK_SET); skip_indent(fp); tokens = count_tokens(vm->line); while (tokens > 0 && vm->ignoreToEOL == 0) { tokens--; read_token(fp, source); vm->currentLine = at; evaluate(vm, source); vm->currentLine = at; } if (vm->ignoreToEOL == -1) { read_line(vm, fp, vm->line); } } vm->current_source--; vm->ignoreToEOF = 0; fclose(fp); if (vm->perform_abort == -1) { carry_out_abort(vm); } for(ACTIVE.rp = 0; ACTIVE.rp <= arp; ACTIVE.rp++) ACTIVE.address[ACTIVE.rp] = ReturnStack[ACTIVE.rp]; ACTIVE.rp = arp; ACTIVE.ip = aip; } /*--------------------------------------------------------------------- `initialize()` sets up Nga and loads the image (from the array in `image.c`) to memory. ---------------------------------------------------------------------*/ V initialize(NgaState *vm) { prepare_vm(vm); load_embedded_image(vm); vm->interactive = 0; strlcpy(vm->code_start, "~~~", 256); strlcpy(vm->code_end, "~~~", 256); strlcpy(vm->test_start, "```", 256); strlcpy(vm->test_end, "```", 256); /* Setup variables related to the scripting device */ vm->currentLine = 0; /* Current Line # for script */ vm->current_source = 0; /* Current file being run */ vm->perform_abort = 0; /* Carry out abort procedure */ strlcpy(vm->scripting_sources[0], "/dev/stdin", 8192); vm->ignoreToEOL = 0; vm->ignoreToEOF = 0; vm->codeBlocks = 0; } V help(char *exename) { printf("Scripting Usage: %s filename\n\n", exename); printf("Interactive Usage: %s [-h] [-i] [-f filename] [-t filename]\n\n", exename); printf("Valid Arguments:\n\n"); printf(" -h\n"); printf(" Display this help text\n"); printf(" -i\n"); printf(" Launches in interactive mode\n"); printf(" -f filename\n"); printf(" Run the contents of the code blocks in the specified file\n"); printf(" -p filename\n"); printf(" Run the contents of the specified file\n"); printf(" -u filename\n"); printf(" Use the image in the specified file instead of the internal one\n"); printf(" -r filename\n"); printf(" Use the image in the specified file instead of the internal one and run the code in it\n"); printf(" -t filename\n"); printf(" Run the contents of the code blocks in the specified file, including any tests (in ``` blocks)\n\n"); printf(" -v\n"); printf(" Run in verbose mode\n"); } /* Signal Handler -----------------------------------------------------*/ #ifdef ENABLE_SIGNALS static V sig_handler(int _) { printf("\nCaught: %d\n", _); exit(1); } #endif /* Main Entry Point ---------------------------------------------------*/ enum flags { FLAG_HELP, FLAG_INTERACTIVE, }; V register_devices(NgaState *vm) { register_device(vm, io_output, query_output); register_device(vm, io_keyboard, query_keyboard); #ifdef ENABLE_FILES register_device(vm, io_filesystem, query_filesystem); #endif register_device(vm, io_image, query_image); #ifdef ENABLE_FLOATS register_device(vm, io_floatingpoint, query_floatingpoint); #endif #ifdef ENABLE_UNIX register_device(vm, io_unix, query_unix); #endif #ifdef ENABLE_MALLOC #ifdef BIT64 register_device(vm, io_malloc, query_malloc); #endif #endif #ifdef ENABLE_BLOCKS register_device(vm, io_blocks, query_blocks); #endif #ifdef ENABLE_CLOCK register_device(vm, io_clock, query_clock); #endif register_device(vm, io_scripting, query_scripting); #ifdef ENABLE_RNG register_device(vm, io_rng, query_rng); #endif #ifdef ENABLE_SOCKETS register_device(vm, io_socket, query_socket); #endif #ifdef ENABLE_MULTICORE register_device(vm, io_multicore, query_multicore); #endif #ifdef ENABLE_FFI register_device(vm, io_ffi, query_ffi); nlibs = 0; nffi = 0; #endif #ifdef ENABLE_UNSIGNED register_device(vm, io_unsigned, query_unsigned); #endif #ifdef ENABLE_ERROR register_device(vm, io_error, query_error); #endif #ifdef ENABLE_IOCTL register_device(vm, io_ioctl, query_ioctl); #endif } V register_signal_handlers() { #ifdef ENABLE_SIGNALS signal(SIGHUP, sig_handler); signal(SIGINT, sig_handler); signal(SIGILL, sig_handler); signal(SIGBUS, sig_handler); signal(SIGFPE, sig_handler); #endif } #define ARG(n) (strcmp(argv[i], n) == 0) int main(int argc, char **argv) { int i; int modes[16]; NgaState *vm = calloc(sizeof(NgaState), sizeof(char)); verbose = 0; register_signal_handlers(); initialize(vm); /* Initialize Nga & image */ register_devices(vm); vm->sys_argc = argc; /* Point the global argc and */ vm->sys_argv = argv; /* argv to the actual ones */ strlcpy(vm->scripting_sources[0], "", 8192); /* Check arguments. If no flags were passed, load & run the file specified and exit. */ if (argc >= 2 && argv[1][0] != '-') { update_rx(vm); include_file(vm, argv[1], 0); if (ACTIVE.sp >= 1) dump_stack(vm); exit(0); } /* Clear startup modes */ for (i = 0; i < 16; i++) modes[i] = 0; if (argc <= 1) modes[FLAG_INTERACTIVE] = 1; update_rx(vm); /* Process Arguments */ for (i = 1; i < argc; i++) { if ARG("-h") { help(argv[0]); exit(0); } else if ARG("-v") { verbose = 1; } else if ARG("-i") { modes[FLAG_INTERACTIVE] = 1; vm->interactive = -1; } else if ARG("-f") { include_file(vm, argv[i + 1], 0); i++; } else if ARG("-p") { include_plain_file(vm, argv[i + 1], 0); i++; } else if ARG("-u") { i++; load_image(vm, argv[i]); update_rx(vm); } else if ARG("-r") { i++; load_image(vm, argv[i]); modes[FLAG_INTERACTIVE] = 1; update_rx(vm); } else if ARG("-t") { include_file(vm, argv[i + 1], 1); i++; } else if (ARG("--code-start") || ARG("-cs")) { i++; strlcpy(vm->code_start, argv[i], 256); } else if (ARG("--code-end") || ARG("-ce")) { i++; strlcpy(vm->code_end, argv[i], 256); } else if (ARG("--test-start") || ARG("-ts")) { i++; strlcpy(vm->test_start, argv[i], 256); } else if (ARG("--test-end") || ARG("-te")) { i++; strlcpy(vm->test_end, argv[i], 256); } } /* Run the Listener (if interactive mode was set) */ if (modes[FLAG_INTERACTIVE] == 1) { execute(vm, 0); } /* Dump Stack */ if (ACTIVE.sp >= 1) dump_stack(vm); free(vm); } /*=====================================================================*/ /*--------------------------------------------------------------------- Interfacing With The Image ---------------------------------------------------------------------*/ /*--------------------------------------------------------------------- Stack push/pop is easy. I could avoid these, but it aids in keeping the code readable, so it's worth the slight overhead. ---------------------------------------------------------------------*/ CELL stack_pop(NgaState *vm) { ACTIVE.sp--; return ACTIVE.data[ACTIVE.sp + 1]; } V stack_push(NgaState *vm, CELL value) { ACTIVE.sp++; ACTIVE.data[ACTIVE.sp] = value; } /*--------------------------------------------------------------------- Strings are next. RETRO uses C-style NULL terminated strings. So I can easily inject or extract a string. Injection iterates over the string, copying it into the image. This also takes care to ensure that the NULL terminator is added. ---------------------------------------------------------------------*/ CELL string_inject(NgaState *vm, char *str, CELL buffer) { if (!str) { vm->memory[buffer] = 0; return 0; } for (CELL i = 0; str[i] != '\0'; i++) { vm->memory[buffer + i] = (CELL)str[i]; vm->memory[buffer + i + 1] = 0; } return buffer; } /*--------------------------------------------------------------------- Extracting a string is similar, but I have to iterate over the VM memory instead of a C string and copy the charaters into a buffer. This uses a static buffer (`string_data`) as I prefer to avoid using `malloc()`. ---------------------------------------------------------------------*/ char *string_extract(NgaState *vm, CELL at) { CELL starting = at, i = 0; while (vm->memory[starting] && i < 8192) vm->string_data[i++] = (char)vm->memory[starting++]; vm->string_data[i] = 0; return (char *)vm->string_data; } /*--------------------------------------------------------------------- This interface tracks a few words and variables in the image. These are: Dictionary - the latest dictionary header interpret - the heart of the interpreter/compiler I have to call this periodically, as the Dictionary will change as new words are defined, and the user might write a new error handler or interpreter. ---------------------------------------------------------------------*/ V update_rx(NgaState *vm) { vm->Dictionary = vm->memory[2]; vm->interpret = vm->memory[5]; if (vm->memory[10] != 0) { execute(vm, vm->memory[10]); } } /*=====================================================================*/ V register_device(NgaState *vm, V *handler, V *query) { vm->IO_deviceHandlers[vm->devices] = handler; vm->IO_queryHandlers[vm->devices] = query; vm->devices++; } V load_embedded_image(NgaState *vm) { int i; for (i = 0; i < ngaImageCells; i++) vm->memory[i] = ngaImage[i]; } CELL load_image(NgaState *vm, char *imageFile) { FILE *fp; CELL imageSize = 0; long fileLen; if ((fp = fopen(imageFile, "rb")) != NULL) { /* Determine length (in cells) */ fseek(fp, 0, SEEK_END); fileLen = ftell(fp) / sizeof(CELL); if (fileLen > IMAGE_SIZE) { fclose(fp); printf("\nERROR (nga/ngaLoadImage): Image is larger than alloted space!\n"); exit(1); } rewind(fp); /* Erase old image in memory: 0 = nop instruction */ for (int i = 0; i < IMAGE_SIZE; i++) { vm->memory[i] = 0; } /* Read the file into memory */ imageSize = fread(vm->memory, sizeof(CELL), fileLen, fp); fclose(fp); } return imageSize; } V prepare_vm(NgaState *vm) { vm->active = 0; ACTIVE.ip = ACTIVE.sp = ACTIVE.rp = ACTIVE.u = 0; ACTIVE.active = -1; for (ACTIVE.ip = 0; ACTIVE.ip < IMAGE_SIZE; ACTIVE.ip++) vm->memory[ACTIVE.ip] = 0; /* NO - nop instruction */ for (ACTIVE.ip = 0; ACTIVE.ip < STACK_DEPTH; ACTIVE.ip++) ACTIVE.data[ACTIVE.ip] = 0; for (ACTIVE.ip = 0; ACTIVE.ip < ADDRESSES; ACTIVE.ip++) ACTIVE.address[ACTIVE.ip] = 0; } V i_no(NgaState *vm) { #ifndef BRANCH_PREDICTION guard(vm, 0, 0, 0); #endif } V i_li(NgaState *vm) { guard(vm, 0, 1, 0); ACTIVE.sp++; ACTIVE.ip++; TOS = vm->memory[ACTIVE.ip]; } V i_du(NgaState *vm) { guard(vm, 1, 2, 0); ACTIVE.sp++; ACTIVE.data[ACTIVE.sp] = NOS; } V i_dr(NgaState *vm) { guard(vm, 1, 0, 0); ACTIVE.data[ACTIVE.sp] = 0; ACTIVE.sp--; } V i_sw(NgaState *vm) { guard(vm, 2, 2, 0); CELL a; a = TOS; TOS = NOS; NOS = a; } V i_pu(NgaState *vm) { guard(vm, 1, 0, 1); ACTIVE.rp++; TORS = TOS; i_dr(vm); } V i_po(NgaState *vm) { guard(vm, 0, 1, -1); ACTIVE.sp++; TOS = TORS; ACTIVE.rp--; } V i_ju(NgaState *vm) { guard(vm, 1, 0, 0); ACTIVE.ip = TOS - 1; i_dr(vm); } V i_ca(NgaState *vm) { guard(vm, 1, 0, 1); ACTIVE.rp++; TORS = ACTIVE.ip; ACTIVE.ip = TOS - 1; i_dr(vm); } V i_cc(NgaState *vm) { guard(vm, 2, 0, 1); CELL a, b; a = TOS; i_dr(vm); /* Target */ b = TOS; i_dr(vm); /* Flag */ if (b != 0) { ACTIVE.rp++; TORS = ACTIVE.ip; ACTIVE.ip = a - 1; } } V i_re(NgaState *vm) { guard(vm, 0, 0, -1); ACTIVE.ip = TORS; ACTIVE.rp--; } V i_eq(NgaState *vm) { guard(vm, 2, 1, 0); if (ACTIVE.u != 0) { NOS = ((unsigned)NOS == (unsigned)TOS) ? -1 : 0; ACTIVE.u = 0; } else { NOS = (NOS == TOS) ? -1 : 0; } i_dr(vm); } V i_ne(NgaState *vm) { guard(vm, 2, 1, 0); if (ACTIVE.u != 0) { NOS = ((unsigned)NOS != (unsigned)TOS) ? -1 : 0; ACTIVE.u = 0; } else { NOS = (NOS != TOS) ? -1 : 0; } i_dr(vm); } V i_lt(NgaState *vm) { guard(vm, 2, 1, 0); if (ACTIVE.u != 0) { NOS = ((unsigned)NOS < (unsigned)TOS) ? -1 : 0; ACTIVE.u = 0; } else { NOS = (NOS < TOS) ? -1 : 0; } i_dr(vm); } V i_gt(NgaState *vm) { guard(vm, 2, 1, 0); if (ACTIVE.u != 0) { NOS = ((unsigned)NOS > (unsigned)TOS) ? -1 : 0; ACTIVE.u = 0; } else { NOS = (NOS > TOS) ? -1 : 0; } i_dr(vm); } V i_fe(NgaState *vm) { guard(vm, 1, 1, 0); switch (TOS) { case -1: TOS = ACTIVE.sp - 1; break; case -2: TOS = ACTIVE.rp; break; case -3: TOS = IMAGE_SIZE; break; case -4: TOS = CELL_MIN; break; case -5: TOS = CELL_MAX; break; default: TOS = vm->memory[TOS]; break; } } V i_st(NgaState *vm) { guard(vm, 2, 0, 0); vm->memory[TOS] = NOS; i_dr(vm); i_dr(vm); } V i_ad(NgaState *vm) { guard(vm, 2, 1, 0); if (ACTIVE.u != 0) { NOS = (unsigned)NOS + (unsigned)TOS; ACTIVE.u = 0; } else { NOS += TOS; } i_dr(vm); } V i_su(NgaState *vm) { guard(vm, 2, 1, 0); if (ACTIVE.u != 0) { NOS = (unsigned)NOS - (unsigned)TOS; ACTIVE.u = 0; } else { NOS -= TOS; } i_dr(vm); } V i_mu(NgaState *vm) { guard(vm, 2, 1, 0); if (ACTIVE.u != 0) { NOS = (unsigned)NOS * (unsigned)TOS; ACTIVE.u = 0; } else { NOS *= TOS; } i_dr(vm); } V i_di(NgaState *vm) { guard(vm, 2, 2, 0); CELL a, b; a = TOS; b = NOS; if (b == 0) { #ifdef ENABLE_ERROR if (vm->ErrorHandlers[6] != 0) { } #endif } if (ACTIVE.u != 0) { TOS = (unsigned)b / (unsigned)a; NOS = (unsigned)b % (unsigned)a; ACTIVE.u = 0; } else { TOS = b / a; NOS = b % a; } } V i_an(NgaState *vm) { guard(vm, 2, 1, 0); NOS = TOS & NOS; i_dr(vm); } V i_or(NgaState *vm) { guard(vm, 2, 1, 0); NOS = TOS | NOS; i_dr(vm); } V i_xo(NgaState *vm) { guard(vm, 2, 1, 0); NOS = TOS ^ NOS; i_dr(vm); } V i_sh(NgaState *vm) { guard(vm, 2, 1, 0); CELL y = TOS; CELL x = NOS; if (TOS < 0) NOS = NOS << (0 - TOS); else { if (ACTIVE.u != 0) { NOS = (unsigned)x >> (unsigned)y; ACTIVE.u = 0; } else { if (x < 0 && y > 0) NOS = x >> y | ~(~0U >> y); else NOS = x >> y; } } i_dr(vm); } V i_zr(NgaState *vm) { guard(vm, 1, 0, 0); if (TOS == 0) { i_dr(vm); ACTIVE.ip = TORS; ACTIVE.rp--; } } V i_ha(NgaState *vm) { guard(vm, 0, 0, 0); ACTIVE.ip = IMAGE_SIZE; ACTIVE.rp = 0; exit(0); } V i_ie(NgaState *vm) { guard(vm, 1, 1, 0); stack_push(vm, vm->devices); } V i_iq(NgaState *vm) { guard(vm, 1, 1, 0); vm->IO_queryHandlers[stack_pop(vm)](vm); } V i_ii(NgaState *vm) { guard(vm, 1, 0, 0); vm->IO_deviceHandlers[stack_pop(vm)](vm); } Handler instructions[] = { i_no, i_li, i_du, i_dr, i_sw, i_pu, i_po, i_ju, i_ca, i_cc, i_re, i_eq, i_ne, i_lt, i_gt, i_fe, i_st, i_ad, i_su, i_mu, i_di, i_an, i_or, i_xo, i_sh, i_zr, i_ha, i_ie, i_iq, i_ii }; V process_opcode(NgaState *vm, CELL opcode) { #ifdef FAST switch (opcode) { case 0: break; case 1: i_li(vm); break; case 2: i_du(vm); break; case 3: i_dr(vm); break; case 4: i_sw(vm); break; case 5: i_pu(vm); break; case 6: i_po(vm); break; case 7: i_ju(vm); break; case 8: i_ca(vm); break; case 9: i_cc(vm); break; case 10: i_re(vm); break; case 11: i_eq(vm); break; case 12: i_ne(vm); break; case 13: i_lt(vm); break; case 14: i_gt(vm); break; case 15: i_fe(vm); break; case 16: i_st(vm); break; case 17: i_ad(vm); break; case 18: i_su(vm); break; case 19: i_mu(vm); break; case 20: i_di(vm); break; case 21: i_an(vm); break; case 22: i_or(vm); break; case 23: i_xo(vm); break; case 24: i_sh(vm); break; case 25: i_zr(vm); break; case 26: i_ha(vm); break; case 27: i_ie(vm); break; case 28: i_iq(vm); break; case 29: i_ii(vm); break; default: break; } #else if (opcode != 0) instructions[opcode](vm); #endif } #ifndef BRANCH_PREDICTION V validate_opcode_bundle(NgaState *vm, CELL opcode) { CELL remainingOpcode = opcode; for (int i = 0; i < 4; i++) { CELL current = remainingOpcode & 0xFF; if (current < 0 || current > 29) { invalid_opcode(vm, opcode); } remainingOpcode >>= 8; } } #endif V verbose_details(NgaState *vm, CELL opcode) { fprintf(stderr, "ip: %lld ", (long long)ACTIVE.ip); fprintf(stderr, "sp: %lld ", (long long)ACTIVE.sp); fprintf(stderr, "rp: %lld ", (long long)ACTIVE.rp); fprintf(stderr, "core: %lld ", (long long)vm->active); fprintf(stderr, "opcode: %lld\n", (long long)opcode); } #define INST(n) ((opcode >> n) & 0xFF) != 0 V process_opcode_bundle(NgaState *vm, CELL opcode) { #ifndef BRANCH_PREDICTION if (INST(0)) instructions[opcode & 0xFF](vm); if (INST(8)) instructions[(opcode >> 8) & 0xFF](vm); if (INST(16)) instructions[(opcode >> 16) & 0xFF](vm); if (INST(24)) instructions[(opcode >> 24) & 0xFF](vm); #else for (size_t i = 0; i < 4; ++i) { uint8_t current = ((uint8_t*)&opcode)[i]; if (unlikely(current > 29)) { invalid_opcode(vm, opcode); } instructions[current](vm); } #endif } #ifdef NEEDS_STRL /*--------------------------------------------------------------------- Copyright (c) 1998, 2015 Todd C. Miller Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------------------*/ size_t strlcat(char *dst, const char *src, size_t dsize) { const char *odst = dst; const char *osrc = src; size_t n = dsize; size_t dlen; /* Find the end of dst and adjust bytes left but don't go past end. */ while (n-- != 0 && *dst != '\0') dst++; dlen = dst - odst; n = dsize - dlen; if (n-- == 0) return(dlen + strlen(src)); while (*src != '\0') { if (n != 0) { *dst++ = *src; n--; } src++; } *dst = '\0'; return(dlen + (src - osrc)); /* count does not include NUL */ } size_t strlcpy(char *dst, const char *src, size_t dsize) { const char *osrc = src; size_t nleft = dsize; /* Copy as many bytes as will fit. */ if (nleft != 0) { while (--nleft != 0) { if ((*dst++ = *src++) == '\0') break; } } /* Not enough room in dst, add NUL and traverse rest of src. */ if (nleft == 0) { if (dsize != 0) *dst = '\0'; /* NUL-terminate dst */ while (*src++) ; } return(src - osrc - 1); /* count does not include NUL */ } #endif