Mercurial > ~dholland > hg > ag > index.cgi
diff tests/agcl/examples/good/jrc.cpp @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/agcl/examples/good/jrc.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,2005 @@ +/* + + Copyright (C) 1989,1990 James A. Roskind, All rights reserved. + + This grammar was developed and written by James A. Roskind. + Copying of this grammar description, as a whole, is permitted + providing this notice is intact and applicable in all complete + copies. Translations as a whole to other parser generator input + languages (or grammar description languages) is permitted + provided that this notice is intact and applicable in all such + copies, along with a disclaimer that the contents are a + translation. The reproduction of derived text, such as modified + versions of this grammar, or the output of parser generators, is + permitted, provided the resulting work includes the copyright + notice "Portions Copyright (c) 1989, 1990 James A. Roskind". + Derived products, such as compilers, translators, browsers, etc., + that use this grammar, must also provide the notice "Portions + Copyright (c) 1989, 1990 James A. Roskind" in a manner + appropriate to the utility, and in keeping with copyright law + (e.g.: EITHER displayed when first invoked/executed; OR displayed + continuously on display terminal; OR via placement in the object + code in form readable in a printout, with or near the title of + the work, or at the end of the file). No royalties, licenses or + commissions of any kind are required to copy this grammar, its + translations, or derivative products, when the copies are made in + compliance with this notice. Persons or corporations that do make + copies in compliance with this notice may charge whatever price + is agreeable to a buyer, for such copies or derivative works. + THIS GRAMMAR IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. + + James A. Roskind + Independent Consultant + 516 Latania Palm Drive + Indialantic FL, 32903 + (407)729-4348 + jar@ileaf.com + or ...!uunet!leafusa!jar + + + ****************************************************************************** + + Translation to AnaGram and Interfacing + Copyright 1993 Parsifal Software. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + ****************************************************************************** + +*/ + +#include "mpp.h" + + +/* + * AnaGram, A System for Syntax Directed Programming + * File generated by: ... + * + * AnaGram Parsing Engine + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef JRC_H +#include "jrc.h" +#endif + +#ifndef JRC_H +#error Mismatched header file +#endif + +#include <ctype.h> +#include <stdio.h> + +#define RULE_CONTEXT (&((PCB).cs[(PCB).ssx])) +#define ERROR_CONTEXT ((PCB).cs[(PCB).error_frame_ssx]) +#define CONTEXT ((PCB).cs[(PCB).ssx]) + + + +cc_pcb_type cc_pcb; +#define PCB cc_pcb +#define CHANGE_REDUCTION(x) cc_change_reduction(cc_##x##_token) +int cc_change_reduction(cc_token_type); + +#define INPUT_VALUE(type) *(type *) &(PCB).input_value + +#line - "jrc.syn" + // Embedded C + +#define SYNTAX_ERROR syntax_error(PCB.error_message) +#define INPUT_CODE(T) (T).id + +static int typedef_flag = 0; +static int use_count = 0; + +symbol_type_enum symbol_table[N_SYMBOLS]; + + +static void do_typedef(token t) { + if (typedef_flag == 0) return; + typedef_flag = 0; + symbol_table[t.handle] = typedef_name; +} + +static token check_typedef(token t) { + if (symbol_table[t.handle] == typedef_name) + CHANGE_REDUCTION(TYPEDEFname); + return t; +} + +// Member Functions for Class c_parser + +// Constructor + +/* + This parser has no provisions for multiple simultaneous parses or for + recursion. The purpose of use_count is to make sure that there is only one + copy of the parser active at any time. +*/ + + +c_parser::c_parser() { + assert(use_count == 0); + use_count++; + typedef_flag = 0; + memset(symbol_table, 0, sizeof(symbol_table)); + init_cc(); // init parse +} + + +// Destructor + +c_parser::~c_parser() { + use_count--; // Makes parser available +} + + +// Reset Parser + +c_parser &reset(c_parser &c) { + typedef_flag = 0; + memset(symbol_table, 0, sizeof(symbol_table)); + init_cc(); // init parse + return c; +} + + +// Transmit token to c_parser + +/* + The overloaded operator "<<" is used to transmit data to a parser. + Newline tokens are filtered out, since they are passed along by the + token scanner only in case text output of the preprocessor is + required. + + If the parser has encountered an error, there is no point in giving + it any further input. + + Otherwise, the input_code and input_value fields of the pcb are set + up and cc() is called to deal with the token. +*/ + +token_sink &c_parser::operator << (token c) { + if (PCB.exit_flag != AG_RUNNING_CODE || (int) c.id == '\n') return *this; + PCB.input_code = c.id; + PCB.input_value = c; + cc(); + return *this; +} + +token_sink &c_parser::operator << (token *s) { + while (s->id != END_OF_FILE && PCB.exit_flag == AG_RUNNING_CODE) { + if ((int) s->id == 10) continue; + PCB.input_code = s->id; + PCB.input_value = *s++; + cc(); + } + return *this; +} + +#line - "jrc.cpp" + +#ifndef CONVERT_CASE +#define CONVERT_CASE(c) (c) +#endif +#ifndef TAB_SPACING +#define TAB_SPACING 8 +#endif + +static void ag_rp_1(void) { +#line - "jrc.syn" + typedef_flag = 1; +#line - "jrc.cpp" +} + +static void ag_rp_2(int f) { +#line - "jrc.syn" + typedef_flag = f; +#line - "jrc.cpp" +} + +static int ag_rp_3(void) { +#line - "jrc.syn" +int f = typedef_flag; typedef_flag = 0; return f; +#line - "jrc.cpp" +} + +static void ag_rp_4(token s) { +#line - "jrc.syn" + do_typedef(s); +#line - "jrc.cpp" +} + +static token ag_rp_5(token t) { +#line - "jrc.syn" + return check_typedef(t); +#line - "jrc.cpp" +} + + +#ifndef AG_TRACE_FILE_NAME +#define AG_TRACE_FILE_NAME "jrc.etr" +#endif + +static void ag_trace_error(void) { + FILE *ag_file = fopen(AG_TRACE_FILE_NAME, "w"); + int i; + if (ag_file == NULL) return; + fprintf(ag_file, "%d\n", (PCB).ssx); + for (i = 0; i < (PCB).ssx; i++) fprintf(ag_file, "%d\n", (PCB).ss[i]); + fprintf(ag_file, "%d\n", (PCB).sn); + fprintf(ag_file, "%d\n", (PCB).token_number); + fclose(ag_file); +} + + +#define READ_COUNTS +#define WRITE_COUNTS +#undef V +#define V(i,t) (*t (&(PCB).vs[(PCB).ssx + i])) +#undef VS +#define VS(i) (PCB).vs[(PCB).ssx + i] + +#ifndef GET_CONTEXT +#define GET_CONTEXT CONTEXT = (PCB).input_context +#endif + +typedef enum { + ag_action_1, + ag_action_2, + ag_action_3, + ag_action_4, + ag_action_5, + ag_action_6, + ag_action_7, + ag_action_8, + ag_action_9, + ag_action_10, + ag_action_11, + ag_action_12 +} ag_parser_action; + + +#ifndef NULL_VALUE_INITIALIZER +#define NULL_VALUE_INITIALIZER = { 0 } +#endif + +static cc_vs_type const ag_null_value NULL_VALUE_INITIALIZER; + +static const unsigned char far ag_rpx[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5 +}; + +#define AG_TCV(x) ag_tcv[(x)] + +static const unsigned char far ag_tcv[] = { + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, + 0, 43, 35, 0, 16, 18, 36, 37, 29, 38, 23, 42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 67, 84, 49, 69, 50, 66, 0, 62, 77, 25, 0, 27, 71,142, + 54, 78, 52, 26, 51, 46, 75, 72, 74, 70, 55, 79, 64, 73, 47, 76, 11, 13, + 0, 20, 0, 21, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,125, 60,127, + 39, 0, 0, 10, 9, 8, 7,186,110,167,155,113,102,166,156,163,118,160, + 137,108,117,164,165,159,115,116,111,168,114,119, 33,109,128,161,107,129, + 120,112,103,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 +}; + +#ifndef SYNTAX_ERROR +#define SYNTAX_ERROR fprintf(stderr,"%s, line %d, column %d\n", \ + (PCB).error_message, (PCB).line, (PCB).column) +#endif + +#ifndef FIRST_LINE +#define FIRST_LINE 1 +#endif + +#ifndef FIRST_COLUMN +#define FIRST_COLUMN 1 +#endif + +#ifndef PARSER_STACK_OVERFLOW +#define PARSER_STACK_OVERFLOW {fprintf(stderr, \ + "\nParser stack overflow, line %d, column %d\n",\ + (PCB).line, (PCB).column);} +#endif + +#ifndef REDUCTION_TOKEN_ERROR +#define REDUCTION_TOKEN_ERROR {fprintf(stderr, \ + "\nReduction token error, line %d, column %d\n", \ + (PCB).line, (PCB).column);} +#endif + + +#ifndef AG_NEWLINE +#define AG_NEWLINE 10 +#endif + +#ifndef AG_RETURN +#define AG_RETURN 13 +#endif + +#ifndef AG_FORMFEED +#define AG_FORMFEED 12 +#endif + +#ifndef AG_TABCHAR +#define AG_TABCHAR 9 +#endif + +static void ag_track(void) { + switch ((PCB).input_code) { + case AG_NEWLINE: + (PCB).column = 1, (PCB).line++; + case AG_RETURN: + case AG_FORMFEED: + break; + case AG_TABCHAR: + (PCB).column += (TAB_SPACING) - ((PCB).column - 1) % (TAB_SPACING); + break; + default: + (PCB).column++; + } + (PCB).read_flag = 1; +} + + +static void ag_prot(void) { + int ag_k; + ag_k = 128 - ++(PCB).btsx; + if (ag_k <= (PCB).ssx) { + ag_trace_error(); + (PCB).exit_flag = AG_STACK_ERROR_CODE; + PARSER_STACK_OVERFLOW; + return; + } + (PCB).bts[(PCB).btsx] = (PCB).sn; + (PCB).bts[ag_k] = (PCB).ssx; + (PCB).vs[ag_k] = (PCB).vs[(PCB).ssx]; + (PCB).ss[ag_k] = (PCB).ss[(PCB).ssx]; +} + +static void ag_undo(void) { + if ((PCB).drt == -1) return; + while ((PCB).btsx) { + int ag_k = 128 - (PCB).btsx; + (PCB).sn = (PCB).bts[(PCB).btsx--]; + (PCB).ssx = (PCB).bts[ag_k]; + (PCB).vs[(PCB).ssx] = (PCB).vs[ag_k]; + (PCB).ss[(PCB).ssx] = (PCB).ss[ag_k]; + } + (PCB).token_number = (cc_token_type) (PCB).drt; + (PCB).ssx = (PCB).dssx; + (PCB).sn = (PCB).dsn; + (PCB).drt = -1; +} + + + +static const int far ag_rtt[] = { + 15,106, 0 +}; + +static const unsigned char far ag_tstt[] = { +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,16,5,0,1,3,4,15,82,83,85,86,87,88,89,91,92,94,95,96,97,98,99,101, + 104,105,106,121,123,169,170,171,179,180,181,182, +186,125,0,15,24,106, +129,128,0,122,124, +186,36,16,0,15,171,179,180,181,182, +186,103,102,36,16,0,15,89,91,101,171,179,180,181,182, +111,110,109,108,107,103,102,0,99,101, +120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,102,0,99,101, + 104, +111,110,109,108,107,103,102,0,99,100,101, +120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,102,0,99,100, + 101,104, +20,16,0,174,185, +84,29,0, +84,29,0, +111,110,109,108,107,103,102,84,0,99,101, +111,110,109,108,107,103,102,84,0,99,100,101, +186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,150,157, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,16,0,15,89,99,101,104,105,106,121,123,171,179,180,181,182, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,16,0,15,89,99,100,101,104,105,106,121,123,171,179,180,181,182, +186,36,16,0,15,89,93,106,145,171,172,173,175,176,177,179,180,181,182, +186,36,16,0,15,89,93,106,145,171,172,173,175,176,177,179,180,181,182, +125,84,0,150, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,16,5,0,15,82,83,85,86,87,88,89,91,92,94,95,96,97,98,99,101,104, + 105,106,121,123,169,170,171,179,180,181,182, +5,0, +125,0, +186,0,15,24,106,138, +186,125,0,15,24,106, +18,0, +20,18,16,0,174,185, +18,0, +186,103,102,36,16,0,15,89,101,171,179,180,181,182, +186,40,39,38,37,36,35,33,27,26,21,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31, + 32,41,44,45,48,53,56,57,59,61,63,65,80, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,18,0,15,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106,121,123, + 140,141,143,146, +20,0, +186,36,16,0,15,89,179,180,181, +186,36,16,0,15,89,93,106,145,172,173,175,176,177,179,180,181, +186,36,16,0,15,89,93,106,145,172,173,175,176,177,179,180,181, +186,36,16,0,15,89,93,106,145,172,173,175,176,177,179,180,181, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,16,0,15,89,99,101,104,105,106,121,123,179,180,181, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,16,0,15,89,99,100,101,104,105,106,121,123,179,180,181, +186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,150, +186,168,167,166,165,164,163,162,161,159,156,155,137,129,128,127,125,120,119, + 118,117,116,115,114,113,112,111,110,109,108,107,103,102,84,40,39,38,37, + 36,35,33,27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41, + 44,45,48,53,56,57,59,61,63,65,81,82,83,85,86,87,88,91,92,94,95,96,97,98, + 99,101,104,105,106,121,123,149,150,151,152,153,154,157,158, +186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,150,157, +125,84,69,29,0,90,150, +186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,150,157, +125,84,69,29,0,90,150, +186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,150,157, +186,36,16,0,15,106,171,173,175,176,177,178,179,180,181,182, +20,16,0,174,185, +186,103,102,36,16,0,15,89,91,101,106,145,171,173,175,176,177,179,180,181, + 182, +125,0,150, +84,69,29,0,90, +186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,150,157, +125,0,150, +84,69,29,0,90, +186,0,15,24,106,138, +127,69,29,0,139, +127,29,0, +125,0, +186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,0,85,91,94,97, + 98,101,104,105,106,121,123,126,130,131,132, +20,16,0,174,185, +20,16,0,174,185, +13,0, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31, +27,26,25,23,20,16,0, +186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,40,39,38,37,36, + 35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,31,32,34,41,44, + 45,48,53,56,57,59,61,63,65,85,91,94,97,98,101,104,105,106,121,123, +43,42,36,0, +38,37,0, +47,46,0, +52,51,50,49,0, +55,54,0, +35,0, +58,0, +60,0, +62,0, +66,64,0, +21,0, +111,110,109,108,107,103,102,0,99,101, +111,110,109,108,107,103,102,0,99,100,101, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,29,20,18,16,0,15,89,99,101,104,105,106,121,123,144,174,179,180, + 181,183,184,185, +186,36,20,16,0,15,89,106,144,145,174,175,176,179,180,181,183,184,185, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,29,20,18,16,0,15,89,99,100,101,104,105,106,121,123,144,174,179, + 180,181,183,184,185, +186,36,20,16,0,15,89,106,144,145,174,175,176,179,180,181,183,184,185, +29,0, +18,0, +29,18,0, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48,53,56,57,59,61,63,65,80, +186,36,16,0,15,179,180,181, +186,103,102,36,16,0,15,89,91,101,179,180,181, +20,16,0,174,185, +84,69,29,0,90, +186,36,16,0,15,106,173,175,176,177,178,179,180,181, +186,103,102,36,16,0,15,89,91,101,106,145,173,175,176,177,179,180,181, +84,69,29,0,90, +84,69,29,0,90, +84,69,29,0,90, +79,78,77,76,75,74,73,72,71,70,69,0,68, +29,0, +84,79,78,77,76,75,74,73,72,71,70,69,67,66,64,62,60,58,55,54,52,51,50,49,47, + 46,43,42,38,37,36,35,29,27,26,25,23,20,16,0, +186,84,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28, + 30,31,32,41,44,45,48,53,56,57,59,61,63,65,81, +84,0, +84,0, +186,0,15,24,106, +16,0, +186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33, + 27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48, + 53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, +16,0, +16,0, +16,0, +84,0, +67,0, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48,53,56,57,59,61,63,65,80, +67,0, +186,168,167,166,165,164,163,162,161,159,156,155,127,125,84,40,39,38,37,36, + 35,33,27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44, + 45,48,53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, +186,111,110,109,108,107,103,102,67,36,16,0, +186,168,167,166,165,164,163,162,161,159,156,155,137,129,128,127,125,120,119, + 118,117,116,115,114,113,112,111,110,109,108,107,103,102,84,40,39,38,37, + 36,35,33,27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41, + 44,45,48,53,56,57,59,61,63,65,81,82,83,85,86,87,88,91,92,94,95,96,97,98, + 99,101,104,105,106,121,123,149,150,151,152,153,154,158, +186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,150, +186,125,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,30, + 31,32,41,44,45,48,53,56,57,59,61,63,65,147, +186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,150, +186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,150, +20,16,0,174,185, +18,0, +186,36,16,0,15,106,171,173,175,176,177,178,179,180,181,182, +18,0, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,18,0,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106,121,123,140, + 141,143, +186,103,102,36,16,0,15,89,101,106,145,171,173,175,176,177,179,180,181,182, +186,36,16,0,15,106,171,173,175,176,177,178,179,180,181,182, +186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,150, +127,29,0, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48,53,56,57,59,61,63,65,80, +186,0,15,24,106, +186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,0,85,91,94,97, + 98,101,104,105,106,121,123,126,130,131,132, +103,102,0,101, +103,102,0,101, +120,119,118,117,116,115,114,113,112,103,102,0,101,104, +186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,67,36,16,0,15, + 89,101,104,105,106,121,123,133,136,179,180,181, +186,67,36,16,0,15,89,93,106,134,136,145,172,173,175,176,177,179,180,181, +84,29,0, +84,29,0, +186,137,129,128,127,120,119,118,117,116,115,114,113,112,103,102,0,85,91,94, + 97,98,101,104,105,106,121,123,130,131,132, +186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,40,39,38,37,36, + 35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,31,32,34,41,44, + 45,48,53,56,57,59,61,63,65,85,91,94,97,98,101,104,105,106,121,123, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30, + 31,32,41,44,45,48,53,56,57,59,61,63,65, +186,0,15,24,106, +186,0,15,24,106, +186,40,39,38,37,36,35,33,27,26,18,16,13,11,10,9,8,7,0,6,12,14,15,19,22,28, + 30,31,32,41,44,45,48,53,56,57,59,61,63,65, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30, + 31,32,41,44,45,48,53,56,57,59,61,63,65, +186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,36,20,18,16,0, + 101,104,105,106,121,123,144,174,183,184,185, +36,20,16,0,144,174,183,184,185, +18,0, +29,18,0, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48,53, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48,53,56, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48,53,56,57, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48,53,56,57,59, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30, + 31,32,41,44,45,48,53,56,57,59,61,63,65, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48,53,56,57,59,61, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,20,18,16,0,15,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106, + 121,123,140,141,143,174,179,180,181,183,184,185, +186,103,102,36,20,16,0,15,89,91,101,144,174,179,180,181,183,184,185, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,20,18,16,0,15,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106, + 121,123,140,141,143,174,175,176,179,180,181,183,184,185, +186,103,102,36,20,16,0,15,89,91,101,106,144,145,174,175,176,179,180,181,183, + 184,185, +186,142,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107, + 103,102,0,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106,121,123,143, +186,0,15, +21,0, +20,18,16,0,174,185, +186,103,102,36,16,0,15,89,101,179,180,181, +186,36,16,0,15,106,173,175,176,177,178,179,180,181, +186,103,102,36,16,0,15,89,101,106,145,173,175,176,177,179,180,181, +186,36,16,0,15,106,173,175,176,177,178,179,180,181, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,30,31, + 32,41,44,45,48,53,56,57,59,61,63,65, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,30,31, + 32,41,44,45,48,53,56,57,59,61,63,65, +84,0, +84,0, +186,84,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28, + 30,31,32,41,44,45,48,53,56,57,59,61,63,65,81, +162,0, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30, + 31,32,41,44,45,48,53,56,57,59,61,63,65, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30, + 31,32,41,44,45,48,53,56,57,59,61,63,65, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30, + 31,32,41,44,45,48,53,56,57,59,61,63,65, +186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33, + 27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48, + 53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, +67,0, +186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33, + 27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48, + 53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, +186,168,167,166,165,164,163,162,161,159,156,155,127,125,84,40,39,38,37,36, + 35,33,27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44, + 45,48,53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, +186,125,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,30, + 31,32,41,44,45,48,53,56,57,59,61,63,65,147,148, +18,0, +20,16,0,174,185, +20,18,16,0,174,185, +20,16,0,174,185, +186,36,16,0,15,106,171,173,175,176,177,178,179,180,181,182, +20,18,16,0,174,185, +127,69,29,0,139, +186,137,129,128,127,120,119,118,117,116,115,114,113,112,103,102,0,85,91,94, + 97,98,101,104,105,106,121,123,130,131,132, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48,53,56,57,59,61,63,65,80, +84,67,29,0,135,136, +84,67,29,0,135,136, +186,67,36,16,0,15,89,133,136,179,180,181, +186,67,36,16,0,15,89,93,106,134,136,145,172,173,175,176,177,179,180,181, +18,0, +29,18,0, +29,21,0, +186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103, + 102,36,20,18,16,0,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106,121, + 123,140,141,143,174,183,184,185, +103,102,36,20,16,0,91,101,144,174,183,184,185, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, +43,42,36,0, +43,42,36,0, +38,37,0, +38,37,0, +47,46,0, +47,46,0, +47,46,0, +47,46,0, +52,51,50,49,0, +52,51,50,49,0, +55,54,0, +35,0, +58,0, +60,0, +67,29,0, +62,0, +18,0, +18,0, +18,0, +186,103,102,36,20,16,0,15,89,101,144,174,179,180,181,183,184,185, +186,103,102,36,20,16,0,15,89,101,106,144,145,174,175,176,179,180,181,183, + 184,185, +186,36,16,0,15,106,173,175,176,177,178,179,180,181, +84,0, +16,0, +29,18,0, +29,18,0, +29,18,0, +186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33, + 27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48, + 53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, +127,29,0, +20,18,16,0,174,185, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,30,31, + 32,41,44,45,48,53,56,57,59,61,63,65, +103,102,36,20,16,0,101,144,174,183,184,185, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32, + 41,44,45,48,53,56,57,59,61,63,65, +20,16,0,174,185, +186,84,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28, + 30,31,32,41,44,45,48,53,56,57,59,61,63,65,81, +186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30, + 31,32,41,44,45,48,53,56,57,59,61,63,65, +186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33, + 27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48, + 53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, +186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33, + 27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48, + 53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, +186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33, + 27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48, + 53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, +186,127,125,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28, + 30,31,32,41,44,45,48,53,56,57,59,61,63,65,147, +84,0, +29,18,0, +160,0, +186,40,39,38,37,36,35,33,27,26,18,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28, + 30,31,32,41,44,45,48,53,56,57,59,61,63,65,81, +84,0, +186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33, + 27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48, + 53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, +18,0, +186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33, + 27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48, + 53,56,57,59,61,63,65,81,106,149,150,151,152,153,154, + 0 +}; + + +static unsigned const char far ag_astt[5043] = { + 2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,8,7,0,1,1,2,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,7,1,1,1,1,1,7,2,1,2,1,1,7,2,1,1, + 1,1,1,2,1,1,1,1,7,2,3,1,1,3,3,1,3,3,3,3,3,3,2,9,9,5,3,3,9,9,9,9,9,9,9,9,9, + 3,3,3,3,2,9,9,5,3,3,3,9,9,9,9,2,9,9,5,3,3,3,9,9,9,9,9,9,9,9,9,9,9,9,9,2,9, + 9,5,3,3,3,3,1,1,5,3,1,3,1,7,3,1,7,3,3,3,3,2,9,9,3,5,3,3,9,9,9,9,2,9,9,3,5, + 3,3,3,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,3,1,2,1,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,9,9,1,1,7,2,1,3,3, + 3,3,3,1,3,1,1,1,1,1,2,1,4,4,3,3,3,3,3,3,3,3,3,9,9,9,9,2,9,9,1,1,7,2,1,3,3, + 3,3,3,3,1,3,1,1,1,1,1,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,2,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,3,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1, + 1,5,7,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,3,7,1,5,2, + 7,1,1,1,1,2,1,7,1,1,1,1,7,1,3,1,7,3,1,1,7,2,9,9,1,1,7,2,3,3,3,3,1,3,3,2,1, + 1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,5,2,1,1,7,2,1,1,1,1,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1, + 1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,4,3, + 3,3,3,3,3,3,3,3,3,3,3,3,2,9,9,1,1,7,2,1,3,3,3,3,3,1,3,1,1,1,2,1,4,4,3,3,3, + 3,3,3,3,3,3,9,9,9,9,2,9,9,1,1,7,2,1,3,3,3,3,3,3,1,3,1,1,1,2,1,4,4,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,2,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1, + 1,1,1,1,1,1,1,1,1,1,1,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,8,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,4,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,5,1, + 5,7,3,3,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,3,1,1,5,1,5,7,3,3,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,2,1,1,7,2,1,1,1,1,1,1,1, + 1,1,1,1,1,1,5,3,1,2,1,1,1,1,7,2,3,1,1,1,3,3,3,3,3,3,3,1,3,3,1,5,3,5,1,5,7, + 3,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,3,1,1,5,3,5,1,5,7,3,2,7,1,1,1,1,5,1,5,7,3,3,1,7,1,5,2,1,4,4,1, + 1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,3,1,1,1,5,3,1,9, + 5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,2,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,7,1,1,1,1,1,3,1,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1, + 1,3,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,9,9,1,1,1,1,5,2,1, + 4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,5,1,1,5,1, + 1,1,1,5,1,1,5,1,5,1,5,1,5,1,5,1,1,5,3,7,3,3,3,3,2,9,9,5,3,3,9,9,9,9,2,9,9, + 5,3,3,3,2,1,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,9,9,1,5,1,5,1,7,2,3,3,3,3,3,3, + 1,3,3,3,3,1,3,3,3,1,2,1,1,1,5,2,3,1,3,3,3,3,3,3,1,3,3,3,1,2,1,4,4,3,3,3,3, + 3,3,3,3,3,9,9,9,9,2,9,9,1,5,1,5,1,7,2,3,3,3,3,3,3,3,1,3,3,3,3,1,3,3,3,1,2, + 1,1,1,5,2,3,1,3,3,3,3,3,3,1,3,3,3,1,1,5,3,7,1,3,7,2,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,2,1,1,1,2,1,1, + 1,1,7,2,3,1,1,3,1,3,1,1,5,3,1,5,1,5,7,3,2,1,1,7,2,1,1,1,1,1,1,1,1,1,2,1,1, + 1,1,7,2,3,1,1,1,3,3,3,3,3,3,1,3,5,1,5,7,3,5,1,5,7,3,5,1,5,7,3,1,1,1,1,1,1, + 1,1,1,1,1,5,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,7,2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,3,7,2,7,1,1,1,1,7,2,1,1,1,1,1,1,1,1,1, + 1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,7,1,7,3,7,1,7,2,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,2,1,1,1,1,1,1,1,1, + 1,1,1,3,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,5,7,2,1,1,1,1,1,1,1, + 1,1,1,1,1,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,8,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,2,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,2,1,4,4,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,2,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1, + 4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,3,1,1,7,1,1,1,7,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,7,2,1,4,4,1,1,1,1, + 1,1,1,1,1,1,1,1,1,2,1,1,3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,9,9, + 1,1,7,2,3,3,1,3,3,3,3,3,3,3,1,3,3,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,2,1,4,4, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,3,3,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,3,3,2,7,1,1,1,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,9,9,5,3,9,9,5,3,9,9,9,9,9,9,9,9,9,9,9,5,3,3,2,1,4,4,3,3,3,3,3,3, + 3,3,3,9,9,1,1,1,7,2,1,3,3,3,3,1,3,3,3,1,1,1,2,1,1,1,7,2,1,1,1,3,3,1,1,1,1, + 1,1,1,1,1,3,1,7,3,1,7,2,1,4,4,3,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1, + 1,1,3,1,1,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,7, + 3,3,3,2,7,3,3,3,2,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,4,3,3,3,3,3,3,3,3,3,9,9,1,1,5,1,7,3,3,3,3, + 1,3,3,3,3,3,1,1,1,1,5,3,3,3,3,1,1,7,1,3,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,7,1,1,1,1,1,3,1,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,3,2, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,3,2,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1, + 1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,2,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1, + 1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1, + 1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4, + 4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,3,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,5,2,3,1,1,3,3,3,1,3,3,3,1,2,1,4,4,1, + 1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,3,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,5,2,3,1,1,1,3,3,3,3,3,3,1,3,3,3,1,2, + 3,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,3,2,7,3,3,7,1,3,1,7,3,1,2,9,9,1,1,7,2,3,3,3,1,3,2,1,1,7,2,1,1,1,1,1,1,1, + 1,1,2,9,9,1,1,7,2,3,3,1,3,3,3,3,3,3,1,3,2,1,1,7,2,1,1,1,1,1,1,1,1,1,2,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3, + 7,3,7,2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3, + 3,3,3,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,2,1,1,1,1,1,1, + 1,1,1,1,1,3,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,1,1,5,3,1,1,3,1,7,1,1,1, + 1,5,3,1,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,3,1,7,1,1,5,1,5,7,3,2,1,4,4,3,1, + 1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,3,1,1,2,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,5,1,5,7,3,3,5,1,5,7,3, + 3,2,1,1,1,7,2,1,3,3,1,1,1,2,1,1,1,7,2,1,1,1,3,3,1,1,1,1,1,1,1,1,1,3,7,1,3, + 7,1,3,7,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,3,1,7,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,3,3,3,3,1,2,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,3,1,1,1,5,1,1,1,5,1,1,5,1,1,5,1,1,5,1,1, + 5,1,1,5,1,1,5,1,1,1,1,5,1,1,1,1,5,1,1,5,1,5,1,5,1,5,1,1,7,1,5,3,7,3,7,1,7, + 2,9,9,1,1,1,5,2,3,3,3,3,3,1,3,3,3,1,2,9,9,1,1,1,5,2,3,3,1,3,3,3,3,3,3,1,3, + 3,3,1,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,7,1,7,1,1,7,1,1,7,1,1,7,2,1,1,1,1,1,1, + 1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,1,7,1,3,1,7,1,1,2,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,9,9,1,1,1,5,3,3,3, + 3,3,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,3,1,1,5,3,1,2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3, + 3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1, + 1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1, + 1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,7,1,1,7,1,5,2,1,1,1,1,1,1,1,1,1,8, + 1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,2,1,1,1,1, + 1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,8,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,3,3,3,3,3,3,11 +}; + + +static const unsigned short far ag_pstt[] = { +312,1,148,148,6,6,6,6,6,6,6,6,6,16,16,16,16,132,15,15,4,3,21,0,0,20,21,287, + 20,13,12,11,10,16,19,15,18,17,8,7,6,5,16,15,6,12,5,2,12,20,20,14,19,9, + 19,14, +312,23,1,22,22,22, +24,24,2,146,24, +312,4,3,3,287,25,27,26,27,25, +312,28,28,4,3,4,287,282,28,28,290,282,9,282,290, +126,126,126,126,132,131,131,102,126,131, +119,119,119,119,119,119,119,119,119,112,112,112,112,132,118,118,100,112,118, + 119, +128,128,128,128,132,128,128,99,128,128,128, +115,115,115,115,115,115,115,115,115,114,114,114,114,132,114,114,97,114,114, + 114,115, +29,30,280,284,31, +90,32,10, +89,33,11, +120,120,120,120,132,125,125,88,101,120,125, +122,122,122,122,132,122,122,87,98,122,122,122, +312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,14,38,13,12,11,10, + 37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,247,38, +312,1,148,148,117,117,117,117,117,117,117,117,117,104,104,104,104,132,107, + 107,4,3,15,287,41,104,107,117,124,130,2,124,40,41,9,41,40, +312,1,148,148,113,113,113,113,113,113,113,113,113,105,105,105,105,132,105, + 105,4,3,16,287,43,105,105,105,113,121,127,2,121,42,43,9,43,42, +312,47,45,17,287,48,49,46,49,44,49,49,49,49,49,48,9,48,44, +312,47,45,18,287,51,52,46,52,50,52,52,52,52,52,51,9,51,50, +39,241,19,242, +312,1,148,148,6,6,6,6,6,6,6,6,6,16,16,16,16,132,15,15,4,3,2,20,287,238,13, + 12,11,10,16,19,15,18,17,8,7,6,5,16,15,6,12,5,2,12,238,238,14,19,9,19,14, +3,21, +53,171, +312,23,54,54,54,55, +312,57,24,56,56,56, +58,25, +29,288,30,26,284,31, +59,27, +312,107,107,4,3,28,287,283,107,291,283,9,283,291, +312,62,62,62,62,62,62,61,63,64,301,66,60,65,65,65,65,65,29,65,60,65,65,65, + 67,62,67,67,68,69,70,71,72,73,74,75,76,77,77, +312,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,299,30,86,79,78,82,80, + 83,81,8,7,6,5,82,80,6,78,5,2,78,85,84,84,86, +87,298, +312,89,88,32,287,91,91,90,91, +312,93,92,33,287,94,94,46,94,94,94,94,94,94,94,90,94, +312,93,92,34,287,49,49,46,49,49,49,49,49,49,49,90,49, +312,93,92,35,287,52,52,46,52,52,52,52,52,52,52,90,52, +312,1,148,148,117,117,117,117,117,117,117,117,117,104,104,104,104,132,107, + 107,89,88,36,287,95,104,107,117,124,130,2,124,95,90,95, +312,1,148,148,113,113,113,113,113,113,113,113,113,105,105,105,105,132,105, + 105,89,88,37,287,96,105,105,105,113,121,127,2,121,96,90,96, +312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,38,223,13,12,11,10, + 37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,252, +312,100,101,102,103,104,105,106,107,108,110,111,1,148,148,218,39,6,6,6,6,6, + 6,6,6,6,37,37,37,37,132,36,36,109,62,62,62,62,62,62,61,63,64,66,60,65, + 65,65,65,65,39,113,65,60,65,99,98,65,112,98,97,62,67,67,68,69,70,71,72, + 73,74,75,76,98,109,115,13,12,11,10,37,36,35,34,8,7,6,5,37,36,6,12,114,2, + 12,113,113,113,113,113,113,115,113, +312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,40,116,13,12,11,10, + 37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,251,116, +39,202,117,202,41,92,246, +312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,42,118,13,12,11,10, + 37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,250,118, +39,202,117,202,43,91,245, +312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,44,119,13,12,11,10, + 37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,249,119, +312,47,122,45,287,120,25,121,123,123,121,120,27,26,27,25, +29,124,261,262,31, +312,125,125,47,126,47,287,282,125,125,46,265,290,272,265,265,272,282,9,282, + 290, +39,258,244, +202,117,202,49,95, +312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,50,127,13,12,11,10, + 37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,248,127, +39,258,243, +202,117,202,52,94, +312,53,54,54,54,128, +174,129,174,54,172, +169,130,55, +131,151, +312,1,148,148,134,134,134,134,134,134,134,134,134,135,135,57,133,135,136, + 134,132,135,134,133,132,2,133,139,139,138,137, +29,124,293,294,31, +29,124,285,286,31, +10,13, +312,62,62,62,62,62,62,61,63,64,140,60,65,65,65,65,65,61,65,60,65,65,65,29, + 62, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,62,65,60,65,65,65,28,62, + 28, +312,62,62,62,62,62,62,61,63,64,141,60,65,65,65,65,65,63,65,60,65,65,65,27, + 62, +312,62,62,62,62,62,62,61,63,64,141,60,65,65,65,65,65,64,65,60,65,65,65,26, + 62, +22,21,142,143,145,144,25, +312,1,148,148,134,134,134,134,134,134,134,134,134,146,146,62,62,62,62,62,62, + 61,63,64,66,60,65,65,65,65,65,66,65,60,65,65,149,65,149,97,62,67,148,67, + 68,69,70,71,72,73,74,75,76,149,133,146,147,134,132,146,134,133,132,2, + 133, +150,151,152,43, +153,154,46, +155,156,49, +157,158,159,160,54, +161,162,57, +163,59, +164,61, +165,63, +166,65, +167,168,67, +302,77, +120,120,120,120,132,125,125,101,120,125, +122,122,122,122,132,122,122,98,122,122,122, +312,1,148,148,117,117,117,117,117,117,117,117,117,104,104,104,104,132,107, + 107,170,191,29,191,169,80,287,193,104,107,117,124,130,2,124,192,192,193, + 90,193,192,192,31, +312,172,29,171,187,287,189,46,188,190,188,190,190,189,90,189,188,188,31, +312,1,148,148,113,113,113,113,113,113,113,113,113,105,105,105,105,132,105, + 105,170,184,29,184,169,82,287,186,105,105,105,113,121,127,2,121,185,185, + 186,90,186,185,185,31, +312,172,29,171,180,287,182,46,181,183,181,183,183,182,90,182,181,181,31, +173,176, +300,85, +174,292,86, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,87,65,60,65,65,65,67,62, + 67,67,68,69,70,71,72,73,74,75,76,175,175, +312,89,88,88,287,27,176,27, +312,177,177,89,88,89,287,282,177,177,282,90,282, +29,124,280,284,31, +202,117,202,91,93, +312,93,178,92,287,120,121,123,123,121,120,27,176,27, +312,179,179,93,180,93,287,282,179,179,46,265,272,265,265,272,282,90,282, +202,117,202,94,96, +202,117,202,95,92, +202,117,202,96,91, +181,181,181,181,181,181,181,181,181,181,181,37,181, +182,86, +11,11,11,11,11,11,11,11,11,11,11,11,196,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,99, +312,183,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,100,65,60,65,65,98, + 65,98,97,62,67,67,68,69,70,71,72,73,74,75,76,98,183, +235,101, +234,102, +312,103,184,184,184, +185,104, +312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61, + 63,64,66,60,65,65,65,65,65,105,186,65,60,65,99,98,65,112,98,97,62,67,67, + 68,69,70,71,72,73,74,75,76,98,109,112,186,186,186,186,186,186, +187,106, +188,107, +189,108, +226,109, +190,110, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,111,65,60,65,65,65,67, + 62,67,67,68,69,70,71,72,73,74,75,76,191,191, +192,112, +312,100,101,102,103,104,105,106,107,108,110,111,220,39,109,62,62,62,62,62, + 62,61,63,64,66,60,65,65,65,65,65,113,225,65,60,65,99,98,65,112,98,97,62, + 67,67,68,69,70,71,72,73,74,75,76,98,109,112,225,225,225,225,225,225, +129,129,129,129,129,129,129,129,197,129,129,114, +312,100,101,102,103,104,105,106,107,108,110,111,1,148,148,219,39,6,6,6,6,6, + 6,6,6,6,37,37,37,37,132,36,36,109,62,62,62,62,62,62,61,63,64,66,60,65, + 65,65,65,65,115,193,65,60,65,99,98,65,112,98,97,62,67,67,68,69,70,71,72, + 73,74,75,76,98,109,223,13,12,11,10,37,36,35,34,8,7,6,5,37,36,6,12,114,2, + 12,193,193,193,193,193,193,193, +312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,116,223,13,12,11, + 10,37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,256, +312,194,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,117,65,60,65,65,65, + 203,97,62,67,67,68,69,70,71,72,73,74,75,76,203,203, +312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,118,223,13,12,11, + 10,37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,255, +312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,119,223,13,12,11, + 10,37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,254, +29,124,120,195,31, +196,121, +312,47,122,122,287,197,25,121,123,123,121,197,27,26,27,25, +198,123, +312,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,299,124,79,78,82,80, + 83,81,8,7,6,5,82,80,6,78,5,2,78,85,84,84, +312,107,107,47,199,125,287,283,107,46,266,291,273,266,266,273,283,9,283,291, +312,47,122,126,287,200,25,121,123,123,121,200,27,26,27,25, +312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,127,223,13,12,11, + 10,37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,253, +170,130,128, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,129,65,60,65,65,65,67, + 62,67,67,68,69,70,71,72,73,74,75,76,175,175, +312,130,201,201,201, +312,1,148,148,134,134,134,134,134,134,134,134,134,135,135,131,133,135,136, + 134,132,135,134,133,132,2,133,202,202,138,137, +131,131,102,131, +125,125,101,125, +119,119,119,119,119,119,119,119,119,118,118,100,118,119, +312,1,148,148,117,117,117,117,117,117,117,117,117,107,107,203,89,88,135,287, + 204,107,117,124,130,2,124,158,158,204,90,204, +312,203,93,92,136,287,205,205,46,160,160,205,205,205,205,205,205,205,90,205, +157,206,137, +156,207,138, +312,1,148,148,149,134,134,134,134,134,134,134,134,134,135,135,139,133,135, + 136,134,132,135,134,133,132,2,133,155,138,137, +312,1,148,148,134,134,134,134,134,134,134,134,134,146,146,62,62,62,62,62,62, + 61,63,64,66,60,65,65,65,65,65,140,65,60,65,65,149,65,149,97,62,67,208, + 67,68,69,70,71,72,73,74,75,76,149,133,146,147,134,132,146,134,133,132,2, + 133, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,141,65,60,65,65,149,65, + 149,97,62,67,67,68,69,70,71,72,73,74,75,76,149, +312,142,20,20,20, +312,143,19,19,19, +312,62,62,62,62,62,62,61,63,64,17,66,60,65,65,65,65,65,144,65,60,65,65,65, + 209,209,97,62,67,67,68,69,70,71,72,73,74,75,76,209, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,145,65,60,65,65,210,65, + 210,97,62,67,67,68,69,70,71,72,73,74,75,76,210, +312,1,148,148,117,117,117,117,117,117,117,117,117,107,107,212,29,200,211, + 146,107,117,124,130,2,124,201,201,201,201,31, +212,29,211,198,199,199,199,199,31, +213,148, +182,14,149, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,150,65,60,65,65,65,42, + 62,42, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,151,65,60,65,65,65,41, + 62,41, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,152,65,60,65,65,65,40, + 62,40, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,153,65,60,65,65,65,214, + 62,214,214, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,154,65,60,65,65,65,215, + 62,215,215, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,155,65,60,65,65,65,67, + 62,67,67,216, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,156,65,60,65,65,65,67, + 62,67,67,217, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,157,65,60,65,65,65,67, + 62,67,67,68,218, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,158,65,60,65,65,65,67, + 62,67,67,68,219, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,159,65,60,65,65,65,67, + 62,67,67,68,220, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,160,65,60,65,65,65,67, + 62,67,67,68,221, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,161,65,60,65,65,65,67, + 62,67,67,68,69,222, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,162,65,60,65,65,65,67, + 62,67,67,68,69,223, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,163,65,60,65,65,65,67, + 62,67,67,68,69,70,224, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,164,65,60,65,65,65,67, + 62,67,67,68,69,70,71,225, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,165,65,60,65,65,65,67, + 62,67,67,68,69,70,71,72,226, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,166,65,60,65,65,65,67, + 62,67,67,68,69,70,71,72,73,227, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,167,65,60,65,65,228,65, + 228,97,62,67,67,68,69,70,71,72,73,74,75,76,228, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,168,65,60,65,65,65,67, + 62,67,67,68,69,70,71,72,73,74,229, +312,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,170,29,299,169,169, + 287,79,78,82,80,83,81,8,7,6,5,82,80,6,78,5,2,78,85,84,84,230,27,176,27, + 232,231,31, +312,233,233,170,29,169,304,287,282,233,233,306,306,282,90,282,306,306,31, +312,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,172,29,299,171,171, + 287,79,78,82,80,83,81,8,7,6,5,82,80,6,78,5,2,78,85,84,84,230,123,123,27, + 176,27,232,231,31, +312,234,234,172,29,171,304,287,282,234,234,46,306,265,306,265,265,282,90, + 282,306,306,31, +312,177,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,173,79,78,82,80, + 83,81,8,7,6,5,82,80,6,78,5,2,78,179, +312,174,195, +303,175, +29,288,124,176,284,31, +312,107,107,89,88,177,287,283,107,283,90,283, +312,93,178,178,287,197,121,123,123,121,197,27,176,27, +312,107,107,93,235,179,287,283,107,46,266,273,266,266,273,283,90,283, +312,93,178,180,287,200,121,123,123,121,200,27,176,27, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,181,65,60,65,65,65,70, + 97,62,67,67,68,69,70,71,72,73,74,75,76,70, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,182,65,60,65,65,65,83, + 97,62,67,67,68,69,70,71,72,73,74,75,76,83, +236,183, +233,184, +312,236,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,185,65,60,65,65,98, + 65,98,97,62,67,67,68,69,70,71,72,73,74,75,76,98,236, +237,186, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,187,65,60,65,65,238,65, + 238,97,62,67,67,68,69,70,71,72,73,74,75,76,238, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,188,65,60,65,65,239,65, + 239,97,62,67,67,68,69,70,71,72,73,74,75,76,239, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,189,65,60,65,65,240,65, + 240,97,62,67,67,68,69,70,71,72,73,74,75,76,240, +312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61, + 63,64,66,60,65,65,65,65,65,190,217,65,60,65,99,98,65,112,98,97,62,67,67, + 68,69,70,71,72,73,74,75,76,98,109,112,217,217,217,217,217,217, +241,191, +312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61, + 63,64,66,60,65,65,65,65,65,192,215,65,60,65,99,98,65,112,98,97,62,67,67, + 68,69,70,71,72,73,74,75,76,98,109,112,215,215,215,215,215,215, +312,100,101,102,103,104,105,106,107,108,110,111,221,39,109,62,62,62,62,62, + 62,61,63,64,66,60,65,65,65,65,65,193,225,65,60,65,99,98,65,112,98,97,62, + 67,67,68,69,70,71,72,73,74,75,76,98,109,112,225,225,225,225,225,225, +312,194,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,194,65,60,65,65,65, + 242,97,62,67,67,68,69,70,71,72,73,74,75,76,242,242,242, +275,195, +29,124,274,276,31, +29,278,124,197,195,31, +29,124,267,268,31, +312,47,122,199,287,243,25,121,123,123,121,243,27,26,27,25, +29,270,124,200,195,31, +174,129,174,201,173, +312,1,148,148,150,134,134,134,134,134,134,134,134,134,135,135,202,133,135, + 136,134,132,135,134,133,132,2,133,155,138,137, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,203,65,60,65,65,65,67, + 62,67,67,68,69,70,71,72,73,74,75,76,168,168, +166,203,166,204,164,164, +166,203,166,205,162,162, +312,203,89,88,206,287,204,159,159,204,90,204, +312,203,93,92,207,287,205,205,46,161,161,205,205,205,205,205,205,205,90,205, +30,208, +244,18,209, +182,16,210, +312,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,212,29,299,211,211,79, + 78,82,80,83,81,8,7,6,5,82,80,6,78,5,2,78,85,84,84,230,232,231,31, +245,245,212,29,211,304,245,245,306,306,306,306,31, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,213,65,60,65,65,65,38, + 62,38, +150,151,152,45, +150,151,152,44, +153,154,48, +153,154,47, +155,156,53, +155,156,52, +155,156,51, +155,156,50, +157,158,159,160,56, +157,158,159,160,55, +161,162,58, +163,60, +164,62, +165,64, +246,182,228, +166,66, +310,230, +309,231, +247,232, +312,107,107,170,29,169,305,287,283,107,307,307,283,90,283,307,307,31, +312,107,107,172,29,171,305,287,283,107,46,307,266,307,266,266,283,90,283, + 307,307,31, +312,93,178,235,287,243,121,123,123,121,243,27,176,27, +248,236, +249,237, +182,250,238, +182,251,239, +182,252,240, +312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61, + 63,64,66,60,65,65,65,65,65,241,216,65,60,65,99,98,65,112,98,97,62,67,67, + 68,69,70,71,72,73,74,75,76,98,109,112,216,216,216,216,216,216, +204,253,242, +29,271,124,243,195,31, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,244,65,60,65,65,65,24, + 97,62,67,67,68,69,70,71,72,73,74,75,76,24, +107,107,212,29,211,305,107,307,307,307,307,31, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,246,65,60,65,65,65,67, + 62,67,67,68,69,70,71,72,73,74,75,76,68, +29,124,308,311,31, +312,254,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,248,65,60,65,65,98, + 65,98,97,62,67,67,68,69,70,71,72,73,74,75,76,98,254, +312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,249,65,60,65,65,255,65, + 255,97,62,67,67,68,69,70,71,72,73,74,75,76,255, +312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61, + 63,64,66,60,65,65,65,65,65,250,230,65,60,65,99,98,65,112,98,97,62,67,67, + 68,69,70,71,72,73,74,75,76,98,109,112,230,230,230,230,230,230, +312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61, + 63,64,66,60,65,65,65,65,65,251,229,65,60,65,99,98,65,112,98,97,62,67,67, + 68,69,70,71,72,73,74,75,76,98,109,112,229,229,229,229,229,229, +312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61, + 63,64,66,60,65,65,65,65,65,252,256,65,60,65,99,98,65,112,98,97,62,67,67, + 68,69,70,71,72,73,74,75,76,98,109,112,256,256,256,256,256,256, +312,205,194,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,253,65,60,65,65, + 65,208,97,62,67,67,68,69,70,71,72,73,74,75,76,208,208, +257,254, +182,258,255, +259,227, +312,62,62,62,62,62,62,61,63,64,260,66,60,65,65,65,65,65,257,65,60,65,65,98, + 65,98,97,62,67,67,68,69,70,71,72,73,74,75,76,98,260, +231,258, +312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61, + 63,64,66,60,65,65,65,65,65,259,228,65,60,65,99,98,65,112,98,97,62,67,67, + 68,69,70,71,72,73,74,75,76,98,109,112,228,228,228,228,228,228, +261,260, +312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61, + 63,64,66,60,65,65,65,65,65,261,232,65,60,65,99,98,65,112,98,97,62,67,67, + 68,69,70,71,72,73,74,75,76,98,109,112,232,232,232,232,232,232, + 0 +}; + + +static const unsigned short far ag_sbt[] = { + 0, 56, 62, 67, 77, 92, 102, 122, 133, 154, 159, 162, 165, 176, + 188, 232, 269, 307, 326, 345, 349, 402, 404, 406, 412, 418, 420, 426, + 428, 442, 481, 525, 527, 536, 553, 570, 587, 622, 658, 701, 804, 848, + 855, 899, 906, 950, 966, 971, 992, 995,1000,1044,1047,1052,1058,1063, + 1066,1068,1099,1104,1109,1111,1136,1162,1187,1212,1219,1284,1288,1291, + 1294,1299,1302,1304,1306,1308,1310,1313,1315,1325,1336,1379,1398,1442, + 1461,1463,1465,1468,1506,1514,1527,1532,1537,1551,1570,1575,1580,1585, + 1598,1600,1640,1681,1683,1685,1690,1692,1754,1756,1758,1760,1762,1764, + 1802,1804,1867,1879,1981,2024,2064,2107,2150,2155,2157,2173,2175,2217, + 2237,2253,2296,2299,2337,2342,2373,2377,2381,2395,2427,2447,2450,2453, + 2484,2549,2588,2593,2598,2638,2677,2708,2717,2719,2722,2748,2774,2800, + 2827,2854,2882,2910,2939,2968,2997,3026,3056,3086,3117,3149,3182,3216, + 3255,3290,3343,3362,3417,3440,3480,3483,3485,3491,3503,3517,3535,3549, + 3587,3625,3627,3629,3670,3672,3711,3750,3789,3851,3853,3915,3978,4019, + 4021,4026,4032,4037,4053,4059,4064,4095,4133,4139,4145,4157,4177,4179, + 4182,4185,4234,4247,4273,4277,4281,4284,4287,4290,4293,4296,4299,4304, + 4309,4312,4314,4316,4318,4321,4323,4325,4327,4329,4347,4369,4383,4385, + 4387,4390,4393,4396,4458,4461,4467,4505,4517,4554,4559,4600,4639,4701, + 4763,4825,4866,4868,4871,4873,4914,4916,4978,4980,5042 +}; + + +static const unsigned short far ag_sbe[] = { + 23, 58, 64, 70, 82, 99, 118, 129, 149, 156, 161, 164, 173, 184, + 209, 254, 291, 310, 329, 347, 372, 403, 405, 407, 414, 419, 423, 427, + 433, 460, 502, 526, 530, 539, 556, 573, 609, 644, 679, 751, 825, 852, + 876, 903, 927, 953, 968, 976, 993, 998,1021,1045,1050,1053,1061,1065, + 1067,1083,1101,1106,1110,1128,1153,1179,1204,1218,1250,1287,1290,1293, + 1298,1301,1303,1305,1307,1309,1312,1314,1322,1332,1361,1383,1423,1446, + 1462,1464,1467,1485,1509,1519,1529,1535,1540,1556,1573,1578,1583,1596, + 1599,1639,1658,1682,1684,1686,1691,1722,1755,1757,1759,1761,1763,1781, + 1803,1835,1878,1929,2002,2042,2085,2128,2152,2156,2160,2174,2196,2222, + 2240,2274,2298,2316,2338,2357,2375,2379,2392,2413,2431,2449,2452,2469, + 2515,2566,2589,2594,2616,2655,2696,2711,2718,2721,2739,2765,2791,2817, + 2844,2871,2899,2927,2956,2985,3014,3043,3073,3103,3134,3166,3199,3233, + 3272,3314,3349,3386,3423,3461,3481,3484,3488,3496,3506,3522,3538,3566, + 3604,3626,3628,3647,3671,3689,3728,3767,3819,3852,3883,3946,3996,4020, + 4023,4029,4034,4040,4056,4062,4080,4112,4136,4142,4149,4161,4178,4181, + 4184,4209,4239,4264,4276,4280,4283,4286,4289,4292,4295,4298,4303,4308, + 4311,4313,4315,4317,4320,4322,4324,4326,4328,4335,4353,4372,4384,4386, + 4389,4392,4395,4426,4460,4464,4484,4510,4534,4556,4577,4617,4669,4731, + 4793,4844,4867,4870,4872,4891,4915,4946,4979,5010,5042 +}; + + +static const unsigned char far ag_fl[] = { + 1,0,1,2,1,1,1,1,1,1,2,1,1,1,3,1,4,3,4,3,3,2,2,1,3,1,2,2,2,2,4,1,1,1,1, + 1,1,1,4,1,3,3,3,1,3,3,1,3,3,1,3,3,3,3,1,3,3,1,3,1,3,1,3,1,3,1,3,1,5,1, + 3,1,1,1,1,1,1,1,1,1,1,1,1,3,1,0,1,2,2,2,2,3,3,4,3,3,4,1,1,1,1,1,1,1,2, + 2,1,2,1,1,1,1,2,2,2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,1,2,2,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,2,1,0,4,5,2,1,1,1,2,2,2,2,3,2,3,2,1,2,1,0,1,2,4,5,2,2,4,0, + 2,1,3,1,3,1,2,2,2,1,2,2,1,2,2,2,1,2,2,1,3,1,1,1,2,1,2,0,2,3,4,1,1,3,1, + 1,1,1,1,1,3,4,3,2,3,3,4,1,2,1,2,2,5,7,5,5,7,9,3,2,2,3,1,2,1,1,2,2,3,3, + 3,3,2,3,3,3,3,3,4,4,4,4,1,1,1,1,1,2,1,1,2,3,3,4,1,4,5,2,3,3,4,4,1,3,1, + 1,1,2,3,2,3,4,1,3,1,2,3,4,3,4,1,1,1,1,2,3,2,3,4,1,2,2,3,3,3,3,4,1 +}; + +static const unsigned char far ag_ptt[] = { + 0, 4, 4, 1, 6, 6, 6, 6, 6, 12, 12, 14, 14, 14, 14, 19, 19, 19, + 19, 19, 19, 19, 19, 22, 22, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, + 31, 32, 32, 41, 41, 41, 41, 44, 44, 44, 45, 45, 45, 48, 48, 48, 48, 48, + 53, 53, 53, 56, 56, 57, 57, 59, 59, 61, 61, 63, 63, 65, 65, 28, 28, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 17, 17, 80, 81, 81, 82, 82, 82, + 82, 87, 87, 87, 86, 86, 86, 92, 92, 92, 94, 94, 94, 88, 88, 88, 91, 91, + 100,100,101,101, 95, 95, 95, 95, 97, 97, 97, 97, 83, 83, 83, 85, 85, 85, + 96, 96, 96, 98, 98, 98, 99, 99, 99, 99, 99,104,104,104,104,104,104,104, + 104,104,105,105,121,122,122,122,124,124,126,126,130,130,132,132,131,131, + 134,134,133,133,135,135,136,123,123,123,138,138,139,139,140,140,141,141, + 143,143,143,143,143,143,143,143,143,143,143,143,143,143,146,146, 24, 24, + 34, 34, 34, 34, 90, 90,147,147,147,148,148, 2, 2, 2, 2, 2, 2,149, + 149,149,150,150,150,150,157,157,158,158,151,152,152,152,153,153,153,154, + 154,154,154, 3, 3,169,169,169,170,170,170,170,170,170,170,170,170,170, + 170,170,170,170,170, 93, 93,172,172,145,145,145,175,175,175,176,176,173, + 173,173,173,173,177,177,177,178,178, 89, 89,179,179,179,181,181,181,180, + 180,171,171,171,182,182,182,144,144,144,174,174,174,185,185,185,183,183, + 183,183,184,184,184,184, 15 +}; + +static const unsigned char far *ag_valid(int ag_k) { + const unsigned char far *ag_tp = &ag_tstt[ag_sbt[(PCB).sn+1]]; + while (*--ag_tp != (unsigned char) ag_k) if (*ag_tp == 0) return NULL; + return ag_tp; +} + +int cc_change_reduction(cc_token_type ag_k) { + if (!ag_valid(ag_k)) return 0; + (PCB).reduction_token = ag_k; + return 1; +} + +static void ag_default(const int *ag_tp) { + (PCB).ag_dsn = (PCB).sn; + (PCB).ag_dtl = ag_tp; + while (!ag_valid((cc_token_type) *ag_tp)) ag_tp++; + (PCB).reduction_token = (cc_token_type) *ag_tp; +} + + + +static void ag_ra(void) +{ + switch(ag_rpx[(PCB).ag_ap]) { + case 1: ag_rp_1(); break; + case 2: ag_rp_2(V(0,(int *))); break; + case 3: V(0,(int *)) = ag_rp_3(); break; + case 4: ag_rp_4(V(0,(token *))); break; + case 5: ag_default(&ag_rtt[0]); V(0,(token *)) = ag_rp_5(V(0,(token *))); break; + } +} + +#define TOKEN_NAMES cc_token_names +const char *const cc_token_names[187] = { + "prog start", + "prog start", + "statement", + "translation unit", + "", + "eof", + "constant", + "FLOATINGconstant", + "INTEGERconstant", + "OCTALconstant", + "HEXconstant", + "CHARACTERconstant", + "string literal list", + "STRINGliteral", + "primary expression", + "IDENTIFIER", + "'('", + "expression", + "')'", + "postfix expression", + "'['", + "']'", + "argument expression list", + "'.'", + "identifier or typedef name", + "ARROW", + "ICR", + "DECR", + "assignment expression", + "','", + "unary expression", + "unary operator", + "cast expression", + "SIZEOF", + "type name", + "'&'", + "'*'", + "'+'", + "'-'", + "'~'", + "'!'", + "multiplicative expression", + "'/'", + "'%'", + "additive expression", + "shift expression", + "LS", + "RS", + "relational expression", + "'<'", + "'>'", + "LE", + "GE", + "equality expression", + "EQ", + "NE", + "AND expression", + "exclusive OR expression", + "'^'", + "inclusive OR expression", + "'|'", + "logical AND expression", + "ANDAND", + "logical OR expression", + "OROR", + "conditional expression", + "'\\?'", + "':'", + "assignment operator", + "'='", + "MULTassign", + "DIVassign", + "MODassign", + "PLUSassign", + "MINUSassign", + "LSassign", + "RSassign", + "ANDassign", + "ERassign", + "ORassign", + "constant expression", + "expression opt", + "declaration", + "sue declaration specifier", + "';'", + "sue type specifier", + "declaring list", + "default declaring list", + "declaration qualifier list", + "identifier declarator", + "initializer opt", + "type qualifier list", + "declaration specifier", + "declarator", + "type specifier", + "basic declaration specifier", + "typedef declaration specifier", + "basic type specifier", + "typedef type specifier", + "storage class", + "declaration qualifier", + "type qualifier", + "CONST", + "VOLATILE", + "basic type name", + "elaborated type name", + "TYPEDEFname", + "TYPEDEF", + "EXTERN", + "STATIC", + "AUTO", + "REGISTER", + "VOID", + "CHAR", + "SHORT", + "INT", + "LONG", + "FLOAT", + "DOUBLE", + "SIGNED", + "UNSIGNED", + "save flag", + "struct or union specifier", + "enum specifier", + "struct or union", + "'{'", + "struct declaration list", + "'}'", + "STRUCT", + "UNION", + "struct declaration", + "struct declaring list", + "struct default declaring list", + "struct identifier declarator", + "struct declarator", + "bit field size opt", + "bit field size", + "ENUM", + "enumerator list", + "enumerator value opt", + "parameter type list", + "parameter list", + "ELLIPSIS", + "parameter declaration", + "abstract declarator", + "parameter typedef declarator", + "identifier list", + "initializer", + "initializer list", + "labeled statement", + "compound statement", + "expression statement", + "selection statement", + "iteration statement", + "jump statement", + "CASE", + "DEFAULT", + "declaration list", + "statement list", + "IF", + "ELSE", + "SWITCH", + "WHILE", + "DO", + "FOR", + "GOTO", + "CONTINUE", + "BREAK", + "RETURN", + "external definition", + "function definition", + "old function declarator", + "typedef declarator", + "paren typedef declarator", + "postfixing abstract declarator", + "clean typedef declarator", + "clean postfix typedef declarator", + "paren postfix typedef declarator", + "simple paren typedef declarator", + "unary identifier declarator", + "paren identifier declarator", + "postfix identifier declarator", + "postfix old function declarator", + "unary abstract declarator", + "postfix abstract declarator", + "array abstract declarator", + "NAME", + +}; + +#ifndef MISSING_FORMAT +#define MISSING_FORMAT "Missing %s" +#endif +#ifndef UNEXPECTED_FORMAT +#define UNEXPECTED_FORMAT "Unexpected %s" +#endif +#ifndef UNNAMED_TOKEN +#define UNNAMED_TOKEN "input" +#endif + + +static void ag_diagnose(void) { + int ag_snd = (PCB).sn; + int ag_k = ag_sbt[ag_snd]; + + if (*TOKEN_NAMES[ag_tstt[ag_k]] && ag_astt[ag_k + 1] == ag_action_8) { + sprintf((PCB).ag_msg, MISSING_FORMAT, TOKEN_NAMES[ag_tstt[ag_k]]); + } + else if (ag_astt[ag_sbe[(PCB).sn]] == ag_action_8 + && (ag_k = (int) ag_sbe[(PCB).sn] + 1) == (int) ag_sbt[(PCB).sn+1] - 1 + && *TOKEN_NAMES[ag_tstt[ag_k]]) { + sprintf((PCB).ag_msg, MISSING_FORMAT, TOKEN_NAMES[ag_tstt[ag_k]]); + } + else if ((PCB).token_number && *TOKEN_NAMES[(PCB).token_number]) { + sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, TOKEN_NAMES[(PCB).token_number]); + } + else if (isprint(((PCB).input_code)) && ((PCB).input_code) != '\\') { + char buf[20]; + sprintf(buf, "\'%c\'", (char) ((PCB).input_code)); + sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, buf); + } + else sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, UNNAMED_TOKEN); + (PCB).error_message = (PCB).ag_msg; + + +} +static int ag_action_1_r_proc(void); +static int ag_action_2_r_proc(void); +static int ag_action_3_r_proc(void); +static int ag_action_4_r_proc(void); +static int ag_action_1_s_proc(void); +static int ag_action_3_s_proc(void); +static int ag_action_1_proc(void); +static int ag_action_2_proc(void); +static int ag_action_3_proc(void); +static int ag_action_4_proc(void); +static int ag_action_5_proc(void); +static int ag_action_6_proc(void); +static int ag_action_7_proc(void); +static int ag_action_8_proc(void); +static int ag_action_9_proc(void); +static int ag_action_10_proc(void); +static int ag_action_11_proc(void); +static int ag_action_8_proc(void); + + +static int (*const ag_r_procs_scan[])(void) = { + ag_action_1_r_proc, + ag_action_2_r_proc, + ag_action_3_r_proc, + ag_action_4_r_proc +}; + +static int (*const ag_s_procs_scan[])(void) = { + ag_action_1_s_proc, + ag_action_2_r_proc, + ag_action_3_s_proc, + ag_action_4_r_proc +}; + +static int (*const ag_gt_procs_scan[])(void) = { + ag_action_1_proc, + ag_action_2_proc, + ag_action_3_proc, + ag_action_4_proc, + ag_action_5_proc, + ag_action_6_proc, + ag_action_7_proc, + ag_action_8_proc, + ag_action_9_proc, + ag_action_10_proc, + ag_action_11_proc, + ag_action_8_proc +}; + + +static int ag_action_10_proc(void) { + (PCB).btsx = 0, (PCB).drt = -1; + ag_track(); + return 0; +} + +static int ag_action_11_proc(void) { + (PCB).btsx = 0, (PCB).drt = -1; + (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value; + (PCB).ssx--; + ag_ra(); + (PCB).ssx++; + ag_track(); + return 0; +} + +static int ag_action_3_r_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + (PCB).btsx = 0, (PCB).drt = -1; + (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_3_s_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + (PCB).btsx = 0, (PCB).drt = -1; + (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_4_r_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap]; + return 1; +} + +static int ag_action_2_proc(void) { + (PCB).btsx = 0, (PCB).drt = -1; + if ((PCB).ssx >= 128) { + ag_trace_error(); + (PCB).exit_flag = AG_STACK_ERROR_CODE; + PARSER_STACK_OVERFLOW; + } + (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value; + (PCB).ss[(PCB).ssx] = (PCB).sn; + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + ag_track(); + return 0; +} + +static int ag_action_9_proc(void) { + if ((PCB).drt == -1) { + (PCB).drt=(PCB).token_number; + (PCB).dssx=(PCB).ssx; + (PCB).dsn=(PCB).sn; + } + ag_prot(); + (PCB).ss[(PCB).ssx] = (PCB).sn; + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_2_r_proc(void) { + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + return 0; +} + +static int ag_action_7_proc(void) { + --(PCB).ssx; + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_1_proc(void) { + (PCB).exit_flag = AG_SUCCESS_CODE; + ag_track(); + return 0; +} + +static int ag_action_1_r_proc(void) { + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_1_s_proc(void) { + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_4_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap]; + (PCB).btsx = 0, (PCB).drt = -1; + (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else (PCB).ss[(PCB).ssx] = (PCB).sn; + ag_track(); + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (PCB).reduction_token) { + (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error(); + REDUCTION_TOKEN_ERROR; break;} + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return 0; +} + +static int ag_action_3_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + (PCB).btsx = 0, (PCB).drt = -1; + (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else (PCB).ss[(PCB).ssx] = (PCB).sn; + ag_track(); + (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (PCB).reduction_token) { + (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error(); + REDUCTION_TOKEN_ERROR; break;} + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return 0; +} + +static int ag_action_8_proc(void) { + ag_undo(); + ag_trace_error(); + (PCB).exit_flag = AG_SYNTAX_ERROR_CODE; + ag_diagnose(); + SYNTAX_ERROR; + ag_track(); + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_5_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap]; + (PCB).btsx = 0, (PCB).drt = -1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else { + (PCB).ss[(PCB).ssx] = (PCB).sn; + } + (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (PCB).reduction_token) { + (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error(); + REDUCTION_TOKEN_ERROR; break;} + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_6_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap]; + (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap]; + if ((PCB).drt == -1) { + (PCB).drt=(PCB).token_number; + (PCB).dssx=(PCB).ssx; + (PCB).dsn=(PCB).sn; + } + if (ag_sd) { + (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + } + else { + ag_prot(); + (PCB).vs[(PCB).ssx] = ag_null_value; + (PCB).ss[(PCB).ssx] = (PCB).sn; + } + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (PCB).reduction_token) { + (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error(); + REDUCTION_TOKEN_ERROR; break;} + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return (PCB).exit_flag == AG_RUNNING_CODE; +} + + +void init_cc(void) { + unsigned ag_t1; + ag_t1 = 0; + (PCB).ss[0] = (PCB).sn = (PCB).ssx = 0; + (PCB).exit_flag = AG_RUNNING_CODE; + (PCB).line = FIRST_LINE; + (PCB).column = FIRST_COLUMN; + (PCB).btsx = 0, (PCB).drt = -1; + while (ag_tstt[ag_t1] == 0) { + (PCB).ag_ap = ag_pstt[ag_t1]; + (ag_gt_procs_scan[ag_astt[ag_t1]])(); + ag_t1 = ag_sbt[(PCB).sn]; + } +} + +void cc(void) { + (PCB).token_number = (cc_token_type) AG_TCV((PCB).input_code); + while (1) { + unsigned ag_t1 = ag_sbt[(PCB).sn]; + unsigned ag_t2 = ag_sbe[(PCB).sn] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] > (unsigned char)(PCB).token_number) + ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (unsigned char)(PCB).token_number) + ag_t1 = ag_sbe[(PCB).sn]; + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_gt_procs_scan[ag_astt[ag_t1]])() == 0) break; + } +} + +