From f0b0d219cbeb25cfd6381b21107f507524eae0c4 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 2 Jun 2016 16:21:18 +0200 Subject: [Minor] Declare function non-static --- src/libserver/protocol.c | 2 +- src/libserver/protocol.h | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c index d314d3fdc..fa4f20e09 100644 --- a/src/libserver/protocol.c +++ b/src/libserver/protocol.c @@ -873,7 +873,7 @@ rspamd_metric_result_ucl (struct rspamd_task *task, return obj; } -static void +void rspamd_ucl_torspamc_output (struct rspamd_task *task, ucl_object_t *top, rspamd_fstring_t **out) diff --git a/src/libserver/protocol.h b/src/libserver/protocol.h index 3c8383565..186ed939a 100644 --- a/src/libserver/protocol.h +++ b/src/libserver/protocol.h @@ -82,5 +82,14 @@ ucl_object_t * rspamd_protocol_write_ucl (struct rspamd_task *task); */ void rspamd_protocol_write_reply (struct rspamd_task *task); +/** + * Convert rspamd output to legacy protocol reply + * @param task + * @param top + * @param out + */ +void rspamd_ucl_torspamc_output (struct rspamd_task *task, + ucl_object_t *top, + rspamd_fstring_t **out); #endif -- cgit v1.2.3 From 4ea9e0293d8490d3a2775a4391518f61537d56ab Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 2 Jun 2016 22:00:43 +0200 Subject: [Minor] Simplify rspamc conversion routines --- src/libserver/protocol.c | 16 +++++++++------- src/libserver/protocol.h | 3 +-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c index fa4f20e09..a48de05dc 100644 --- a/src/libserver/protocol.c +++ b/src/libserver/protocol.c @@ -874,8 +874,7 @@ rspamd_metric_result_ucl (struct rspamd_task *task, } void -rspamd_ucl_torspamc_output (struct rspamd_task *task, - ucl_object_t *top, +rspamd_ucl_torspamc_output (const ucl_object_t *top, rspamd_fstring_t **out) { const ucl_object_t *metric, *score, @@ -927,12 +926,15 @@ rspamd_ucl_torspamc_output (struct rspamd_task *task, } } - rspamd_printf_fstring (out, "Message-ID: %s\r\n", task->message_id); + elt = ucl_object_lookup (top, "message-id"); + if (elt != NULL) { + rspamd_printf_fstring (out, "Message-ID: %s\r\n", + ucl_object_tostring (elt)); + } } static void -rspamd_ucl_tospamc_output (struct rspamd_task *task, - ucl_object_t *top, +rspamd_ucl_tospamc_output (const ucl_object_t *top, rspamd_fstring_t **out) { const ucl_object_t *metric, *score, @@ -1055,10 +1057,10 @@ rspamd_protocol_http_reply (struct rspamd_http_message *msg, } else { if (RSPAMD_TASK_IS_SPAMC (task)) { - rspamd_ucl_tospamc_output (task, top, &msg->body); + rspamd_ucl_tospamc_output (top, &msg->body); } else { - rspamd_ucl_torspamc_output (task, top, &msg->body); + rspamd_ucl_torspamc_output (top, &msg->body); } } diff --git a/src/libserver/protocol.h b/src/libserver/protocol.h index 186ed939a..1f7acbab2 100644 --- a/src/libserver/protocol.h +++ b/src/libserver/protocol.h @@ -88,8 +88,7 @@ void rspamd_protocol_write_reply (struct rspamd_task *task); * @param top * @param out */ -void rspamd_ucl_torspamc_output (struct rspamd_task *task, - ucl_object_t *top, +void rspamd_ucl_torspamc_output (const ucl_object_t *top, rspamd_fstring_t **out); #endif -- cgit v1.2.3 From 8fce0b58686e4cb4f0212db40e52cc0d7a0bffa0 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 2 Jun 2016 22:01:02 +0200 Subject: [Minor] Add macro to clear rspamd fstring --- src/libutil/fstring.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libutil/fstring.h b/src/libutil/fstring.h index db8b49085..0bd9a271d 100644 --- a/src/libutil/fstring.h +++ b/src/libutil/fstring.h @@ -81,6 +81,8 @@ rspamd_fstring_t *rspamd_fstring_append_chars (rspamd_fstring_t *str, */ void rspamd_fstring_erase (rspamd_fstring_t *str, gsize pos, gsize len); +#define rspamd_fstring_clear(s) rspamd_fstring_erase(s, 0, s->len) + /** * Convert fixed string to a zero terminated string. This string should be * freed by a caller -- cgit v1.2.3 From b3ff930cf3466de446bd8bf830bb463135440d0a Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 2 Jun 2016 22:01:23 +0200 Subject: [Feature] Add workaround for legacy clients in rspamd proxy --- src/rspamd_proxy.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index bac7af32f..c26889628 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -139,9 +139,10 @@ struct rspamd_proxy_session { struct rspamd_http_connection *client_conn; gpointer map; gsize map_len; - gint client_sock; struct rspamd_proxy_backend_connection *master_conn; GPtrArray *mirror_conns; + gint client_sock; + gboolean is_spamc; ref_entry_t ref; }; @@ -1062,27 +1063,32 @@ proxy_backend_master_finish_handler (struct rspamd_http_connection *conn, session = bk_conn->s; rspamd_http_connection_steal_msg (session->master_conn->backend_conn); - /* Reset spamc legacy */ - if (msg->method >= HTTP_CHECK) { - msg->method = HTTP_GET; - } - - if (msg->url->len == 0) { - msg->url = rspamd_fstring_append (msg->url, "/check", strlen ("/check")); - } - rspamd_http_message_remove_header (msg, "Content-Length"); rspamd_http_message_remove_header (msg, "Key"); rspamd_http_connection_reset (session->master_conn->backend_conn); - rspamd_http_connection_write_message (session->client_conn, - msg, NULL, NULL, session, session->client_sock, - &session->ctx->io_tv, session->ctx->ev_base); if (!proxy_backend_parse_results (session, bk_conn, session->ctx->lua_state, bk_conn->parser_from_ref, msg->body_buf.begin, msg->body_buf.len)) { msg_warn_session ("cannot parse results from the master backend"); } + + if (session->is_spamc) { + /* We need to reformat ucl to fit with legacy spamc protocol */ + if (bk_conn->results) { + rspamd_fstring_clear (msg->body); + rspamd_ucl_torspamc_output (bk_conn->results, &msg->body); + } + else { + msg_warn_session ("cannot parse results from the master backend, " + "return them as is"); + } + } + + rspamd_http_connection_write_message (session->client_conn, + msg, NULL, NULL, session, session->client_sock, + &session->ctx->io_tv, session->ctx->ev_base); + return 0; } @@ -1163,6 +1169,8 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, /* Reset spamc legacy */ if (msg->method >= HTTP_CHECK) { msg->method = HTTP_GET; + session->is_spamc = TRUE; + msg_info_session ("enabling legacy rspamc mode for session"); } if (msg->url->len == 0) { -- cgit v1.2.3 From 3a0579fd5ab6dd22745d780cc64754de3dcf861f Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 2 Jun 2016 22:02:47 +0200 Subject: [Fix] Force rspamd to upgrade fuzzy db on opening Issue: #649 Reported by: @moisseev --- src/libserver/fuzzy_backend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libserver/fuzzy_backend.c b/src/libserver/fuzzy_backend.c index 57cbb729d..e58e8a546 100644 --- a/src/libserver/fuzzy_backend.c +++ b/src/libserver/fuzzy_backend.c @@ -431,7 +431,7 @@ rspamd_fuzzy_backend_open_db (const gchar *path, GError **err) bk->expired = 0; bk->pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "fuzzy_backend"); bk->db = rspamd_sqlite3_open_or_create (bk->pool, bk->path, - create_tables_sql, 0, err); + create_tables_sql, 1, err); if (bk->db == NULL) { rspamd_fuzzy_backend_close (bk); -- cgit v1.2.3 From c8bc6be028234a19693f9e59c98fa88d19a300df Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 4 Jun 2016 21:12:49 +0200 Subject: [Minor] Fix spamc workaround --- src/rspamd_proxy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index c26889628..5c542105e 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -1167,7 +1167,7 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, rspamd_http_connection_reset (session->client_conn); /* Reset spamc legacy */ - if (msg->method >= HTTP_CHECK) { + if (msg->method >= HTTP_SYMBOLS) { msg->method = HTTP_GET; session->is_spamc = TRUE; msg_info_session ("enabling legacy rspamc mode for session"); -- cgit v1.2.3 From 42ef4ee31d73aca6aef41f66bc825a4296070cca Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 4 Jun 2016 21:36:55 +0200 Subject: [Feature] Allow to read password from console for rspamc Issue: #644 Reported by: @dehnli --- src/client/rspamc.c | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/client/rspamc.c b/src/client/rspamc.c index 5280914b9..9c00a4bc8 100644 --- a/src/client/rspamc.c +++ b/src/client/rspamc.c @@ -67,12 +67,17 @@ static GList *children; g_queue_push_tail ((o), nh); \ } while (0) +static gboolean rspamc_password_callback (const gchar *option_name, + const gchar *value, + gpointer data, + GError **error); + static GOptionEntry entries[] = { { "connect", 'h', 0, G_OPTION_ARG_STRING, &connect_str, "Specify host and port", NULL }, - { "password", 'P', 0, G_OPTION_ARG_STRING, &password, - "Specify control password", NULL }, + { "password", 'P', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, + &rspamc_password_callback, "Specify control password", NULL }, { "classifier", 'c', 0, G_OPTION_ARG_STRING, &classifier, "Classifier to learn spam or ham", NULL }, { "weight", 'w', 0, G_OPTION_ARG_INT, &weight, @@ -292,6 +297,31 @@ struct rspamc_callback_data { gdouble start; }; +gboolean +rspamc_password_callback (const gchar *option_name, + const gchar *value, + gpointer data, + GError **error) +{ + guint plen = 8192; + + if (value != NULL) { + password = g_strdup (value); + } + else { + /* Read password from console */ + password = g_malloc0 (plen); + plen = rspamd_read_passphrase (password, plen, 0, NULL); + } + + if (plen == 0) { + rspamd_fprintf (stderr, "Invalid password\n"); + exit (EXIT_FAILURE); + } + + return TRUE; +} + /* * Parse command line */ -- cgit v1.2.3 From 64022c191d7234f52dccc6d4009bf3b7d0491074 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sun, 5 Jun 2016 20:36:06 +0200 Subject: [Fix] Fix processing of messages without received headers --- rules/forwarding.lua | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/rules/forwarding.lua b/rules/forwarding.lua index 6ee0b9a97..c5c8912af 100644 --- a/rules/forwarding.lua +++ b/rules/forwarding.lua @@ -81,24 +81,27 @@ rspamd_config.FORWARDED = { local matches = 0 -- Retrieve and loop through all Received headers local rcvds = task:get_header_full('Received') - for _, rcvd in ipairs(rcvds) do + + if rcvds then + for _, rcvd in ipairs(rcvds) do local _,_,addr = rcvd['decoded']:lower():find("%sfor%s<(.-)>") if addr then - matches = matches + 1 - -- Check that it doesn't match the envrcpt - -- TODO: remove any plus addressing? - if addr ~= envrcpts[1].addr:lower() then - -- Check for mailing-lists as they will have the same signature - if matches < 2 and lu and to and to[1].addr:lower() == addr then - return false - else - return true, addr - end + matches = matches + 1 + -- Check that it doesn't match the envrcpt + -- TODO: remove any plus addressing? + if addr ~= envrcpts[1].addr:lower() then + -- Check for mailing-lists as they will have the same signature + if matches < 2 and lu and to and to[1].addr:lower() == addr then + return false + else + return true, addr end - -- Prevent any other iterations as we only want - -- process the first matching Received header - return false + end + -- Prevent any other iterations as we only want + -- process the first matching Received header + return false end + end end return false end, -- cgit v1.2.3 From 242063230f2fbbfb7f3aa06727a79cbd6f72938c Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 6 Jun 2016 15:46:09 +0200 Subject: [Fix] Implement new automata to skip empty lines for dkim signing Issue: #651 Reported by: @FelixSchwarz --- src/libserver/dkim.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 153 insertions(+), 16 deletions(-) diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c index 5052960f0..1f65733ba 100644 --- a/src/libserver/dkim.c +++ b/src/libserver/dkim.c @@ -1260,6 +1260,147 @@ rspamd_dkim_simple_body_step (rspamd_dkim_context_t *ctx, return (len != 0); } +static const gchar * +rspamd_dkim_skip_empty_lines (const gchar *start, const gchar *end, + guint type, gboolean *need_crlf) +{ + const gchar *p = end - 1, *t; + enum { + init = 0, + init_2, + got_cr, + got_lf, + got_crlf, + test_spaces, + } state = init; + guint skip = 0; + + while (p >= start + 2) { + switch (state) { + case init: + if (*p == '\r') { + state = got_cr; + } + else if (*p == '\n') { + state = got_lf; + } + else if (type == DKIM_CANON_RELAXED && *p == ' ') { + skip = 0; + state = test_spaces; + } + else { + if (type == DKIM_CANON_SIMPLE) { + *need_crlf = TRUE; + } + + goto end; + } + break; + case init_2: + if (*p == '\r') { + state = got_cr; + } + else if (*p == '\n') { + state = got_lf; + } + else if (type == DKIM_CANON_RELAXED && *p == ' ') { + skip = 0; + state = test_spaces; + } + else { + goto end; + } + break; + case got_cr: + if (*(p - 1) == '\r') { + p --; + state = got_cr; + } + else if (*(p - 1) == '\n') { + if ((*p - 2) == '\r') { + /* \r\n\r -> we know about one line */ + p -= 1; + state = got_crlf; + } + else { + /* \n\r -> we know about one line */ + p -= 1; + state = got_lf; + } + } + else if (type == DKIM_CANON_RELAXED && *(p - 1) == ' ') { + skip = 1; + state = test_spaces; + } + else { + goto end; + } + break; + case got_lf: + if (*(p - 1) == '\r') { + state = got_crlf; + } + else if (*(p - 1) == '\n') { + /* We know about one line */ + p --; + state = got_lf; + } + else if (type == DKIM_CANON_RELAXED && *(p - 1) == ' ') { + skip = 1; + state = test_spaces; + } + else { + goto end; + } + break; + case got_crlf: + if (p > start - 2) { + if (*(p - 3) == '\r') { + p -= 2; + state = got_cr; + } + else if (*(p - 3) == '\n') { + p -= 2; + state = got_lf; + } + else if (type == DKIM_CANON_RELAXED && *(p - 3) == ' ') { + skip = 2; + state = test_spaces; + } + else { + goto end; + } + } + else { + goto end; + } + break; + case test_spaces: + t = p - skip; + + while (t > start - 2 && *t == ' ') { + t --; + } + + if (*t == '\r') { + p = t; + state = got_cr; + } + else if (*t == '\n') { + p = t; + state = got_lf; + } + else { + goto end; + } + break; + } + } + +end: + return p; +} + static gboolean rspamd_dkim_canonize_body (rspamd_dkim_context_t *ctx, const gchar *start, @@ -1267,6 +1408,7 @@ rspamd_dkim_canonize_body (rspamd_dkim_context_t *ctx, { const gchar *p; guint remain = ctx->len ? ctx->len : (guint)(end - start); + gboolean need_crlf = FALSE; if (start == NULL) { /* Empty body */ @@ -1279,22 +1421,9 @@ rspamd_dkim_canonize_body (rspamd_dkim_context_t *ctx, } else { /* Strip extra ending CRLF */ - p = end - 1; - while (p >= start + 2) { - if (*p == '\n' && *(p - 1) == '\r' && *(p - 2) == '\n') { - p -= 2; - } - else if (*p == '\n' && *(p - 1) == '\n') { - p--; - } - else if (*p == '\r' && *(p - 1) == '\r') { - p--; - } - else { - break; - } - } + p = rspamd_dkim_skip_empty_lines (start, end, ctx->body_canon_type, &need_crlf); end = p + 1; + if (end == start) { /* Empty body */ if (ctx->body_canon_type == DKIM_CANON_SIMPLE) { @@ -1308,7 +1437,15 @@ rspamd_dkim_canonize_body (rspamd_dkim_context_t *ctx, if (ctx->body_canon_type == DKIM_CANON_SIMPLE) { /* Simple canonization */ while (rspamd_dkim_simple_body_step (ctx, ctx->body_hash, - &start, end - start, &remain)) ; + &start, end - start, &remain)); + + if (need_crlf) { + start = "\r\n"; + end = start + 2; + remain = 2; + rspamd_dkim_simple_body_step (ctx, ctx->body_hash, + &start, end - start, &remain); + } } else { while (rspamd_dkim_relaxed_body_step (ctx, ctx->body_hash, -- cgit v1.2.3 From 8a8f6c981aba81a7f7f8d407640c9013efda0677 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 7 Jun 2016 20:54:45 +0200 Subject: [Feature] Implement braced regexp quantifiers --- src/libmime/mime_expressions.c | 66 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/src/libmime/mime_expressions.c b/src/libmime/mime_expressions.c index 427b3654c..0f026980a 100644 --- a/src/libmime/mime_expressions.c +++ b/src/libmime/mime_expressions.c @@ -177,6 +177,48 @@ rspamd_mime_expr_quark (void) return g_quark_from_static_string ("mime-expressions"); } +static gboolean +rspamd_parse_long_option (const gchar *start, gsize len, + struct rspamd_regexp_atom *a) +{ + gboolean ret = FALSE; + + if (rspamd_lc_cmp (start, "body", len) == 0) { + ret = TRUE; + a->type = RSPAMD_RE_BODY; + } + else if (rspamd_lc_cmp (start, "part", len) == 0) { + ret = TRUE; + a->type = RSPAMD_RE_MIME; + } + else if (rspamd_lc_cmp (start, "raw_part", len) == 0) { + ret = TRUE; + a->type = RSPAMD_RE_RAWMIME; + } + else if (rspamd_lc_cmp (start, "header", len) == 0) { + ret = TRUE; + a->type = RSPAMD_RE_HEADER; + } + else if (rspamd_lc_cmp (start, "mime_header", len) == 0) { + ret = TRUE; + a->type = RSPAMD_RE_MIMEHEADER; + } + else if (rspamd_lc_cmp (start, "raw_header", len) == 0) { + ret = TRUE; + a->type = RSPAMD_RE_RAWHEADER; + } + else if (rspamd_lc_cmp (start, "sabody", len) == 0) { + ret = TRUE; + a->type = RSPAMD_RE_SABODY; + } + else if (rspamd_lc_cmp (start, "sabody", len) == 0) { + ret = TRUE; + a->type = RSPAMD_RE_SARAWBODY; + } + + return ret; +} + /* * Rspamd regexp utility functions */ @@ -184,7 +226,7 @@ static struct rspamd_regexp_atom * rspamd_mime_expr_parse_regexp_atom (rspamd_mempool_t * pool, const gchar *line, struct rspamd_config *cfg) { - const gchar *begin, *end, *p, *src, *start; + const gchar *begin, *end, *p, *src, *start, *brace; gchar *dbegin, *dend; struct rspamd_regexp_atom *result; GError *err = NULL; @@ -291,6 +333,14 @@ rspamd_mime_expr_parse_regexp_atom (rspamd_mempool_t * pool, const gchar *line, result->type = RSPAMD_RE_MIMEHEADER; p++; break; + case 'C': + result->type = RSPAMD_RE_SABODY; + p++; + break; + case 'D': + result->type = RSPAMD_RE_SARAWBODY; + p++; + break; case 'M': result->type = RSPAMD_RE_BODY; p++; @@ -311,6 +361,20 @@ rspamd_mime_expr_parse_regexp_atom (rspamd_mempool_t * pool, const gchar *line, result->type = RSPAMD_RE_RAWHEADER; p++; break; + case '{': + /* Long definition */ + if ((brace = strchr (p + 1, '}')) != NULL) { + if (!rspamd_parse_long_option (p + 1, brace - (p + 1), result)) { + p = NULL; + } + else { + p = brace + 1; + } + } + else { + p = NULL; + } + break; /* Other flags */ case 'T': result->is_test = TRUE; -- cgit v1.2.3 From 00c06a0fe397ede01875ca351a9d386c8d9aac56 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 7 Jun 2016 20:58:07 +0200 Subject: [Fix] Add missing types --- src/libmime/mime_expressions.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libmime/mime_expressions.c b/src/libmime/mime_expressions.c index 0f026980a..8a121f7a1 100644 --- a/src/libmime/mime_expressions.c +++ b/src/libmime/mime_expressions.c @@ -207,6 +207,14 @@ rspamd_parse_long_option (const gchar *start, gsize len, ret = TRUE; a->type = RSPAMD_RE_RAWHEADER; } + else if (rspamd_lc_cmp (start, "all_header", len) == 0) { + ret = TRUE; + a->type = RSPAMD_RE_ALLHEADER; + } + else if (rspamd_lc_cmp (start, "url", len) == 0) { + ret = TRUE; + a->type = RSPAMD_RE_URL; + } else if (rspamd_lc_cmp (start, "sabody", len) == 0) { ret = TRUE; a->type = RSPAMD_RE_SABODY; -- cgit v1.2.3 From 24de60c01275d375c6d7ad9694bce60caf196d39 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 7 Jun 2016 22:11:13 +0200 Subject: [Minor] Fix names --- src/libmime/mime_expressions.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libmime/mime_expressions.c b/src/libmime/mime_expressions.c index 8a121f7a1..065e63d6d 100644 --- a/src/libmime/mime_expressions.c +++ b/src/libmime/mime_expressions.c @@ -215,11 +215,11 @@ rspamd_parse_long_option (const gchar *start, gsize len, ret = TRUE; a->type = RSPAMD_RE_URL; } - else if (rspamd_lc_cmp (start, "sabody", len) == 0) { + else if (rspamd_lc_cmp (start, "sa_body", len) == 0) { ret = TRUE; a->type = RSPAMD_RE_SABODY; } - else if (rspamd_lc_cmp (start, "sabody", len) == 0) { + else if (rspamd_lc_cmp (start, "sa_raw_body", len) == 0) { ret = TRUE; a->type = RSPAMD_RE_SARAWBODY; } -- cgit v1.2.3 From 651b4eb898410a761f27a511b0b99302080ecea3 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 7 Jun 2016 22:11:22 +0200 Subject: [Doc] Update regexp module documentation --- doc/markdown/modules/regexp.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/doc/markdown/modules/regexp.md b/doc/markdown/modules/regexp.md index f08079bff..01d7a0635 100644 --- a/doc/markdown/modules/regexp.md +++ b/doc/markdown/modules/regexp.md @@ -60,12 +60,24 @@ The match type is defined by special flags after the last `/` symbol: * `B` - MIME header regexp (applied for headers in MIME parts only) * `R` - full headers content (applied for all headers undecoded and for the message only - **not** including MIME headers) * `M` - raw message regexp -* `P` - part regexp +* `P` - part regexp without HTML tags +* `Q` - part regexp with HTML tags +* `C` - spamassassin `BODY` regexp analogue(see http://spamassassin.apache.org/full/3.4.x/doc/Mail_SpamAssassin_Conf.txt) +* `D` - spamassassin `RAWBODY` regexp analogue * `U` - URL regexp +From 1.3, it is also possible to specify long regexp types for convenience in curly braces: -We strongly discourage from using of raw message regexps as they are expensive and -should be replaced by [trie](trie.md) rules if possible. +* `{header}` - header regexp +* `{raw_header}` - undecoded header regexp (e.g. without quoted-printable decoding) +* `{mime_header}` - MIME header regexp (applied for headers in MIME parts only) +* `{all_header}` - full headers content (applied for all headers undecoded and for the message only - **not** including MIME headers) +* `{body}` - raw message regexp +* `{mime}` - part regexp without HTML tags +* `{raw_mime}` - part regexp with HTML tags +* `{sa_body}` - spamassassin `BODY` regexp analogue(see http://spamassassin.apache.org/full/3.4.x/doc/Mail_SpamAssassin_Conf.txt) +* `{sa_raw_body}` - spamassassin `RAWBODY` regexp analogue +* `{url}` - URL regexp Each regexp also supports the following flags: @@ -122,7 +134,7 @@ Here is an example of table form definition of regexp rule: ~~~lua config['regexp']['RE_TEST'] = { - re = '/test/P', + re = '/test/i{mime}', score = 10.0, condition = function(task) if task:get_header('Subject') then -- cgit v1.2.3 From 2c2f97b658798c0ccecf394a981725e945025fc9 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 7 Jun 2016 22:17:55 +0200 Subject: [Fix] Fix setting path for lua Issue: #652 Reported by: @vurgun --- src/lua/lua_common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c index 4c5051aeb..85dbfa372 100644 --- a/src/lua/lua_common.c +++ b/src/lua/lua_common.c @@ -187,13 +187,13 @@ rspamd_lua_set_path (lua_State *L, struct rspamd_config *cfg) if (additional_path) { rspamd_snprintf (path_buf, sizeof (path_buf), - "%s/lua/?.lua;%s/lua/?.lua;%s;%s;%s", + "%s/lua/?.lua;%s/lua/?.lua;%s/?.lua;%s;%s", RSPAMD_PLUGINSDIR, RSPAMD_CONFDIR, RSPAMD_RULESDIR, additional_path, old_path); } else { rspamd_snprintf (path_buf, sizeof (path_buf), - "%s/lua/?.lua;%s/lua/?.lua;%s;%s", + "%s/lua/?.lua;%s/lua/?.lua;%s/?.lua;%s", RSPAMD_PLUGINSDIR, RSPAMD_CONFDIR, RSPAMD_RULESDIR, old_path); } -- cgit v1.2.3 From 7b094aea65622299db13268222c0bfec4104882e Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 8 Jun 2016 15:31:12 +0100 Subject: [Fix] Fix symbol name for spf soft fail --- rules/http_headers.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/http_headers.lua b/rules/http_headers.lua index f8d7f2be6..0252ccce9 100644 --- a/rules/http_headers.lua +++ b/rules/http_headers.lua @@ -69,7 +69,7 @@ rspamd_config:add_condition("R_SPF_ALLOW", function(task) elseif obj['result'] == 'neutral' then task:insert_result('R_SPF_NEUTRAL', 1.0, 'http header') elseif obj['result'] == 'tempfail' or obj['result'] == 'softfail' then - task:insert_result('R_SPF_TEMPFAIL', 1.0, 'http header') + task:insert_result('R_SPF_SOFTFAIL', 1.0, 'http header') end return false -- cgit v1.2.3 From d2392c19032a785a96cb32b02043b0ecf4dc6afc Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 08:57:09 +0100 Subject: [Fix] Fix usage of rdns reply structure Issue: #654 Reported by: @AlexeySa --- src/lua/lua_tcp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lua/lua_tcp.c b/src/lua/lua_tcp.c index e6ccd85ee..094ebf12b 100644 --- a/src/lua/lua_tcp.c +++ b/src/lua/lua_tcp.c @@ -348,10 +348,12 @@ static void lua_tcp_dns_handler (struct rdns_reply *reply, gpointer ud) { struct lua_tcp_cbdata *cbd = (struct lua_tcp_cbdata *)ud; + const struct rdns_request_name *rn; if (reply->code != RDNS_RC_NOERROR) { + rn = rdns_request_get_name (reply->request, NULL); lua_tcp_push_error (cbd, "unable to resolve host: %s", - reply->requested_name); + rn->name); lua_tcp_maybe_free (cbd); } else { @@ -368,7 +370,7 @@ lua_tcp_dns_handler (struct rdns_reply *reply, gpointer ud) if (!lua_tcp_make_connection (cbd)) { lua_tcp_push_error (cbd, "unable to make connection to the host %s", - reply->requested_name); + rspamd_inet_address_to_string (cbd->addr)); lua_tcp_maybe_free (cbd); } } -- cgit v1.2.3 From 8b35a3e93355e972cf079901c882ad6cf196ff18 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 09:30:19 +0100 Subject: [Fix] Try to fix issue in redis stats backend when task is closed --- src/libstat/backends/redis_backend.c | 39 +++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index 4f65a673c..ea852566e 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -22,6 +22,7 @@ #ifdef WITH_HIREDIS #include "hiredis.h" #include "adapters/libevent.h" +#include "ref.h" #define REDIS_CTX(p) (struct redis_stat_ctx *)(p) @@ -64,6 +65,7 @@ struct redis_stat_runtime { guint64 learned; gint id; enum rspamd_redis_connection_state conn_state; + ref_entry_t ref; }; /* Used to get statistics from redis */ @@ -722,6 +724,12 @@ rspamd_redis_connected (redisAsyncContext *c, gpointer r, gpointer priv) task = rt->task; + if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { + /* Task has disappeared already */ + REF_RELEASE (rt); + return; + } + if (c->err == 0) { if (r != NULL) { if (G_LIKELY (reply->type == REDIS_REPLY_INTEGER)) { @@ -748,6 +756,7 @@ rspamd_redis_connected (redisAsyncContext *c, gpointer r, gpointer priv) rt->learned = val; rt->conn_state = RSPAMD_REDIS_CONNECTED; + REF_RETAIN (rt); msg_debug_task ("connected to redis server, tokens learned for %s: %uL", rt->redis_object_expanded, rt->learned); @@ -765,6 +774,8 @@ rspamd_redis_connected (redisAsyncContext *c, gpointer r, gpointer priv) rspamd_upstream_fail (rt->selected); rspamd_session_remove_event (task->s, rspamd_redis_fin, rt); } + + REF_RELEASE (rt); } /* Called when we have received tokens values from redis */ @@ -781,6 +792,12 @@ rspamd_redis_processed (redisAsyncContext *c, gpointer r, gpointer priv) task = rt->task; + if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { + /* Task has disappeared already */ + REF_RELEASE (rt); + return; + } + if (c->err == 0) { if (r != NULL) { if (reply->type == REDIS_REPLY_ARRAY) { @@ -848,6 +865,8 @@ rspamd_redis_processed (redisAsyncContext *c, gpointer r, gpointer priv) rspamd_upstream_fail (rt->selected); rspamd_session_remove_event (task->s, rspamd_redis_fin, rt); } + + REF_RELEASE (rt); } /* Called when we have set tokens during learning */ @@ -859,6 +878,12 @@ rspamd_redis_learned (redisAsyncContext *c, gpointer r, gpointer priv) task = rt->task; + if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { + /* Task has disappeared already */ + REF_RELEASE (rt); + return; + } + if (c->err == 0) { rspamd_upstream_ok (rt->selected); rspamd_session_remove_event (task->s, rspamd_redis_fin_learn, rt); @@ -874,6 +899,8 @@ rspamd_redis_learned (redisAsyncContext *c, gpointer r, gpointer priv) redisAsyncFree (rt->redis); rt->conn_state = RSPAMD_REDIS_DISCONNECTED; } + + REF_RELEASE (rt); } static gboolean @@ -1053,6 +1080,12 @@ rspamd_redis_init (struct rspamd_stat_ctx *ctx, return (gpointer)backend; } +static void +rspamd_redis_runtime_dtor (struct redis_stat_runtime *rt) +{ + g_slice_free1 (sizeof (*rt), rt); +} + gpointer rspamd_redis_runtime (struct rspamd_task *task, struct rspamd_statfile_config *stcf, @@ -1090,7 +1123,8 @@ rspamd_redis_runtime (struct rspamd_task *task, return NULL; } - rt = rspamd_mempool_alloc0 (task->task_pool, sizeof (*rt)); + rt = g_slice_alloc0 (sizeof (*rt)); + REF_INIT_RETAIN (rt, rspamd_redis_runtime_dtor); rspamd_redis_expand_object (ctx->redis_object, ctx, task, &rt->redis_object_expanded); rt->selected = up; @@ -1192,6 +1226,8 @@ rspamd_redis_finalize_process (struct rspamd_task *task, gpointer runtime, rt->redis = NULL; rt->conn_state = RSPAMD_REDIS_DISCONNECTED; + + REF_RELEASE (rt); } } @@ -1329,6 +1365,7 @@ rspamd_redis_finalize_learn (struct rspamd_task *task, gpointer runtime, rt->redis = NULL; rt->conn_state = RSPAMD_REDIS_DISCONNECTED; + REF_RELEASE (rt); } } -- cgit v1.2.3 From 48bf70c3c212e96d0a3a9a34a460c0bd0aed2d33 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 11:16:42 +0100 Subject: [Fix] Initialize parser scripts properly --- src/rspamd_proxy.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 5c542105e..d9231ec3d 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -279,6 +279,8 @@ rspamd_proxy_parse_upstream (rspamd_mempool_t *pool, } up = g_slice_alloc0 (sizeof (*up)); + up->parser_from_ref = -1; + up->parser_to_ref = -1; up->name = g_strdup (ucl_object_tostring (elt)); elt = ucl_object_lookup (obj, "key"); -- cgit v1.2.3 From 61e083db79ed2ad7ebec73003c5787ffb1e1a25f Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 12:32:17 +0100 Subject: [Fix] More fixes for redis refcounts --- src/libstat/backends/redis_backend.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index ea852566e..d7725a4c1 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -680,9 +680,9 @@ rspamd_redis_fin (gpointer data) if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { rt->conn_state = RSPAMD_REDIS_DISCONNECTED; + event_del (&rt->timeout_event); + REF_RELEASE (rt); } - - event_del (&rt->timeout_event); } static void @@ -692,9 +692,9 @@ rspamd_redis_fin_learn (gpointer data) if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { rt->conn_state = RSPAMD_REDIS_DISCONNECTED; + event_del (&rt->timeout_event); + REF_RELEASE (rt); } - - event_del (&rt->timeout_event); } static void @@ -705,12 +705,13 @@ rspamd_redis_timeout (gint fd, short what, gpointer d) task = rt->task; - msg_err_task ("connection to redis server %s timed out", + msg_err_task_check ("connection to redis server %s timed out", rspamd_upstream_name (rt->selected)); rspamd_upstream_fail (rt->selected); rt->conn_state = RSPAMD_REDIS_TIMEDOUT; redisAsyncFree (rt->redis); rt->redis = NULL; + REF_RELEASE (rt); } /* Called when we have connected to the redis server and got stats */ @@ -1148,6 +1149,8 @@ rspamd_redis_runtime (struct rspamd_task *task, event_base_set (task->ev_base, &rt->timeout_event); double_to_tv (ctx->timeout, &tv); event_add (&rt->timeout_event, &tv); + /* Cleared by timeout */ + REF_RETAIN (rt); rspamd_redis_maybe_auth (ctx, rt->redis); redisAsyncCommand (rt->redis, rspamd_redis_connected, rt, "HGET %s %s", -- cgit v1.2.3 From d15ea1d42bb864cd8c62fa3ab8fd9aa875b1866d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 12:38:41 +0100 Subject: [Fix] Fix errors handling in the proxy --- src/rspamd_proxy.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index d9231ec3d..844eaf1e8 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -1134,6 +1134,22 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, } } + rspamd_http_connection_steal_msg (session->client_conn); + rspamd_http_message_remove_header (msg, "Content-Length"); + rspamd_http_message_remove_header (msg, "Key"); + rspamd_http_connection_reset (session->client_conn); + + /* Reset spamc legacy */ + if (msg->method >= HTTP_SYMBOLS) { + msg->method = HTTP_GET; + session->is_spamc = TRUE; + msg_info_session ("enabling legacy rspamc mode for session"); + } + + if (msg->url->len == 0) { + msg->url = rspamd_fstring_append (msg->url, "/check", strlen ("/check")); + } + if (backend == NULL) { /* No backend */ msg_err_session ("cannot find upstream for %s", host ? hostbuf : "default"); @@ -1153,7 +1169,9 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, SOCK_STREAM, TRUE); if (session->master_conn->backend_sock == -1) { - msg_err_session ("cannot connect upstream for %s", host ? hostbuf : "default"); + msg_err_session ("cannot connect upstream: %s(%s)", + host ? hostbuf : "default", + rspamd_inet_address_to_string (rspamd_upstream_addr (session->master_conn->up))); rspamd_upstream_fail (session->master_conn->up); goto err; } @@ -1163,21 +1181,6 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, } proxy_open_mirror_connections (session); - rspamd_http_connection_steal_msg (session->client_conn); - rspamd_http_message_remove_header (msg, "Content-Length"); - rspamd_http_message_remove_header (msg, "Key"); - rspamd_http_connection_reset (session->client_conn); - - /* Reset spamc legacy */ - if (msg->method >= HTTP_SYMBOLS) { - msg->method = HTTP_GET; - session->is_spamc = TRUE; - msg_info_session ("enabling legacy rspamc mode for session"); - } - - if (msg->url->len == 0) { - msg->url = rspamd_fstring_append (msg->url, "/check", strlen ("/check")); - } session->master_conn->backend_conn = rspamd_http_connection_new ( NULL, -- cgit v1.2.3 From a8beb9e5f242c2fe3636a363b55bd31bdc9d0f4c Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 12:45:22 +0100 Subject: [Feature] Use file lock in logger to avoid deadlocks --- src/libutil/logger.c | 35 ++++++++++------------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/src/libutil/logger.c b/src/libutil/logger.c index f81730448..7f46c2a50 100644 --- a/src/libutil/logger.c +++ b/src/libutil/logger.c @@ -61,8 +61,6 @@ struct rspamd_logger_s { gchar *saved_module; gchar *saved_id; guint saved_loglevel; - rspamd_mempool_t *pool; - rspamd_mempool_mutex_t *mtx; guint64 log_cnt[4]; }; @@ -70,18 +68,6 @@ static const gchar lf_chr = '\n'; static rspamd_logger_t *default_logger = NULL; -#define RSPAMD_LOGGER_LOCK(l) do { \ - if ((l) != NULL && !(l)->no_lock) { \ - rspamd_mempool_lock_mutex ((l)->mtx); \ - } \ -} while (0) - -#define RSPAMD_LOGGER_UNLOCK(l) do { \ - if ((l) != NULL && !(l)->no_lock) { \ - rspamd_mempool_unlock_mutex ((l)->mtx); \ - } \ -} while (0) - static void syslog_log_function (const gchar *log_domain, const gchar *module, const gchar *id, const gchar *function, @@ -118,6 +104,10 @@ direct_write_log_line (rspamd_logger_t *rspamd_log, glong r; if (rspamd_log->enabled) { + if (!rspamd_log->no_lock) { + rspamd_file_lock (rspamd_log->fd, FALSE); + } + if (is_iov) { iov = (struct iovec *) data; r = writev (rspamd_log->fd, iov, count); @@ -126,6 +116,11 @@ direct_write_log_line (rspamd_logger_t *rspamd_log, line = (const gchar *) data; r = write (rspamd_log->fd, line, count); } + + if (!rspamd_log->no_lock) { + rspamd_file_unlock (rspamd_log->fd, FALSE); + } + if (r == -1) { /* We cannot write message to file, so we need to detect error and make decision */ if (errno == EINTR) { @@ -321,11 +316,7 @@ rspamd_set_logger (struct rspamd_config *cfg, struct rspamd_main *rspamd) { if (rspamd->logger == NULL) { - rspamd->logger = g_malloc (sizeof (rspamd_logger_t)); - memset (rspamd->logger, 0, sizeof (rspamd_logger_t)); - /* Small pool for interlocking */ - rspamd->logger->pool = rspamd_mempool_new (512, NULL); - rspamd->logger->mtx = rspamd_mempool_get_mutex (rspamd->logger->pool); + rspamd->logger = g_slice_alloc0 (sizeof (rspamd_logger_t)); } rspamd->logger->type = cfg->log_type; @@ -468,14 +459,12 @@ rspamd_common_logv (rspamd_logger_t *rspamd_log, GLogLevelFlags log_level, else { if (rspamd_logger_need_log (rspamd_log, log_level, module)) { rspamd_vsnprintf (logbuf, sizeof (logbuf), fmt, args); - RSPAMD_LOGGER_LOCK (rspamd_log); rspamd_log->log_func (NULL, module, id, function, log_level, logbuf, FALSE, rspamd_log); - RSPAMD_LOGGER_UNLOCK (rspamd_log); } switch (log_level) { @@ -936,7 +925,6 @@ rspamd_conditional_debug (rspamd_logger_t *rspamd_log, } } - RSPAMD_LOGGER_LOCK (rspamd_log); va_start (vp, fmt); end = rspamd_vsnprintf (logbuf, sizeof (logbuf), fmt, vp); *end = '\0'; @@ -947,7 +935,6 @@ rspamd_conditional_debug (rspamd_logger_t *rspamd_log, logbuf, TRUE, rspamd_log); - RSPAMD_LOGGER_UNLOCK (rspamd_log); } } @@ -964,14 +951,12 @@ rspamd_glib_log_function (const gchar *log_domain, if (rspamd_log->enabled && rspamd_logger_need_log (rspamd_log, log_level, NULL)) { - RSPAMD_LOGGER_LOCK (rspamd_log); rspamd_log->log_func (log_domain, "glib", NULL, NULL, log_level, message, FALSE, rspamd_log); - RSPAMD_LOGGER_UNLOCK (rspamd_log); } } -- cgit v1.2.3 From 4502b6ce489f54c9cf7417a9770e38e012da7e1a Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 13:40:58 +0100 Subject: [Fix] Fix order of initialization --- src/rspamd_proxy.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 844eaf1e8..7ca0cc51d 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -1122,6 +1122,17 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, session->master_conn->name = "master"; host = rspamd_http_message_find_header (msg, "Host"); + /* Reset spamc legacy */ + if (msg->method >= HTTP_SYMBOLS) { + msg->method = HTTP_GET; + session->is_spamc = TRUE; + msg_info_session ("enabling legacy rspamc mode for session"); + } + + if (msg->url->len == 0) { + msg->url = rspamd_fstring_append (msg->url, "/check", strlen ("/check")); + } + if (host == NULL) { backend = session->ctx->default_upstream; } @@ -1134,22 +1145,6 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, } } - rspamd_http_connection_steal_msg (session->client_conn); - rspamd_http_message_remove_header (msg, "Content-Length"); - rspamd_http_message_remove_header (msg, "Key"); - rspamd_http_connection_reset (session->client_conn); - - /* Reset spamc legacy */ - if (msg->method >= HTTP_SYMBOLS) { - msg->method = HTTP_GET; - session->is_spamc = TRUE; - msg_info_session ("enabling legacy rspamc mode for session"); - } - - if (msg->url->len == 0) { - msg->url = rspamd_fstring_append (msg->url, "/check", strlen ("/check")); - } - if (backend == NULL) { /* No backend */ msg_err_session ("cannot find upstream for %s", host ? hostbuf : "default"); @@ -1200,6 +1195,11 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, msg, NULL, NULL, session->master_conn, session->master_conn->backend_sock, &session->ctx->io_tv, session->ctx->ev_base); + rspamd_http_connection_steal_msg (session->client_conn); + rspamd_http_message_remove_header (msg, "Content-Length"); + rspamd_http_message_remove_header (msg, "Key"); + rspamd_http_connection_reset (session->client_conn); + } } else { @@ -1211,6 +1211,10 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, return 0; err: + rspamd_http_connection_steal_msg (session->client_conn); + rspamd_http_message_remove_header (msg, "Content-Length"); + rspamd_http_message_remove_header (msg, "Key"); + rspamd_http_connection_reset (session->client_conn); proxy_client_write_error (session, 404, "Backend not found"); return 0; -- cgit v1.2.3 From 60ef2e36f2264d1d0baf61116324f9bcb11eadfc Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 14:18:16 +0100 Subject: [Fix] Another fix for redis timeouts --- src/libstat/backends/redis_backend.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index d7725a4c1..a2924d054 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -708,10 +708,14 @@ rspamd_redis_timeout (gint fd, short what, gpointer d) msg_err_task_check ("connection to redis server %s timed out", rspamd_upstream_name (rt->selected)); rspamd_upstream_fail (rt->selected); + + if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { + rspamd_session_remove_event (task->s, rspamd_redis_fin, rt); + } + rt->conn_state = RSPAMD_REDIS_TIMEDOUT; redisAsyncFree (rt->redis); rt->redis = NULL; - REF_RELEASE (rt); } /* Called when we have connected to the redis server and got stats */ -- cgit v1.2.3 From 0988e1b1b1d0a3a82728df658d834aba199baf4c Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 16:35:31 +0100 Subject: [Feature] Add protection against open files limit and accepting sockets --- src/controller.c | 2 +- src/fuzzy_storage.c | 24 ++++++++++++------------ src/libserver/worker_util.c | 21 +++++++++++---------- src/libutil/addr.c | 42 +++++++++++++++++++++++++++++++++++++++++- src/libutil/addr.h | 6 ++++-- src/lua_worker.c | 2 +- src/rspamadm/lua_repl.c | 2 +- src/rspamd.c | 2 +- src/rspamd_proxy.c | 2 +- src/smtp_proxy.c | 2 +- src/worker.c | 2 +- test/rspamd_http_test.c | 2 +- utils/rspamd_http_server.c | 2 +- 13 files changed, 77 insertions(+), 34 deletions(-) diff --git a/src/controller.c b/src/controller.c index 91f4cfed6..f5efb4535 100644 --- a/src/controller.c +++ b/src/controller.c @@ -2216,7 +2216,7 @@ rspamd_controller_accept_socket (gint fd, short what, void *arg) ctx = worker->ctx; if ((nfd = - rspamd_accept_from_socket (fd, &addr)) == -1) { + rspamd_accept_from_socket (fd, &addr, worker->accept_events)) == -1) { msg_warn_ctx ("accept failed: %s", strerror (errno)); return; } diff --git a/src/fuzzy_storage.c b/src/fuzzy_storage.c index bd888fd3c..d96346ce4 100644 --- a/src/fuzzy_storage.c +++ b/src/fuzzy_storage.c @@ -1161,7 +1161,7 @@ accept_fuzzy_mirror_socket (gint fd, short what, void *arg) struct fuzzy_master_update_session *session; if ((nfd = - rspamd_accept_from_socket (fd, &addr)) == -1) { + rspamd_accept_from_socket (fd, &addr, worker->accept_events)) == -1) { msg_warn ("accept failed: %s", strerror (errno)); return; } @@ -2006,7 +2006,7 @@ fuzzy_peer_rep (struct rspamd_worker *worker, struct rspamd_fuzzy_storage_ctx *ctx = ud; GList *cur; struct rspamd_worker_listen_socket *ls; - struct event *accept_event; + struct event *accept_events; gdouble next_check; ctx->peer_fd = rep_fd; @@ -2026,23 +2026,23 @@ fuzzy_peer_rep (struct rspamd_worker *worker, if (ls->fd != -1) { if (ls->type == RSPAMD_WORKER_SOCKET_UDP) { - accept_event = g_slice_alloc0 (sizeof (struct event)); - event_set (accept_event, ls->fd, EV_READ | EV_PERSIST, + accept_events = g_slice_alloc0 (sizeof (struct event) * 2); + event_set (&accept_events[0], ls->fd, EV_READ | EV_PERSIST, accept_fuzzy_socket, worker); - event_base_set (ctx->ev_base, accept_event); - event_add (accept_event, NULL); + event_base_set (ctx->ev_base, &accept_events[0]); + event_add (&accept_events[0], NULL); worker->accept_events = g_list_prepend (worker->accept_events, - accept_event); + accept_events); } else if (worker->index == 0) { /* We allow TCP listeners only for a update worker */ - accept_event = g_slice_alloc0 (sizeof (struct event)); - event_set (accept_event, ls->fd, EV_READ | EV_PERSIST, + accept_events = g_slice_alloc0 (sizeof (struct event) * 2); + event_set (&accept_events[0], ls->fd, EV_READ | EV_PERSIST, accept_fuzzy_mirror_socket, worker); - event_base_set (ctx->ev_base, accept_event); - event_add (accept_event, NULL); + event_base_set (ctx->ev_base, &accept_events[0]); + event_add (&accept_events[0], NULL); worker->accept_events = g_list_prepend (worker->accept_events, - accept_event); + accept_events); } } diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c index d3e296d6d..b50b0384f 100644 --- a/src/libserver/worker_util.c +++ b/src/libserver/worker_util.c @@ -248,7 +248,7 @@ rspamd_prepare_worker (struct rspamd_worker *worker, const char *name, void (*accept_handler)(int, short, void *)) { struct event_base *ev_base; - struct event *accept_event; + struct event *accept_events; GList *cur; struct rspamd_worker_listen_socket *ls; @@ -276,13 +276,13 @@ rspamd_prepare_worker (struct rspamd_worker *worker, const char *name, ls = cur->data; if (ls->fd != -1) { - accept_event = g_slice_alloc0 (sizeof (struct event)); - event_set (accept_event, ls->fd, EV_READ | EV_PERSIST, + accept_events = g_slice_alloc0 (sizeof (struct event) * 2); + event_set (&accept_events[0], ls->fd, EV_READ | EV_PERSIST, accept_handler, worker); - event_base_set (ev_base, accept_event); - event_add (accept_event, NULL); + event_base_set (ev_base, &accept_events[0]); + event_add (&accept_events[0], NULL); worker->accept_events = g_list_prepend (worker->accept_events, - accept_event); + accept_events); } cur = g_list_next (cur); @@ -296,7 +296,7 @@ void rspamd_worker_stop_accept (struct rspamd_worker *worker) { GList *cur; - struct event *event; + struct event *events; GHashTableIter it; struct rspamd_worker_signal_handler *sigh; gpointer k, v; @@ -305,10 +305,11 @@ rspamd_worker_stop_accept (struct rspamd_worker *worker) /* Remove all events */ cur = worker->accept_events; while (cur) { - event = cur->data; - event_del (event); + events = cur->data; + event_del (&events[0]); + event_del (&events[1]); cur = g_list_next (cur); - g_slice_free1 (sizeof (struct event), event); + g_slice_free1 (sizeof (struct event) * 2, events); } if (worker->accept_events != NULL) { diff --git a/src/libutil/addr.c b/src/libutil/addr.c index 5c5a51e13..3fee0b4bc 100644 --- a/src/libutil/addr.c +++ b/src/libutil/addr.c @@ -199,8 +199,41 @@ rspamd_ip_is_valid (const rspamd_inet_addr_t *addr) return ret; } +static void +rspamd_enable_accept_event (gint fd, short what, gpointer d) +{ + struct event *events = d; + + event_del (&events[1]); + event_add (&events[0], NULL); +} + +static void +rspamd_disable_accept_events (gint sock, GList *accept_events) +{ + GList *cur; + struct event *events; + const gdouble throttling = 0.5; + struct timeval tv; + struct event_base *ev_base; + + double_to_tv (throttling, &tv); + + for (cur = accept_events; cur != NULL; cur = g_list_next (cur)) { + events = cur->data; + + ev_base = event_get_base (&events[0]); + event_del (&events[0]); + event_set (&events[1], sock, EV_TIMEOUT, rspamd_enable_accept_event, + events); + event_base_set (ev_base, &events[1]); + event_add (&events[1], &tv); + } +} + gint -rspamd_accept_from_socket (gint sock, rspamd_inet_addr_t **target) +rspamd_accept_from_socket (gint sock, rspamd_inet_addr_t **target, + GList *accept_events) { gint nfd, serrno; union sa_union su; @@ -215,6 +248,13 @@ rspamd_accept_from_socket (gint sock, rspamd_inet_addr_t **target) if (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK) { return 0; } + else if (errno == EMFILE || errno == ENFILE) { + /* Temporary disable accept event */ + rspamd_disable_accept_events (sock, accept_events); + + return 0; + } + return -1; } diff --git a/src/libutil/addr.h b/src/libutil/addr.h index bb9fd2573..200543d6f 100644 --- a/src/libutil/addr.h +++ b/src/libutil/addr.h @@ -193,10 +193,12 @@ gboolean rspamd_ip_is_valid (const rspamd_inet_addr_t *addr); /** * Accept from listening socket filling addr structure * @param sock listening socket - * @param addr allocated inet addr structur + * @param addr allocated inet addr structure + * @param accept_events events for accepting new sockets * @return */ -gint rspamd_accept_from_socket (gint sock, rspamd_inet_addr_t **addr); +gint rspamd_accept_from_socket (gint sock, rspamd_inet_addr_t **addr, + GList *accept_events); /** * Parse host[:port[:priority]] line diff --git a/src/lua_worker.c b/src/lua_worker.c index df6970efa..b74b8d422 100644 --- a/src/lua_worker.c +++ b/src/lua_worker.c @@ -261,7 +261,7 @@ lua_accept_socket (gint fd, short what, void *arg) L = ctx->L; if ((nfd = - rspamd_accept_from_socket (fd, &addr)) == -1) { + rspamd_accept_from_socket (fd, &addr, worker->accept_events)) == -1) { msg_warn ("accept failed: %s", strerror (errno)); return; } diff --git a/src/rspamadm/lua_repl.c b/src/rspamadm/lua_repl.c index f0d337ad9..f96aa2890 100644 --- a/src/rspamadm/lua_repl.c +++ b/src/rspamadm/lua_repl.c @@ -482,7 +482,7 @@ rspamadm_lua_accept_cb (gint fd, short what, void *arg) gint nfd; if ((nfd = - rspamd_accept_from_socket (fd, &addr)) == -1) { + rspamd_accept_from_socket (fd, &addr, NULL)) == -1) { rspamd_fprintf (stderr, "accept failed: %s", strerror (errno)); return; } diff --git a/src/rspamd.c b/src/rspamd.c index b6b5a271c..922327f38 100644 --- a/src/rspamd.c +++ b/src/rspamd.c @@ -959,7 +959,7 @@ rspamd_control_handler (gint fd, short what, gpointer arg) gint nfd; if ((nfd = - rspamd_accept_from_socket (fd, &addr)) == -1) { + rspamd_accept_from_socket (fd, &addr, NULL)) == -1) { msg_warn_main ("accept failed: %s", strerror (errno)); return; } diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 7ca0cc51d..d2ac90aa0 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -1232,7 +1232,7 @@ proxy_accept_socket (gint fd, short what, void *arg) ctx = worker->ctx; if ((nfd = - rspamd_accept_from_socket (fd, &addr)) == -1) { + rspamd_accept_from_socket (fd, &addr, worker->accept_events)) == -1) { msg_warn ("accept failed: %s", strerror (errno)); return; } diff --git a/src/smtp_proxy.c b/src/smtp_proxy.c index 6b0a4fe2e..8eebc2c86 100644 --- a/src/smtp_proxy.c +++ b/src/smtp_proxy.c @@ -902,7 +902,7 @@ accept_socket (gint fd, short what, void *arg) ctx = worker->ctx; if ((nfd = - rspamd_accept_from_socket (fd, &addr)) == -1) { + rspamd_accept_from_socket (fd, &addr, worker->accept_events)) == -1) { msg_warn ("accept failed: %s", strerror (errno)); return; } diff --git a/src/worker.c b/src/worker.c index ac104f7f0..81c5b1c63 100644 --- a/src/worker.c +++ b/src/worker.c @@ -266,7 +266,7 @@ accept_socket (gint fd, short what, void *arg) } if ((nfd = - rspamd_accept_from_socket (fd, &addr)) == -1) { + rspamd_accept_from_socket (fd, &addr, worker->accept_events)) == -1) { msg_warn_ctx ("accept failed: %s", strerror (errno)); return; } diff --git a/test/rspamd_http_test.c b/test/rspamd_http_test.c index 428c510c4..88ac48676 100644 --- a/test/rspamd_http_test.c +++ b/test/rspamd_http_test.c @@ -55,7 +55,7 @@ rspamd_server_accept (gint fd, short what, void *arg) gint nfd; if ((nfd = - rspamd_accept_from_socket (fd, &addr)) == -1) { + rspamd_accept_from_socket (fd, &addr, NULL)) == -1) { msg_warn ("accept failed: %s", strerror (errno)); return; } diff --git a/utils/rspamd_http_server.c b/utils/rspamd_http_server.c index ad01085df..9af96fad9 100644 --- a/utils/rspamd_http_server.c +++ b/utils/rspamd_http_server.c @@ -134,7 +134,7 @@ rspamd_server_accept (gint fd, short what, void *arg) do { if ((nfd = - rspamd_accept_from_socket (fd, &addr)) == -1) { + rspamd_accept_from_socket (fd, &addr, NULL)) == -1) { rspamd_fprintf (stderr, "accept failed: %s", strerror (errno)); return; } -- cgit v1.2.3 From 80fd30c6adae73fdeda635657750c1a0762780b3 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 16:43:39 +0100 Subject: [Fix] Do not delete uninitialized events --- src/libserver/worker_util.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c index b50b0384f..bf596a343 100644 --- a/src/libserver/worker_util.c +++ b/src/libserver/worker_util.c @@ -306,8 +306,15 @@ rspamd_worker_stop_accept (struct rspamd_worker *worker) cur = worker->accept_events; while (cur) { events = cur->data; - event_del (&events[0]); - event_del (&events[1]); + + if (event_get_base (&events[0])) { + event_del (&events[0]); + } + + if (event_get_base (&events[1])) { + event_del (&events[1]); + } + cur = g_list_next (cur); g_slice_free1 (sizeof (struct event) * 2, events); } -- cgit v1.2.3 From 689afbb9986cac439d76f4cae5f232e6dc78ee28 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 16:54:03 +0100 Subject: [Fix] Fix encrypted proxy requests --- src/rspamd_proxy.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index d2ac90aa0..5a969a155 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -1176,6 +1176,10 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, } proxy_open_mirror_connections (session); + rspamd_http_connection_steal_msg (session->client_conn); + rspamd_http_message_remove_header (msg, "Content-Length"); + rspamd_http_message_remove_header (msg, "Key"); + rspamd_http_connection_reset (session->client_conn); session->master_conn->backend_conn = rspamd_http_connection_new ( NULL, @@ -1195,11 +1199,6 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, msg, NULL, NULL, session->master_conn, session->master_conn->backend_sock, &session->ctx->io_tv, session->ctx->ev_base); - rspamd_http_connection_steal_msg (session->client_conn); - rspamd_http_message_remove_header (msg, "Content-Length"); - rspamd_http_message_remove_header (msg, "Key"); - rspamd_http_connection_reset (session->client_conn); - } } else { -- cgit v1.2.3 From d1ad620d8e8a1bc90dfdf6505a95c155dd31a0cd Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 17:04:53 +0100 Subject: [Feature] Do not print garbadge in --compact output --- src/client/rspamc.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/client/rspamc.c b/src/client/rspamc.c index 9c00a4bc8..8f7f463bb 100644 --- a/src/client/rspamc.c +++ b/src/client/rspamc.c @@ -1238,12 +1238,16 @@ rspamc_client_cb (struct rspamd_client_connection *conn, } else { if (cmd->need_input) { - rspamd_fprintf (out, "Results for file: %s (%.3f seconds)\n", - cbdata->filename, diff); + if (!compact) { + rspamd_fprintf (out, "Results for file: %s (%.3f seconds)\n", + cbdata->filename, diff); + } } else { - rspamd_fprintf (out, "Results for command: %s (%.3f seconds)\n", - cmd->name, diff); + if (!compact) { + rspamd_fprintf (out, "Results for command: %s (%.3f seconds)\n", + cmd->name, diff); + } } if (result != NULL) { -- cgit v1.2.3 From fb326efc2b3fa1c25705d218987199a608b87b87 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 9 Jun 2016 17:07:25 +0100 Subject: [Fix] Plug memory leak in proxy --- src/rspamd_proxy.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 5a969a155..5864d6020 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -804,6 +804,10 @@ proxy_session_dtor (struct rspamd_proxy_session *session) } } + if (session->master_conn->results) { + ucl_object_unref (session->master_conn->results); + } + g_ptr_array_free (session->mirror_conns, TRUE); rspamd_inet_address_destroy (session->client_addr); close (session->client_sock); -- cgit v1.2.3 From 9fb162704d186ca35b66cef49a57a5088e74c5e4 Mon Sep 17 00:00:00 2001 From: Larry Hynes Date: Thu, 9 Jun 2016 20:40:51 +0100 Subject: [Doc] Correct doc/markdown/architecture/index.md --- doc/markdown/architecture/index.md | 105 ++++++++++--------------------------- 1 file changed, 29 insertions(+), 76 deletions(-) diff --git a/doc/markdown/architecture/index.md b/doc/markdown/architecture/index.md index 45e52fa8e..ddb9a7407 100644 --- a/doc/markdown/architecture/index.md +++ b/doc/markdown/architecture/index.md @@ -1,28 +1,20 @@ -# Rspamd architecture +# rspamd architecture ## Introduction -Rspamd is a universal spam filtering system based on event-driven processing -model. It means that rspamd is intended not to block anywhere in the code. To -process messages rspamd uses a set of so called `rules`. Each `rule` is a symbolic -name associated with some message property. For example, we can define the following -rules: +rspamd is a universal spam filtering system based on an event-driven processing model, which means that rspamd is not intended to block anywhere in the code. To process messages rspamd uses a set of `rules`. Each `rule` is a symbolic name associated with a message property. For example, we can define the following rules: - `SPF_ALLOW` - means that a message is validated by SPF; - `BAYES_SPAM` - means that a message is statistically considered as spam; -- `FORGED_OUTLOOK_MID` - message ID seems to be forged for Outlook MUA. +- `FORGED_OUTLOOK_MID` - message ID seems to be forged for the Outlook MUA. -Rules are defined by [modules](../modules/). So far, if there is a module that -performs SPF checks it may define several rules according to SPF policy: +Rules are defined by [modules](../modules/). If there is a module, for example, that performs SPF checks it may define several rules according to SPF policy: - `SPF_ALLOW` - a sender is allowed to send messages for this domain; - `SPF_DENY` - a sender is denied by SPF policy; - `SPF_SOFTFAIL` - there is no affinity defined by SPF policy. -Rspamd supports two main types of modules: internal written in C and external -written in Lua. There is no real difference between these two types with the exception -that C modules are embeded all the time and can be enabled in `filters` attribute -in the `options` section of the config: +rspamd supports two main types of modules: internal modules written in C and external modules written in lua. There is no real difference between the two types with the exception that C modules are embedded and can be enabled in a `filters` attribute in the `options` section of the config: ~~~ucl options { @@ -33,29 +25,21 @@ options { ## Protocol -Rspamd uses HTTP protocol for all operations. This protocol is described in the [protocol section](protocol.md). +rspamd uses the HTTP protocol for all operations. This protocol is described in the [protocol section](protocol.md). ## Metrics -Rules in rspamd, defines merely a logic of checks, however it is required to -set up weights for each rule. Weight means `significance` in terms of rspamd. So -far, rules with greater absolute value of weight are considered as more important -than the recent rules. The weight of rules is defined in `metrics`. Each metric -is a set of grouped rules with specific weights. For example, we may define the -following weights for our SPF rules: +Rules in rspamd define a logic of checks, but it is required to set up weights for each rule. (For rspamd, weight means `significance`.) Rules with a greater absolute value of weight are considered more important. The weight of rules is defined in `metrics`. Each metric is a set of grouped rules with specific weights. For example, we may define the following weights for our SPF rules: - `SPF_ALLOW`: -1 - `SPF_DENY`: 2 - `SPF_SOFTFAIL`: 0.5 -Positive weights means that this rule turns message to more spammy, while negative -means the opposite. +Positive weights mean that this rule increases a messages 'spammyness', while negative weights mean the opposite. ### Rules scheduler -To avoid unnecessary checks rspamd uses scheduler of rules for each message. So far, -if a message is considered as `definite spam` then further checks are not performed. -This scheduler is rather naive and it performs the following logic: +To avoid unnecessary checks rspamd uses a scheduler of rules for each message. If a message is considered as definite spam then further checks are not performed. This scheduler is rather naive and it performs the following logic: - select negative rules *before* positive ones to prevent false positives; - prefer rules with the following characteristics: @@ -65,77 +49,46 @@ This scheduler is rather naive and it performs the following logic: These optimizations can filter definite spam more quickly than a generic queue. -Since rspamd-0.9 there are more optimizations for rules and expressions that are -roughly described in the [following presentation](http://highsecure.ru/ast-rspamd.pdf). +Since rspamd-0.9 there are further optimizations for rules and expressions that are described generally in the [following presentation](http://highsecure.ru/ast-rspamd.pdf). ## Actions -Another important property of metrics is their actions set. This set defines recommended -actions for a message if it reach a certain score defined by all rules triggered. -Rspamd defines the following actions: +Another important property of metrics is their actions set. This set defines recommended actions for a message if it reaches a certain score defined by all rules which have been triggered. rspamd defines the following actions: -- `No action`: a message is likely ham; -- `Greylist`: greylist message is it is not certainly ham; +- `No action`: a message is likely to be ham; +- `Greylist`: greylist a message if it is not certainly ham; - `Add header`: a message is likely spam, so add a specific header; - `Rewrite subject`: a message is likely spam, so rewrite its subject; - `Reject`: a message is very likely spam, so reject it completely -These actions are just recommendations for MTA and are not to be strictly followed. -For all actions that are greater or equal than `greylist` it is recommended to -perform explicit greylisting. `Add header` and `rewrite subject` actions are very -close in semantics and are both considered as `probable spam`. `Reject` is a -strong rule that usually means that a message should be really rejected by MTA. -The triggering score for these actions should be specified according to their logic -priorities. If two actions have the same weight, the result is unspecified. +These actions are just recommendations for the MTA and are not to be strictly followed. For all actions that are greater or equal than `greylist` it is recommended to perform explicit greylisting. `Add header` and `rewrite subject` actions are very close in semantics and are both considered as probable spam. `Reject` is a strong rule which usually means that a message should be really rejected by the MTA. The triggering score for these actions should be specified according to their logic priorities. If two actions have the same weight, the result is unspecified. ## Rules weight -The weights of rules is not necessarily constant. For example, for statistics rules -we have no certain confidence if a message is spam or not. We have some probability -instead. To allow fuzzy rules weight, rspamd supports `dynamic weights`. Generally, -it means that a rule may add a dynamic range from 0 to a defined weight in the metric. -So far if we define symbol `BAYES_SPAM` with weight 5.0, then this rule can add -a resulting symbol with weight from 0 to 5.0. To distribute values in the proper -way, rspamd usually uses some sort of Sigma function to provide fair distribution curve. -Nevertheless, the most of rspamd rules uses static weights with the exception of -fuzzy rules. - -## Statistic - -Rspamd uses statistic algorithms to precise the final score of a message. Currently, -the only algorithm defined is OSB-Bayes. You may find the concrete details of this -algorithm in the following [paper](http://osbf-lua.luaforge.net/papers/osbf-eddc.pdf). -Rspamd uses window size of 5 words in its classification. During classification procedure, -rspamd split a message to a set of tokens. - -Tokens are separated by punctiation or space characters. Short tokens (less than 3 symbols) are ignored. For each token rspamd -calculates two non-cryptographic hashes used subsequently as indices. All these tokens -are stored in memory-mapped files called `statistic files` (or `statfiles`). Each statfile -is a set of token chains, indexed by the first hash. A new token may be inserted to some -chain, and if this chain is full then rspamd tries to expire less significant tokens to -insert a new one. It is possible to obtain the current state of tokens by running +The weight of rules is not necessarily constant. For example, for statistics rules we have no certain confidence if a message is spam or not; instead we have a measure of probability. To allow fuzzy rules weight, rspamd supports `dynamic weights`. Generally, it means that a rule may add a dynamic range from 0 to a defined weight in the metric. So if we define the symbol `BAYES_SPAM` with a weight of 5.0, then this rule can add a resulting symbol with a weight from 0 to 5.0. To distribute values, rspamd uses a form of Sigma function to provide a fair distribution curve. The majority of rspamd rules, with the exception of fuzzy rules, use static weights. + +## Statistics + +rspamd uses statistic algorithms to precisely calculate the final score of a message. Currently, the only algorithm defined is OSB-Bayes. You can find details of this algorithm in the following [paper](http://osbf-lua.luaforge.net/papers/osbf-eddc.pdf). rspamd uses a window size of 5 words in its classification. During the classification procedure, rspamd splits a message into a set of tokens. Tokens are separated by punctuation or whitespace characters. Short tokens (less than 3 symbols) are ignored. For each token, rspamd calculates two non-cryptographic hashes used subsequently as indices. All these tokens are stored in memory-mapped files called `statistic files` (or `statfiles`). Each statfile is a set of token chains, indexed by the first hash. A new token may be inserted into a chain, and if this chain is full then rspamd tries to expire less significant tokens to insert the new one. It is possible to obtain the current state of tokens by running the rspamc stat -command that asks controller for free and used tokens in each statfile. -Please note that if a statfile is close to be completely filled then during subsequent -learning you will loose existing data. Therefore, it is recommended to increase size for -such statfiles. +command which outputs statistics for free and used tokens in each statfile. Please note that if a statfile is close to being completely full then during subsequent learning you will lose existing data. Therefore, it is recommended to increase the size of such statfiles. ## Running rspamd -There are several command-line options that can be passed to rspamd. All of them can be displayed by passing `--help` argument: +There are several command-line options that can be passed to rspamd. All of them can be displayed by passing the `--help` argument. -All options are optional: by default rspamd would try to read `etc/rspamd.conf` config file and run as daemon. Also there is test mode that can be turned on by passing `-t` argument. In test mode, rspamd reads config file and checks its syntax. If a configuration file is OK, then exit code is zero. Test mode is useful for testing new config file withou rspamd restart. `--convert-config` option can be used to convert old style (pre 0.6.0) config to [ucl](../configuration/ucl.md) one: +All options are optional: by default rspamd will try to read the `etc/rspamd.conf` config file and run as a daemon. Also there is a test mode that can be turned on by passing the `-t` argument. In test mode, rspamd reads the config file and checks its syntax. If a configuration file is OK, the exit code is zero. Test mode is useful for testing new config files without restarting rspamd. The `--convert-config` option can be used to convert old style (pre 0.6.0) configs to [ucl](../configuration/ucl.md) format: $ rspamd -c ./rspamd.xml --convert-conf ./rspamd.conf ## Managing rspamd using signals -First of all, it is important to note that all user's signals should be sent to rspamd main process and not to its children (as for child processes these signals can have other meanings). To determine which process is main you can use two ways: +It is important to note that all user signals should be sent to the rspamd main process and not to its children (as for child processes these signals can have other meanings). You can identify the main process: -- by reading pidfile: +- by reading the pidfile: $ cat pidfile @@ -151,10 +104,10 @@ First of all, it is important to note that all user's signals should be sent to $ ps auxwww | grep rspamd | grep main nobody 28378 0.0 0.2 49744 9424 rspamd: main process -After getting the pid of main process it is possible to manage rspamd with signals: +After getting the pid of the main process it is possible to manage rspamd with signals, as follows: -- `SIGHUP` - restart rspamd: reread config file, start new workers (as well as controller and other processes), stop accepting connections by old workers, reopen all log files. Note that old workers would be terminated after one minute that should allow to process all pending requests. All new requests to rspamd will be processed by newly started workers. -- `SIGTERM` - terminate rspamd system. -- `SIGUSR1` - reopen log files (useful for log files rotation). +- `SIGHUP` - restart rspamd: reread config file, start new workers (as well as controller and other processes), stop accepting connections by old workers, reopen all log files. Note that old workers would be terminated after one minute which should allow processing of all pending requests. All new requests to rspamd will be processed by the newly started workers. +- `SIGTERM` - terminate rspamd. +- `SIGUSR1` - reopen log files (useful for log file rotation). -These signals may be used in start scripts as it is done in `FreeBSD` start script. Restarting of rspamd is performed softly: no connections are dropped and if a new config is incorrect then the old config is used. +These signals may be used in rc-style scripts. Restarting of rspamd is performed softly: no connections are dropped and if a new config is incorrect then the old config is used. -- cgit v1.2.3 From 204034dd45454882385b54077712b38ec663bfe6 Mon Sep 17 00:00:00 2001 From: Larry Hynes Date: Thu, 9 Jun 2016 21:08:09 +0100 Subject: [Doc] Correct doc/markdown/architecture/protocol.md --- doc/markdown/architecture/protocol.md | 110 +++++++++++++++++----------------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/doc/markdown/architecture/protocol.md b/doc/markdown/architecture/protocol.md index 51ac8e9c6..75a512718 100644 --- a/doc/markdown/architecture/protocol.md +++ b/doc/markdown/architecture/protocol.md @@ -1,15 +1,12 @@ -# Rspamd protocol +# rspamd protocol ## Protocol basics -Rspamd uses HTTP protocol of either version 1.0 or 1.1. However, there is compatibility layer described further in this document. -Rspamd defines some servicing headers that allows to pass extra information about a message scanned, such as envelope data, IP address, -SMTP sasl authentication data and so on. Rspamd supports both normal and chunked encoded HTTP request, however, form URL encoding is **NOT** supported currently. +rspamd uses the HTTP protocol, either version 1.0 or 1.1. (There is also a compatibility layer described further in this document.) rspamd defines some headers which allow the passing of extra information about a scanned message, such as envelope data, IP address or SMTP sasl authentication data, etc. rspamd supports normal and chunked encoded HTTP requests; however, form URL encoding is **NOT** supported currently. -## Rspamd HTTP request +## rspamd HTTP request -Rspamd encourages usage of HTTP protocol since it is standard and can be used by literally every programming language without exotic libraries. -The typical HTTP request looks like the following: +rspamd encourages the use of the HTTP protocol since it is standard and can be used by every programming language without the use of exotic libraries. A typical HTTP request looks like the following: POST /check HTTP/1.0 Content-Length: 26969 @@ -21,32 +18,31 @@ The typical HTTP request looks like the following: -You can also use chunked encoding that allows streamlined data transfer which is useful if you don't know the length of the message. +You can also use chunked encoding that allows streamlined data transfer which is useful if you don't know the length of a message. ### HTTP request -Normally, you should just use '/check' here. However, if you talk to the controller then you might want to use controllers commands here. +Normally, you should just use '/check' here. However, if you want to communicate with the controller then you might want to use controllers commands. (TODO: write this part) ### HTTP headers -To avoid unnecessary work, rspamd allows MTA to pass pre-processed data about the message by using either HTTP headers or JSON control block (described further in this document). -Rspamd supports the following non-standard HTTP headers: +To avoid unnecessary work, rspamd allows an MTA to pass pre-processed data about the message by using either HTTP headers or a JSON control block (described further in this document). rspamd supports the following non-standard HTTP headers: | Header | Description | -| :-------------- | :-------------------------------- | -| **Deliver-To:** | Defines actual delivery recipient of message. Can be used for personalized statistic and for user specific options.| -| **IP:** | Defines IP from which this message is received. | -| **Helo:** | Defines SMTP helo. | -| **Hostname:** | Defines resolved hostname. | -| **From:** | Defines SMTP mail from command data. | -| **Queue-Id:** | Defines SMTP queue id for message (can be used instead of message id in logging). | -| **Rcpt:** | Defines SMTP recipient (it may be several `Rcpt` headers). | -| **Pass:** | If this header has `all` value, all filters would be checked for this message. | -| **Subject:** | Defines subject of message (is used for non-mime messages). | +| :-------------- | :-------------------------------- | +| **Deliver-To:** | Defines actual delivery recipient of message. Can be used for personalized statistics and for user specific options. | +| **IP:** | Defines IP from which this message is received. | +| **Helo:** | Defines SMTP | +| **Hostname:** | Defines resolved | +| **From:** | Defines SMTP mail from command | +| **Queue-Id:** | Defines SMTP queue id for message (can be used instead of message id in logging). | +| **Rcpt:** | Defines SMTP recipient (it may be several `Rcpt` | +| **Pass:** | If this header has `all` value, all filters would be checked for this message. | +| **Subject:** | Defines subject of message (is used for non-mime messages). | | **User:** | Defines SMTP user. | -| **Message-Length:** | Defines the length of message excluding the control block. | +| **Message-Length:** | Defines the length of message excluding the control block. | Controller also defines certain headers: @@ -54,9 +50,9 @@ Controller also defines certain headers: Standard HTTP headers, such as `Content-Length`, are also supported. -## Rspamd HTTP reply +## rspamd HTTP reply -Rspamd reply is encoded using `json` format. Here is a typical HTTP reply: +rspamd reply is encoded in `JSON`. Here is a typical HTTP reply: HTTP/1.1 200 OK Connection: close @@ -111,7 +107,7 @@ Rspamd reply is encoded using `json` format. Here is a typical HTTP reply: For convenience, the reply is LINTed using [jsonlint](http://jsonlint.com). The actual reply is compressed for speed. -The reply can be treated as the JSON object where keys are metric names (namely `default`) and values are objects that represent metric. +The reply can be treated as a JSON object where keys are metric names (namely `default`) and values are objects that represent metrics. Each metric has the following fields: @@ -124,27 +120,26 @@ Each metric has the following fields: - `greylist` - message should be greylisted; - `add header` - message is suspicious and should be marked as spam - `rewrite subject` - message is suspicious and should have subject rewritten - - `soft reject` - message should be temporary rejected at the moment (for example, due to rate limit exhausting) + - `soft reject` - message should be temporary rejected (for example, due to rate limit exhausting) - `reject` - message should be rejected as spam -Additionally, metric contains all symbols added during message's processing indexed by symbols' names. +Additionally, metric contains all symbols added during a message's processing, indexed by symbol names. -Moreover, some other keys might be in the reply: +Additional keys which may be in the reply include: -* `subject` - if action is `rewrite subject` then this value defines the desired subject for a message +* `subject` - if action is `rewrite subject` this value defines the desired subject for a message * `urls` - a list of urls found in a message (only hostnames) * `emails` - a list of emails found in a message * `message-id` - ID of message (useful for logging) -* `messages` - array of optional messages added by some rspamd filters (such as `SPF`) +* `messages` - array of optional messages added by rspamd filters (such as `SPF`) -## Rspamd JSON control block +## rspamd JSON control block -Since rspamd 0.9 it is also possible to pass additional data by using request body prepending JSON control block to the message. Hence, you can use either headers or JSON block to pass data from MTA to rspamd. -The advantage of JSON block is that it can be encrypted using `httpcrypt`. Headers encryption is currently unsupported. +Since rspamd version 0.9 it is also possible to pass additional data by prepending a JSON control block to a message. So you can use either headers or a JSON block to pass data from the MTA to rspamd. The advantage of the JSON block is that it can be encrypted using `httpcrypt`. Header encryption is currently unsupported. -To use JSON control block, you need to pass extra header to rspamd called `Message-Length`. This header should be equal to the size of the message **excluding** JSON control block. Therefore, the size of control block is equal to `Content-Length` - `Message-Length`. Rspamd assumes that a message starts immediately after control block (with no extra CRLF). This method is equally compatible with streaming transfer, however even if not specifying `Content-Length` you are still required to specify `Message-Length`. +To use a JSON control block, you need to pass an extra header called `Message-Length` to rspamd. This header should be equal to the size of the message **excluding** the JSON control block. Therefore, the size of the control block is equal to `Content-Length - Message-Length`. rspamd assumes that a message starts immediately after the control block (with no extra CRLF). This method is equally compatible with streaming transfer, however even if you are not specifying `Content-Length` you are still required to specify `Message-Length`. -Here is an example of JSON control block: +Here is an example of a JSON control block: ~~~json { @@ -156,38 +151,41 @@ Here is an example of JSON control block: } ~~~ -Moreover, [UCL](https://github.com/vstakhov/libucl) json extensions and syntax conventions are also supported inside control block. +Moreover, [UCL](https://github.com/vstakhov/libucl) json extensions and syntax conventions are also supported inside the control block. ## Legacy RSPAMC protocol -For compatibility, rspamd also supports legacy `RSPAMC` and also spamassassin `SPAMC` protocols. Thought their usage is discouraged, these protocols could be still used as last resort to communicate with rspamd from legacy applications. -The rspamc dialog looks as following: +For compatibility, rspamd supports legacy `RSPAMC` and also SpamAssassin `SPAMC` protocols. Though their usage is discouraged, these protocols can still be used as a last resort to communicate with rspamd from legacy applications. - SYMBOLS RSPAMC/1.1 - Content-Length: 2200 +The RSPAMC dialog looks as follows: - +~~~ +SYMBOLS RSPAMC/1.1 +Content-Length: 2200 - RSPAMD/1.1 0 OK - Metric: default; True; 10.40 / 10.00 / 0.00 - Symbol: R_UNDISC_RCPT - Symbol: ONCE_RECEIVED - Symbol: R_MISSING_CHARSET - Urls: + + +RSPAMD/1.1 0 OK +Metric: default; True; 10.40 / 10.00 / 0.00 +Symbol: R_UNDISC_RCPT +Symbol: ONCE_RECEIVED +Symbol: R_MISSING_CHARSET +Urls: +~~~ -Rspamc protocol support different commands as well: +The RSPAMC protocol also supports different commands: -| Command | Description | -| :-------| :----- | -| CHECK | Check a message and output results for each metric. But do not output symbols. | -| SYMBOLS | Same as `CHECK` but output symbols. | -| PROCESS | Same as `SYMBOLS` but output also original message with inserted X-Spam headers. | -| PING | Do not do any processing, just check rspamd state: | +| Command | Description | +| :-------| :----- | +| CHECK | Check a message and output results for each metric, but do not output symbols. | +| SYMBOLS | Same as `CHECK`, but output symbols. | +| PROCESS | Same as `SYMBOLS` but also output the original message with inserted X-Spam headers. | +| PING | Do not do any processing, just check rspamd state. | -After command there should be one mandatory header: `Content-Length` that defines message's length in bytes and optional headers (same as for HTTP). +After the command, there should be one mandatory header - `Content-Length` - which defines a message's length in bytes, and optional headers (same as for HTTP). -Rspamd supports spamassassin `spamc` protocol and you can even pass rspamc headers in spamc mode, but reply of rspamd in `spamc` mode is truncated to "default" metric only with no options for symbols being displayed. Rspamc reply looks as following: +rspamd supports SpamAssassin's `spamc` protocol, and you can even pass rspamc headers in spamc mode, but the reply of rspamd in `spamc` mode is truncated to the "default" metric only with no options for symbols being displayed. Rspamc reply looks as follows: RSPAMD/1.1 0 OK Metric: default; True; 10.40 / 10.00 / 0.00 -- cgit v1.2.3 From 42c732f32a45f4f3dbea262eff6b251a839eab15 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 09:27:25 +0100 Subject: [Feature] Add function to generate random hex string --- src/libutil/util.c | 19 +++++++++++++++++++ src/libutil/util.h | 7 +++++++ src/lua/lua_util.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/src/libutil/util.c b/src/libutil/util.c index 4ce90ba06..212cb7f1b 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -1875,6 +1875,25 @@ randombytes (guchar *buf, guint64 len) ottery_rand_bytes (buf, (size_t)len); } +void +rspamd_random_hex (guchar *buf, guint64 len) +{ + static const gchar hexdigests[16] = "0123456789abcdef"; + gint64 i; + + g_assert (len > 0); + + ottery_rand_bytes (buf, (len / 2.0 + 0.5)); + + for (i = (gint64)len - 1; i >= 0; i -= 2) { + buf[i] = hexdigests[buf[i / 2] & 0xf]; + + if (i > 0) { + buf[i - 1] = hexdigests[(buf[i / 2] >> 4) & 0xf]; + } + } +} + void rspamd_ptr_array_free_hard (gpointer p) diff --git a/src/libutil/util.h b/src/libutil/util.h index 48e91cb4f..5c0e82a0d 100644 --- a/src/libutil/util.h +++ b/src/libutil/util.h @@ -404,6 +404,13 @@ void rspamd_deinit_libs (struct rspamd_external_libs_ctx *ctx); */ guint64 rspamd_hash_seed (void); +/** + * Returns random hex string of the specified length + * @param buf + * @param len + */ +void rspamd_random_hex (guchar *buf, guint64 len); + /** * Return jittered time value */ diff --git a/src/lua/lua_util.c b/src/lua/lua_util.c index a5b5eac84..272e39463 100644 --- a/src/lua/lua_util.c +++ b/src/lua/lua_util.c @@ -324,6 +324,15 @@ LUA_FUNCTION_DEF (util, create_file); */ LUA_FUNCTION_DEF (util, close_file); +/** + * @function util.random_hex(size) + * Returns random hex string of the specified size + * + * @param {number} len length of desired string in bytes + * @return {string} string with random hex digests + */ +LUA_FUNCTION_DEF (util, random_hex); + static const struct luaL_reg utillib_f[] = { LUA_INTERFACE_DEF (util, create_event_base), LUA_INTERFACE_DEF (util, load_rspamd_config), @@ -358,6 +367,7 @@ static const struct luaL_reg utillib_f[] = { LUA_INTERFACE_DEF (util, unlock_file), LUA_INTERFACE_DEF (util, create_file), LUA_INTERFACE_DEF (util, close_file), + LUA_INTERFACE_DEF (util, random_hex), {NULL, NULL} }; @@ -1470,6 +1480,26 @@ lua_util_close_file (lua_State *L) return 1; } +static gint +lua_util_random_hex (lua_State *L) +{ + gchar *buf; + gint buflen; + + buflen = lua_tonumber (L, 1); + + if (buflen <= 0) { + return luaL_error (L, "invalid arguments"); + } + + buf = g_malloc (buflen); + rspamd_random_hex (buf, buflen); + lua_pushlstring (L, buf, buflen); + g_free (buf); + + return 1; +} + static gint lua_load_util (lua_State * L) { -- cgit v1.2.3 From d910528bbdb056c17ed988e9824bd29ddbc98a40 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 09:48:20 +0100 Subject: [Feature] Add function to create temporary shared memory mapping --- src/libutil/util.c | 33 +++++++++++++++++++++++++++++++++ src/libutil/util.h | 7 +++++++ 2 files changed, 40 insertions(+) diff --git a/src/libutil/util.c b/src/libutil/util.c index 212cb7f1b..19953194c 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -1894,6 +1894,39 @@ rspamd_random_hex (guchar *buf, guint64 len) } } +gint +rspamd_shmem_mkstemp (gchar *pattern) +{ + gint fd = -1; + gchar *nbuf, *xpos; + gsize blen; + + xpos = strchr (pattern, 'X'); + + if (xpos == NULL) { + errno = EINVAL; + return -1; + } + + blen = strlen (pattern); + nbuf = g_malloc (blen + 1); + rspamd_strlcpy (nbuf, pattern, blen + 1); + xpos = nbuf + (xpos - pattern); + + for (;;) { + rspamd_random_hex (xpos, blen - (xpos - nbuf)); + + fd = shm_open (nbuf, O_RDWR | O_EXCL | O_CREAT, 0600); + + if (fd != -1) { + rspamd_strlcpy (pattern, nbuf, blen + 1); + } + } + + g_free (nbuf); + + return fd; +} void rspamd_ptr_array_free_hard (gpointer p) diff --git a/src/libutil/util.h b/src/libutil/util.h index 5c0e82a0d..0c293ccbe 100644 --- a/src/libutil/util.h +++ b/src/libutil/util.h @@ -411,6 +411,13 @@ guint64 rspamd_hash_seed (void); */ void rspamd_random_hex (guchar *buf, guint64 len); +/** + * Returns + * @param pattern pattern to create (should end with some number of X symbols), modified by this function + * @return + */ +gint rspamd_shmem_mkstemp (gchar *pattern); + /** * Return jittered time value */ -- cgit v1.2.3 From 06f9bb71dbd6953bda4e9330a852d221deed05ac Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 09:56:00 +0100 Subject: [Feature] Allow to open message from a shared memory segment --- src/libserver/task.c | 132 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 97 insertions(+), 35 deletions(-) diff --git a/src/libserver/task.c b/src/libserver/task.c index ce95b927d..16e8cc681 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -289,6 +289,64 @@ rspamd_task_load_message (struct rspamd_task *task, rspamd_protocol_handle_headers (task, msg); } + srch.begin = "shm"; + srch.len = 3; + tok = g_hash_table_lookup (task->request_headers, &srch); + + if (tok) { + /* Shared memory part */ + r = rspamd_strlcpy (filepath, tok->begin, + MIN (sizeof (filepath), tok->len + 1)); + + rspamd_decode_url (filepath, filepath, r + 1); + flen = strlen (filepath); + + if (filepath[0] == '"' && flen > 2) { + /* We need to unquote filepath */ + fp = &filepath[1]; + fp[flen - 2] = '\0'; + } + else { + fp = &filepath[0]; + } + + fd = shm_open (fp, O_RDONLY); + + if (fd == -1) { + g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, + "Cannot open shm segment (%s): %s", fp, strerror (errno)); + return FALSE; + } + + if (fstat (fd, &st) == -1) { + g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, + "Cannot stat shm segment (%s): %s", fp, strerror (errno)); + close (fd); + + return FALSE; + } + + map = mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); + + if (map == MAP_FAILED) { + close (fd); + g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, + "Cannot mmap file (%s): %s", fp, strerror (errno)); + return FALSE; + } + + close (fd); + task->msg.begin = map; + task->msg.len = st.st_size; + task->flags |= RSPAMD_TASK_FLAG_FILE; + + msg_info_task ("loaded message from shared memory %s", fp); + + rspamd_mempool_add_destructor (task->task_pool, rspamd_task_unmapper, task); + + return TRUE; + } + srch.begin = "file"; srch.len = 4; tok = g_hash_table_lookup (task->request_headers, &srch); @@ -317,7 +375,7 @@ rspamd_task_load_message (struct rspamd_task *task, fp = &filepath[0]; } - if (access (fp, R_OK) == -1 || stat (fp, &st) == -1) { + if (stat (fp, &st) == -1) { g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, "Invalid file (%s): %s", fp, strerror (errno)); return FALSE; @@ -346,46 +404,50 @@ rspamd_task_load_message (struct rspamd_task *task, task->msg.len = st.st_size; task->flags |= RSPAMD_TASK_FLAG_FILE; + msg_info_task ("loaded message from file %s", fp); + rspamd_mempool_add_destructor (task->task_pool, rspamd_task_unmapper, task); + + return TRUE; } - else { - debug_task ("got input of length %z", task->msg.len); - task->msg.begin = start; - task->msg.len = len; - - if (task->msg.len == 0) { - task->flags |= RSPAMD_TASK_FLAG_EMPTY; - } - - if (task->flags & RSPAMD_TASK_FLAG_HAS_CONTROL) { - /* We have control chunk, so we need to process it separately */ - if (task->msg.len < task->message_len) { - msg_warn_task ("message has invalid message length: %ul and total len: %ul", - task->message_len, task->msg.len); - g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, - "Invalid length"); - return FALSE; - } - control_len = task->msg.len - task->message_len; - if (control_len > 0) { - parser = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE); + /* Plain data */ + debug_task ("got input of length %z", task->msg.len); + task->msg.begin = start; + task->msg.len = len; - if (!ucl_parser_add_chunk (parser, task->msg.begin, control_len)) { - msg_warn_task ("processing of control chunk failed: %s", - ucl_parser_get_error (parser)); - ucl_parser_free (parser); - } - else { - control_obj = ucl_parser_get_object (parser); - ucl_parser_free (parser); - rspamd_protocol_handle_control (task, control_obj); - ucl_object_unref (control_obj); - } + if (task->msg.len == 0) { + task->flags |= RSPAMD_TASK_FLAG_EMPTY; + } - task->msg.begin += control_len; - task->msg.len -= control_len; + if (task->flags & RSPAMD_TASK_FLAG_HAS_CONTROL) { + /* We have control chunk, so we need to process it separately */ + if (task->msg.len < task->message_len) { + msg_warn_task ("message has invalid message length: %ul and total len: %ul", + task->message_len, task->msg.len); + g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, + "Invalid length"); + return FALSE; + } + control_len = task->msg.len - task->message_len; + + if (control_len > 0) { + parser = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE); + + if (!ucl_parser_add_chunk (parser, task->msg.begin, control_len)) { + msg_warn_task ("processing of control chunk failed: %s", + ucl_parser_get_error (parser)); + ucl_parser_free (parser); + } + else { + control_obj = ucl_parser_get_object (parser); + ucl_parser_free (parser); + rspamd_protocol_handle_control (task, control_obj); + ucl_object_unref (control_obj); } + + task->msg.begin += control_len; + task->msg.len -= control_len; } } -- cgit v1.2.3 From bad0ee381608c99a22c7b0e3146d6372c22736f9 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 12:03:27 +0100 Subject: [Feature] Improve fstrings API --- src/libutil/fstring.c | 54 +++++++++++++++++++++++++++++++++++++++------------ src/libutil/fstring.h | 9 +++++++++ 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/libutil/fstring.c b/src/libutil/fstring.c index a70290a0b..25eda60e7 100644 --- a/src/libutil/fstring.c +++ b/src/libutil/fstring.c @@ -17,8 +17,6 @@ #include "str_util.h" static const gsize default_initial_size = 48; -/* Maximum size when we double the size of new string */ -static const gsize max_grow = 1024 * 1024; #define fstravail(s) ((s)->allocated - (s)->len) @@ -27,7 +25,13 @@ rspamd_fstring_new (void) { rspamd_fstring_t *s; - g_assert (posix_memalign ((void**)&s, 16, default_initial_size + sizeof (*s)) == 0); + if (posix_memalign ((void**)&s, 16, default_initial_size + sizeof (*s)) != 0) { + g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes", + G_STRLOC, default_initial_size + sizeof (*s)); + + return NULL; + } + s->len = 0; s->allocated = default_initial_size; @@ -40,7 +44,12 @@ rspamd_fstring_sized_new (gsize initial_size) rspamd_fstring_t *s; gsize real_size = MAX (default_initial_size, initial_size); - g_assert (posix_memalign ((void **)&s, 16, real_size + sizeof (*s)) == 0); + if (posix_memalign ((void **)&s, 16, real_size + sizeof (*s)) != 0) { + g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes", + G_STRLOC, real_size + sizeof (*s)); + + return NULL; + } s->len = 0; s->allocated = real_size; @@ -53,7 +62,13 @@ rspamd_fstring_new_init (const gchar *init, gsize len) rspamd_fstring_t *s; gsize real_size = MAX (default_initial_size, len); - g_assert (posix_memalign ((void **) &s, 16, real_size + sizeof (*s)) == 0); + if (posix_memalign ((void **) &s, 16, real_size + sizeof (*s)) != 0) { + g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes", + G_STRLOC, real_size + sizeof (*s)); + + return NULL; + } + s->len = len; s->allocated = real_size; memcpy (s->str, init, len); @@ -85,13 +100,14 @@ rspamd_fstring_free (rspamd_fstring_t *str) free (str); } -rspamd_fstring_t * -rspamd_fstring_grow (rspamd_fstring_t *str, gsize needed_len) +inline gsize +rspamd_fstring_suggest_size (gsize len, gsize allocated, gsize needed_len) { gsize newlen; - gpointer nptr; + /* Maximum size when we double the size of new string */ + static const gsize max_grow = 1024 * 1024; - newlen = str->allocated; + newlen = allocated; /* * Stop exponential grow at some point, since it might be slow for the @@ -107,8 +123,8 @@ rspamd_fstring_grow (rspamd_fstring_t *str, gsize needed_len) /* * Check for overflow */ - if (newlen <= str->len + needed_len) { - newlen = str->len + needed_len; + if (newlen <= len + needed_len) { + newlen = len + needed_len; if (newlen < max_grow) { newlen *= 2; @@ -118,12 +134,26 @@ rspamd_fstring_grow (rspamd_fstring_t *str, gsize needed_len) } } + return newlen; +} + +rspamd_fstring_t * +rspamd_fstring_grow (rspamd_fstring_t *str, gsize needed_len) +{ + gsize newlen; + gpointer nptr; + + newlen = rspamd_fstring_suggest_size (str->len, str->allocated, needed_len); + nptr = realloc (str, newlen + sizeof (*str)); if (nptr == NULL) { /* Avoid memory leak */ free (str); - g_assert (nptr); + g_error ("%s: failed to re-allocate %"G_GSIZE_FORMAT" bytes", + G_STRLOC, newlen + sizeof (*str)); + + return NULL; } str = nptr; diff --git a/src/libutil/fstring.h b/src/libutil/fstring.h index 0bd9a271d..e23bd5e19 100644 --- a/src/libutil/fstring.h +++ b/src/libutil/fstring.h @@ -146,6 +146,15 @@ void rspamd_fstring_mapped_ftok_free (gpointer p); */ rspamd_ftok_t *rspamd_ftok_map (const rspamd_fstring_t *s); +/** + * Suggest suitable size to grow fstring + * @param len + * @param allocated + * @param needed_len + * @return + */ +gsize rspamd_fstring_suggest_size (gsize len, gsize allocated, gsize needed_len); + /** * Grow the specified fixed string * @param str -- cgit v1.2.3 From 2672f82d536eeed406c6c9882d972ac24e458cf3 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 14:17:13 +0100 Subject: [Rework] Rework HTTP code - Restructure body storage - Make abstract API to manage body of HTTP messages - Implement messages with body in shared memory - Avoid copying when serving files - Allow to share content between messages --- src/libutil/http.c | 347 ++++++++++++++++++++++++++++++++++++++++++----------- src/libutil/http.h | 69 ++++++++++- 2 files changed, 346 insertions(+), 70 deletions(-) diff --git a/src/libutil/http.c b/src/libutil/http.c index fc8263ddd..84faaad89 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -592,8 +592,10 @@ rspamd_http_on_headers_complete (http_parser * parser) struct rspamd_http_connection *conn = (struct rspamd_http_connection *)parser->data; struct rspamd_http_connection_private *priv; + struct rspamd_http_message *msg; priv = conn->priv; + msg = priv->msg; if (priv->header != NULL) { rspamd_http_finish_header (conn, priv); @@ -602,20 +604,17 @@ rspamd_http_on_headers_complete (http_parser * parser) priv->flags &= ~RSPAMD_HTTP_CONN_FLAG_NEW_HEADER; } - if (parser->content_length != 0 && parser->content_length != ULLONG_MAX) { - priv->msg->body = rspamd_fstring_sized_new (parser->content_length); - } - else { - priv->msg->body = rspamd_fstring_new (); + if (!rspamd_http_message_set_body (msg, NULL, parser->content_length)) { + return -1; } if (parser->flags & F_SPAMC) { - priv->msg->flags |= RSPAMD_HTTP_FLAG_SPAMC; + msg->flags |= RSPAMD_HTTP_FLAG_SPAMC; } - priv->msg->body_buf.begin = priv->msg->body->str; - priv->msg->method = parser->method; - priv->msg->code = parser->status_code; + + msg->method = parser->method; + msg->code = parser->status_code; return 0; } @@ -626,18 +625,18 @@ rspamd_http_on_body (http_parser * parser, const gchar *at, size_t length) struct rspamd_http_connection *conn = (struct rspamd_http_connection *)parser->data; struct rspamd_http_connection_private *priv; + struct rspamd_http_message *msg; priv = conn->priv; + msg = priv->msg; - priv->msg->body = rspamd_fstring_append (priv->msg->body, at, length); - - /* Append might cause realloc */ - priv->msg->body_buf.begin = priv->msg->body->str; - priv->msg->body_buf.len = priv->msg->body->len; + if (!rspamd_http_message_append_body (msg, at, length)) { + return -1; + } if ((conn->opts & RSPAMD_HTTP_BODY_PARTIAL) && !IS_CONN_ENCRYPTED (priv)) { /* Incremental update is impossible for encrypted requests so far */ - return (conn->body_handler (conn, priv->msg, at, length)); + return (conn->body_handler (conn, msg, at, length)); } return 0; @@ -710,10 +709,10 @@ rspamd_http_decrypt_message (struct rspamd_http_connection *conn, enum rspamd_cryptobox_mode mode; mode = rspamd_keypair_alg (priv->local_key); - nonce = msg->body->str; - m = msg->body->str + rspamd_cryptobox_nonce_bytes (mode) + + nonce = msg->body_buf.str; + m = msg->body_buf.str + rspamd_cryptobox_nonce_bytes (mode) + rspamd_cryptobox_mac_bytes (mode); - dec_len = msg->body->len - rspamd_cryptobox_nonce_bytes (mode) - + dec_len = msg->body_buf.len - rspamd_cryptobox_nonce_bytes (mode) - rspamd_cryptobox_mac_bytes (mode); if ((nm = rspamd_pubkey_get_nm (peer_key)) == NULL) { @@ -781,7 +780,7 @@ rspamd_http_on_message_complete (http_parser * parser) mode = rspamd_keypair_alg (priv->local_key); if (priv->local_key == NULL || priv->msg->peer_key == NULL || - priv->msg->body->len < rspamd_cryptobox_nonce_bytes (mode) + + priv->msg->body_buf.len < rspamd_cryptobox_nonce_bytes (mode) + rspamd_cryptobox_mac_bytes (mode)) { msg_err ("cannot decrypt message"); return -1; @@ -1172,13 +1171,6 @@ rspamd_http_connection_steal_msg (struct rspamd_http_connection *conn) msg->peer_key = NULL; } priv->msg = NULL; - - /* We also might need to adjust body/body_buf */ - if (msg->body_buf.begin > msg->body->str) { - memmove (msg->body->str, msg->body_buf.begin, msg->body_buf.len); - msg->body->len = msg->body_buf.len; - msg->body_buf.begin = msg->body->str; - } } return msg; @@ -1190,17 +1182,60 @@ rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn) struct rspamd_http_connection_private *priv; struct rspamd_http_message *new_msg, *msg; struct rspamd_http_header *hdr, *nhdr; + const gchar *old_body; + gsize old_len; + struct stat st; + union _rspamd_storage_u *storage; priv = conn->priv; msg = priv->msg; new_msg = rspamd_http_new_message (msg->type); + new_msg->flags = msg->flags; - if (msg->body) { - new_msg->body = rspamd_fstring_new_init (msg->body->str, - msg->body->len); - new_msg->body_buf.begin = msg->body_buf.begin; - new_msg->body_buf.len = msg->body_buf.len; + if (msg->body_buf.len > 0) { + + if (msg->flags & RSPAMD_HTTP_FLAG_SHMEM) { + /* Avoid copying by just maping a shared segment */ + new_msg->flags |= RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE; + + storage = &new_msg->body_buf.c; + storage->shared.shm_fd = dup (msg->body_buf.c.shared.shm_fd); + + if (storage->shared.shm_fd == -1) { + rspamd_http_message_free (new_msg); + return NULL; + } + + if (fstat (storage->shared.shm_fd, &st) == -1) { + rspamd_http_message_free (new_msg); + return NULL; + } + + /* We don't own segment, so do not try to touch it */ + storage->shared.shm_name = NULL; + new_msg->body_buf.str = mmap (NULL, st.st_size, + PROT_READ, MAP_SHARED, + storage->shared.shm_fd, 0); + + if (new_msg->body_buf.str == MAP_FAILED) { + rspamd_http_message_free (new_msg); + return NULL; + } + + new_msg->body_buf.begin = new_msg->body_buf.str; + new_msg->body_buf.len = st.st_size; + new_msg->body_buf.begin = new_msg->body_buf.str + + (msg->body_buf.begin - msg->body_buf.str); + } + else { + old_body = rspamd_http_message_get_body (msg, &old_len); + + if (!rspamd_http_message_set_body (new_msg, old_body, old_len)) { + rspamd_http_message_free (new_msg); + return NULL; + } + } } if (msg->url) { @@ -1222,7 +1257,6 @@ rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn) new_msg->method = msg->method; new_msg->port = msg->port; new_msg->date = msg->date; - new_msg->flags = msg->flags; new_msg->last_modified = msg->last_modified; LL_FOREACH (msg->headers, hdr) { @@ -1469,14 +1503,14 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, if (encrypted) { mode = rspamd_keypair_alg (priv->local_key); - if (msg->body == NULL || msg->body->len == 0) { + if (msg->body_buf.len == 0) { pbody = NULL; bodylen = 0; msg->method = HTTP_GET; } else { - pbody = msg->body->str; - bodylen = msg->body->len; + pbody = (gchar *)msg->body_buf.begin; + bodylen = msg->body_buf.len; msg->method = HTTP_POST; } @@ -1534,22 +1568,22 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, } else { if (msg->method < HTTP_SYMBOLS) { - if (msg->body == NULL || msg->body->len == 0) { + if (msg->body_buf.len == 0) { pbody = NULL; bodylen = 0; priv->outlen = 2; msg->method = HTTP_GET; } else { - pbody = msg->body->str; - bodylen = msg->body->len; + pbody = (gchar *)msg->body_buf.begin; + bodylen = msg->body_buf.len; priv->outlen = 3; msg->method = HTTP_POST; } } - else if (msg->body != NULL) { - pbody = msg->body->str; - bodylen = msg->body->len; + else if (msg->body_buf.len > 0) { + pbody = (gchar *)msg->body_buf.begin; + bodylen = msg->body_buf.len; priv->outlen = 2; } else { @@ -1796,11 +1830,6 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, } if (pbody != NULL) { - - if (msg->body_buf.begin == NULL && msg->body_buf.len == 0) { - msg->body_buf.begin = msg->body->str; - } - priv->out[i].iov_base = pbody; priv->out[i++].iov_len = bodylen; } @@ -1825,7 +1854,8 @@ rspamd_http_new_message (enum http_parser_type type) { struct rspamd_http_message *new; - new = g_slice_alloc (sizeof (struct rspamd_http_message)); + new = g_slice_alloc0 (sizeof (struct rspamd_http_message)); + if (type == HTTP_REQUEST) { new->url = rspamd_fstring_new (); } @@ -1834,17 +1864,9 @@ rspamd_http_new_message (enum http_parser_type type) new->code = 200; } - new->headers = NULL; - new->date = 0; - new->body = NULL; - memset (&new->body_buf, 0, sizeof (new->body_buf)); - new->status = NULL; - new->host = NULL; new->port = 80; new->type = type; new->method = HTTP_GET; - new->peer_key = NULL; - new->flags = 0; return new; } @@ -1898,10 +1920,186 @@ rspamd_http_message_from_url (const gchar *url) return msg; } +const gchar * +rspamd_http_message_get_body (struct rspamd_http_message *msg, + gsize *blen) +{ + const gchar *ret = NULL; + + if (msg->body_buf.len > 0) { + ret = msg->body_buf.begin; + } + + if (blen) { + *blen = msg->body_buf.len; + } + + return ret; +} + +gboolean +rspamd_http_message_set_body (struct rspamd_http_message *msg, + const gchar *data, gsize len) +{ + union _rspamd_storage_u *storage; + storage = &msg->body_buf.c; + + if (msg->flags & RSPAMD_HTTP_FLAG_SHMEM) { + storage->shared.shm_name = g_strdup ("/rhm.XXXXXXXXXXXXXXXXXXXX"); + storage->shared.shm_fd = rspamd_shmem_mkstemp (storage->shared.shm_name); + + if (storage->shared.shm_fd == -1) { + return FALSE; + } + + if (len != 0 && len != ULLONG_MAX) { + if (ftruncate (storage->shared.shm_fd, len) == -1) { + return FALSE; + } + + msg->body_buf.str = mmap (NULL, len, + PROT_WRITE|PROT_READ, MAP_SHARED, + storage->shared.shm_fd, 0); + + if (msg->body_buf.str == MAP_FAILED) { + return FALSE; + } + + msg->body_buf.begin = msg->body_buf.str; + + if (data != NULL) { + memcpy (msg->body_buf.str, data, len); + msg->body_buf.len = len; + } + } + else { + msg->body_buf.len = 0; + msg->body_buf.begin = NULL; + msg->body_buf.str = NULL; + } + } + else { + if (len != 0 && len != ULLONG_MAX) { + if (data == NULL) { + storage->normal = rspamd_fstring_sized_new (len); + msg->body_buf.len = 0; + } + else { + storage->normal = rspamd_fstring_new_init (data, len); + msg->body_buf.len = len; + } + } + else { + storage->normal = rspamd_fstring_new (); + } + + msg->body_buf.begin = storage->normal->str; + msg->body_buf.str = storage->normal->str; + } + + return TRUE; +} + +gboolean +rspamd_http_message_set_body_from_fd (struct rspamd_http_message *msg, + gint fd) +{ + union _rspamd_storage_u *storage; + struct stat st; + + storage = &msg->body_buf.c; + msg->flags |= RSPAMD_HTTP_FLAG_SHMEM|RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE; + + storage->shared.shm_fd = dup (fd); + msg->body_buf.str = MAP_FAILED; + + if (storage->shared.shm_fd == -1) { + return FALSE; + } + + if (fstat (storage->shared.shm_fd, &st) == -1) { + return FALSE; + } + + msg->body_buf.str = mmap (NULL, st.st_size, + PROT_READ, MAP_SHARED, + storage->shared.shm_fd, 0); + + if (msg->body_buf.str == MAP_FAILED) { + return FALSE; + } + + msg->body_buf.begin = msg->body_buf.str; + msg->body_buf.len = st.st_size; + + return TRUE; +} + +gboolean +rspamd_http_message_append_body (struct rspamd_http_message *msg, + const gchar *data, gsize len) +{ + struct stat st; + union _rspamd_storage_u *storage; + gsize newlen; + + storage = &msg->body_buf.c; + + if (msg->flags & RSPAMD_HTTP_FLAG_SHMEM) { + if (storage->shared.shm_fd == -1) { + return FALSE; + } + + if (fstat (storage->shared.shm_fd, &st) == -1) { + return FALSE; + } + + /* Unmap as we need another size of segment */ + if (msg->body_buf.str) { + munmap (msg->body_buf.str, msg->body_buf.len); + } + + /* Check if we need to grow */ + if (st.st_size - msg->body_buf.len < len) { + /* Need to grow */ + newlen = rspamd_fstring_suggest_size (msg->body_buf.len, st.st_size, + len); + + if (ftruncate (storage->shared.shm_fd, newlen) == -1) { + return FALSE; + } + } + + msg->body_buf.str = mmap (NULL, msg->body_buf.len + len, + PROT_WRITE|PROT_READ, MAP_SHARED, storage->shared.shm_fd, 0); + + if (msg->body_buf.str == MAP_FAILED) { + return FALSE; + } + + memcpy (msg->body_buf.str + msg->body_buf.len, data, len); + msg->body_buf.len += len; + msg->body_buf.begin = msg->body_buf.str; + } + else { + storage->normal = rspamd_fstring_append (storage->normal, data, len); + + /* Append might cause realloc */ + msg->body_buf.begin = storage->normal->str; + msg->body_buf.len = storage->normal->len; + msg->body_buf.str = storage->normal->str; + } + + return TRUE; +} + + void rspamd_http_message_free (struct rspamd_http_message *msg) { struct rspamd_http_header *hdr, *tmp_hdr; + union _rspamd_storage_u *storage; + struct stat st; LL_FOREACH_SAFE (msg->headers, hdr, tmp_hdr) { @@ -1910,9 +2108,31 @@ rspamd_http_message_free (struct rspamd_http_message *msg) g_slice_free1 (sizeof (*hdr->value), hdr->value); g_slice_free1 (sizeof (struct rspamd_http_header), hdr); } - if (msg->body != NULL) { - rspamd_fstring_free (msg->body); + + if (msg->body_buf.len != 0) { + if (msg->flags & RSPAMD_HTTP_FLAG_SHMEM) { + storage = &msg->body_buf.c; + + if (storage->shared.shm_fd != -1) { + g_assert (fstat (storage->shared.shm_fd, &st) != -1); + + if (msg->body_buf.str != MAP_FAILED) { + munmap (msg->body_buf.str, st.st_size); + } + + close (storage->shared.shm_fd); + } + + if (storage->shared.shm_name != NULL) { + shm_unlink (storage->shared.shm_name); + g_free (storage->shared.shm_name); + } + } + else { + rspamd_fstring_free (msg->body_buf.c.normal); + } } + if (msg->url != NULL) { rspamd_fstring_free (msg->url); } @@ -2046,7 +2266,7 @@ rspamd_http_router_error_handler (struct rspamd_http_connection *conn, msg = rspamd_http_new_message (HTTP_RESPONSE); msg->date = time (NULL); msg->code = err->code; - msg->body = rspamd_fstring_new_init (err->message, strlen (err->message)); + rspamd_http_message_set_body (msg, err->message, strlen (err->message)); rspamd_http_connection_reset (entry->conn); rspamd_http_connection_write_message (entry->conn, msg, @@ -2160,14 +2380,7 @@ rspamd_http_router_try_file (struct rspamd_http_connection_entry *entry, reply_msg->date = time (NULL); reply_msg->code = 200; - reply_msg->body = rspamd_fstring_sized_new (st.st_size); - reply_msg->body->len = st.st_size; - reply_msg->body_buf.len = st.st_size; - reply_msg->body_buf.begin = reply_msg->body->str; - - if (read (fd, reply_msg->body->str, st.st_size) != st.st_size) { - close (fd); - rspamd_http_message_free (reply_msg); + if (!rspamd_http_message_set_body_from_fd (reply_msg, fd)) { return FALSE; } @@ -2239,7 +2452,7 @@ rspamd_http_router_finish_handler (struct rspamd_http_connection *conn, err_msg = rspamd_http_new_message (HTTP_RESPONSE); err_msg->date = time (NULL); err_msg->code = err->code; - err_msg->body = rspamd_fstring_new_init (err->message, + rspamd_http_message_set_body (err_msg, err->message, strlen (err->message)); rspamd_http_connection_reset (entry->conn); rspamd_http_connection_write_message (entry->conn, diff --git a/src/libutil/http.h b/src/libutil/http.h index d9fb73b82..1d4e0f886 100644 --- a/src/libutil/http.h +++ b/src/libutil/http.h @@ -47,7 +47,15 @@ struct rspamd_http_header { /** * Legacy spamc protocol */ -#define RSPAMD_HTTP_FLAG_SPAMC 1 << 1 +#define RSPAMD_HTTP_FLAG_SPAMC (1 << 0) +/** + * Store body of the message in a shared memory segment + */ +#define RSPAMD_HTTP_FLAG_SHMEM (1 << 2) +/** + * Store body of the message in an immutable shared memory segment + */ +#define RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE (1 << 3) /** * HTTP message structure, used for requests and replies @@ -57,8 +65,25 @@ struct rspamd_http_message { rspamd_fstring_t *host; rspamd_fstring_t *status; struct rspamd_http_header *headers; - rspamd_fstring_t *body; - rspamd_ftok_t body_buf; + + struct _rspamd_body_buf_s { + /* Data start */ + const gchar *begin; + /* Data len */ + gsize len; + /* Data buffer (used to write data inside) */ + gchar *str; + + /* Internal storage */ + union _rspamd_storage_u { + rspamd_fstring_t *normal; + struct { + gchar *shm_name; + gint shm_fd; + } shared; + } c; + } body_buf; + struct rspamd_cryptobox_pubkey *peer_key; time_t date; time_t last_modified; @@ -276,6 +301,44 @@ struct rspamd_http_message * rspamd_http_new_message (enum http_parser_type type */ struct rspamd_http_message* rspamd_http_message_from_url (const gchar *url); +/** + * Returns body for a message + * @param msg + * @param blen pointer where to save body length + * @return pointer to body start + */ +const gchar *rspamd_http_message_get_body (struct rspamd_http_message *msg, + gsize *blen); + +/** + * Set message's body from the string + * @param msg + * @param data + * @param len + * @return TRUE if a message's body has been set + */ +gboolean rspamd_http_message_set_body (struct rspamd_http_message *msg, + const gchar *data, gsize len); + +/** + * Maps fd as message's body + * @param msg + * @param fd + * @return TRUE if a message's body has been set + */ +gboolean rspamd_http_message_set_body_from_fd (struct rspamd_http_message *msg, + gint fd); + +/** + * Appends data to message's body + * @param msg + * @param data + * @param len + * @return TRUE if a message's body has been set + */ +gboolean rspamd_http_message_append_body (struct rspamd_http_message *msg, + const gchar *data, gsize len); + /** * Append a header to reply * @param rep -- cgit v1.2.3 From 42acc1f6bb3e8f4ba967bbedc73ab7e6f043518b Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 14:32:46 +0100 Subject: [Feature] Store HTTP headers in a hash table --- src/libutil/http.c | 70 +++++++++++++++++++++++++----------------------------- src/libutil/http.h | 3 ++- 2 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/libutil/http.c b/src/libutil/http.c index 84faaad89..2e9fa259a 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -517,7 +517,8 @@ rspamd_http_finish_header (struct rspamd_http_connection *conn, priv->header->value->begin = priv->header->combined->str + priv->header->name->len + 2; priv->header->name->begin = priv->header->combined->str; - DL_APPEND (priv->msg->headers, priv->header); + HASH_ADD_KEYPTR (hh, priv->msg->headers, priv->header->name->begin, + priv->header->name->len, priv->header); rspamd_http_check_special_header (conn, priv); } @@ -726,7 +727,8 @@ rspamd_http_decrypt_message (struct rspamd_http_connection *conn, } /* Cleanup message */ - DL_FOREACH_SAFE (msg->headers, hdr, hdrtmp) { + HASH_ITER (hh, msg->headers, hdr, hdrtmp) { + HASH_DELETE (hh, msg->headers, hdr); rspamd_fstring_free (hdr->combined); g_slice_free1 (sizeof (*hdr->name), hdr->name); g_slice_free1 (sizeof (*hdr->value), hdr->value); @@ -1181,7 +1183,7 @@ rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn) { struct rspamd_http_connection_private *priv; struct rspamd_http_message *new_msg, *msg; - struct rspamd_http_header *hdr, *nhdr; + struct rspamd_http_header *hdr, *nhdr, *thdr; const gchar *old_body; gsize old_len; struct stat st; @@ -1259,7 +1261,7 @@ rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn) new_msg->date = msg->date; new_msg->last_modified = msg->last_modified; - LL_FOREACH (msg->headers, hdr) { + HASH_ITER (hh, msg->headers, hdr, thdr) { nhdr = g_slice_alloc (sizeof (struct rspamd_http_header)); nhdr->name = g_slice_alloc (sizeof (*nhdr->name)); nhdr->value = g_slice_alloc (sizeof (*nhdr->value)); @@ -1272,7 +1274,8 @@ rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn) (hdr->value->begin - hdr->combined->str); nhdr->value->len = hdr->value->len; - DL_APPEND (new_msg->headers, nhdr); + HASH_ADD_KEYPTR (hh, new_msg->headers, nhdr->name->begin, + nhdr->name->len, nhdr); } return new_msg; @@ -1367,7 +1370,7 @@ rspamd_http_connection_encrypt_message ( const guchar *nm; gint i, cnt; guint outlen; - struct rspamd_http_header *hdr; + struct rspamd_http_header *hdr, *htmp; enum rspamd_cryptobox_mode mode; mode = rspamd_keypair_alg (priv->local_key); @@ -1402,7 +1405,7 @@ rspamd_http_connection_encrypt_message ( } - LL_FOREACH (msg->headers, hdr) { + HASH_ITER (hh, msg->headers, hdr, htmp) { segments[i].data = hdr->combined->str; segments[i++].len = hdr->combined->len; } @@ -1456,7 +1459,7 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, gpointer ud, gint fd, struct timeval *timeout, struct event_base *base) { struct rspamd_http_connection_private *priv = conn->priv; - struct rspamd_http_header *hdr; + struct rspamd_http_header *hdr, *htmp; struct tm t, *ptm; gchar datebuf[64], repbuf[512], *pbody; gint i, hdrcount, meth_len = 0, preludelen = 0; @@ -1597,7 +1600,7 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, priv->wr_total = bodylen + buf->len + 2; hdrcount = 0; - DL_FOREACH (msg->headers, hdr) { + HASH_ITER (hh, msg->headers, hdr, htmp) { /* */ priv->wr_total += hdr->combined->len; enclen += hdr->combined->len; @@ -1816,7 +1819,7 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, } else { i = 1; - LL_FOREACH (msg->headers, hdr) { + HASH_ITER (hh, msg->headers, hdr, htmp) { priv->out[i].iov_base = hdr->combined->str; priv->out[i++].iov_len = hdr->combined->len; } @@ -2097,12 +2100,12 @@ rspamd_http_message_append_body (struct rspamd_http_message *msg, void rspamd_http_message_free (struct rspamd_http_message *msg) { - struct rspamd_http_header *hdr, *tmp_hdr; + struct rspamd_http_header *hdr, *htmp; union _rspamd_storage_u *storage; struct stat st; - LL_FOREACH_SAFE (msg->headers, hdr, tmp_hdr) - { + HASH_ITER (hh, msg->headers, hdr, htmp) { + HASH_DEL (msg->headers, hdr); rspamd_fstring_free (hdr->combined); g_slice_free1 (sizeof (*hdr->name), hdr->name); g_slice_free1 (sizeof (*hdr->value), hdr->value); @@ -2169,7 +2172,7 @@ rspamd_http_message_add_header (struct rspamd_http_message *msg, hdr->name->len = nlen; hdr->value->begin = hdr->combined->str + nlen + 2; hdr->value->len = vlen; - DL_APPEND (msg->headers, hdr); + HASH_ADD_KEYPTR (hh, msg->headers, hdr->name->begin, hdr->name->len, hdr); } } @@ -2179,46 +2182,37 @@ rspamd_http_message_find_header (struct rspamd_http_message *msg, { struct rspamd_http_header *hdr; const rspamd_ftok_t *res = NULL; - rspamd_ftok_t cmp; guint slen = strlen (name); if (msg != NULL) { - cmp.begin = name; - cmp.len = slen; + HASH_FIND (hh, msg->headers, name, slen, hdr); - LL_FOREACH (msg->headers, hdr) { - if (rspamd_ftok_casecmp (hdr->name, &cmp) == 0) { - res = hdr->value; - break; - } + if (hdr) { + res = hdr->value; } } return res; } -gboolean rspamd_http_message_remove_header (struct rspamd_http_message *msg, +gboolean +rspamd_http_message_remove_header (struct rspamd_http_message *msg, const gchar *name) { - struct rspamd_http_header *hdr, *tmp; + struct rspamd_http_header *hdr; gboolean res = FALSE; guint slen = strlen (name); - rspamd_ftok_t cmp; if (msg != NULL) { - cmp.begin = name; - cmp.len = slen; - - DL_FOREACH_SAFE (msg->headers, hdr, tmp) { - if (rspamd_ftok_casecmp (hdr->name, &cmp) == 0) { - res = TRUE; - DL_DELETE (msg->headers, hdr); - - rspamd_fstring_free (hdr->combined); - g_slice_free1 (sizeof (*hdr->value), hdr->value); - g_slice_free1 (sizeof (*hdr->name), hdr->name); - g_slice_free1 (sizeof (*hdr), hdr); - } + HASH_FIND (hh, msg->headers, name, slen, hdr); + + if (hdr) { + HASH_DEL (msg->headers, hdr); + res = TRUE; + rspamd_fstring_free (hdr->combined); + g_slice_free1 (sizeof (*hdr->value), hdr->value); + g_slice_free1 (sizeof (*hdr->name), hdr->name); + g_slice_free1 (sizeof (*hdr), hdr); } } diff --git a/src/libutil/http.h b/src/libutil/http.h index 1d4e0f886..59567b10a 100644 --- a/src/libutil/http.h +++ b/src/libutil/http.h @@ -28,6 +28,7 @@ #include "keypair.h" #include "keypairs_cache.h" #include "fstring.h" +#include "uthash.h" enum rspamd_http_connection_type { RSPAMD_HTTP_SERVER, @@ -41,7 +42,7 @@ struct rspamd_http_header { rspamd_ftok_t *name; rspamd_ftok_t *value; rspamd_fstring_t *combined; - struct rspamd_http_header *next, *prev; + UT_hash_handle hh; }; /** -- cgit v1.2.3 From 1b39a1b22f04395501138a8b31196704dbc21e59 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 14:46:03 +0100 Subject: [Fix] Improve strcase hash used in uthash --- src/libutil/str_util.c | 3 ++- src/libutil/str_util.h | 2 ++ src/libutil/uthash_strcase.h | 62 ++++++++++++++++++++++++++++++++++---------- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/src/libutil/str_util.c b/src/libutil/str_util.c index 67aa63aa8..1ce81bc9e 100644 --- a/src/libutil/str_util.c +++ b/src/libutil/str_util.c @@ -17,9 +17,10 @@ #include "util.h" #include "cryptobox.h" #include "url.h" +#include "str_util.h" #include -static const guchar lc_map[256] = { +const guchar lc_map[256] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, diff --git a/src/libutil/str_util.h b/src/libutil/str_util.h index a63b160dd..695a8d022 100644 --- a/src/libutil/str_util.h +++ b/src/libutil/str_util.h @@ -308,4 +308,6 @@ gboolean rspamd_emails_cmp (gconstpointer a, gconstpointer b); /* Compare two urls for building emails hash */ gboolean rspamd_urls_cmp (gconstpointer a, gconstpointer b); +extern const guchar lc_map[256]; + #endif /* SRC_LIBUTIL_STR_UTIL_H_ */ diff --git a/src/libutil/uthash_strcase.h b/src/libutil/uthash_strcase.h index 5d1df130f..45ed84f67 100644 --- a/src/libutil/uthash_strcase.h +++ b/src/libutil/uthash_strcase.h @@ -16,30 +16,66 @@ #ifndef UTHASH_STRCASE_H_ #define UTHASH_STRCASE_H_ -#include "xxhash.h" - /* Utils for uthash tuning */ #ifndef HASH_CASELESS #define HASH_FUNCTION(key,keylen,num_bkts,hashv,bkt) do {\ - hashv = XXH32(key, keylen, 0); \ + hashv = mum(key, keylen, 0xdeadbabe); \ bkt = (hashv) & (num_bkts-1); \ } while (0) #define HASH_KEYCMP(a,b,len) memcmp(a,b,len) #else #define HASH_FUNCTION(key,keylen,num_bkts,hashv,bkt) do {\ - XXH32_state_t xxh; \ - XXH32_reset(&xxh, 0xdead); \ - unsigned char *p = (unsigned char *)key, t; \ - for (unsigned int i = 0; i < keylen; i ++) { \ - t = g_ascii_tolower(p[i]); \ - XXH32_update(&xxh, &t, 1); \ - } \ - hashv = XXH32_digest(&xxh); \ - bkt = (hashv) & (num_bkts-1); \ + unsigned len = keylen; \ + unsigned leftover = keylen % 8; \ + unsigned fp, i; \ + const uint8_t* s = (const uint8_t*)key; \ + union { \ + struct { \ + unsigned char c1, c2, c3, c4, c5, c6, c7, c8; \ + } c; \ + uint64_t pp; \ + } u; \ + uint64_t r; \ + fp = len - leftover; \ + r = 0xdeadbabe; \ + for (i = 0; i != fp; i += 8) { \ + u.c.c1 = s[i], u.c.c2 = s[i + 1], u.c.c3 = s[i + 2], u.c.c4 = s[i + 3]; \ + u.c.c5 = s[i + 4], u.c.c6 = s[i + 5], u.c.c7 = s[i + 6], u.c.c8 = s[i + 7]; \ + u.c.c1 = lc_map[u.c.c1]; \ + u.c.c2 = lc_map[u.c.c2]; \ + u.c.c3 = lc_map[u.c.c3]; \ + u.c.c4 = lc_map[u.c.c4]; \ + u.c.c1 = lc_map[u.c.c5]; \ + u.c.c2 = lc_map[u.c.c6]; \ + u.c.c3 = lc_map[u.c.c7]; \ + u.c.c4 = lc_map[u.c.c8]; \ + r = mum_hash_step (r, u.pp); \ + } \ + u.pp = 0; \ + switch (leftover) { \ + case 7: \ + u.c.c7 = lc_map[(unsigned char)s[i++]]; \ + case 6: \ + u.c.c6 = lc_map[(unsigned char)s[i++]]; \ + case 5: \ + u.c.c5 = lc_map[(unsigned char)s[i++]]; \ + case 4: \ + u.c.c4 = lc_map[(unsigned char)s[i++]]; \ + case 3: \ + u.c.c3 = lc_map[(unsigned char)s[i++]]; \ + case 2: \ + u.c.c2 = lc_map[(unsigned char)s[i++]]; \ + case 1: \ + u.c.c1 = lc_map[(unsigned char)s[i]]; \ + r = mum_hash_step (r, u.pp); \ + break; \ + } \ + hashv = mum_hash_finish (r); \ + bkt = (hashv) & (num_bkts-1); \ } while (0) -#define HASH_KEYCMP(a,b,len) strncasecmp(a,b,len) +#define HASH_KEYCMP(a,b,len) rspamd_lc_cmp(a,b,len) #endif #include "uthash.h" -- cgit v1.2.3 From a3efc2848155f4764bfa7ef70db13c5000d5ca6a Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 14:46:44 +0100 Subject: [Rework] Move http internal structures to a private header --- src/libutil/http.c | 2 +- src/libutil/http.h | 59 ++++--------------------------------- src/libutil/http_private.h | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 54 deletions(-) create mode 100644 src/libutil/http_private.h diff --git a/src/libutil/http.c b/src/libutil/http.c index 2e9fa259a..718ef818d 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -14,7 +14,7 @@ * limitations under the License. */ #include "config.h" -#include "http.h" +#include "http_private.h" #include "utlist.h" #include "util.h" #include "printf.h" diff --git a/src/libutil/http.h b/src/libutil/http.h index 59567b10a..bb5f8d8a7 100644 --- a/src/libutil/http.h +++ b/src/libutil/http.h @@ -28,22 +28,18 @@ #include "keypair.h" #include "keypairs_cache.h" #include "fstring.h" -#include "uthash.h" enum rspamd_http_connection_type { RSPAMD_HTTP_SERVER, RSPAMD_HTTP_CLIENT }; -/** - * HTTP header structure - */ -struct rspamd_http_header { - rspamd_ftok_t *name; - rspamd_ftok_t *value; - rspamd_fstring_t *combined; - UT_hash_handle hh; -}; +struct rspamd_http_header; +struct rspamd_http_message; +struct rspamd_http_connection_private; +struct rspamd_http_connection; +struct rspamd_http_connection_router; +struct rspamd_http_connection_entry; /** * Legacy spamc protocol @@ -58,44 +54,6 @@ struct rspamd_http_header { */ #define RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE (1 << 3) -/** - * HTTP message structure, used for requests and replies - */ -struct rspamd_http_message { - rspamd_fstring_t *url; - rspamd_fstring_t *host; - rspamd_fstring_t *status; - struct rspamd_http_header *headers; - - struct _rspamd_body_buf_s { - /* Data start */ - const gchar *begin; - /* Data len */ - gsize len; - /* Data buffer (used to write data inside) */ - gchar *str; - - /* Internal storage */ - union _rspamd_storage_u { - rspamd_fstring_t *normal; - struct { - gchar *shm_name; - gint shm_fd; - } shared; - } c; - } body_buf; - - struct rspamd_cryptobox_pubkey *peer_key; - time_t date; - time_t last_modified; - unsigned port; - enum http_parser_type type; - gint code; - enum http_method method; - gint flags; -}; - - /** * Options for HTTP connection */ @@ -105,11 +63,6 @@ enum rspamd_http_options { RSPAMD_HTTP_CLIENT_ENCRYPTED = 0x4 /**< Encrypt data for client */ }; -struct rspamd_http_connection_private; -struct rspamd_http_connection; -struct rspamd_http_connection_router; -struct rspamd_http_connection_entry; - typedef int (*rspamd_http_body_handler_t) (struct rspamd_http_connection *conn, struct rspamd_http_message *msg, const gchar *chunk, diff --git a/src/libutil/http_private.h b/src/libutil/http_private.h new file mode 100644 index 000000000..a944cb31b --- /dev/null +++ b/src/libutil/http_private.h @@ -0,0 +1,73 @@ +/*- + * Copyright 2016 Vsevolod Stakhov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef SRC_LIBUTIL_HTTP_PRIVATE_H_ +#define SRC_LIBUTIL_HTTP_PRIVATE_H_ + +#include "http.h" +#include "str_util.h" +#include "../../contrib/mumhash/mum.h" +#define HASH_CASELESS +#include "uthash_strcase.h" + +/** + * HTTP header structure + */ +struct rspamd_http_header { + rspamd_ftok_t *name; + rspamd_ftok_t *value; + rspamd_fstring_t *combined; + UT_hash_handle hh; +}; + +/** + * HTTP message structure, used for requests and replies + */ +struct rspamd_http_message { + rspamd_fstring_t *url; + rspamd_fstring_t *host; + rspamd_fstring_t *status; + struct rspamd_http_header *headers; + + struct _rspamd_body_buf_s { + /* Data start */ + const gchar *begin; + /* Data len */ + gsize len; + /* Data buffer (used to write data inside) */ + gchar *str; + + /* Internal storage */ + union _rspamd_storage_u { + rspamd_fstring_t *normal; + struct { + gchar *shm_name; + gint shm_fd; + } shared; + } c; + } body_buf; + + struct rspamd_cryptobox_pubkey *peer_key; + time_t date; + time_t last_modified; + unsigned port; + enum http_parser_type type; + gint code; + enum http_method method; + gint flags; +}; + + +#endif /* SRC_LIBUTIL_HTTP_PRIVATE_H_ */ -- cgit v1.2.3 From 363cbd0b04f6bbcaa12a0f8bd156bd0ebfaff926 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 14:49:13 +0100 Subject: [Feature] Update mumhash --- contrib/mumhash/mum.h | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/contrib/mumhash/mum.h b/contrib/mumhash/mum.h index 161c5390e..ae6eec16c 100644 --- a/contrib/mumhash/mum.h +++ b/contrib/mumhash/mum.h @@ -56,21 +56,6 @@ typedef unsigned __int64 uint64_t; #include #endif -#ifdef __GNUC__ -#define _MUM_ATTRIBUTE_UNUSED __attribute__((unused)) -#ifndef __clang__ -#define _MUM_OPTIMIZE(opts) __attribute__((__optimize__ (opts))) -#define _MUM_TARGET(opts) __attribute__((__target__ (opts))) -#else -#define _MUM_OPTIMIZE(opts) -#define _MUM_TARGET(opts) -#endif -#else -#define _MUM_ATTRIBUTE_UNUSED -#define _MUM_OPTIMIZE(opts) -#define _MUM_TARGET(opts) -#endif - /* Macro saying to use 128-bit integers implemented by GCC for some targets. */ #ifndef _MUM_USE_INT128 @@ -84,6 +69,20 @@ typedef unsigned __int64 uint64_t; #endif #endif +#if defined(__GNUC__) && ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9) || (__GNUC__ > 4)) +#define _MUM_FRESH_GCC +#endif + +#if defined(__GNUC__) && !defined(__llvm__) +#define _MUM_ATTRIBUTE_UNUSED __attribute__((unused)) +#define _MUM_OPTIMIZE(opts) __attribute__((__optimize__ (opts))) +#define _MUM_TARGET(opts) __attribute__((__target__ (opts))) +#else +#define _MUM_ATTRIBUTE_UNUSED +#define _MUM_OPTIMIZE(opts) +#define _MUM_TARGET(opts) +#endif + /* Here are different primes randomly generated with the equal probability of their bit values. They are used to randomize input @@ -236,7 +235,7 @@ _mum_hash_aligned (uint64_t start, const void *key, size_t len) { result = _mum (result, _mum_unroll_prime); } n = len / sizeof (uint64_t); - for (i = 0; i < n; i++) + for (i = 0; i < (int)n; i++) result ^= _mum (_mum_le (((uint64_t *) str)[i]), _mum_primes[i]); len -= n * sizeof (uint64_t); str += n * sizeof (uint64_t); switch (len) { @@ -282,7 +281,7 @@ _mum_final (uint64_t h) { return h; } -#if defined(__x86_64__) && defined(__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 9) && !defined(__clang__) +#if defined(__x86_64__) && defined(_MUM_FRESH_GCC) /* We want to use AVX2 insn MULX instead of generic x86-64 MULQ where it is possible. Although on modern Intel processors MULQ takes @@ -366,7 +365,7 @@ mum_hash_randomize (uint64_t seed) { _mum_block_start_prime = _mum_next_factor (); _mum_unroll_prime = _mum_next_factor (); _mum_tail_prime = _mum_next_factor (); - for (i = 0; i < sizeof (_mum_primes) / sizeof (uint64_t); i++) + for (i = 0; i < (int)(sizeof (_mum_primes) / sizeof (uint64_t)); i++) _mum_primes[i] = _mum_next_factor (); } @@ -400,7 +399,7 @@ mum_hash64 (uint64_t key, uint64_t seed) { target endianess and the unroll factor. */ static inline uint64_t mum_hash (const void *key, size_t len, uint64_t seed) { -#if defined(__x86_64__) && defined(__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 9) && !defined(__clang__) +#if defined(__x86_64__) && defined(_MUM_FRESH_GCC) static int avx2_support = 0; if (avx2_support > 0) -- cgit v1.2.3 From 328703c09e3a22f7df01010aca1a21b167735504 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 15:28:50 +0100 Subject: [Fix] Fix caseless uthash application --- src/libserver/cfg_rcl.c | 2 ++ src/libutil/uthash_strcase.h | 62 ++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index ebbc29d61..50e5893a8 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -15,6 +15,8 @@ */ #include "cfg_rcl.h" #include "rspamd.h" +#include "../../contrib/mumhash/mum.h" +#define HASH_CASELESS #include "uthash_strcase.h" #include "utlist.h" #include "cfg_file.h" diff --git a/src/libutil/uthash_strcase.h b/src/libutil/uthash_strcase.h index 45ed84f67..77c807630 100644 --- a/src/libutil/uthash_strcase.h +++ b/src/libutil/uthash_strcase.h @@ -27,52 +27,52 @@ #define HASH_KEYCMP(a,b,len) memcmp(a,b,len) #else #define HASH_FUNCTION(key,keylen,num_bkts,hashv,bkt) do {\ - unsigned len = keylen; \ - unsigned leftover = keylen % 8; \ - unsigned fp, i; \ - const uint8_t* s = (const uint8_t*)key; \ + unsigned _len = keylen; \ + unsigned _leftover = keylen % 8; \ + unsigned _fp, _i; \ + const uint8_t* _s = (const uint8_t*)(key); \ union { \ struct { \ unsigned char c1, c2, c3, c4, c5, c6, c7, c8; \ } c; \ uint64_t pp; \ - } u; \ - uint64_t r; \ - fp = len - leftover; \ - r = 0xdeadbabe; \ - for (i = 0; i != fp; i += 8) { \ - u.c.c1 = s[i], u.c.c2 = s[i + 1], u.c.c3 = s[i + 2], u.c.c4 = s[i + 3]; \ - u.c.c5 = s[i + 4], u.c.c6 = s[i + 5], u.c.c7 = s[i + 6], u.c.c8 = s[i + 7]; \ - u.c.c1 = lc_map[u.c.c1]; \ - u.c.c2 = lc_map[u.c.c2]; \ - u.c.c3 = lc_map[u.c.c3]; \ - u.c.c4 = lc_map[u.c.c4]; \ - u.c.c1 = lc_map[u.c.c5]; \ - u.c.c2 = lc_map[u.c.c6]; \ - u.c.c3 = lc_map[u.c.c7]; \ - u.c.c4 = lc_map[u.c.c8]; \ - r = mum_hash_step (r, u.pp); \ + } _u; \ + uint64_t _r; \ + _fp = _len - _leftover; \ + _r = 0xdeadbabe; \ + for (_i = 0; _i != _fp; _i += 8) { \ + _u.c.c1 = _s[_i], _u.c.c2 = _s[_i + 1], _u.c.c3 = _s[_i + 2], _u.c.c4 = _s[_i + 3]; \ + _u.c.c5 = _s[_i + 4], _u.c.c6 = _s[_i + 5], _u.c.c7 = _s[_i + 6], _u.c.c8 = _s[_i + 7]; \ + _u.c.c1 = lc_map[_u.c.c1]; \ + _u.c.c2 = lc_map[_u.c.c2]; \ + _u.c.c3 = lc_map[_u.c.c3]; \ + _u.c.c4 = lc_map[_u.c.c4]; \ + _u.c.c1 = lc_map[_u.c.c5]; \ + _u.c.c2 = lc_map[_u.c.c6]; \ + _u.c.c3 = lc_map[_u.c.c7]; \ + _u.c.c4 = lc_map[_u.c.c8]; \ + _r = mum_hash_step (_r, _u.pp); \ } \ - u.pp = 0; \ - switch (leftover) { \ + _u.pp = 0; \ + switch (_leftover) { \ case 7: \ - u.c.c7 = lc_map[(unsigned char)s[i++]]; \ + _u.c.c7 = lc_map[(unsigned char)_s[_i++]]; \ case 6: \ - u.c.c6 = lc_map[(unsigned char)s[i++]]; \ + _u.c.c6 = lc_map[(unsigned char)_s[_i++]]; \ case 5: \ - u.c.c5 = lc_map[(unsigned char)s[i++]]; \ + _u.c.c5 = lc_map[(unsigned char)_s[_i++]]; \ case 4: \ - u.c.c4 = lc_map[(unsigned char)s[i++]]; \ + _u.c.c4 = lc_map[(unsigned char)_s[_i++]]; \ case 3: \ - u.c.c3 = lc_map[(unsigned char)s[i++]]; \ + _u.c.c3 = lc_map[(unsigned char)_s[_i++]]; \ case 2: \ - u.c.c2 = lc_map[(unsigned char)s[i++]]; \ + _u.c.c2 = lc_map[(unsigned char)_s[_i++]]; \ case 1: \ - u.c.c1 = lc_map[(unsigned char)s[i]]; \ - r = mum_hash_step (r, u.pp); \ + _u.c.c1 = lc_map[(unsigned char)_s[_i]]; \ + _r = mum_hash_step (_r, _u.pp); \ break; \ } \ - hashv = mum_hash_finish (r); \ + hashv = mum_hash_finish (_r); \ bkt = (hashv) & (num_bkts-1); \ } while (0) #define HASH_KEYCMP(a,b,len) rspamd_lc_cmp(a,b,len) -- cgit v1.2.3 From f85965a72957a9cf9d1c1a5643fc0b15fb274f9a Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 15:50:05 +0100 Subject: [Feature] Add more methods to init http message body --- src/libutil/http.c | 34 ++++++++++++++++++++++++++++++++++ src/libutil/http.h | 18 ++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/libutil/http.c b/src/libutil/http.c index 718ef818d..5417110d9 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -2038,6 +2038,40 @@ rspamd_http_message_set_body_from_fd (struct rspamd_http_message *msg, return TRUE; } +gboolean +rspamd_http_message_set_body_from_fstring_steal (struct rspamd_http_message *msg, + rspamd_fstring_t *fstr) +{ + union _rspamd_storage_u *storage; + + storage = &msg->body_buf.c; + msg->flags &= ~(RSPAMD_HTTP_FLAG_SHMEM|RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE); + + storage->normal = fstr; + msg->body_buf.str = fstr->str; + msg->body_buf.begin = msg->body_buf.str; + msg->body_buf.len = fstr->len; + + return TRUE; +} + +gboolean +rspamd_http_message_set_body_from_fstring_copy (struct rspamd_http_message *msg, + const rspamd_fstring_t *fstr) +{ + union _rspamd_storage_u *storage; + + storage = &msg->body_buf.c; + msg->flags &= ~(RSPAMD_HTTP_FLAG_SHMEM|RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE); + + storage->normal = rspamd_fstring_new_init (fstr->str, fstr->len); + msg->body_buf.str = storage->normal->str; + msg->body_buf.begin = msg->body_buf.str; + msg->body_buf.len = storage->normal->len; + + return TRUE; +} + gboolean rspamd_http_message_append_body (struct rspamd_http_message *msg, const gchar *data, gsize len) diff --git a/src/libutil/http.h b/src/libutil/http.h index bb5f8d8a7..ab71f619b 100644 --- a/src/libutil/http.h +++ b/src/libutil/http.h @@ -283,6 +283,24 @@ gboolean rspamd_http_message_set_body (struct rspamd_http_message *msg, gboolean rspamd_http_message_set_body_from_fd (struct rspamd_http_message *msg, gint fd); +/** + * Uses rspamd_fstring_t as message's body, string is consumed by this operation + * @param msg + * @param fstr + * @return TRUE if a message's body has been set + */ +gboolean rspamd_http_message_set_body_from_fstring_steal (struct rspamd_http_message *msg, + rspamd_fstring_t *fstr); + +/** + * Uses rspamd_fstring_t as message's body, string is copied by this operation + * @param msg + * @param fstr + * @return TRUE if a message's body has been set + */ +gboolean rspamd_http_message_set_body_from_fstring_copy (struct rspamd_http_message *msg, + const rspamd_fstring_t *fstr); + /** * Appends data to message's body * @param msg -- cgit v1.2.3 From de6e99a081384da39d119e15375febf0028cea9d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 16:22:30 +0100 Subject: [Fix] Cleanup message when assiging body --- src/libutil/http.c | 48 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/src/libutil/http.c b/src/libutil/http.c index 5417110d9..bff41d0c9 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -96,6 +96,8 @@ static const rspamd_ftok_t last_modified_header = { .len = 13 }; +static void rspamd_http_message_storage_cleanup (struct rspamd_http_message *msg); + #define HTTP_ERROR http_error_quark () GQuark http_error_quark (void) @@ -1947,6 +1949,8 @@ rspamd_http_message_set_body (struct rspamd_http_message *msg, union _rspamd_storage_u *storage; storage = &msg->body_buf.c; + rspamd_http_message_storage_cleanup (msg); + if (msg->flags & RSPAMD_HTTP_FLAG_SHMEM) { storage->shared.shm_name = g_strdup ("/rhm.XXXXXXXXXXXXXXXXXXXX"); storage->shared.shm_fd = rspamd_shmem_mkstemp (storage->shared.shm_name); @@ -2010,6 +2014,8 @@ rspamd_http_message_set_body_from_fd (struct rspamd_http_message *msg, union _rspamd_storage_u *storage; struct stat st; + rspamd_http_message_storage_cleanup (msg); + storage = &msg->body_buf.c; msg->flags |= RSPAMD_HTTP_FLAG_SHMEM|RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE; @@ -2044,6 +2050,8 @@ rspamd_http_message_set_body_from_fstring_steal (struct rspamd_http_message *msg { union _rspamd_storage_u *storage; + rspamd_http_message_storage_cleanup (msg); + storage = &msg->body_buf.c; msg->flags &= ~(RSPAMD_HTTP_FLAG_SHMEM|RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE); @@ -2061,6 +2069,8 @@ rspamd_http_message_set_body_from_fstring_copy (struct rspamd_http_message *msg, { union _rspamd_storage_u *storage; + rspamd_http_message_storage_cleanup (msg); + storage = &msg->body_buf.c; msg->flags &= ~(RSPAMD_HTTP_FLAG_SHMEM|RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE); @@ -2130,22 +2140,12 @@ rspamd_http_message_append_body (struct rspamd_http_message *msg, return TRUE; } - -void -rspamd_http_message_free (struct rspamd_http_message *msg) +static void +rspamd_http_message_storage_cleanup (struct rspamd_http_message *msg) { - struct rspamd_http_header *hdr, *htmp; union _rspamd_storage_u *storage; struct stat st; - HASH_ITER (hh, msg->headers, hdr, htmp) { - HASH_DEL (msg->headers, hdr); - rspamd_fstring_free (hdr->combined); - g_slice_free1 (sizeof (*hdr->name), hdr->name); - g_slice_free1 (sizeof (*hdr->value), hdr->value); - g_slice_free1 (sizeof (struct rspamd_http_header), hdr); - } - if (msg->body_buf.len != 0) { if (msg->flags & RSPAMD_HTTP_FLAG_SHMEM) { storage = &msg->body_buf.c; @@ -2164,12 +2164,36 @@ rspamd_http_message_free (struct rspamd_http_message *msg) shm_unlink (storage->shared.shm_name); g_free (storage->shared.shm_name); } + + storage->shared.shm_fd = -1; + msg->body_buf.str = MAP_FAILED; } else { rspamd_fstring_free (msg->body_buf.c.normal); + msg->body_buf.c.normal = NULL; } + + msg->body_buf.len = 0; + } +} + +void +rspamd_http_message_free (struct rspamd_http_message *msg) +{ + struct rspamd_http_header *hdr, *htmp; + + + HASH_ITER (hh, msg->headers, hdr, htmp) { + HASH_DEL (msg->headers, hdr); + rspamd_fstring_free (hdr->combined); + g_slice_free1 (sizeof (*hdr->name), hdr->name); + g_slice_free1 (sizeof (*hdr->value), hdr->value); + g_slice_free1 (sizeof (struct rspamd_http_header), hdr); } + + rspamd_http_message_storage_cleanup (msg); + if (msg->url != NULL) { rspamd_fstring_free (msg->url); } -- cgit v1.2.3 From 5bbd698d9649a09e1992caef99b1482c62a5a54f Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 16:38:29 +0100 Subject: [Rework] Finish rework for the rest of places that use HTTP --- src/client/rspamc.c | 23 +++++++++++++++-------- src/client/rspamdclient.c | 12 +++++++----- src/controller.c | 20 ++++++++------------ src/fuzzy_storage.c | 21 +++++++++++---------- src/libserver/protocol.c | 24 ++++++++++++++---------- src/libserver/rspamd_control.c | 15 ++++++++++----- src/libserver/worker_util.c | 17 ++++++++++++----- src/libutil/map.c | 1 + src/lua/lua_http.c | 26 +++++++++++++++++++++----- src/plugins/fuzzy_check.c | 1 + src/plugins/surbl.c | 1 + src/rspamadm/control.c | 8 ++++++-- src/rspamadm/lua_repl.c | 13 +++++++++---- src/rspamd_proxy.c | 20 ++++++++++++++++++-- test/CMakeLists.txt | 1 + test/rspamd_http_test.c | 3 ++- utils/rspamd_http_bench.c | 3 ++- utils/rspamd_http_server.c | 13 +++++++++---- 18 files changed, 148 insertions(+), 74 deletions(-) diff --git a/src/client/rspamc.c b/src/client/rspamc.c index 8f7f463bb..8001bb9cb 100644 --- a/src/client/rspamc.c +++ b/src/client/rspamc.c @@ -14,8 +14,9 @@ * limitations under the License. */ #include "config.h" -#include "util.h" -#include "http.h" +#include "libutil/util.h" +#include "libutil/http.h" +#include "libutil/http_private.h" #include "rspamdclient.h" #include "utlist.h" #include "unix-std.h" @@ -950,12 +951,12 @@ rspamc_stat_output (FILE *out, ucl_object_t *obj) static void rspamc_output_headers (FILE *out, struct rspamd_http_message *msg) { - struct rspamd_http_header *h; + struct rspamd_http_header *h, *htmp; - LL_FOREACH (msg->headers, h) - { + HASH_ITER (hh, msg->headers, h, htmp) { rspamd_fprintf (out, "%T: %T\n", h->name, h->value); } + rspamd_fprintf (out, "\n"); } @@ -1223,6 +1224,8 @@ rspamc_client_cb (struct rspamd_client_connection *conn, struct rspamc_command *cmd; FILE *out = stdout; gdouble finish = rspamd_get_ticks (), diff; + const gchar *body; + gsize body_len; cmd = cbdata->cmd; diff = finish - cbdata->start; @@ -1275,9 +1278,13 @@ rspamc_client_cb (struct rspamd_client_connection *conn, else if (err != NULL) { rspamd_fprintf (out, "%s\n", err->message); - if (json && msg != NULL && msg->body != NULL) { - /* We can also output the resulting json */ - rspamd_fprintf (out, "%V\n", msg->body); + if (json && msg != NULL) { + body = rspamd_http_message_get_body (msg, &body_len); + + if (body) { + /* We can also output the resulting json */ + rspamd_fprintf (out, "%*s\n", (gint)body_len, body); + } } } } diff --git a/src/client/rspamdclient.c b/src/client/rspamdclient.c index d386664dc..5932da38b 100644 --- a/src/client/rspamdclient.c +++ b/src/client/rspamdclient.c @@ -14,8 +14,9 @@ * limitations under the License. */ #include "rspamdclient.h" -#include "util.h" -#include "http.h" +#include "libutil/util.h" +#include "libutil/http.h" +#include "libutil/http_private.h" #include "unix-std.h" #ifdef HAVE_FETCH_H @@ -115,7 +116,7 @@ rspamd_client_finish_handler (struct rspamd_http_connection *conn, return 0; } else { - if (msg->body == NULL || msg->body_buf.len == 0 || msg->code != 200) { + if (rspamd_http_message_get_body (msg, NULL) == NULL || msg->code != 200) { err = g_error_new (RCLIENT_ERROR, msg->code, "HTTP error: %d, %.*s", msg->code, (gint)msg->status->len, msg->status->str); @@ -205,6 +206,7 @@ rspamd_client_command (struct rspamd_client_connection *conn, gsize remain, old_len; GList *cur; GString *input = NULL; + rspamd_fstring_t *body; req = g_slice_alloc0 (sizeof (struct rspamd_client_request)); req->conn = conn; @@ -243,11 +245,11 @@ rspamd_client_command (struct rspamd_client_connection *conn, return FALSE; } - req->msg->body = rspamd_fstring_new_init (input->str, input->len); + body = rspamd_fstring_new_init (input->str, input->len); + rspamd_http_message_set_body_from_fstring_steal (req->msg, body); req->input = input; } else { - req->msg->body = NULL; req->input = NULL; } diff --git a/src/controller.c b/src/controller.c index f5efb4535..f2352e514 100644 --- a/src/controller.c +++ b/src/controller.c @@ -18,6 +18,7 @@ #include "libutil/rrd.h" #include "libutil/map.h" #include "libutil/map_private.h" +#include "libutil/http_private.h" #include "libstat/stat_api.h" #include "rspamd.h" #include "libserver/worker_util.h" @@ -871,7 +872,6 @@ rspamd_controller_handle_get_map (struct rspamd_http_connection_entry *conn_ent, gboolean found = FALSE; struct rspamd_http_message *reply; - if (!rspamd_controller_check_password (conn_ent, session, msg, FALSE)) { return 0; } @@ -919,10 +919,8 @@ rspamd_controller_handle_get_map (struct rspamd_http_connection_entry *conn_ent, reply = rspamd_http_new_message (HTTP_RESPONSE); reply->date = time (NULL); reply->code = 200; - reply->body = rspamd_fstring_sized_new (st.st_size); - /* Read the whole buffer */ - if (read (fd, reply->body->str, st.st_size) == -1) { + if (!rspamd_http_message_set_body_from_fd (reply, fd)) { close (fd); rspamd_http_message_free (reply); msg_err_session ("cannot read map %s: %s", bk->uri, strerror (errno)); @@ -930,8 +928,6 @@ rspamd_controller_handle_get_map (struct rspamd_http_connection_entry *conn_ent, return 0; } - reply->body->len = st.st_size; - close (fd); rspamd_http_connection_reset (conn_ent->conn); @@ -1420,7 +1416,7 @@ rspamd_controller_handle_learn_common ( return 0; } - if (msg->body == NULL || msg->body->len == 0) { + if (rspamd_http_message_get_body (msg, NULL) == NULL) { msg_err_session ("got zero length body, cannot continue"); rspamd_controller_send_error (conn_ent, 400, @@ -1521,7 +1517,7 @@ rspamd_controller_handle_scan (struct rspamd_http_connection_entry *conn_ent, return 0; } - if (msg->body == NULL || msg->body->len == 0) { + if (rspamd_http_message_get_body (msg, NULL) == NULL) { msg_err_session ("got zero length body, cannot continue"); rspamd_controller_send_error (conn_ent, 400, @@ -1595,7 +1591,7 @@ rspamd_controller_handle_saveactions ( return 0; } - if (msg->body == NULL || msg->body->len == 0) { + if (rspamd_http_message_get_body (msg, NULL) == NULL) { msg_err_session ("got zero length body, cannot continue"); rspamd_controller_send_error (conn_ent, 400, @@ -1714,7 +1710,7 @@ rspamd_controller_handle_savesymbols ( return 0; } - if (msg->body == NULL || msg->body->len == 0) { + if (rspamd_http_message_get_body (msg, NULL) == NULL) { msg_err_session ("got zero length body, cannot continue"); rspamd_controller_send_error (conn_ent, 400, @@ -1840,7 +1836,7 @@ rspamd_controller_handle_savemap (struct rspamd_http_connection_entry *conn_ent, return 0; } - if (msg->body == NULL || msg->body->len == 0) { + if (rspamd_http_message_get_body (msg, NULL) == NULL) { msg_err_session ("got zero length body, cannot continue"); rspamd_controller_send_error (conn_ent, 400, @@ -2162,7 +2158,7 @@ rspamd_controller_handle_custom (struct rspamd_http_connection_entry *conn_ent, cmd->privilleged)) { return 0; } - if (cmd->require_message && (msg->body == NULL || msg->body->len == 0)) { + if (cmd->require_message && (rspamd_http_message_get_body (msg, NULL) == NULL)) { msg_err_session ("got zero length body, cannot continue"); rspamd_controller_send_error (conn_ent, 400, diff --git a/src/fuzzy_storage.c b/src/fuzzy_storage.c index d96346ce4..b49a35984 100644 --- a/src/fuzzy_storage.c +++ b/src/fuzzy_storage.c @@ -33,6 +33,7 @@ #include "ref.h" #include "xxhash.h" #include "libutil/hash.h" +#include "libutil/http_private.h" #include "unix-std.h" /* This number is used as expire time in seconds for cache items (2 days) */ @@ -260,6 +261,7 @@ fuzzy_mirror_updates_to_http (struct rspamd_fuzzy_storage_ctx *ctx, gsize len; guint32 rev; const gchar *p; + rspamd_fstring_t *reply; rev = rspamd_fuzzy_backend_version (ctx->backend, local_db_name); rev = GUINT32_TO_LE (rev); @@ -278,8 +280,8 @@ fuzzy_mirror_updates_to_http (struct rspamd_fuzzy_storage_ctx *ctx, } } - msg->body = rspamd_fstring_sized_new (len); - msg->body = rspamd_fstring_append (msg->body, (const char *)&rev, + reply = rspamd_fstring_sized_new (len); + reply = rspamd_fstring_append (reply, (const char *)&rev, sizeof (rev)); for (cur = ctx->updates_pending->head; cur != NULL; cur = g_list_next (cur)) { @@ -295,15 +297,14 @@ fuzzy_mirror_updates_to_http (struct rspamd_fuzzy_storage_ctx *ctx, } p = (const char *)io_cmd; - msg->body = rspamd_fstring_append (msg->body, (const char *)&len, - sizeof (len)); - msg->body = rspamd_fstring_append (msg->body, p, len); + reply = rspamd_fstring_append (reply, (const char *)&len, sizeof (len)); + reply = rspamd_fstring_append (reply, p, len); } /* Last chunk */ len = 0; - msg->body = rspamd_fstring_append (msg->body, (const char *)&len, - sizeof (len)); + reply = rspamd_fstring_append (reply, (const char *)&len, sizeof (len)); + rspamd_http_message_set_body_from_fstring_steal (msg, reply); } static void @@ -936,7 +937,8 @@ rspamd_fuzzy_mirror_process_update (struct fuzzy_master_update_session *session, } state = read_len; GList *updates = NULL, *cur; - if (!msg->body || msg->body->len == 0 || !msg->url || msg->url->len == 0) { + if (!rspamd_http_message_get_body (msg, NULL) || !msg->url + || msg->url->len == 0) { msg_err ("empty update message, not processing"); return; @@ -963,8 +965,7 @@ rspamd_fuzzy_mirror_process_update (struct fuzzy_master_update_session *session, * <0> - end of data * ... - ignored */ - p = (const guchar *)msg->body->str; - remain = msg->body->len; + p = rspamd_http_message_get_body (msg, &remain); if (remain > sizeof (guint32) * 2) { memcpy (&revision, p, sizeof (guint32)); diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c index a48de05dc..becaca01b 100644 --- a/src/libserver/protocol.c +++ b/src/libserver/protocol.c @@ -21,6 +21,7 @@ #include "message.h" #include "utlist.h" #include "http.h" +#include "http_private.h" #include "email_addr.h" #include "worker_private.h" #include "cryptobox.h" @@ -270,11 +271,10 @@ rspamd_protocol_handle_headers (struct rspamd_task *task, rspamd_fstring_t *hn, *hv; rspamd_ftok_t *hn_tok, *hv_tok, srch; gboolean fl, has_ip = FALSE; - struct rspamd_http_header *h; + struct rspamd_http_header *h, *htmp; struct rspamd_email_address *addr; - LL_FOREACH (msg->headers, h) - { + HASH_ITER (hh, msg->headers, h, htmp) { hn = rspamd_fstring_new_init (h->name->begin, h->name->len); hv = rspamd_fstring_new_init (h->value->begin, h->value->len); hn_tok = rspamd_ftok_map (hn); @@ -1017,6 +1017,7 @@ rspamd_protocol_http_reply (struct rspamd_http_message *msg, const struct rspamd_re_cache_stat *restat; gpointer h, v; ucl_object_t *top = NULL; + rspamd_fstring_t *reply; gint action; /* Write custom headers */ @@ -1050,21 +1051,22 @@ rspamd_protocol_http_reply (struct rspamd_http_message *msg, restat->bytes_scanned); } - msg->body = rspamd_fstring_sized_new (1000); + reply = rspamd_fstring_sized_new (1000); if (msg->method < HTTP_SYMBOLS && !RSPAMD_TASK_IS_SPAMC (task)) { - rspamd_ucl_emit_fstring (top, UCL_EMIT_JSON_COMPACT, &msg->body); + rspamd_ucl_emit_fstring (top, UCL_EMIT_JSON_COMPACT, &reply); } else { if (RSPAMD_TASK_IS_SPAMC (task)) { - rspamd_ucl_tospamc_output (top, &msg->body); + rspamd_ucl_tospamc_output (top, &reply); } else { - rspamd_ucl_torspamc_output (top, &msg->body); + rspamd_ucl_torspamc_output (top, &reply); } } ucl_object_unref (top); + rspamd_http_message_set_body_from_fstring_steal (msg, reply); if (!(task->flags & RSPAMD_TASK_FLAG_NO_STAT)) { /* Update stat for default metric */ @@ -1187,6 +1189,7 @@ rspamd_protocol_write_reply (struct rspamd_task *task) struct rspamd_http_message *msg; const gchar *ctype = "application/json"; struct rspamd_abstract_worker_ctx *actx; + rspamd_fstring_t *reply; msg = rspamd_http_new_message (HTTP_RESPONSE); @@ -1218,9 +1221,10 @@ rspamd_protocol_write_reply (struct rspamd_task *task) ucl_object_insert_key (top, ucl_object_fromstring (g_quark_to_string (task->err->domain)), "error_domain", 0, false); - msg->body = rspamd_fstring_sized_new (256); - rspamd_ucl_emit_fstring (top, UCL_EMIT_JSON_COMPACT, &msg->body); + reply = rspamd_fstring_sized_new (256); + rspamd_ucl_emit_fstring (top, UCL_EMIT_JSON_COMPACT, &reply); ucl_object_unref (top); + rspamd_http_message_set_body_from_fstring_steal (msg, reply); } else { msg->status = rspamd_fstring_new_init ("OK", 2); @@ -1243,7 +1247,7 @@ rspamd_protocol_write_reply (struct rspamd_task *task) } break; case CMD_PING: - msg->body = rspamd_fstring_new_init ("pong" CRLF, 6); + rspamd_http_message_set_body (msg, "pong" CRLF, 6); ctype = "text/plain"; break; case CMD_OTHER: diff --git a/src/libserver/rspamd_control.c b/src/libserver/rspamd_control.c index 8c0a150e2..a925c0bb1 100644 --- a/src/libserver/rspamd_control.c +++ b/src/libserver/rspamd_control.c @@ -16,7 +16,8 @@ #include "config.h" #include "rspamd.h" #include "rspamd_control.h" -#include "http.h" +#include "libutil/http.h" +#include "libutil/http_private.h" #include "unix-std.h" #include "utlist.h" @@ -107,6 +108,7 @@ rspamd_control_send_error (struct rspamd_control_session *session, gint code, const gchar *error_msg, ...) { struct rspamd_http_message *msg; + rspamd_fstring_t *reply; va_list args; msg = rspamd_http_new_message (HTTP_RESPONSE); @@ -118,8 +120,9 @@ rspamd_control_send_error (struct rspamd_control_session *session, msg->date = time (NULL); msg->code = code; - msg->body = rspamd_fstring_new (); - rspamd_printf_fstring (&msg->body, "{\"error\":\"%V\"}", msg->status); + reply = rspamd_fstring_sized_new (msg->status->len + 16); + rspamd_printf_fstring (&reply, "{\"error\":\"%V\"}", msg->status); + rspamd_http_message_set_body_from_fstring_steal (msg, reply); rspamd_http_connection_reset (session->conn); rspamd_http_connection_write_message (session->conn, msg, @@ -136,13 +139,15 @@ rspamd_control_send_ucl (struct rspamd_control_session *session, ucl_object_t *obj) { struct rspamd_http_message *msg; + rspamd_fstring_t *reply; msg = rspamd_http_new_message (HTTP_RESPONSE); msg->date = time (NULL); msg->code = 200; msg->status = rspamd_fstring_new_init ("OK", 2); - msg->body = rspamd_fstring_sized_new (BUFSIZ); - rspamd_ucl_emit_fstring (obj, UCL_EMIT_JSON_COMPACT, &msg->body); + reply = rspamd_fstring_sized_new (BUFSIZ); + rspamd_ucl_emit_fstring (obj, UCL_EMIT_JSON_COMPACT, &reply); + rspamd_http_message_set_body_from_fstring_steal (msg, reply); rspamd_http_connection_reset (session->conn); rspamd_http_connection_write_message (session->conn, msg, diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c index bf596a343..9924671cf 100644 --- a/src/libserver/worker_util.c +++ b/src/libserver/worker_util.c @@ -24,6 +24,7 @@ #include "rspamd_control.h" #include "libutil/map.h" #include "libutil/map_private.h" +#include "libutil/http_private.h" #ifdef WITH_GPERF_TOOLS #include @@ -352,6 +353,7 @@ rspamd_controller_send_error (struct rspamd_http_connection_entry *entry, { struct rspamd_http_message *msg; va_list args; + rspamd_fstring_t *reply; msg = rspamd_http_new_message (HTTP_RESPONSE); @@ -362,8 +364,9 @@ rspamd_controller_send_error (struct rspamd_http_connection_entry *entry, msg->date = time (NULL); msg->code = code; - msg->body = rspamd_fstring_new (); - rspamd_printf_fstring (&msg->body, "{\"error\":\"%V\"}", msg->status); + reply = rspamd_fstring_sized_new (msg->status->len + 16); + rspamd_printf_fstring (&reply, "{\"error\":\"%V\"}", msg->status); + rspamd_http_message_set_body_from_fstring_steal (msg, reply); rspamd_http_connection_reset (entry->conn); rspamd_http_connection_write_message (entry->conn, msg, @@ -381,12 +384,14 @@ rspamd_controller_send_string (struct rspamd_http_connection_entry *entry, const gchar *str) { struct rspamd_http_message *msg; + rspamd_fstring_t *reply; msg = rspamd_http_new_message (HTTP_RESPONSE); msg->date = time (NULL); msg->code = 200; msg->status = rspamd_fstring_new_init ("OK", 2); - msg->body = rspamd_fstring_new_init (str, strlen (str)); + reply = rspamd_fstring_new_init (str, strlen (str)); + rspamd_http_message_set_body_from_fstring_steal (msg, reply); rspamd_http_connection_reset (entry->conn); rspamd_http_connection_write_message (entry->conn, msg, @@ -404,13 +409,15 @@ rspamd_controller_send_ucl (struct rspamd_http_connection_entry *entry, ucl_object_t *obj) { struct rspamd_http_message *msg; + rspamd_fstring_t *reply; msg = rspamd_http_new_message (HTTP_RESPONSE); msg->date = time (NULL); msg->code = 200; msg->status = rspamd_fstring_new_init ("OK", 2); - msg->body = rspamd_fstring_sized_new (BUFSIZ); - rspamd_ucl_emit_fstring (obj, UCL_EMIT_JSON_COMPACT, &msg->body); + reply = rspamd_fstring_sized_new (BUFSIZ); + rspamd_ucl_emit_fstring (obj, UCL_EMIT_JSON_COMPACT, &reply); + rspamd_http_message_set_body_from_fstring_steal (msg, reply); rspamd_http_connection_reset (entry->conn); rspamd_http_connection_write_message (entry->conn, msg, diff --git a/src/libutil/map.c b/src/libutil/map.c index 86cd3e5ee..b747b6a96 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -20,6 +20,7 @@ #include "map.h" #include "map_private.h" #include "http.h" +#include "http_private.h" #include "rspamd.h" #include "cryptobox.h" #include "unix-std.h" diff --git a/src/lua/lua_http.c b/src/lua/lua_http.c index 84ab2de16..0e9c99cc7 100644 --- a/src/lua/lua_http.c +++ b/src/lua/lua_http.c @@ -17,6 +17,7 @@ #include "buffer.h" #include "dns.h" #include "http.h" +#include "http_private.h" #include "utlist.h" #include "unix-std.h" @@ -150,7 +151,9 @@ lua_http_finish_handler (struct rspamd_http_connection *conn, struct rspamd_http_message *msg) { struct lua_http_cbdata *cbd = (struct lua_http_cbdata *)conn->ud; - struct rspamd_http_header *h; + struct rspamd_http_header *h, *htmp; + const gchar *body; + gsize body_len; lua_rawgeti (cbd->L, LUA_REGISTRYINDEX, cbd->cbref); /* Error */ @@ -158,14 +161,23 @@ lua_http_finish_handler (struct rspamd_http_connection *conn, /* Reply code */ lua_pushinteger (cbd->L, msg->code); /* Body */ - lua_pushlstring (cbd->L, msg->body->str, msg->body->len); + body = rspamd_http_message_get_body (msg, &body_len); + + if (body_len > 0) { + lua_pushlstring (cbd->L, body, body_len); + } + else { + lua_pushnil (cbd->L); + } /* Headers */ lua_newtable (cbd->L); - LL_FOREACH (msg->headers, h) { + + HASH_ITER (hh, msg->headers, h, htmp) { lua_pushlstring (cbd->L, h->name->begin, h->name->len); lua_pushlstring (cbd->L, h->value->begin, h->value->len); lua_settable (cbd->L, -3); } + if (lua_pcall (cbd->L, 4, 0, 0) != 0) { msg_info ("callback call failed: %s", lua_tostring (cbd->L, -1)); lua_pop (cbd->L, 1); @@ -296,19 +308,23 @@ lua_http_request (lua_State *L) else { ev_base = NULL; } + if (lua_gettop (L) >= 4 && rspamd_lua_check_udata (L, 4, "rspamd{resolver}")) { resolver = *(struct rspamd_dns_resolver **)lua_touserdata (L, 4); } else { resolver = lua_http_global_resolver (ev_base); } + if (lua_gettop (L) >= 5 && rspamd_lua_check_udata (L, 5, "rspamd{session}")) { session = *(struct rspamd_async_session **)lua_touserdata (L, 5); } else { session = NULL; } + msg = rspamd_http_message_from_url (url); + if (msg == NULL) { lua_pushboolean (L, FALSE); return 1; @@ -403,13 +419,13 @@ lua_http_request (lua_State *L) lua_gettable (L, -2); if (lua_type (L, -1) == LUA_TSTRING) { lua_body = lua_tolstring (L, -1, &bodylen); - msg->body = rspamd_fstring_new_init (lua_body, bodylen); + rspamd_http_message_set_body (msg, lua_body, bodylen); } else if (lua_type (L, -1) == LUA_TUSERDATA) { t = lua_check_text (L, -1); /* TODO: think about zero-copy possibilities */ if (t) { - msg->body = rspamd_fstring_new_init (t->start, t->len); + rspamd_http_message_set_body (msg, t->start, t->len); } } diff --git a/src/plugins/fuzzy_check.c b/src/plugins/fuzzy_check.c index 30eccf0c3..78b215033 100644 --- a/src/plugins/fuzzy_check.c +++ b/src/plugins/fuzzy_check.c @@ -42,6 +42,7 @@ #include "keypair.h" #include "lua/lua_common.h" #include "unix-std.h" +#include "libutil/http_private.h" #include #define DEFAULT_SYMBOL "R_FUZZY_HASH" diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c index 1063013c7..4cd594b8f 100644 --- a/src/plugins/surbl.c +++ b/src/plugins/surbl.c @@ -40,6 +40,7 @@ #include "surbl.h" #include "utlist.h" #include "libserver/html.h" +#include "libutil/http_private.h" #include "unix-std.h" static struct surbl_ctx *surbl_module_ctx = NULL; diff --git a/src/rspamadm/control.c b/src/rspamadm/control.c index de6e48346..52fec99c6 100644 --- a/src/rspamadm/control.c +++ b/src/rspamadm/control.c @@ -17,7 +17,8 @@ #include "rspamadm.h" #include "cryptobox.h" #include "printf.h" -#include "http.h" +#include "libutil/http.h" +#include "libutil/http_private.h" #include "addr.h" #include "unix-std.h" #include @@ -100,11 +101,14 @@ rspamd_control_finish_handler (struct rspamd_http_connection *conn, struct ucl_parser *parser; ucl_object_t *obj; rspamd_fstring_t *out; + const gchar *body; + gsize body_len; struct rspamadm_control_cbdata *cbdata = conn->ud; + body = rspamd_http_message_get_body (msg, &body_len); parser = ucl_parser_new (0); - if (!ucl_parser_add_chunk (parser, msg->body->str, msg->body->len)) { + if (!body || !ucl_parser_add_chunk (parser, body, body_len)) { rspamd_fprintf (stderr, "cannot parse server's reply: %s\n", ucl_parser_get_error (parser)); ucl_parser_free (parser); diff --git a/src/rspamadm/lua_repl.c b/src/rspamadm/lua_repl.c index f96aa2890..a7c598be0 100644 --- a/src/rspamadm/lua_repl.c +++ b/src/rspamadm/lua_repl.c @@ -17,6 +17,8 @@ #include "config.h" #include "rspamadm.h" #include "cryptobox.h" +#include "libutil/http.h" +#include "libutil/http_private.h" #include "printf.h" #include "lua/lua_common.h" #include "message.h" @@ -533,11 +535,14 @@ rspamadm_lua_handle_exec (struct rspamd_http_connection_entry *conn_ent, struct rspamadm_lua_repl_context *ctx; struct rspamadm_lua_repl_session *session = conn_ent->ud; ucl_object_t *obj, *elt; + const gchar *body; + gsize body_len; ctx = session->ctx; L = ctx->L; + body = rspamd_http_message_get_body (msg, &body_len); - if (msg->body == NULL || msg->body->len == 0) { + if (body == NULL) { rspamd_controller_send_error (conn_ent, 400, "Empty lua script"); return 0; @@ -547,8 +552,8 @@ rspamadm_lua_handle_exec (struct rspamd_http_connection_entry *conn_ent, err_idx = lua_gettop (L); /* First try return + input */ - tb = g_string_sized_new (msg->body->len + sizeof ("return ")); - rspamd_printf_gstring (tb, "return %V", msg->body); + tb = g_string_sized_new (body_len + sizeof ("return ")); + rspamd_printf_gstring (tb, "return %*s", (gint)body_len, body); if (luaL_loadstring (L, tb->str) != 0) { /* Reset stack */ @@ -556,7 +561,7 @@ rspamadm_lua_handle_exec (struct rspamd_http_connection_entry *conn_ent, lua_pushcfunction (L, &rspamd_lua_traceback); err_idx = lua_gettop (L); /* Try with no return */ - if (luaL_loadbuffer (L, msg->body->str, msg->body->len, "http input") != 0) { + if (luaL_loadbuffer (L, body, body_len, "http input") != 0) { rspamd_controller_send_error (conn_ent, 400, "Invalid lua script"); return 0; diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 5864d6020..1ab3a6fbc 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -17,6 +17,8 @@ #include "libutil/util.h" #include "libutil/map.h" #include "libutil/upstream.h" +#include "libutil/http.h" +#include "libutil/http_private.h" #include "libserver/protocol.h" #include "libserver/cfg_file.h" #include "libserver/url.h" @@ -67,6 +69,7 @@ struct rspamd_http_upstream { struct rspamd_cryptobox_pubkey *key; gint parser_from_ref; gint parser_to_ref; + gboolean local; }; struct rspamd_http_mirror { @@ -77,6 +80,7 @@ struct rspamd_http_mirror { gdouble prob; gint parser_from_ref; gint parser_to_ref; + gboolean local; }; static const guint64 rspamd_rspamd_proxy_magic = 0xcdeb4fd1fc351980ULL; @@ -318,6 +322,11 @@ rspamd_proxy_parse_upstream (rspamd_mempool_t *pool, ctx->default_upstream = up; } + elt = ucl_object_lookup (obj, "local"); + if (elt && ucl_object_toboolean (elt)) { + up->local = TRUE; + } + /* * Accept lua function here in form * fun :: String -> UCL @@ -431,6 +440,11 @@ rspamd_proxy_parse_mirror (rspamd_mempool_t *pool, up->prob = 1.0; } + elt = ucl_object_lookup (obj, "local"); + if (elt && ucl_object_toboolean (elt)) { + up->local = TRUE; + } + /* * Accept lua function here in form * fun :: String -> UCL @@ -1065,6 +1079,7 @@ proxy_backend_master_finish_handler (struct rspamd_http_connection *conn, { struct rspamd_proxy_backend_connection *bk_conn = conn->ud; struct rspamd_proxy_session *session; + rspamd_fstring_t *reply; session = bk_conn->s; rspamd_http_connection_steal_msg (session->master_conn->backend_conn); @@ -1082,8 +1097,9 @@ proxy_backend_master_finish_handler (struct rspamd_http_connection *conn, if (session->is_spamc) { /* We need to reformat ucl to fit with legacy spamc protocol */ if (bk_conn->results) { - rspamd_fstring_clear (msg->body); - rspamd_ucl_torspamc_output (bk_conn->results, &msg->body); + reply = rspamd_fstring_new (); + rspamd_ucl_torspamc_output (bk_conn->results, &reply); + rspamd_http_message_set_body_from_fstring_steal (msg, reply); } else { msg_warn_session ("cannot parse results from the master backend, " diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c613d0cfd..e94a1a04b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -26,6 +26,7 @@ ENDIF(NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin") TARGET_LINK_LIBRARIES(rspamd-test rspamd-cdb) TARGET_LINK_LIBRARIES(rspamd-test lcbtrie) TARGET_LINK_LIBRARIES(rspamd-test rspamd-http-parser) +TARGET_LINK_LIBRARIES(rspamd-test rspamd-lpeg) TARGET_LINK_LIBRARIES(rspamd-test ${RSPAMD_REQUIRED_LIBRARIES}) IF (ENABLE_SNOWBALL MATCHES "ON") TARGET_LINK_LIBRARIES(rspamd-test stemmer) diff --git a/test/rspamd_http_test.c b/test/rspamd_http_test.c index 88ac48676..882b148fc 100644 --- a/test/rspamd_http_test.c +++ b/test/rspamd_http_test.c @@ -16,7 +16,8 @@ #include "config.h" #include "rspamd.h" #include "util.h" -#include "http.h" +#include "libutil/http.h" +#include "libutil/http_private.h" #include "tests.h" #include "ottery.h" #include "cryptobox.h" diff --git a/utils/rspamd_http_bench.c b/utils/rspamd_http_bench.c index c9a752243..64b4e6ed2 100644 --- a/utils/rspamd_http_bench.c +++ b/utils/rspamd_http_bench.c @@ -16,7 +16,8 @@ #include "config.h" #include "rspamd.h" #include "util.h" -#include "http.h" +#include "libutil/http.h" +#include "libutil/http_private.h" #include "ottery.h" #include "cryptobox.h" #include "unix-std.h" diff --git a/utils/rspamd_http_server.c b/utils/rspamd_http_server.c index 9af96fad9..d920c425d 100644 --- a/utils/rspamd_http_server.c +++ b/utils/rspamd_http_server.c @@ -16,7 +16,9 @@ #include "config.h" #include "rspamd.h" #include "util.h" -#include "http.h" +#include "libutil/fstring.h" +#include "libutil/http.h" +#include "libutil/http_private.h" #include "ottery.h" #include "cryptobox.h" #include "keypair.h" @@ -83,6 +85,7 @@ rspamd_server_finish (struct rspamd_http_connection *conn, gulong size; const gchar *url_str; guint url_len; + rspamd_fstring_t *body; if (!session->reply) { session->reply = TRUE; @@ -100,9 +103,11 @@ rspamd_server_finish (struct rspamd_http_connection *conn, reply->code = 200; reply->status = rspamd_fstring_new_init ("OK", 2); - reply->body = rspamd_fstring_sized_new (size); - reply->body->len = size; - memset (reply->body->str, 0, size); + body = rspamd_fstring_sized_new (size); + body->len = size; + memset (body->str, 0, size); + rspamd_http_message_set_body_from_fstring_steal (msg, body); + } else { reply->code = 404; -- cgit v1.2.3 From 9945da06ec7a59844306793e61a151ab8fa43a91 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 16:49:34 +0100 Subject: [Fix] Fix shm_open call as described in POSIX --- src/libserver/task.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libserver/task.c b/src/libserver/task.c index 16e8cc681..7d45274df 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -310,7 +310,7 @@ rspamd_task_load_message (struct rspamd_task *task, fp = &filepath[0]; } - fd = shm_open (fp, O_RDONLY); + fd = shm_open (fp, O_RDONLY, 00600); if (fd == -1) { g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, -- cgit v1.2.3 From 4afabcbbe22e95a3dfe5db4b31b3b978f73fa0db Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 17:17:50 +0100 Subject: [Feature] Implement reading of messages to shared memory --- src/libutil/http.c | 42 +++++++++++++++++++++++++++++++++++++----- src/libutil/http.h | 33 ++++++++++++++++++++------------- src/rspamd_proxy.c | 2 +- 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/libutil/http.c b/src/libutil/http.c index bff41d0c9..cedf394ae 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -1306,9 +1306,10 @@ rspamd_http_connection_free (struct rspamd_http_connection *conn) g_slice_free1 (sizeof (struct rspamd_http_connection), conn); } -void -rspamd_http_connection_read_message (struct rspamd_http_connection *conn, - gpointer ud, gint fd, struct timeval *timeout, struct event_base *base) +static void +rspamd_http_connection_read_message_common (struct rspamd_http_connection *conn, + gpointer ud, gint fd, struct timeval *timeout, struct event_base *base, + gint flags) { struct rspamd_http_connection_private *priv = conn->priv; struct rspamd_http_message *req; @@ -1318,6 +1319,7 @@ rspamd_http_connection_read_message (struct rspamd_http_connection *conn, req = rspamd_http_new_message ( conn->type == RSPAMD_HTTP_SERVER ? HTTP_REQUEST : HTTP_RESPONSE); priv->msg = req; + req->flags = flags; if (priv->peer_key) { priv->msg->peer_key = priv->peer_key; @@ -1352,6 +1354,21 @@ rspamd_http_connection_read_message (struct rspamd_http_connection *conn, event_add (&priv->ev, priv->ptv); } +void +rspamd_http_connection_read_message (struct rspamd_http_connection *conn, + gpointer ud, gint fd, struct timeval *timeout, struct event_base *base) +{ + rspamd_http_connection_read_message_common (conn, ud, fd, timeout, base, 0); +} + +void +rspamd_http_connection_read_message_shared (struct rspamd_http_connection *conn, + gpointer ud, gint fd, struct timeval *timeout, struct event_base *base) +{ + rspamd_http_connection_read_message_common (conn, ud, fd, timeout, base, + RSPAMD_HTTP_FLAG_SHMEM); +} + static void rspamd_http_connection_encrypt_message ( struct rspamd_http_connection *conn, @@ -1455,10 +1472,19 @@ rspamd_http_connection_encrypt_message ( g_free (segments); } +static void +rspamd_http_detach_shared (struct rspamd_http_message *msg) +{ + rspamd_fstring_t *cpy_str; + + cpy_str = rspamd_fstring_new_init (msg->body_buf.begin, msg->body_buf.len); + rspamd_http_message_set_body_from_fstring_steal (msg, cpy_str); +} + void rspamd_http_connection_write_message (struct rspamd_http_connection *conn, - struct rspamd_http_message *msg, const gchar *host, const gchar *mime_type, - gpointer ud, gint fd, struct timeval *timeout, struct event_base *base) + struct rspamd_http_message *msg, const gchar *host, const gchar *mime_type, + gpointer ud, gint fd, struct timeval *timeout, struct event_base *base) { struct rspamd_http_connection_private *priv = conn->priv; struct rspamd_http_header *hdr, *htmp; @@ -1505,6 +1531,12 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, } } + if (encrypted && (msg->flags & + (RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE|RSPAMD_HTTP_FLAG_SHMEM))) { + /* We cannot use immutable body to encrypt message in place */ + rspamd_http_detach_shared (msg); + } + if (encrypted) { mode = rspamd_keypair_alg (priv->local_key); diff --git a/src/libutil/http.h b/src/libutil/http.h index ab71f619b..1e4ffbbc0 100644 --- a/src/libutil/http.h +++ b/src/libutil/http.h @@ -166,11 +166,18 @@ gboolean rspamd_http_connection_is_encrypted (struct rspamd_http_connection *con * @param fd fd to read/write */ void rspamd_http_connection_read_message ( - struct rspamd_http_connection *conn, - gpointer ud, - gint fd, - struct timeval *timeout, - struct event_base *base); + struct rspamd_http_connection *conn, + gpointer ud, + gint fd, + struct timeval *timeout, + struct event_base *base); + +void rspamd_http_connection_read_message_shared ( + struct rspamd_http_connection *conn, + gpointer ud, + gint fd, + struct timeval *timeout, + struct event_base *base); /** * Send reply using initialised connection @@ -180,14 +187,14 @@ void rspamd_http_connection_read_message ( * @param fd fd to read/write */ void rspamd_http_connection_write_message ( - struct rspamd_http_connection *conn, - struct rspamd_http_message *msg, - const gchar *host, - const gchar *mime_type, - gpointer ud, - gint fd, - struct timeval *timeout, - struct event_base *base); + struct rspamd_http_connection *conn, + struct rspamd_http_message *msg, + const gchar *host, + const gchar *mime_type, + gpointer ud, + gint fd, + struct timeval *timeout, + struct event_base *base); /** * Free connection structure diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 1ab3a6fbc..9d70306e9 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -1284,7 +1284,7 @@ proxy_accept_socket (gint fd, short what, void *arg) rspamd_inet_address_to_string (addr), rspamd_inet_address_get_port (addr)); - rspamd_http_connection_read_message (session->client_conn, + rspamd_http_connection_read_message_shared (session->client_conn, session, nfd, &ctx->io_tv, -- cgit v1.2.3 From e9e67d85ef8eddc7e38f57b8e11e9eac8ac1ac54 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 17:28:39 +0100 Subject: [Fix] Fix creating of temporary shmem segment --- src/libutil/util.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/libutil/util.c b/src/libutil/util.c index 19953194c..3b0203f9f 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -1920,6 +1920,11 @@ rspamd_shmem_mkstemp (gchar *pattern) if (fd != -1) { rspamd_strlcpy (pattern, nbuf, blen + 1); + break; + } + else if (errno != EEXIST) { + g_error ("%s: failed to create temp shmem %s: %s", + G_STRLOC, nbuf, strerror (errno)); } } -- cgit v1.2.3 From ec64510fc496ca6e01576a53bb7862b7a9308cd3 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 18:47:25 +0100 Subject: [Fix] Fix race condition with shared memory by refcounts --- src/libutil/http.c | 90 ++++++++++++++++++++++++++++++++++++++++------ src/libutil/http.h | 21 +++++++++++ src/libutil/http_private.h | 8 +++-- src/rspamd_proxy.c | 16 +++++---- 4 files changed, 117 insertions(+), 18 deletions(-) diff --git a/src/libutil/http.c b/src/libutil/http.c index cedf394ae..ad47b1b20 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -1217,7 +1217,12 @@ rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn) } /* We don't own segment, so do not try to touch it */ - storage->shared.shm_name = NULL; + + if (msg->body_buf.c.shared.name) { + storage->shared.name = msg->body_buf.c.shared.name; + REF_RETAIN (storage->shared.name); + } + new_msg->body_buf.str = mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, storage->shared.shm_fd, 0); @@ -1481,10 +1486,11 @@ rspamd_http_detach_shared (struct rspamd_http_message *msg) rspamd_http_message_set_body_from_fstring_steal (msg, cpy_str); } -void -rspamd_http_connection_write_message (struct rspamd_http_connection *conn, +static void +rspamd_http_connection_write_message_common (struct rspamd_http_connection *conn, struct rspamd_http_message *msg, const gchar *host, const gchar *mime_type, - gpointer ud, gint fd, struct timeval *timeout, struct event_base *base) + gpointer ud, gint fd, struct timeval *timeout, struct event_base *base, + gboolean allow_shared) { struct rspamd_http_connection_private *priv = conn->priv; struct rspamd_http_header *hdr, *htmp; @@ -1534,9 +1540,22 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, if (encrypted && (msg->flags & (RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE|RSPAMD_HTTP_FLAG_SHMEM))) { /* We cannot use immutable body to encrypt message in place */ + allow_shared = FALSE; rspamd_http_detach_shared (msg); } + if (allow_shared) { + if (!(msg->flags & RSPAMD_HTTP_FLAG_SHMEM) || + msg->body_buf.c.shared.name == NULL) { + allow_shared = FALSE; + } + else { + /* Insert new header */ + rspamd_http_message_add_header (msg, "Shm", + msg->body_buf.c.shared.name->shm_name); + } + } + if (encrypted) { mode = rspamd_keypair_alg (priv->local_key); @@ -1605,7 +1624,7 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, } else { if (msg->method < HTTP_SYMBOLS) { - if (msg->body_buf.len == 0) { + if (msg->body_buf.len == 0 || allow_shared) { pbody = NULL; bodylen = 0; priv->outlen = 2; @@ -1619,6 +1638,7 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, } } else if (msg->body_buf.len > 0) { + allow_shared = FALSE; pbody = (gchar *)msg->body_buf.begin; bodylen = msg->body_buf.len; priv->outlen = 2; @@ -1886,6 +1906,24 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn, event_add (&priv->ev, priv->ptv); } +void +rspamd_http_connection_write_message (struct rspamd_http_connection *conn, + struct rspamd_http_message *msg, const gchar *host, const gchar *mime_type, + gpointer ud, gint fd, struct timeval *timeout, struct event_base *base) +{ + rspamd_http_connection_write_message_common (conn, msg, host, mime_type, + ud, fd, timeout, base, FALSE); +} + +void +rspamd_http_connection_write_message_shared (struct rspamd_http_connection *conn, + struct rspamd_http_message *msg, const gchar *host, const gchar *mime_type, + gpointer ud, gint fd, struct timeval *timeout, struct event_base *base) +{ + rspamd_http_connection_write_message_common (conn, msg, host, mime_type, + ud, fd, timeout, base, TRUE); +} + struct rspamd_http_message * rspamd_http_new_message (enum http_parser_type type) { @@ -1974,6 +2012,37 @@ rspamd_http_message_get_body (struct rspamd_http_message *msg, return ret; } +static void +rspamd_http_shname_dtor (void *p) +{ + struct _rspamd_storage_shmem_s *n = p; + + shm_unlink (n->shm_name); + g_free (n->shm_name); + g_slice_free1 (sizeof (*n), n); +} + +void * +rspamd_http_message_shmem_ref (struct rspamd_http_message *msg) +{ + if ((msg->flags & RSPAMD_HTTP_FLAG_SHMEM) && msg->body_buf.c.shared.name) { + REF_RETAIN (msg->body_buf.c.shared.name); + return msg->body_buf.c.shared.name; + } + + return NULL; +} + +void +rspamd_http_message_shmem_unref (void *p) +{ + struct _rspamd_storage_shmem_s *n = p; + + if (n) { + REF_RELEASE (n); + } +} + gboolean rspamd_http_message_set_body (struct rspamd_http_message *msg, const gchar *data, gsize len) @@ -1984,8 +2053,10 @@ rspamd_http_message_set_body (struct rspamd_http_message *msg, rspamd_http_message_storage_cleanup (msg); if (msg->flags & RSPAMD_HTTP_FLAG_SHMEM) { - storage->shared.shm_name = g_strdup ("/rhm.XXXXXXXXXXXXXXXXXXXX"); - storage->shared.shm_fd = rspamd_shmem_mkstemp (storage->shared.shm_name); + storage->shared.name = g_slice_alloc (sizeof (*storage->shared.name)); + REF_INIT_RETAIN (storage->shared.name, rspamd_http_shname_dtor); + storage->shared.name->shm_name = g_strdup ("/rhm.XXXXXXXXXXXXXXXXXXXX"); + storage->shared.shm_fd = rspamd_shmem_mkstemp (storage->shared.name->shm_name); if (storage->shared.shm_fd == -1) { return FALSE; @@ -2192,9 +2263,8 @@ rspamd_http_message_storage_cleanup (struct rspamd_http_message *msg) close (storage->shared.shm_fd); } - if (storage->shared.shm_name != NULL) { - shm_unlink (storage->shared.shm_name); - g_free (storage->shared.shm_name); + if (storage->shared.name != NULL) { + REF_RELEASE (storage->shared.name); } storage->shared.shm_fd = -1; diff --git a/src/libutil/http.h b/src/libutil/http.h index 1e4ffbbc0..4cbcaf5fb 100644 --- a/src/libutil/http.h +++ b/src/libutil/http.h @@ -196,6 +196,16 @@ void rspamd_http_connection_write_message ( struct timeval *timeout, struct event_base *base); +void rspamd_http_connection_write_message_shared ( + struct rspamd_http_connection *conn, + struct rspamd_http_message *msg, + const gchar *host, + const gchar *mime_type, + gpointer ud, + gint fd, + struct timeval *timeout, + struct event_base *base); + /** * Free connection structure * @param conn @@ -352,6 +362,17 @@ gboolean rspamd_http_message_remove_header (struct rspamd_http_message *msg, */ void rspamd_http_message_free (struct rspamd_http_message *msg); +/** + * Increase refcount for shared file (if any) to prevent early memory unlinking + * @param msg + */ +void* rspamd_http_message_shmem_ref (struct rspamd_http_message *msg); +/** + * Decrease external ref for shmem segment associated with a message + * @param msg + */ +void rspamd_http_message_shmem_unref (void *p); + /** * Parse HTTP date header and return it as time_t * @param header HTTP date header diff --git a/src/libutil/http_private.h b/src/libutil/http_private.h index a944cb31b..38fbec742 100644 --- a/src/libutil/http_private.h +++ b/src/libutil/http_private.h @@ -18,6 +18,7 @@ #include "http.h" #include "str_util.h" +#include "ref.h" #include "../../contrib/mumhash/mum.h" #define HASH_CASELESS #include "uthash_strcase.h" @@ -52,8 +53,11 @@ struct rspamd_http_message { /* Internal storage */ union _rspamd_storage_u { rspamd_fstring_t *normal; - struct { - gchar *shm_name; + struct _rspamd_storage_shared_s { + struct _rspamd_storage_shmem_s { + gchar *shm_name; + ref_entry_t ref; + } *name; gint shm_fd; } shared; } c; diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 9d70306e9..6e0c1c254 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -142,9 +142,10 @@ struct rspamd_proxy_session { rspamd_inet_addr_t *client_addr; struct rspamd_http_connection *client_conn; gpointer map; - gsize map_len; + gpointer shmem_ref; struct rspamd_proxy_backend_connection *master_conn; GPtrArray *mirror_conns; + gsize map_len; gint client_sock; gboolean is_spamc; ref_entry_t ref; @@ -823,6 +824,7 @@ proxy_session_dtor (struct rspamd_proxy_session *session) } g_ptr_array_free (session->mirror_conns, TRUE); + rspamd_http_message_shmem_unref (session->shmem_ref); rspamd_inet_address_destroy (session->client_addr); close (session->client_sock); rspamd_mempool_delete (session->pool); @@ -1033,7 +1035,7 @@ proxy_open_mirror_connections (struct rspamd_proxy_session *session) session->ctx->local_key); msg->peer_key = rspamd_pubkey_ref (m->key); - rspamd_http_connection_write_message (bk_conn->backend_conn, + rspamd_http_connection_write_message_shared (bk_conn->backend_conn, msg, NULL, NULL, bk_conn, bk_conn->backend_sock, &session->ctx->io_tv, session->ctx->ev_base); @@ -1200,6 +1202,7 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, rspamd_http_message_remove_header (msg, "Content-Length"); rspamd_http_message_remove_header (msg, "Key"); rspamd_http_connection_reset (session->client_conn); + session->shmem_ref = rspamd_http_message_shmem_ref (msg); session->master_conn->backend_conn = rspamd_http_connection_new ( NULL, @@ -1215,10 +1218,11 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, session->ctx->local_key); msg->peer_key = rspamd_pubkey_ref (backend->key); - rspamd_http_connection_write_message (session->master_conn->backend_conn, - msg, NULL, NULL, session->master_conn, - session->master_conn->backend_sock, - &session->ctx->io_tv, session->ctx->ev_base); + rspamd_http_connection_write_message_shared ( + session->master_conn->backend_conn, + msg, NULL, NULL, session->master_conn, + session->master_conn->backend_sock, + &session->ctx->io_tv, session->ctx->ev_base); } } else { -- cgit v1.2.3 From b627fdf63412e22defd0f5ef42ad34ef8330b658 Mon Sep 17 00:00:00 2001 From: Jérôme Lebleu Date: Fri, 10 Jun 2016 19:55:58 +0200 Subject: [Typo] Correct suppress spelling --- src/rspamadm/configtest.c | 2 +- src/rspamadm/fuzzy_merge.c | 2 +- src/rspamadm/pw.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rspamadm/configtest.c b/src/rspamadm/configtest.c index 80c2ec759..7ba9af3fe 100644 --- a/src/rspamadm/configtest.c +++ b/src/rspamadm/configtest.c @@ -40,7 +40,7 @@ struct rspamadm_command configtest_command = { static GOptionEntry entries[] = { {"quiet", 'q', 0, G_OPTION_ARG_NONE, &quiet, - "Supress output", NULL}, + "Suppress output", NULL}, {"config", 'c', 0, G_OPTION_ARG_STRING, &config, "Config file to test", NULL}, {"strict", 's', 0, G_OPTION_ARG_NONE, &strict, diff --git a/src/rspamadm/fuzzy_merge.c b/src/rspamadm/fuzzy_merge.c index 931bea0f0..92a434064 100644 --- a/src/rspamadm/fuzzy_merge.c +++ b/src/rspamadm/fuzzy_merge.c @@ -38,7 +38,7 @@ static GOptionEntry entries[] = { {"destination", 'd', 0, G_OPTION_ARG_STRING, &target, "Destination db", NULL}, {"quiet", 'q', 0, G_OPTION_ARG_NONE, &quiet, - "Supress output", NULL}, + "Suppress output", NULL}, {NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL} }; diff --git a/src/rspamadm/pw.c b/src/rspamadm/pw.c index 47c111335..fb2817c59 100644 --- a/src/rspamadm/pw.c +++ b/src/rspamadm/pw.c @@ -44,7 +44,7 @@ static GOptionEntry entries[] = { {"check", 'c', 0, G_OPTION_ARG_NONE, &do_check, "Check password", NULL}, {"quiet", 'q', 0, G_OPTION_ARG_NONE, &quiet, - "Supress output", NULL}, + "Suppress output", NULL}, {"password", 'p', 0, G_OPTION_ARG_STRING, &password, "Input password", NULL}, {"type", 't', 0, G_OPTION_ARG_STRING, &type, -- cgit v1.2.3 From 9e98bed31cf8cd9cacda5f983b8f98233abe5e73 Mon Sep 17 00:00:00 2001 From: Larry Hynes Date: Fri, 10 Jun 2016 19:43:24 +0100 Subject: [Doc] Correct edits to table in protocol.md --- doc/markdown/architecture/protocol.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/markdown/architecture/protocol.md b/doc/markdown/architecture/protocol.md index 75a512718..f16f3380d 100644 --- a/doc/markdown/architecture/protocol.md +++ b/doc/markdown/architecture/protocol.md @@ -34,11 +34,11 @@ To avoid unnecessary work, rspamd allows an MTA to pass pre-processed data about | :-------------- | :-------------------------------- | | **Deliver-To:** | Defines actual delivery recipient of message. Can be used for personalized statistics and for user specific options. | | **IP:** | Defines IP from which this message is received. | -| **Helo:** | Defines SMTP | -| **Hostname:** | Defines resolved | -| **From:** | Defines SMTP mail from command | +| **Helo:** | Defines SMTP helo | +| **Hostname:** | Defines resolved hostname | +| **From:** | Defines SMTP mail from command data | | **Queue-Id:** | Defines SMTP queue id for message (can be used instead of message id in logging). | -| **Rcpt:** | Defines SMTP recipient (it may be several `Rcpt` | +| **Rcpt:** | Defines SMTP recipient (there may be several `Rcpt` headers) | | **Pass:** | If this header has `all` value, all filters would be checked for this message. | | **Subject:** | Defines subject of message (is used for non-mime messages). | | **User:** | Defines SMTP user. | -- cgit v1.2.3 From c5064c42570b60b5687004de82ce14993085dafd Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 11 Jun 2016 10:11:36 +0100 Subject: [Feature] Use offset when passing shm to deal with encrypted requests --- src/libserver/task.c | 42 ++++++++++++++++++++++++++++++++++++------ src/libutil/http.c | 6 +++++- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/libserver/task.c b/src/libserver/task.c index 7d45274df..82e4d6fa9 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -264,12 +264,17 @@ rspamd_task_free (struct rspamd_task *task) } } +struct rspamd_task_map { + gpointer begin; + gulong len; +}; + static void rspamd_task_unmapper (gpointer ud) { - struct rspamd_task *task = ud; + struct rspamd_task_map *m = ud; - munmap ((void *)task->msg.begin, task->msg.len); + munmap (m->begin, m->len); } gboolean @@ -281,9 +286,11 @@ rspamd_task_load_message (struct rspamd_task *task, ucl_object_t *control_obj; gchar filepath[PATH_MAX], *fp; gint fd, flen; + gulong offset = 0; rspamd_ftok_t srch, *tok; gpointer map; struct stat st; + struct rspamd_task_map *m; if (msg) { rspamd_protocol_handle_headers (task, msg); @@ -336,13 +343,33 @@ rspamd_task_load_message (struct rspamd_task *task, } close (fd); - task->msg.begin = map; - task->msg.len = st.st_size; + + srch.begin = "shm-offset"; + srch.len = 10; + tok = g_hash_table_lookup (task->request_headers, &srch); + + if (tok) { + rspamd_strtoul (tok->begin, tok->len, &offset); + + if (offset > (gulong)st.st_size) { + msg_err_task ("invalid offset %ul (%ul available) for shm " + "segment %s", offset, st.st_size, fp); + munmap (map, st.st_size); + + return FALSE; + } + } + + task->msg.begin = ((guchar *)map) + offset; + task->msg.len = st.st_size - offset; task->flags |= RSPAMD_TASK_FLAG_FILE; + m = rspamd_mempool_alloc (task->task_pool, sizeof (*m)); + m->begin = map; + m->len = st.st_size; msg_info_task ("loaded message from shared memory %s", fp); - rspamd_mempool_add_destructor (task->task_pool, rspamd_task_unmapper, task); + rspamd_mempool_add_destructor (task->task_pool, rspamd_task_unmapper, m); return TRUE; } @@ -405,8 +432,11 @@ rspamd_task_load_message (struct rspamd_task *task, task->flags |= RSPAMD_TASK_FLAG_FILE; msg_info_task ("loaded message from file %s", fp); + m = rspamd_mempool_alloc (task->task_pool, sizeof (*m)); + m->begin = map; + m->len = st.st_size; - rspamd_mempool_add_destructor (task->task_pool, rspamd_task_unmapper, task); + rspamd_mempool_add_destructor (task->task_pool, rspamd_task_unmapper, m); return TRUE; } diff --git a/src/libutil/http.c b/src/libutil/http.c index ad47b1b20..26fd3410d 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -1550,9 +1550,13 @@ rspamd_http_connection_write_message_common (struct rspamd_http_connection *conn allow_shared = FALSE; } else { - /* Insert new header */ + /* Insert new headers */ rspamd_http_message_add_header (msg, "Shm", msg->body_buf.c.shared.name->shm_name); + rspamd_snprintf (datebuf, sizeof (datebuf), "%d", + (int)(msg->body_buf.begin - msg->body_buf.str)); + rspamd_http_message_add_header (msg, "Shm-Offset", + datebuf); } } -- cgit v1.2.3 From 78ba3dfdbf1b5e0747f4e9258f48c8adc2a5482d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 11 Jun 2016 12:40:25 +0100 Subject: [Feature] Initialize ssl library to use SSL connections --- CMakeLists.txt | 11 +++++------ src/libutil/util.c | 21 +++++++++++++++++++++ src/rspamd.h | 2 ++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 219fdce41..0b5331bb3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -613,7 +613,6 @@ IF(CMAKE_SYSTEM_NAME STREQUAL "SunOS") LIST(APPEND CMAKE_REQUIRED_LIBRARIES socket) LIST(APPEND CMAKE_REQUIRED_LIBRARIES umem) # Ugly hack, but FindOpenSSL on Solaris does not link with libcrypto - LIST(APPEND CMAKE_REQUIRED_LIBRARIES crypto) SET(CMAKE_VERBOSE_MAKEFILE ON) SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib:${RSPAMD_LIBDIR}") @@ -671,8 +670,10 @@ ProcessPackage(SQLITE3 LIBRARY sqlite3 INCLUDE sqlite3.h INCLUDE_SUFFIXES includ ROOT ${SQLITE3_ROOT_DIR} MODULES sqlite3 sqlite) ProcessPackage(ICONV LIBRARY iconv libiconv libiconv-2 c INCLUDE iconv.h INCLUDE_SUFFIXES include/libiconv ROOT ${ICONV_ROOT_DIR} MODULES iconv) -ProcessPackage(OPENSSL LIBRARY crypto INCLUDE err.h INCLUDE_SUFFIXES include/openssl - ROOT ${OPENSSL_ROOT_DIR} MODULES openssl) +ProcessPackage(LIBCRYPT LIBRARY crypto INCLUDE err.h INCLUDE_SUFFIXES include/openssl + ROOT ${OPENSSL_ROOT_DIR} MODULES openssl libcrypt) +ProcessPackage(LIBSSL LIBRARY ssl INCLUDE ssl.h INCLUDE_SUFFIXES include/openssl + ROOT ${OPENSSL_ROOT_DIR} MODULES openssl libssl) ProcessPackage(MAGIC LIBRARY magic INCLUDE magic.h INCLUDE_SUFFIXES include/libmagic ROOT ${LIBMAGIC_ROOT_DIR} MODULES magic) @@ -690,9 +691,7 @@ IF (ENABLE_FANN MATCHES "ON") ENDIF () #Check for openssl (required for dkim) -IF(WITH_OPENSSL) - SET(HAVE_OPENSSL 1) -ENDIF(WITH_OPENSSL) +SET(HAVE_OPENSSL 1) IF(GMIME2_VERSION VERSION_GREATER "2.4.0" OR NOT GMIME2_VERSION) SET(GMIME24 1) diff --git a/src/libutil/util.c b/src/libutil/util.c index 3b0203f9f..10753ec93 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -28,6 +28,7 @@ #include #include #include +#include #endif #ifdef HAVE_TERMIOS_H @@ -1971,6 +1972,7 @@ rspamd_init_libs (void) struct rlimit rlim; struct rspamd_external_libs_ctx *ctx; struct ottery_config *ottery_cfg; + static const char secure_ciphers[] = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4"; ctx = g_slice_alloc0 (sizeof (*ctx)); ctx->crypto_ctx = rspamd_cryptobox_init (); @@ -2007,6 +2009,24 @@ rspamd_init_libs (void) OpenSSL_add_all_algorithms (); OpenSSL_add_all_digests (); OpenSSL_add_all_ciphers (); + SSL_library_init (); + SSL_load_error_strings (); + + if (RAND_poll () == 0) { + guchar seed[128]; + + /* Try to use ottery to seed rand */ + ottery_rand_bytes (seed, sizeof (seed)); + RAND_seed (seed, sizeof (seed)); + rspamd_explicit_memzero (seed, sizeof (seed)); + } + + ctx->ssl_ctx = SSL_CTX_new (SSLv23_method ()); + SSL_CTX_set_verify (ctx->ssl_ctx, SSL_VERIFY_PEER, NULL); + SSL_CTX_set_verify_depth (ctx->ssl_ctx, 4); + SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_COMPRESSION); + /* Default settings */ + SSL_CTX_set_cipher_list (ctx->ssl_ctx, secure_ciphers); #endif g_random_set_seed (ottery_rand_uint32 ()); @@ -2067,6 +2087,7 @@ rspamd_deinit_libs (struct rspamd_external_libs_ctx *ctx) #ifdef HAVE_OPENSSL EVP_cleanup (); ERR_free_strings (); + SSL_CTX_free (ctx->ssl_ctx); #endif rspamd_inet_library_destroy (); } diff --git a/src/rspamd.h b/src/rspamd.h index c0c60185d..6a24370aa 100644 --- a/src/rspamd.h +++ b/src/rspamd.h @@ -19,6 +19,7 @@ #include "libserver/events.h" #include "libserver/roll_history.h" #include "libserver/task.h" +#include #include @@ -295,6 +296,7 @@ struct rspamd_external_libs_ctx { void **local_addrs; struct rspamd_cryptobox_library_ctx *crypto_ctx; struct ottery_config *ottery_cfg; + SSL_CTX *ssl_ctx; ref_entry_t ref; }; -- cgit v1.2.3 From e48dc88595c2ddd7be31512ba6677ceff09d7632 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 11 Jun 2016 13:15:35 +0100 Subject: [Fix] Use shared memory merely for local backends in the proxy --- src/rspamd_proxy.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 6e0c1c254..65339b3d5 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -1035,10 +1035,19 @@ proxy_open_mirror_connections (struct rspamd_proxy_session *session) session->ctx->local_key); msg->peer_key = rspamd_pubkey_ref (m->key); - rspamd_http_connection_write_message_shared (bk_conn->backend_conn, - msg, NULL, NULL, bk_conn, - bk_conn->backend_sock, - &session->ctx->io_tv, session->ctx->ev_base); + if (m->local || + rspamd_inet_address_is_local (rspamd_upstream_addr (bk_conn->up))) { + rspamd_http_connection_write_message_shared (bk_conn->backend_conn, + msg, NULL, NULL, bk_conn, + bk_conn->backend_sock, + &session->ctx->io_tv, session->ctx->ev_base); + } + else { + rspamd_http_connection_write_message (bk_conn->backend_conn, + msg, NULL, NULL, bk_conn, + bk_conn->backend_sock, + &session->ctx->io_tv, session->ctx->ev_base); + } g_ptr_array_add (session->mirror_conns, bk_conn); REF_RETAIN (session); @@ -1218,11 +1227,22 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, session->ctx->local_key); msg->peer_key = rspamd_pubkey_ref (backend->key); - rspamd_http_connection_write_message_shared ( - session->master_conn->backend_conn, - msg, NULL, NULL, session->master_conn, - session->master_conn->backend_sock, - &session->ctx->io_tv, session->ctx->ev_base); + if (backend->local || + rspamd_inet_address_is_local ( + rspamd_upstream_addr (session->master_conn->up))) { + rspamd_http_connection_write_message_shared ( + session->master_conn->backend_conn, + msg, NULL, NULL, session->master_conn, + session->master_conn->backend_sock, + &session->ctx->io_tv, session->ctx->ev_base); + } + else { + rspamd_http_connection_write_message ( + session->master_conn->backend_conn, + msg, NULL, NULL, session->master_conn, + session->master_conn->backend_sock, + &session->ctx->io_tv, session->ctx->ev_base); + } } } else { -- cgit v1.2.3 From 4eac8a4828fa434d94dc662fe3b5426bf396d7be Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 11 Jun 2016 13:40:44 +0100 Subject: [Feature] Allow to set ciphers and CA paths in config --- src/libserver/cfg_file.h | 3 +++ src/libserver/cfg_rcl.c | 12 ++++++++++++ src/libserver/cfg_utils.c | 7 +++++++ src/libutil/util.c | 16 ++++++++++++++++ 4 files changed, 38 insertions(+) diff --git a/src/libserver/cfg_file.h b/src/libserver/cfg_file.h index e14fbd90a..93470c0f3 100644 --- a/src/libserver/cfg_file.h +++ b/src/libserver/cfg_file.h @@ -405,6 +405,9 @@ struct rspamd_config { struct rspamd_config_post_load_script *on_load; /**< list of scripts executed on config load */ + gchar *ssl_ca_path; /**< path to CA certs */ + gchar *ssl_ciphers; /**< set of preferred ciphers */ + ref_entry_t ref; /**< reference counter */ }; diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index 50e5893a8..7b7c76420 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -1924,6 +1924,18 @@ rspamd_rcl_config_init (struct rspamd_config *cfg) G_STRUCT_OFFSET (struct rspamd_config, ignore_received), 0, "Ignore data from the first received header"); + rspamd_rcl_add_default_handler (sub, + "ssl_ca_path", + rspamd_rcl_parse_struct_string, + G_STRUCT_OFFSET (struct rspamd_config, ssl_ca_path), + RSPAMD_CL_FLAG_STRING_PATH, + "Path to ssl CA file"); + rspamd_rcl_add_default_handler (sub, + "ssl_ciphers", + rspamd_rcl_parse_struct_string, + G_STRUCT_OFFSET (struct rspamd_config, ssl_ciphers), + 0, + "List of ssl ciphers (e.g. HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4)"); /* New DNS configuration */ ssub = rspamd_rcl_add_section_doc (&sub->subsections, "dns", NULL, NULL, UCL_OBJECT, FALSE, TRUE, diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c index 85fd6af80..9cdedaabe 100644 --- a/src/libserver/cfg_utils.c +++ b/src/libserver/cfg_utils.c @@ -161,6 +161,13 @@ rspamd_config_new (void) */ cfg->enable_shutdown_workaround = TRUE; + cfg->ssl_ciphers = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4"; +#ifndef FREEBSD + cfg->ssl_ca_path = "/etc/ssl/certs/ca-certificates.crt"; +#else + cfg->ssl_ca_path = "/usr/local/etc/ssl/certs/ca-certificates.crt"; +#endif + REF_INIT_RETAIN (cfg, rspamd_config_free); return cfg; diff --git a/src/libutil/util.c b/src/libutil/util.c index 10753ec93..17dc0d644 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #endif #ifdef HAVE_TERMIOS_H @@ -2009,8 +2011,22 @@ rspamd_init_libs (void) OpenSSL_add_all_algorithms (); OpenSSL_add_all_digests (); OpenSSL_add_all_ciphers (); + +#if OPENSSL_VERSION_NUMBER >= 0x1000104fL + ENGINE_load_builtin_engines (); + + if ((ctx->crypto_ctx->cpu_config & CPUID_RDRAND) == 0) { + RAND_set_rand_engine (NULL); + } +#endif +#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) + SSL_library_init (); +#else + OPENSSL_init_ssl (0, NULL); +#endif SSL_library_init (); SSL_load_error_strings (); + OPENSSL_config (NULL); if (RAND_poll () == 0) { guchar seed[128]; -- cgit v1.2.3 From d64b6c289c8b5e9ad9e53bbb551fa345e4bbe41a Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 11 Jun 2016 16:16:04 +0100 Subject: [Feature] Configure CA path and ciphers --- src/libserver/cfg_utils.c | 5 ----- src/libutil/util.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c index 9cdedaabe..9e80cbaa8 100644 --- a/src/libserver/cfg_utils.c +++ b/src/libserver/cfg_utils.c @@ -162,11 +162,6 @@ rspamd_config_new (void) cfg->enable_shutdown_workaround = TRUE; cfg->ssl_ciphers = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4"; -#ifndef FREEBSD - cfg->ssl_ca_path = "/etc/ssl/certs/ca-certificates.crt"; -#else - cfg->ssl_ca_path = "/usr/local/etc/ssl/certs/ca-certificates.crt"; -#endif REF_INIT_RETAIN (cfg, rspamd_config_free); diff --git a/src/libutil/util.c b/src/libutil/util.c index 17dc0d644..aaaa09f27 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -1974,7 +1974,6 @@ rspamd_init_libs (void) struct rlimit rlim; struct rspamd_external_libs_ctx *ctx; struct ottery_config *ottery_cfg; - static const char secure_ciphers[] = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4"; ctx = g_slice_alloc0 (sizeof (*ctx)); ctx->crypto_ctx = rspamd_cryptobox_init (); @@ -2041,8 +2040,6 @@ rspamd_init_libs (void) SSL_CTX_set_verify (ctx->ssl_ctx, SSL_VERIFY_PEER, NULL); SSL_CTX_set_verify_depth (ctx->ssl_ctx, 4); SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_COMPRESSION); - /* Default settings */ - SSL_CTX_set_cipher_list (ctx->ssl_ctx, secure_ciphers); #endif g_random_set_seed (ottery_rand_uint32 ()); @@ -2070,6 +2067,8 @@ void rspamd_config_libs (struct rspamd_external_libs_ctx *ctx, struct rspamd_config *cfg) { + static const char secure_ciphers[] = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4"; + g_assert (cfg != NULL); if (ctx != NULL) { @@ -2085,6 +2084,30 @@ rspamd_config_libs (struct rspamd_external_libs_ctx *ctx, (void **) ctx->local_addrs); } } + + if (cfg->ssl_ca_path) { + if (SSL_CTX_load_verify_locations (ctx->ssl_ctx, cfg->ssl_ca_path, + NULL) != 1) { + msg_err_config ("cannot load CA certs from %s: %s", + cfg->ssl_ca_path, + ERR_error_string (ERR_get_error (), NULL)); + } + } + else { + msg_warn_config ("ssl_ca_path is not set, using default CA path"); + SSL_CTX_set_default_verify_paths (ctx->ssl_ctx); + } + + if (cfg->ssl_ciphers) { + if (SSL_CTX_set_cipher_list (ctx->ssl_ctx, cfg->ssl_ciphers) != 1) { + msg_err_config ("cannot set ciphers set to %s: %s; fallback to %s", + cfg->ssl_ciphers, + ERR_error_string (ERR_get_error (), NULL), + secure_ciphers); + /* Default settings */ + SSL_CTX_set_cipher_list (ctx->ssl_ctx, secure_ciphers); + } + } } } -- cgit v1.2.3 From 6f69240fd4ad3eebe8f67fb53fe0cb179c342be5 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sun, 12 Jun 2016 13:11:03 +0100 Subject: [Doc] Update documentation --- doc/markdown/architecture/index.md | 11 ++--------- doc/markdown/architecture/protocol.md | 4 ++-- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/doc/markdown/architecture/index.md b/doc/markdown/architecture/index.md index ddb9a7407..f93ce9818 100644 --- a/doc/markdown/architecture/index.md +++ b/doc/markdown/architecture/index.md @@ -69,20 +69,13 @@ The weight of rules is not necessarily constant. For example, for statistics rul ## Statistics -rspamd uses statistic algorithms to precisely calculate the final score of a message. Currently, the only algorithm defined is OSB-Bayes. You can find details of this algorithm in the following [paper](http://osbf-lua.luaforge.net/papers/osbf-eddc.pdf). rspamd uses a window size of 5 words in its classification. During the classification procedure, rspamd splits a message into a set of tokens. Tokens are separated by punctuation or whitespace characters. Short tokens (less than 3 symbols) are ignored. For each token, rspamd calculates two non-cryptographic hashes used subsequently as indices. All these tokens are stored in memory-mapped files called `statistic files` (or `statfiles`). Each statfile is a set of token chains, indexed by the first hash. A new token may be inserted into a chain, and if this chain is full then rspamd tries to expire less significant tokens to insert the new one. It is possible to obtain the current state of tokens by running the - - rspamc stat - -command which outputs statistics for free and used tokens in each statfile. Please note that if a statfile is close to being completely full then during subsequent learning you will lose existing data. Therefore, it is recommended to increase the size of such statfiles. +rspamd uses statistic algorithms to precisely calculate the final score of a message. Currently, the only algorithm defined is OSB-Bayes. You can find details of this algorithm in the following [paper](http://osbf-lua.luaforge.net/papers/osbf-eddc.pdf). rspamd uses a window size of 5 words in its classification. During the classification procedure, rspamd splits a message into a set of tokens. Tokens are separated by punctuation or whitespace characters. Short tokens (less than 3 symbols) are ignored. For each token, rspamd calculates two non-cryptographic hashes used subsequently as indices. All these tokens are stored in different statistics backends (mmapped files, sqlite3 database or redis server). Currently, the recommended backend for statistics is `redis`. ## Running rspamd There are several command-line options that can be passed to rspamd. All of them can be displayed by passing the `--help` argument. -All options are optional: by default rspamd will try to read the `etc/rspamd.conf` config file and run as a daemon. Also there is a test mode that can be turned on by passing the `-t` argument. In test mode, rspamd reads the config file and checks its syntax. If a configuration file is OK, the exit code is zero. Test mode is useful for testing new config files without restarting rspamd. The `--convert-config` option can be used to convert old style (pre 0.6.0) configs to [ucl](../configuration/ucl.md) format: - - $ rspamd -c ./rspamd.xml --convert-conf ./rspamd.conf - +All options are optional: by default rspamd will try to read the `etc/rspamd.conf` config file and run as a daemon. Also there is a test mode that can be turned on by passing the `-t` argument. In test mode, rspamd reads the config file and checks its syntax. If a configuration file is OK, the exit code is zero. Test mode is useful for testing new config files without restarting rspamd. ## Managing rspamd using signals diff --git a/doc/markdown/architecture/protocol.md b/doc/markdown/architecture/protocol.md index f16f3380d..b3f94a7e3 100644 --- a/doc/markdown/architecture/protocol.md +++ b/doc/markdown/architecture/protocol.md @@ -2,7 +2,7 @@ ## Protocol basics -rspamd uses the HTTP protocol, either version 1.0 or 1.1. (There is also a compatibility layer described further in this document.) rspamd defines some headers which allow the passing of extra information about a scanned message, such as envelope data, IP address or SMTP sasl authentication data, etc. rspamd supports normal and chunked encoded HTTP requests; however, form URL encoding is **NOT** supported currently. +rspamd uses the HTTP protocol, either version 1.0 or 1.1. (There is also a compatibility layer described further in this document.) rspamd defines some headers which allow the passing of extra information about a scanned message, such as envelope data, IP address or SMTP sasl authentication data, etc. rspamd supports normal and chunked encoded HTTP requests. ## rspamd HTTP request @@ -135,7 +135,7 @@ Additional keys which may be in the reply include: ## rspamd JSON control block -Since rspamd version 0.9 it is also possible to pass additional data by prepending a JSON control block to a message. So you can use either headers or a JSON block to pass data from the MTA to rspamd. The advantage of the JSON block is that it can be encrypted using `httpcrypt`. Header encryption is currently unsupported. +Since rspamd version 0.9 it is also possible to pass additional data by prepending a JSON control block to a message. So you can use either headers or a JSON block to pass data from the MTA to rspamd. To use a JSON control block, you need to pass an extra header called `Message-Length` to rspamd. This header should be equal to the size of the message **excluding** the JSON control block. Therefore, the size of the control block is equal to `Content-Length - Message-Length`. rspamd assumes that a message starts immediately after the control block (with no extra CRLF). This method is equally compatible with streaming transfer, however even if you are not specifying `Content-Length` you are still required to specify `Message-Length`. -- cgit v1.2.3 From 366cbd885d048cd848ab9a85aba8af4685503f4e Mon Sep 17 00:00:00 2001 From: Andrew Lewis Date: Sun, 12 Jun 2016 15:05:27 +0200 Subject: [Doc] Clarify some rspamc arguments --- doc/rspamc.1 | 8 ++++---- doc/rspamc.1.md | 10 +++++----- src/client/rspamc.c | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/rspamc.1 b/doc/rspamc.1 index b29bbb20d..331bdada8 100644 --- a/doc/rspamc.1 +++ b/doc/rspamc.1 @@ -100,22 +100,22 @@ Emulate that message was received from specified ip address .RE .TP .B \-u \f[I]username\f[], \-\-user=\f[I]username\f[] -Emulate that message was from specified user +Emulate that message was received from specified authenticated user .RS .RE .TP .B \-d \f[I]user\@domain\f[], \-\-deliver=\f[I]user\@domain\f[] -Emulate that message is delivered to specified user +Emulate that message is delivered to specified user (for LDA/statistics) .RS .RE .TP .B \-F \f[I]user\@domain\f[], \-\-from=\f[I]user\@domain\f[] -Emulate that message is from specified user +Emulate that message has specified SMTP FROM address .RS .RE .TP .B \-r \f[I]user\@domain\f[], \-\-rcpt=\f[I]user\@domain\f[] -Emulate that message is for specified user +Emulate that message has specified SMTP RCPT address .RS .RE .TP diff --git a/doc/rspamc.1.md b/doc/rspamc.1.md index 8e76d01b2..fb0fa58c8 100644 --- a/doc/rspamc.1.md +++ b/doc/rspamc.1.md @@ -64,16 +64,16 @@ requires input. : Emulate that message was received from specified ip address -u *username*, \--user=*username* -: Emulate that message was from specified user +: Emulate that message was received from specified authenticated user -d *user@domain*, \--deliver=*user@domain* -: Emulate that message is delivered to specified user +: Emulate that message is delivered to specified user (for LDA/statistics) -F *user@domain*, \--from=*user@domain* -: Emulate that message is from specified user +: Emulate that message has specified SMTP FROM address -r *user@domain*, \--rcpt=*user@domain* -: Emulate that message is for specified user +: Emulate that message has specified SMTP RCPT address \--helo=*helo_string* : Imitate SMTP HELO passing from MTA @@ -167,4 +167,4 @@ Add custom action's weight: Rspamd documentation and source codes may be downloaded from . -[rspamd-workers]: https://rspamd.com/doc/workers/ \ No newline at end of file +[rspamd-workers]: https://rspamd.com/doc/workers/ diff --git a/src/client/rspamc.c b/src/client/rspamc.c index 8001bb9cb..56cbeec16 100644 --- a/src/client/rspamc.c +++ b/src/client/rspamc.c @@ -93,13 +93,13 @@ static GOptionEntry entries[] = "Emulate that message was received from specified ip address", NULL }, { "user", 'u', 0, G_OPTION_ARG_STRING, &user, - "Emulate that message was from specified user", NULL }, + "Emulate that message was received from specified authenticated user", NULL }, { "deliver", 'd', 0, G_OPTION_ARG_STRING, &deliver_to, - "Emulate that message is delivered to specified user", NULL }, + "Emulate that message is delivered to specified user (for LDA/statistics)", NULL }, { "from", 'F', 0, G_OPTION_ARG_STRING, &from, - "Emulate that message is from specified user", NULL }, + "Emulate that message has specified SMTP FROM address", NULL }, { "rcpt", 'r', 0, G_OPTION_ARG_STRING_ARRAY, &rcpts, - "Emulate that message is for specified user", NULL }, + "Emulate that message has specified SMTP RCPT address", NULL }, { "helo", 0, 0, G_OPTION_ARG_STRING, &helo, "Imitate SMTP HELO passing from MTA", NULL }, { "hostname", 0, 0, G_OPTION_ARG_STRING, &hostname, -- cgit v1.2.3 From d9688f961e01c72aa591dbd84d81881889f42c0a Mon Sep 17 00:00:00 2001 From: Alexander Moisseev Date: Mon, 13 Jun 2016 12:11:23 +0300 Subject: [Minor] Add includes for `classifier "bayes"` to avoid redefining everything in the classifier configuration. --- conf/statistic.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/statistic.conf b/conf/statistic.conf index f5359f2b0..2b64b7e84 100644 --- a/conf/statistic.conf +++ b/conf/statistic.conf @@ -68,6 +68,9 @@ return function(task, is_spam, is_unlearn) return true end EOD + + .include(try=true; priority=1) "$LOCAL_CONFDIR/local.d/classifier-bayes.conf" + .include(try=true; priority=10) "$LOCAL_CONFDIR/override.d/classifier-bayes.conf" } .include(try=true; priority=1) "$LOCAL_CONFDIR/local.d/statistic.conf" -- cgit v1.2.3 From 7c9830991c58a6b23014a0bdc8748fb4ab7588da Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 10:04:21 +0100 Subject: [Feature] Search for SSL_set_tlsext_host_name support --- CMakeLists.txt | 2 ++ config.h.in | 1 + 2 files changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b5331bb3..62711ca4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -926,6 +926,8 @@ CHECK_SYMBOL_EXISTS(SOCK_SEQPACKET "sys/types.h;sys/socket.h" HAVE_SOCK_SEQPACKE CHECK_SYMBOL_EXISTS(I_SETSIG "sys/types.h;sys/ioctl.h" HAVE_SETSIG) CHECK_SYMBOL_EXISTS(O_ASYNC "sys/types.h;sys/fcntl.h" HAVE_OASYNC) CHECK_SYMBOL_EXISTS(O_NOFOLLOW "sys/types.h;sys/fcntl.h" HAVE_ONOFOLLOW) +LIST(APPEND CMAKE_REQUIRED_INCLUDES "${LIBSSL_INCLUDE}") +CHECK_SYMBOL_EXISTS(SSL_set_tlsext_host_name "openssl/ssl.h" HAVE_SSL_TLSEXT_HOSTNAME) IF(ENABLE_PCRE2 MATCHES "ON") IF(HAVE_PCRE_JIT) diff --git a/config.h.in b/config.h.in index f7bdedbfb..30b07797a 100644 --- a/config.h.in +++ b/config.h.in @@ -78,6 +78,7 @@ #cmakedefine HAVE_SETSIG 1 #cmakedefine HAVE_SIGINFO_H 1 #cmakedefine HAVE_SOCK_SEQPACKET 1 +#cmakedefine HAVE_SSL_TLSEXT_HOSTNAME 1 #cmakedefine HAVE_STDBOOL_H 1 #cmakedefine HAVE_STDINT_H 1 #cmakedefine HAVE_STDIO_H 1 -- cgit v1.2.3 From fa66761cd5d0e22b7a3fa84e299b22c8e368897c Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 12:04:29 +0100 Subject: [Feature] Add preliminary version of ssl toolbox --- src/libutil/CMakeLists.txt | 3 +- src/libutil/ssl_util.c | 487 +++++++++++++++++++++++++++++++++++++++++++++ src/libutil/ssl_util.h | 56 ++++++ 3 files changed, 545 insertions(+), 1 deletion(-) create mode 100644 src/libutil/ssl_util.c create mode 100644 src/libutil/ssl_util.h diff --git a/src/libutil/CMakeLists.txt b/src/libutil/CMakeLists.txt index a229c7f0d..0bf4590e2 100644 --- a/src/libutil/CMakeLists.txt +++ b/src/libutil/CMakeLists.txt @@ -20,6 +20,7 @@ SET(LIBRSPAMDUTILSRC ${CMAKE_CURRENT_SOURCE_DIR}/upstream.c ${CMAKE_CURRENT_SOURCE_DIR}/util.c ${CMAKE_CURRENT_SOURCE_DIR}/heap.c - ${CMAKE_CURRENT_SOURCE_DIR}/multipattern.c) + ${CMAKE_CURRENT_SOURCE_DIR}/multipattern.c + ${CMAKE_CURRENT_SOURCE_DIR}/ssl_util.c) # Rspamdutil SET(RSPAMD_UTIL ${LIBRSPAMDUTILSRC} PARENT_SCOPE) \ No newline at end of file diff --git a/src/libutil/ssl_util.c b/src/libutil/ssl_util.c new file mode 100644 index 000000000..d0f73a907 --- /dev/null +++ b/src/libutil/ssl_util.c @@ -0,0 +1,487 @@ +/*- + * Copyright 2016 Vsevolod Stakhov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "config.h" +#include "libutil/util.h" +#include "ssl_util.h" + +#include +#include +#include +#include +#include + +struct rspamd_ssl_connection { + gint fd; + enum { + ssl_conn_reset = 0, + ssl_conn_init, + ssl_conn_connected + } state; + SSL *ssl; + gchar *hostname; + struct event *ev; + struct event_base *ev_base; + struct timeval *tv; + rspamd_ssl_handler_t handler; + rspamd_ssl_error_handler_t err_handler; + gpointer handler_data; +}; + +static GQuark +rspamd_ssl_quark (void) +{ + return g_quark_from_static_string ("rspamd-ssl"); +} + +/* $OpenBSD: tls_verify.c,v 1.14 2015/09/29 10:17:04 deraadt Exp $ */ +/* + * Copyright (c) 2014 Jeremie Courreges-Anglas + * + * 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. + */ + +static gboolean +rspamd_tls_match_name (const char *cert_name, const char *name) +{ + const char *cert_domain, *domain, *next_dot; + + if (g_ascii_strcasecmp (cert_name, name) == 0) { + return TRUE; + } + + /* Wildcard match? */ + if (cert_name[0] == '*') { + /* + * Valid wildcards: + * - "*.domain.tld" + * - "*.sub.domain.tld" + * - etc. + * Reject "*.tld". + * No attempt to prevent the use of eg. "*.co.uk". + */ + cert_domain = &cert_name[1]; + /* Disallow "*" */ + if (cert_domain[0] == '\0') { + return FALSE; + } + + /* Disallow "*foo" */ + if (cert_domain[0] != '.') { + return FALSE; + } + /* Disallow "*.." */ + if (cert_domain[1] == '.') { + return FALSE; + } + next_dot = strchr (&cert_domain[1], '.'); + /* Disallow "*.bar" */ + if (next_dot == NULL) { + return FALSE; + } + /* Disallow "*.bar.." */ + if (next_dot[1] == '.') { + return FALSE; + } + + domain = strchr (name, '.'); + + /* No wildcard match against a name with no host part. */ + if (name[0] == '.') { + return FALSE; + } + /* No wildcard match against a name with no domain part. */ + if (domain == NULL || strlen (domain) == 1) { + return FALSE; + } + + if (g_ascii_strcasecmp (cert_domain, domain) == 0) { + return TRUE; + } + } + + return FALSE; +} + +/* See RFC 5280 section 4.2.1.6 for SubjectAltName details. */ +static gboolean +rspamd_tls_check_subject_altname (X509 *cert, const char *name) +{ + STACK_OF(GENERAL_NAME) *altname_stack = NULL; + int addrlen, type; + int count, i; + union { + struct in_addr ip4; + struct in6_addr ip6; + } addrbuf; + gboolean ret = FALSE; + + altname_stack = X509_get_ext_d2i (cert, NID_subject_alt_name, NULL, NULL); + + if (altname_stack == NULL) { + return FALSE; + } + + if (inet_pton (AF_INET, name, &addrbuf) == 1) { + type = GEN_IPADD; + addrlen = 4; + } + else if (inet_pton (AF_INET6, name, &addrbuf) == 1) { + type = GEN_IPADD; + addrlen = 16; + } + else { + type = GEN_DNS; + addrlen = 0; + } + + count = sk_GENERAL_NAME_num (altname_stack); + + for (i = 0; i < count; i++) { + GENERAL_NAME *altname; + + altname = sk_GENERAL_NAME_value (altname_stack, i); + + if (altname->type != type) { + continue; + } + + if (type == GEN_DNS) { + unsigned char *data; + int format, len; + + format = ASN1_STRING_type (altname->d.dNSName); + + if (format == V_ASN1_IA5STRING) { + data = ASN1_STRING_data (altname->d.dNSName); + len = ASN1_STRING_length (altname->d.dNSName); + + if (len < 0 || len != (gint)strlen (data)) { + ret = FALSE; + break; + } + + /* + * Per RFC 5280 section 4.2.1.6: + * " " is a legal domain name, but that + * dNSName must be rejected. + */ + if (strcmp (data, " ") == 0) { + ret = FALSE; + break; + } + + if (rspamd_tls_match_name (data, name)) { + ret = TRUE; + break; + } + } + } + else if (type == GEN_IPADD) { + unsigned char *data; + int datalen; + + datalen = ASN1_STRING_length (altname->d.iPAddress); + data = ASN1_STRING_data (altname->d.iPAddress); + + if (datalen < 0) { + ret = FALSE; + break; + } + + /* + * Per RFC 5280 section 4.2.1.6: + * IPv4 must use 4 octets and IPv6 must use 16 octets. + */ + if (datalen == addrlen && memcmp (data, &addrbuf, addrlen) == 0) { + ret = TRUE; + break; + } + } + } + + sk_GENERAL_NAME_pop_free (altname_stack, GENERAL_NAME_free); + return ret; +} + +static gboolean +rspamd_tls_check_common_name (X509 *cert, const char *name) +{ + X509_NAME *subject_name; + char *common_name = NULL; + union { + struct in_addr ip4; + struct in6_addr ip6; + } addrbuf; + int common_name_len; + gboolean ret = FALSE; + + subject_name = X509_get_subject_name (cert); + if (subject_name == NULL) { + goto out; + } + + common_name_len = X509_NAME_get_text_by_NID (subject_name, NID_commonName, NULL, 0); + + if (common_name_len < 0) { + goto out; + } + + common_name = g_malloc0 (common_name_len + 1); + X509_NAME_get_text_by_NID (subject_name, NID_commonName, common_name, + common_name_len + 1); + + /* NUL bytes in CN? */ + if (common_name_len != (gint)strlen (common_name)) { + goto out; + } + + if (inet_pton (AF_INET, name, &addrbuf) == 1 + || inet_pton (AF_INET6, name, &addrbuf) == 1) { + /* + * We don't want to attempt wildcard matching against IP + * addresses, so perform a simple comparison here. + */ + if (strcmp (common_name, name) == 0) { + ret = TRUE; + } + else { + ret = FALSE; + } + + goto out; + } + + if (rspamd_tls_match_name (common_name, name)) { + ret = TRUE; + } + +out: + g_free (common_name); + + return ret; +} + +static gboolean +rspamd_tls_check_name (X509 *cert, const char *name) +{ + gboolean ret; + + ret = rspamd_tls_check_subject_altname (cert, name); + if (ret) { + return ret; + } + + return rspamd_tls_check_common_name (cert, name); +} + +static gboolean +rspamd_ssl_peer_verify (struct rspamd_ssl_connection *c) +{ + X509 *server_cert; + glong ver_err; + GError *err = NULL; + + ver_err = SSL_get_verify_result (c->ssl); + + if (ver_err != X509_V_OK) { + g_set_error (&err, rspamd_ssl_quark (), ver_err, "certificate validation " + "failed: %s", X509_verify_cert_error_string (ver_err)); + c->err_handler (c->handler_data, err); + g_error_free (err); + + return FALSE; + } + else { + ver_err = ERR_get_error (); + g_set_error (&err, rspamd_ssl_quark (), ver_err, + "ssl connect error: %s", ERR_error_string (ver_err, NULL)); + c->err_handler (c->handler_data, err); + g_error_free (err); + return FALSE; + } + + /* Get server's certificate */ + server_cert = SSL_get_peer_certificate (c->ssl); + if (server_cert == NULL) { + g_set_error (&err, rspamd_ssl_quark (), ver_err, "peer certificate is absent"); + c->err_handler (c->handler_data, err); + g_error_free (err); + + return FALSE; + } + + if (c->hostname) { + if (!rspamd_tls_check_name (server_cert, c->hostname)) { + g_set_error (&err, rspamd_ssl_quark (), ver_err, "peer certificate fails " + "hostname verification for %s", c->hostname); + c->err_handler (c->handler_data, err); + g_error_free (err); + + return FALSE; + } + } + + return TRUE; +} + +static void +rspamd_ssl_event_handler (gint fd, short what, gpointer ud) +{ + struct rspamd_ssl_connection *c = ud; + gint ret; + GError *err = NULL; + + if (c->state == ssl_conn_init) { + /* Continue connection */ + ret = SSL_connect (c->ssl); + + if (ret == 1) { + /* Verify certificate */ + if (rspamd_ssl_peer_verify (c)) { + c->state = ssl_conn_connected; + c->handler (fd, what, c->handler_data); + } + else { + /* Error handler has been called from peer verify */ + return; + } + + if (ret == SSL_ERROR_WANT_READ) { + what = EV_READ; + } + else if (ret == SSL_ERROR_WANT_WRITE) { + what = EV_WRITE; + } + else { + g_set_error (&err, rspamd_ssl_quark (), ret, + "ssl connect error: %s", ERR_error_string (ret, NULL)); + c->err_handler (c->handler_data, err); + g_error_free (err); + return; + } + + event_set (c->ev, fd, EV_WRITE, rspamd_ssl_event_handler, c); + event_base_set (c->ev_base, c->ev); + event_add (c->ev, c->tv); + } + } +} + +struct rspamd_ssl_connection * +rspamd_ssl_connection_new (gpointer ssl_ctx) +{ + struct rspamd_ssl_connection *c; + + g_assert (ssl_ctx != NULL); + c = g_slice_alloc0 (sizeof (*c)); + c->ssl = SSL_new (ssl_ctx); + + return c; +} + + +gboolean +rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, + const gchar *hostname, struct event *ev, struct timeval *tv, + rspamd_ssl_handler_t handler, rspamd_ssl_error_handler_t err_handler, + gpointer handler_data) +{ + gint ret; + short what; + + g_assert (conn != NULL); + + if (conn->state != ssl_conn_reset) { + return FALSE; + } + + conn->fd = fd; + conn->ev = ev; + conn->handler = handler; + conn->err_handler = err_handler; + conn->handler_data = handler_data; + conn->ev_base = event_get_base (ev); + + if (SSL_set_fd (conn->ssl, fd) != 1) { + return FALSE; + } + + if (hostname) { + conn->hostname = g_strdup (hostname); +#ifdef HAVE_SSL_TLSEXT_HOSTNAME + SSL_set_tlsext_host_name (conn->ssl, hostname); +#endif + } + + conn->state = ssl_conn_init; + + ret = SSL_connect (conn->ssl); + + if (ret == 1) { + conn->state = ssl_conn_connected; + event_set (ev, fd, EV_WRITE, rspamd_ssl_event_handler, conn); + event_base_set (conn->ev_base, ev); + event_add (ev, tv); + } + else { + ret = SSL_get_error (conn->ssl, ret); + + if (ret == SSL_ERROR_WANT_READ) { + what = EV_READ; + } + else if (ret == SSL_ERROR_WANT_WRITE) { + what = EV_WRITE; + } + else { + return FALSE; + } + + event_set (ev, fd, EV_WRITE, rspamd_ssl_event_handler, conn); + event_base_set (conn->ev_base, ev); + event_add (ev, tv); + } + + return TRUE; +} + +/** + * Removes connection data + * @param conn + */ +void +rspamd_ssl_connection_free (struct rspamd_ssl_connection *conn) +{ + if (conn) { + SSL_free (conn->ssl); + + if (conn->hostname) { + g_free (conn->hostname); + } + + g_slice_free1 (sizeof (*conn), conn); + } +} diff --git a/src/libutil/ssl_util.h b/src/libutil/ssl_util.h new file mode 100644 index 000000000..1fcd65a35 --- /dev/null +++ b/src/libutil/ssl_util.h @@ -0,0 +1,56 @@ +/*- + * Copyright 2016 Vsevolod Stakhov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef SRC_LIBUTIL_SSL_UTIL_H_ +#define SRC_LIBUTIL_SSL_UTIL_H_ + +#include "config.h" +#include "libutil/addr.h" + +struct rspamd_ssl_connection; + +typedef void (*rspamd_ssl_handler_t)(gint fd, short what, gpointer d); +typedef void (*rspamd_ssl_error_handler_t)(gpointer d, GError *err); + +/** + * Creates a new ssl connection data structure + * @param ssl_ctx initialized SSL_CTX structure + * @return opaque connection data + */ +struct rspamd_ssl_connection * rspamd_ssl_connection_new (gpointer ssl_ctx); + +/** + * Connects SSL session using the specified (connected) FD + * @param conn connection + * @param fd fd to use + * @param hostname hostname for SNI + * @param ev event to use + * @param tv timeout for connection + * @param handler connected session handler + * @param handler_data opaque data + * @return TRUE if a session has been connected + */ +gboolean rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, + const gchar *hostname, struct event *ev, struct timeval *tv, + rspamd_ssl_handler_t handler, rspamd_ssl_error_handler_t err_handler, + gpointer handler_data); + +/** + * Removes connection data + * @param conn + */ +void rspamd_ssl_connection_free (struct rspamd_ssl_connection *conn); + +#endif /* SRC_LIBUTIL_SSL_UTIL_H_ */ -- cgit v1.2.3 From 121dd2106056508787f8046a89da38becc41c551 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 12:41:21 +0100 Subject: [Fix] Fix results checking if no master connection is active --- src/rspamd_proxy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 65339b3d5..8290795f8 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -819,7 +819,7 @@ proxy_session_dtor (struct rspamd_proxy_session *session) } } - if (session->master_conn->results) { + if (session->master_conn && session->master_conn->results) { ucl_object_unref (session->master_conn->results); } -- cgit v1.2.3 From 1ad42d3b00442d7122b16c72d1226f6c2b0e133f Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 13:10:50 +0100 Subject: [Fix] Fix length calculations for shared memory segments --- src/libserver/task.c | 24 +++++++++++++++++++++--- src/libutil/http.c | 6 +++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/libserver/task.c b/src/libserver/task.c index 82e4d6fa9..f8ebe81f1 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -286,7 +286,7 @@ rspamd_task_load_message (struct rspamd_task *task, ucl_object_t *control_obj; gchar filepath[PATH_MAX], *fp; gint fd, flen; - gulong offset = 0; + gulong offset = 0, shmem_size = 0; rspamd_ftok_t srch, *tok; gpointer map; struct stat st; @@ -360,14 +360,32 @@ rspamd_task_load_message (struct rspamd_task *task, } } + srch.begin = "shm-length"; + srch.len = 10; + tok = g_hash_table_lookup (task->request_headers, &srch); + shmem_size = st.st_size; + + if (tok) { + rspamd_strtoul (tok->begin, tok->len, &shmem_size); + + if (shmem_size > (gulong)st.st_size) { + msg_err_task ("invalid length %ul (%ul available) for shm " + "segment %s", shmem_size, st.st_size, fp); + munmap (map, st.st_size); + + return FALSE; + } + } + task->msg.begin = ((guchar *)map) + offset; - task->msg.len = st.st_size - offset; + task->msg.len = shmem_size; task->flags |= RSPAMD_TASK_FLAG_FILE; m = rspamd_mempool_alloc (task->task_pool, sizeof (*m)); m->begin = map; m->len = st.st_size; - msg_info_task ("loaded message from shared memory %s", fp); + msg_info_task ("loaded message from shared memory %s (%ul size, %ul offset)", + fp, shmem_size, offset); rspamd_mempool_add_destructor (task->task_pool, rspamd_task_unmapper, m); diff --git a/src/libutil/http.c b/src/libutil/http.c index 26fd3410d..57618653a 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -1233,7 +1233,7 @@ rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn) } new_msg->body_buf.begin = new_msg->body_buf.str; - new_msg->body_buf.len = st.st_size; + new_msg->body_buf.len = msg->body_buf.len; new_msg->body_buf.begin = new_msg->body_buf.str + (msg->body_buf.begin - msg->body_buf.str); } @@ -1557,6 +1557,10 @@ rspamd_http_connection_write_message_common (struct rspamd_http_connection *conn (int)(msg->body_buf.begin - msg->body_buf.str)); rspamd_http_message_add_header (msg, "Shm-Offset", datebuf); + rspamd_snprintf (datebuf, sizeof (datebuf), "%z", + msg->body_buf.len); + rspamd_http_message_add_header (msg, "Shm-Length", + datebuf); } } -- cgit v1.2.3 From bc6a03a1086e8f7d1c1211633f61ee25b12e16a2 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 14:27:48 +0100 Subject: [Feature] Implement SSL support in http client --- src/client/rspamdclient.c | 3 +- src/fuzzy_storage.c | 12 ++-- src/libserver/rspamd_control.c | 9 ++- src/libutil/http.c | 136 ++++++++++++++++++++++++++++++++--------- src/libutil/http.h | 65 +++++++++++--------- src/libutil/map.c | 10 ++- src/libutil/ssl_util.c | 2 +- src/lua/lua_http.c | 10 ++- src/plugins/surbl.c | 7 ++- src/rspamadm/control.c | 10 ++- src/rspamd_proxy.c | 23 +++---- src/worker.c | 14 ++--- test/rspamd_http_test.c | 10 ++- utils/rspamd_http_bench.c | 10 ++- utils/rspamd_http_server.c | 9 ++- 15 files changed, 224 insertions(+), 106 deletions(-) diff --git a/src/client/rspamdclient.c b/src/client/rspamdclient.c index 5932da38b..753f64c74 100644 --- a/src/client/rspamdclient.c +++ b/src/client/rspamdclient.c @@ -167,7 +167,8 @@ rspamd_client_init (struct event_base *ev_base, const gchar *name, rspamd_client_finish_handler, 0, RSPAMD_HTTP_CLIENT, - conn->keys_cache); + conn->keys_cache, + NULL); conn->server_name = g_string_new (name); if (port != 0) { diff --git a/src/fuzzy_storage.c b/src/fuzzy_storage.c index b49a35984..04498f84d 100644 --- a/src/fuzzy_storage.c +++ b/src/fuzzy_storage.c @@ -363,13 +363,13 @@ rspamd_fuzzy_send_update_mirror (struct rspamd_fuzzy_storage_ctx *ctx, msg = rspamd_http_new_message (HTTP_REQUEST); rspamd_printf_fstring (&msg->url, "/update_v1/%s", m->name); - conn->http_conn = rspamd_http_connection_new ( - NULL, + conn->http_conn = rspamd_http_connection_new (NULL, fuzzy_mirror_error_handler, fuzzy_mirror_finish_handler, RSPAMD_HTTP_CLIENT_SIMPLE, RSPAMD_HTTP_CLIENT, - ctx->keypair_cache); + ctx->keypair_cache, + NULL); rspamd_http_connection_set_key (conn->http_conn, ctx->sync_keypair); @@ -1200,13 +1200,13 @@ accept_fuzzy_mirror_socket (gint fd, short what, void *arg) } session = g_slice_alloc0 (sizeof (*session)); - http_conn = rspamd_http_connection_new ( - NULL, + http_conn = rspamd_http_connection_new (NULL, rspamd_fuzzy_mirror_error_handler, rspamd_fuzzy_mirror_finish_handler, 0, RSPAMD_HTTP_SERVER, - ctx->keypair_cache); + ctx->keypair_cache, + NULL); rspamd_http_connection_set_key (http_conn, ctx->sync_keypair); session->ctx = ctx; diff --git a/src/libserver/rspamd_control.c b/src/libserver/rspamd_control.c index a925c0bb1..da573fa94 100644 --- a/src/libserver/rspamd_control.c +++ b/src/libserver/rspamd_control.c @@ -503,8 +503,13 @@ rspamd_control_process_client_socket (struct rspamd_main *rspamd_main, session = g_slice_alloc0 (sizeof (*session)); session->fd = fd; - session->conn = rspamd_http_connection_new (NULL, rspamd_control_error_handler, - rspamd_control_finish_handler, 0, RSPAMD_HTTP_SERVER, NULL); + session->conn = rspamd_http_connection_new (NULL, + rspamd_control_error_handler, + rspamd_control_finish_handler, + 0, + RSPAMD_HTTP_SERVER, + NULL, + NULL); session->rspamd_main = rspamd_main; rspamd_http_connection_read_message (session->conn, session, session->fd, &io_timeout, rspamd_main->ev_base); diff --git a/src/libutil/http.c b/src/libutil/http.c index 57618653a..46ebf486c 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -24,6 +24,7 @@ #include "keypair_private.h" #include "cryptobox.h" #include "unix-std.h" +#include "libutil/ssl_util.h" #define ENCRYPTED_VERSION " HTTP/1.0" @@ -42,6 +43,8 @@ enum rspamd_http_priv_flags { #define IS_CONN_RESETED(c) ((c)->flags & RSPAMD_HTTP_CONN_FLAG_RESETED) struct rspamd_http_connection_private { + gpointer ssl_ctx; + struct rspamd_ssl_connection *ssl; struct _rspamd_http_privbuf *buf; struct rspamd_cryptobox_pubkey *peer_key; struct rspamd_cryptobox_keypair *local_key; @@ -834,9 +837,15 @@ static void rspamd_http_simple_client_helper (struct rspamd_http_connection *conn) { struct event_base *base; + struct rspamd_http_connection_private *priv; + gpointer ssl; + priv = conn->priv; base = conn->priv->ev.ev_base; + ssl = priv->ssl; + priv->ssl = NULL; rspamd_http_connection_reset (conn); + priv->ssl = ssl; /* Plan read message */ rspamd_http_connection_read_message (conn, conn->ud, conn->fd, conn->priv->ptv, base); @@ -951,6 +960,16 @@ rspamd_http_try_read (gint fd, return r; } +static void +rspamd_http_ssl_err_handler (gpointer ud, GError *err) +{ + struct rspamd_http_connection *conn = (struct rspamd_http_connection *)ud; + + rspamd_http_connection_ref (conn); + conn->error_handler (conn, err); + rspamd_http_connection_unref (conn); +} + static void rspamd_http_event_handler (int fd, short what, gpointer ud) { @@ -1084,39 +1103,42 @@ rspamd_http_parser_reset (struct rspamd_http_connection *conn) } struct rspamd_http_connection * -rspamd_http_connection_new (rspamd_http_body_handler_t body_handler, - rspamd_http_error_handler_t error_handler, - rspamd_http_finish_handler_t finish_handler, - unsigned opts, - enum rspamd_http_connection_type type, - struct rspamd_keypair_cache *cache) -{ - struct rspamd_http_connection *new; +rspamd_http_connection_new ( + rspamd_http_body_handler_t body_handler, + rspamd_http_error_handler_t error_handler, + rspamd_http_finish_handler_t finish_handler, + unsigned opts, + enum rspamd_http_connection_type type, + struct rspamd_keypair_cache *cache, + gpointer ssl_ctx) +{ + struct rspamd_http_connection *conn; struct rspamd_http_connection_private *priv; if (error_handler == NULL || finish_handler == NULL) { return NULL; } - new = g_slice_alloc0 (sizeof (struct rspamd_http_connection)); - new->opts = opts; - new->type = type; - new->body_handler = body_handler; - new->error_handler = error_handler; - new->finish_handler = finish_handler; - new->fd = -1; - new->ref = 1; - new->finished = FALSE; - new->cache = cache; + conn = g_slice_alloc0 (sizeof (struct rspamd_http_connection)); + conn->opts = opts; + conn->type = type; + conn->body_handler = body_handler; + conn->error_handler = error_handler; + conn->finish_handler = finish_handler; + conn->fd = -1; + conn->ref = 1; + conn->finished = FALSE; + conn->cache = cache; /* Init priv */ priv = g_slice_alloc0 (sizeof (struct rspamd_http_connection_private)); - new->priv = priv; + conn->priv = priv; + priv->ssl_ctx = ssl_ctx; - rspamd_http_parser_reset (new); - priv->parser.data = new; + rspamd_http_parser_reset (conn); + priv->parser.data = conn; - return new; + return conn; } void @@ -1156,6 +1178,11 @@ rspamd_http_connection_reset (struct rspamd_http_connection *conn) priv->out = NULL; } + if (priv->ssl) { + rspamd_ssl_connection_free (priv->ssl); + priv->ssl = NULL; + } + priv->flags |= RSPAMD_HTTP_CONN_FLAG_RESETED; } @@ -1504,6 +1531,7 @@ rspamd_http_connection_write_message_common (struct rspamd_http_connection *conn guchar *np = NULL, *mp = NULL, *meth_pos = NULL; struct rspamd_cryptobox_pubkey *peer_key = NULL; enum rspamd_cryptobox_mode mode; + GError *err; conn->fd = fd; conn->ud = ud; @@ -1900,18 +1928,51 @@ rspamd_http_connection_write_message_common (struct rspamd_http_connection *conn } } + priv->flags &= ~RSPAMD_HTTP_CONN_FLAG_RESETED; + if (base != NULL && event_get_base (&priv->ev) == base) { event_del (&priv->ev); } - event_set (&priv->ev, fd, EV_WRITE, rspamd_http_event_handler, conn); + if (msg->flags & RSPAMD_HTTP_FLAG_SSL) { + if (base != NULL) { + event_base_set (base, &priv->ev); + } + if (!priv->ssl_ctx) { + err = g_error_new (HTTP_ERROR, errno, "ssl message requested " + "with no ssl ctx"); + rspamd_http_connection_ref (conn); + conn->error_handler (conn, err); + rspamd_http_connection_unref (conn); + g_error_free (err); + return; + } + else { + priv->ssl = rspamd_ssl_connection_new (priv->ssl_ctx); + g_assert (priv->ssl != NULL); + + if (!rspamd_ssl_connect_fd (priv->ssl, fd, host, &priv->ev, + priv->ptv, rspamd_http_event_handler, + rspamd_http_ssl_err_handler, conn)) { - if (base != NULL) { - event_base_set (base, &priv->ev); + err = g_error_new (HTTP_ERROR, errno, "ssl connection error"); + rspamd_http_connection_ref (conn); + conn->error_handler (conn, err); + rspamd_http_connection_unref (conn); + g_error_free (err); + return; + } + } } + else { + event_set (&priv->ev, fd, EV_WRITE, rspamd_http_event_handler, conn); - priv->flags &= ~RSPAMD_HTTP_CONN_FLAG_RESETED; - event_add (&priv->ev, priv->ptv); + if (base != NULL) { + event_base_set (base, &priv->ev); + } + + event_add (&priv->ev, priv->ptv); + } } void @@ -1961,6 +2022,7 @@ rspamd_http_message_from_url (const gchar *url) struct rspamd_http_message *msg; const gchar *host, *path; size_t pathlen, urllen; + guint flags = 0; if (url == NULL) { return NULL; @@ -1977,6 +2039,14 @@ rspamd_http_message_from_url (const gchar *url) msg_warn ("no host argument in URL: %s", url); return NULL; } + + if ((pu.field_set & (1 << UF_SCHEMA))) { + if (pu.field_data[UF_SCHEMA].len == sizeof ("https") - 1 && + memcmp (url + pu.field_data[UF_SCHEMA].off, "https", 5) == 0) { + flags |= RSPAMD_HTTP_FLAG_SSL; + } + } + if ((pu.field_set & (1 << UF_PATH)) == 0) { path = "/"; pathlen = 1; @@ -1988,13 +2058,19 @@ rspamd_http_message_from_url (const gchar *url) msg = rspamd_http_new_message (HTTP_REQUEST); host = url + pu.field_data[UF_HOST].off; + msg->flags = flags; if ((pu.field_set & (1 << UF_PORT)) != 0) { msg->port = pu.port; } else { /* XXX: magic constant */ - msg->port = 80; + if (flags & RSPAMD_HTTP_FLAG_SSL) { + msg->port = 443; + } + else { + msg->port = 80; + } } msg->host = rspamd_fstring_new_init (host, pu.field_data[UF_HOST].len); @@ -2724,7 +2800,9 @@ rspamd_http_router_handle_socket (struct rspamd_http_connection_router *router, rspamd_http_router_error_handler, rspamd_http_router_finish_handler, 0, - RSPAMD_HTTP_SERVER, router->cache); + RSPAMD_HTTP_SERVER, + router->cache, + NULL); if (router->key) { rspamd_http_connection_set_key (conn->conn, router->key); diff --git a/src/libutil/http.h b/src/libutil/http.h index 4cbcaf5fb..e85e7ccee 100644 --- a/src/libutil/http.h +++ b/src/libutil/http.h @@ -53,6 +53,10 @@ struct rspamd_http_connection_entry; * Store body of the message in an immutable shared memory segment */ #define RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE (1 << 3) +/** + * Use tls for this message + */ +#define RSPAMD_HTTP_FLAG_SSL (1 << 4) /** * Options for HTTP connection @@ -64,24 +68,24 @@ enum rspamd_http_options { }; typedef int (*rspamd_http_body_handler_t) (struct rspamd_http_connection *conn, - struct rspamd_http_message *msg, - const gchar *chunk, - gsize len); + struct rspamd_http_message *msg, + const gchar *chunk, + gsize len); typedef void (*rspamd_http_error_handler_t) (struct rspamd_http_connection *conn, - GError *err); + GError *err); typedef int (*rspamd_http_finish_handler_t) (struct rspamd_http_connection *conn, - struct rspamd_http_message *msg); + struct rspamd_http_message *msg); typedef int (*rspamd_http_router_handler_t) (struct rspamd_http_connection_entry - *conn_ent, - struct rspamd_http_message *msg); + *conn_ent, + struct rspamd_http_message *msg); typedef void (*rspamd_http_router_error_handler_t) (struct - rspamd_http_connection_entry *conn_ent, - GError *err); + rspamd_http_connection_entry *conn_ent, + GError *err); typedef void (*rspamd_http_router_finish_handler_t) (struct - rspamd_http_connection_entry *conn_ent); + rspamd_http_connection_entry *conn_ent); /** * HTTP connection structure @@ -127,13 +131,14 @@ struct rspamd_http_connection_router { * @param opts options * @return new connection structure */ -struct rspamd_http_connection * rspamd_http_connection_new ( - rspamd_http_body_handler_t body_handler, - rspamd_http_error_handler_t error_handler, - rspamd_http_finish_handler_t finish_handler, - unsigned opts, - enum rspamd_http_connection_type type, - struct rspamd_keypair_cache *cache); +struct rspamd_http_connection *rspamd_http_connection_new ( + rspamd_http_body_handler_t body_handler, + rspamd_http_error_handler_t error_handler, + rspamd_http_finish_handler_t finish_handler, + unsigned opts, + enum rspamd_http_connection_type type, + struct rspamd_keypair_cache *cache, + gpointer ssl_ctx); /** @@ -335,8 +340,8 @@ gboolean rspamd_http_message_append_body (struct rspamd_http_message *msg, * @param value */ void rspamd_http_message_add_header (struct rspamd_http_message *msg, - const gchar *name, - const gchar *value); + const gchar *name, + const gchar *value); /** * Search for a specified header in message @@ -354,7 +359,7 @@ const rspamd_ftok_t * rspamd_http_message_find_header ( * @return */ gboolean rspamd_http_message_remove_header (struct rspamd_http_message *msg, - const gchar *name); + const gchar *name); /** * Free HTTP message @@ -390,12 +395,12 @@ time_t rspamd_http_parse_date (const gchar *header, gsize len); * @return */ struct rspamd_http_connection_router * rspamd_http_router_new ( - rspamd_http_router_error_handler_t eh, - rspamd_http_router_finish_handler_t fh, - struct timeval *timeout, - struct event_base *base, - const char *default_fs_path, - struct rspamd_keypair_cache *cache); + rspamd_http_router_error_handler_t eh, + rspamd_http_router_finish_handler_t fh, + struct timeval *timeout, + struct event_base *base, + const char *default_fs_path, + struct rspamd_keypair_cache *cache); /** * Set encryption key for the HTTP router @@ -409,7 +414,7 @@ void rspamd_http_router_set_key (struct rspamd_http_connection_router *router, * Add new path to the router */ void rspamd_http_router_add_path (struct rspamd_http_connection_router *router, - const gchar *path, rspamd_http_router_handler_t handler); + const gchar *path, rspamd_http_router_handler_t handler); /** * Handle new accepted socket @@ -418,9 +423,9 @@ void rspamd_http_router_add_path (struct rspamd_http_connection_router *router, * @param ud opaque userdata */ void rspamd_http_router_handle_socket ( - struct rspamd_http_connection_router *router, - gint fd, - gpointer ud); + struct rspamd_http_connection_router *router, + gint fd, + gpointer ud); /** * Free router and all connections associated diff --git a/src/libutil/map.c b/src/libutil/map.c index b747b6a96..6bc0ef257 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -646,9 +646,13 @@ rspamd_map_dns_callback (struct rdns_reply *reply, void *arg) if (cbd->fd != -1) { cbd->stage = map_load_file; cbd->conn = rspamd_http_connection_new (http_map_read, - http_map_error, http_map_finish, - RSPAMD_HTTP_BODY_PARTIAL|RSPAMD_HTTP_CLIENT_SIMPLE, - RSPAMD_HTTP_CLIENT, NULL); + http_map_error, + http_map_finish, + RSPAMD_HTTP_BODY_PARTIAL | + RSPAMD_HTTP_CLIENT_SIMPLE, + RSPAMD_HTTP_CLIENT, + NULL, + NULL); write_http_request (cbd); } diff --git a/src/libutil/ssl_util.c b/src/libutil/ssl_util.c index d0f73a907..6c426761b 100644 --- a/src/libutil/ssl_util.c +++ b/src/libutil/ssl_util.c @@ -363,7 +363,7 @@ rspamd_ssl_event_handler (gint fd, short what, gpointer ud) /* Verify certificate */ if (rspamd_ssl_peer_verify (c)) { c->state = ssl_conn_connected; - c->handler (fd, what, c->handler_data); + c->handler (fd, EV_WRITE, c->handler_data); } else { /* Error handler has been called from peer verify */ diff --git a/src/lua/lua_http.c b/src/lua/lua_http.c index 0e9c99cc7..298da5a47 100644 --- a/src/lua/lua_http.c +++ b/src/lua/lua_http.c @@ -201,9 +201,13 @@ lua_http_make_connection (struct lua_http_cbdata *cbd) return FALSE; } cbd->fd = fd; - cbd->conn = rspamd_http_connection_new (NULL, lua_http_error_handler, - lua_http_finish_handler, RSPAMD_HTTP_CLIENT_SIMPLE, - RSPAMD_HTTP_CLIENT, NULL); + cbd->conn = rspamd_http_connection_new (NULL, + lua_http_error_handler, + lua_http_finish_handler, + RSPAMD_HTTP_CLIENT_SIMPLE, + RSPAMD_HTTP_CLIENT, + NULL, + NULL); rspamd_http_connection_write_message (cbd->conn, cbd->msg, NULL, cbd->mime_type, cbd, fd, &cbd->tv, cbd->ev_base); diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c index 4cd594b8f..1e0eacff1 100644 --- a/src/plugins/surbl.c +++ b/src/plugins/surbl.c @@ -1329,10 +1329,13 @@ register_redirector_call (struct rspamd_url *url, struct rspamd_task *task, sizeof (struct redirector_param)); param->url = url; param->task = task; - param->conn = rspamd_http_connection_new (NULL, surbl_redirector_error, + param->conn = rspamd_http_connection_new (NULL, + surbl_redirector_error, surbl_redirector_finish, RSPAMD_HTTP_CLIENT_SIMPLE, - RSPAMD_HTTP_CLIENT, NULL); + RSPAMD_HTTP_CLIENT, + NULL, + NULL); msg = rspamd_http_new_message (HTTP_REQUEST); msg->url = rspamd_fstring_assign (msg->url, url->string, url->urllen); param->sock = s; diff --git a/src/rspamadm/control.c b/src/rspamadm/control.c index 52fec99c6..2bdccc876 100644 --- a/src/rspamadm/control.c +++ b/src/rspamadm/control.c @@ -230,9 +230,13 @@ rspamadm_control (gint argc, gchar **argv) L = rspamd_lua_init (); - conn = rspamd_http_connection_new (NULL, rspamd_control_error_handler, - rspamd_control_finish_handler, RSPAMD_HTTP_CLIENT_SIMPLE, - RSPAMD_HTTP_CLIENT, NULL); + conn = rspamd_http_connection_new (NULL, + rspamd_control_error_handler, + rspamd_control_finish_handler, + RSPAMD_HTTP_CLIENT_SIMPLE, + RSPAMD_HTTP_CLIENT, + NULL, + NULL); msg = rspamd_http_new_message (HTTP_REQUEST); msg->url = rspamd_fstring_new_init (path, strlen (path)); double_to_tv (timeout, &tv); diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 8290795f8..b7e0c9618 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -1023,13 +1023,13 @@ proxy_open_mirror_connections (struct rspamd_proxy_session *session) rspamd_http_message_add_header (msg, "Settings-ID", m->settings_id); } - bk_conn->backend_conn = rspamd_http_connection_new ( - NULL, + bk_conn->backend_conn = rspamd_http_connection_new (NULL, proxy_backend_mirror_error_handler, proxy_backend_mirror_finish_handler, RSPAMD_HTTP_CLIENT_SIMPLE, RSPAMD_HTTP_CLIENT, - session->ctx->keys_cache); + session->ctx->keys_cache, + NULL); rspamd_http_connection_set_key (bk_conn->backend_conn, session->ctx->local_key); @@ -1219,7 +1219,8 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn, proxy_backend_master_finish_handler, RSPAMD_HTTP_CLIENT_SIMPLE, RSPAMD_HTTP_CLIENT, - session->ctx->keys_cache); + session->ctx->keys_cache, + NULL); session->master_conn->parser_from_ref = backend->parser_from_ref; session->master_conn->parser_to_ref = backend->parser_to_ref; @@ -1291,13 +1292,13 @@ proxy_accept_socket (gint fd, short what, void *arg) session->mirror_conns = g_ptr_array_sized_new (ctx->mirrors->len); session->pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "proxy"); - session->client_conn = rspamd_http_connection_new ( - NULL, - proxy_client_error_handler, - proxy_client_finish_handler, - 0, - RSPAMD_HTTP_SERVER, - ctx->keys_cache); + session->client_conn = rspamd_http_connection_new (NULL, + proxy_client_error_handler, + proxy_client_finish_handler, + 0, + RSPAMD_HTTP_SERVER, + ctx->keys_cache, + NULL); session->ctx = ctx; if (ctx->key) { diff --git a/src/worker.c b/src/worker.c index 81c5b1c63..a099e8177 100644 --- a/src/worker.c +++ b/src/worker.c @@ -298,13 +298,13 @@ accept_socket (gint fd, short what, void *arg) /* TODO: allow to disable autolearn in protocol */ task->flags |= RSPAMD_TASK_FLAG_LEARN_AUTO; - task->http_conn = rspamd_http_connection_new ( - rspamd_worker_body_handler, - rspamd_worker_error_handler, - rspamd_worker_finish_handler, - 0, - RSPAMD_HTTP_SERVER, - ctx->keys_cache); + task->http_conn = rspamd_http_connection_new (rspamd_worker_body_handler, + rspamd_worker_error_handler, + rspamd_worker_finish_handler, + 0, + RSPAMD_HTTP_SERVER, + ctx->keys_cache, + NULL); task->ev_base = ctx->ev_base; worker->nconns++; rspamd_mempool_add_destructor (task->task_pool, diff --git a/test/rspamd_http_test.c b/test/rspamd_http_test.c index 882b148fc..4ce859efd 100644 --- a/test/rspamd_http_test.c +++ b/test/rspamd_http_test.c @@ -156,9 +156,13 @@ rspamd_http_client_func (const gchar *path, rspamd_inet_addr_t *addr, gint fd; g_assert ((fd = rspamd_inet_address_connect (addr, SOCK_STREAM, TRUE)) != -1); - conn = rspamd_http_connection_new (rspamd_client_body, rspamd_client_err, - rspamd_client_finish, RSPAMD_HTTP_CLIENT_SIMPLE, - RSPAMD_HTTP_CLIENT, c); + conn = rspamd_http_connection_new (rspamd_client_body, + rspamd_client_err, + rspamd_client_finish, + RSPAMD_HTTP_CLIENT_SIMPLE, + RSPAMD_HTTP_CLIENT, + c, + NULL); rspamd_snprintf (urlbuf, sizeof (urlbuf), "http://127.0.0.1/%s", path); msg = rspamd_http_message_from_url (urlbuf); diff --git a/utils/rspamd_http_bench.c b/utils/rspamd_http_bench.c index 64b4e6ed2..32aedb334 100644 --- a/utils/rspamd_http_bench.c +++ b/utils/rspamd_http_bench.c @@ -146,9 +146,13 @@ rspamd_http_client_func (struct event_base *ev_base, struct lat_elt *latency, g_assert (fd != -1); flags = 1; (void)setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &flags, sizeof (flags)); - conn = rspamd_http_connection_new (rspamd_client_body, rspamd_client_err, - rspamd_client_finish, RSPAMD_HTTP_CLIENT_SIMPLE, - RSPAMD_HTTP_CLIENT, c); + conn = rspamd_http_connection_new (rspamd_client_body, + rspamd_client_err, + rspamd_client_finish, + RSPAMD_HTTP_CLIENT_SIMPLE, + RSPAMD_HTTP_CLIENT, + c, + NULL); rspamd_snprintf (urlbuf, sizeof (urlbuf), "http://%s/%d", host, file_size); msg = rspamd_http_message_from_url (urlbuf); diff --git a/utils/rspamd_http_server.c b/utils/rspamd_http_server.c index d920c425d..69ef852e6 100644 --- a/utils/rspamd_http_server.c +++ b/utils/rspamd_http_server.c @@ -150,8 +150,13 @@ rspamd_server_accept (gint fd, short what, void *arg) rspamd_inet_address_destroy (addr); session = g_slice_alloc (sizeof (*session)); - session->conn = rspamd_http_connection_new (NULL, rspamd_server_error, - rspamd_server_finish, 0, RSPAMD_HTTP_SERVER, c); + session->conn = rspamd_http_connection_new (NULL, + rspamd_server_error, + rspamd_server_finish, + 0, + RSPAMD_HTTP_SERVER, + c, + NULL); rspamd_http_connection_set_key (session->conn, server_key); rspamd_http_connection_read_message (session->conn, session, -- cgit v1.2.3 From 0c5266d324b0e80d1606b9cf49af0ca34799ad5c Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 15:44:16 +0100 Subject: [Feature] Allow https maps --- src/libutil/http.c | 2 +- src/libutil/map.c | 28 +++++++++++++++++++++------- src/libutil/map_private.h | 1 + src/libutil/ssl_util.c | 8 +++++--- src/libutil/ssl_util.h | 3 ++- src/lua/lua_map.c | 3 +++ 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/libutil/http.c b/src/libutil/http.c index 46ebf486c..b4a1692cc 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -1948,7 +1948,7 @@ rspamd_http_connection_write_message_common (struct rspamd_http_connection *conn return; } else { - priv->ssl = rspamd_ssl_connection_new (priv->ssl_ctx); + priv->ssl = rspamd_ssl_connection_new (priv->ssl_ctx, base); g_assert (priv->ssl != NULL); if (!rspamd_ssl_connect_fd (priv->ssl, fd, host, &priv->ev, diff --git a/src/libutil/map.c b/src/libutil/map.c index 6bc0ef257..d334f68ee 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -80,6 +80,10 @@ write_http_request (struct http_callback_data *cbd) if (cbd->fd != -1) { msg = rspamd_http_new_message (HTTP_REQUEST); + if (cbd->bk->protocol == MAP_PROTO_HTTPS) { + msg->flags |= RSPAMD_HTTP_FLAG_SSL; + } + if (cbd->check) { msg->method = HTTP_HEAD; } @@ -652,7 +656,7 @@ rspamd_map_dns_callback (struct rdns_reply *reply, void *arg) RSPAMD_HTTP_CLIENT_SIMPLE, RSPAMD_HTTP_CLIENT, NULL, - NULL); + cbd->map->cfg->libs_ctx->ssl_ctx); write_http_request (cbd); } @@ -857,7 +861,7 @@ rspamd_map_periodic_callback (gint fd, short what, void *ud) if (cbd->need_modify) { /* Load data from the next backend */ - if (bk->protocol == MAP_PROTO_HTTP) { + if (bk->protocol == MAP_PROTO_HTTP || bk->protocol == MAP_PROTO_HTTPS) { rspamd_map_http_read_callback (fd, what, cbd); } else { @@ -866,7 +870,7 @@ rspamd_map_periodic_callback (gint fd, short what, void *ud) } else { /* Check the next backend */ - if (bk->protocol == MAP_PROTO_HTTP) { + if (bk->protocol == MAP_PROTO_HTTP || bk->protocol == MAP_PROTO_HTTPS) { rspamd_map_http_check_callback (fd, what, cbd); } else { @@ -985,13 +989,18 @@ rspamd_map_check_proto (struct rspamd_config *cfg, bk->protocol = MAP_PROTO_FILE; - if (g_ascii_strncasecmp (pos, "http://", - sizeof ("http://") - 1) == 0) { + if (g_ascii_strncasecmp (pos, "http://", sizeof ("http://") - 1) == 0) { bk->protocol = MAP_PROTO_HTTP; /* Include http:// */ bk->uri = g_strdup (pos); pos += sizeof ("http://") - 1; } + else if (g_ascii_strncasecmp (pos, "https://", sizeof ("https://") - 1) == 0) { + bk->protocol = MAP_PROTO_HTTPS; + /* Include http:// */ + bk->uri = g_strdup (pos); + pos += sizeof ("https://") - 1; + } else if (g_ascii_strncasecmp (pos, "file://", sizeof ("file://") - 1) == 0) { pos += sizeof ("file://") - 1; @@ -1086,7 +1095,7 @@ rspamd_map_parse_backend (struct rspamd_config *cfg, const gchar *map_line) fdata->filename = g_strdup (bk->uri); bk->data.fd = fdata; } - else if (bk->protocol == MAP_PROTO_HTTP) { + else if (bk->protocol == MAP_PROTO_HTTP || bk->protocol == MAP_PROTO_HTTPS) { hdata = g_slice_alloc0 (sizeof (struct http_map_data)); memset (&up, 0, sizeof (up)); @@ -1109,7 +1118,12 @@ rspamd_map_parse_backend (struct rspamd_config *cfg, const gchar *map_line) hdata->port = up.port; } else { - hdata->port = 80; + if (bk->protocol == MAP_PROTO_HTTP) { + hdata->port = 80; + } + else { + hdata->port = 443; + } } if (up.field_set & 1 << UF_PATH) { diff --git a/src/libutil/map_private.h b/src/libutil/map_private.h index 9bdca5f90..0370fc607 100644 --- a/src/libutil/map_private.h +++ b/src/libutil/map_private.h @@ -44,6 +44,7 @@ typedef void (*rspamd_map_dtor) (gpointer p); enum fetch_proto { MAP_PROTO_FILE, MAP_PROTO_HTTP, + MAP_PROTO_HTTPS }; struct rspamd_map_backend { diff --git a/src/libutil/ssl_util.c b/src/libutil/ssl_util.c index 6c426761b..17bd2880d 100644 --- a/src/libutil/ssl_util.c +++ b/src/libutil/ssl_util.c @@ -392,13 +392,14 @@ rspamd_ssl_event_handler (gint fd, short what, gpointer ud) } struct rspamd_ssl_connection * -rspamd_ssl_connection_new (gpointer ssl_ctx) +rspamd_ssl_connection_new (gpointer ssl_ctx, struct event_base *ev_base) { struct rspamd_ssl_connection *c; g_assert (ssl_ctx != NULL); c = g_slice_alloc0 (sizeof (*c)); c->ssl = SSL_new (ssl_ctx); + c->ev_base = ev_base; return c; } @@ -424,7 +425,6 @@ rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, conn->handler = handler; conn->err_handler = err_handler; conn->handler_data = handler_data; - conn->ev_base = event_get_base (ev); if (SSL_set_fd (conn->ssl, fd) != 1) { return FALSE; @@ -444,7 +444,9 @@ rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, if (ret == 1) { conn->state = ssl_conn_connected; event_set (ev, fd, EV_WRITE, rspamd_ssl_event_handler, conn); - event_base_set (conn->ev_base, ev); + if (conn->ev_base) { + event_base_set (conn->ev_base, ev); + } event_add (ev, tv); } else { diff --git a/src/libutil/ssl_util.h b/src/libutil/ssl_util.h index 1fcd65a35..719c8ffd1 100644 --- a/src/libutil/ssl_util.h +++ b/src/libutil/ssl_util.h @@ -29,7 +29,8 @@ typedef void (*rspamd_ssl_error_handler_t)(gpointer d, GError *err); * @param ssl_ctx initialized SSL_CTX structure * @return opaque connection data */ -struct rspamd_ssl_connection * rspamd_ssl_connection_new (gpointer ssl_ctx); +struct rspamd_ssl_connection * rspamd_ssl_connection_new (gpointer ssl_ctx, + struct event_base *ev_base); /** * Connects SSL session using the specified (connected) FD diff --git a/src/lua/lua_map.c b/src/lua/lua_map.c index a74ee205c..cf2b29f04 100644 --- a/src/lua/lua_map.c +++ b/src/lua/lua_map.c @@ -621,6 +621,9 @@ lua_map_get_proto (lua_State *L) case MAP_PROTO_HTTP: ret = "http"; break; + case MAP_PROTO_HTTPS: + ret = "https"; + break; } lua_pushstring (L, ret); } -- cgit v1.2.3 From d07fb53df082a1008d90891cd00fe08579acbeb7 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 17:18:10 +0100 Subject: [Doc] Remove legacy protocol description --- doc/markdown/architecture/protocol.md | 44 +---------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-) diff --git a/doc/markdown/architecture/protocol.md b/doc/markdown/architecture/protocol.md index b3f94a7e3..56e1da1d4 100644 --- a/doc/markdown/architecture/protocol.md +++ b/doc/markdown/architecture/protocol.md @@ -151,46 +151,4 @@ Here is an example of a JSON control block: } ~~~ -Moreover, [UCL](https://github.com/vstakhov/libucl) json extensions and syntax conventions are also supported inside the control block. - -## Legacy RSPAMC protocol - -For compatibility, rspamd supports legacy `RSPAMC` and also SpamAssassin `SPAMC` protocols. Though their usage is discouraged, these protocols can still be used as a last resort to communicate with rspamd from legacy applications. - -The RSPAMC dialog looks as follows: - -~~~ -SYMBOLS RSPAMC/1.1 -Content-Length: 2200 - - - -RSPAMD/1.1 0 OK -Metric: default; True; 10.40 / 10.00 / 0.00 -Symbol: R_UNDISC_RCPT -Symbol: ONCE_RECEIVED -Symbol: R_MISSING_CHARSET -Urls: -~~~ - -The RSPAMC protocol also supports different commands: - -| Command | Description | -| :-------| :----- | -| CHECK | Check a message and output results for each metric, but do not output symbols. | -| SYMBOLS | Same as `CHECK`, but output symbols. | -| PROCESS | Same as `SYMBOLS` but also output the original message with inserted X-Spam headers. | -| PING | Do not do any processing, just check rspamd state. | - - -After the command, there should be one mandatory header - `Content-Length` - which defines a message's length in bytes, and optional headers (same as for HTTP). - -rspamd supports SpamAssassin's `spamc` protocol, and you can even pass rspamc headers in spamc mode, but the reply of rspamd in `spamc` mode is truncated to the "default" metric only with no options for symbols being displayed. Rspamc reply looks as follows: - - RSPAMD/1.1 0 OK - Metric: default; True; 10.40 / 10.00 / 0.00 - Symbol: R_UNDISC_RCPT - Symbol: ONCE_RECEIVED - Symbol: R_MISSING_CHARSET - Urls: - +Moreover, [UCL](https://github.com/vstakhov/libucl) json extensions and syntax conventions are also supported inside the control block. \ No newline at end of file -- cgit v1.2.3 From 5d46e29fcac899483e6b2f3d0790e4c8915411c7 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 17:18:26 +0100 Subject: {Feature] Implement SSL IO --- src/libutil/ssl_util.c | 216 +++++++++++++++++++++++++++++++++++++++++++++---- src/libutil/ssl_util.h | 32 ++++++++ 2 files changed, 234 insertions(+), 14 deletions(-) diff --git a/src/libutil/ssl_util.c b/src/libutil/ssl_util.c index 17bd2880d..a72f1de95 100644 --- a/src/libutil/ssl_util.c +++ b/src/libutil/ssl_util.c @@ -29,7 +29,9 @@ struct rspamd_ssl_connection { enum { ssl_conn_reset = 0, ssl_conn_init, - ssl_conn_connected + ssl_conn_connected, + ssl_next_read, + ssl_next_write } state; SSL *ssl; gchar *hostname; @@ -315,14 +317,6 @@ rspamd_ssl_peer_verify (struct rspamd_ssl_connection *c) return FALSE; } - else { - ver_err = ERR_get_error (); - g_set_error (&err, rspamd_ssl_quark (), ver_err, - "ssl connect error: %s", ERR_error_string (ver_err, NULL)); - c->err_handler (c->handler_data, err); - g_error_free (err); - return FALSE; - } /* Get server's certificate */ server_cert = SSL_get_peer_certificate (c->ssl); @@ -355,20 +349,24 @@ rspamd_ssl_event_handler (gint fd, short what, gpointer ud) gint ret; GError *err = NULL; - if (c->state == ssl_conn_init) { + switch (c->state) { + case ssl_conn_init: /* Continue connection */ ret = SSL_connect (c->ssl); if (ret == 1) { + event_del (c->ev); /* Verify certificate */ if (rspamd_ssl_peer_verify (c)) { c->state = ssl_conn_connected; c->handler (fd, EV_WRITE, c->handler_data); } else { - /* Error handler has been called from peer verify */ - return; + g_assert (0); } + } + else { + ret = SSL_get_error (c->ssl, ret); if (ret == SSL_ERROR_WANT_READ) { what = EV_READ; @@ -384,10 +382,28 @@ rspamd_ssl_event_handler (gint fd, short what, gpointer ud) return; } - event_set (c->ev, fd, EV_WRITE, rspamd_ssl_event_handler, c); + event_set (c->ev, fd, what, rspamd_ssl_event_handler, c); event_base_set (c->ev_base, c->ev); event_add (c->ev, c->tv); } + break; + case ssl_next_read: + event_del (c->ev); + c->state = ssl_conn_connected; + c->handler (fd, EV_READ, c->handler_data); + break; + case ssl_next_write: + case ssl_conn_connected: + event_del (c->ev); + c->state = ssl_conn_connected; + c->handler (fd, EV_WRITE, c->handler_data); + break; + default: + g_set_error (&err, rspamd_ssl_quark (), EINVAL, + "ssl bad state error: %d", c->state); + c->err_handler (c->handler_data, err); + g_error_free (err); + break; } } @@ -444,9 +460,11 @@ rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, if (ret == 1) { conn->state = ssl_conn_connected; event_set (ev, fd, EV_WRITE, rspamd_ssl_event_handler, conn); + if (conn->ev_base) { event_base_set (conn->ev_base, ev); } + event_add (ev, tv); } else { @@ -462,7 +480,7 @@ rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, return FALSE; } - event_set (ev, fd, EV_WRITE, rspamd_ssl_event_handler, conn); + event_set (ev, fd, what, rspamd_ssl_event_handler, conn); event_base_set (conn->ev_base, ev); event_add (ev, tv); } @@ -470,6 +488,176 @@ rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, return TRUE; } +gssize +rspamd_ssl_read (struct rspamd_ssl_connection *conn, gpointer buf, + gsize buflen) +{ + gint ret; + short what; + GError *err = NULL; + + g_assert (conn != NULL); + + if (conn->state != ssl_conn_connected && conn->state != ssl_next_read) { + errno = EINVAL; + return -1; + } + + ret = SSL_read (conn->ssl, buf, buflen); + + if (ret > 0) { + conn->state = ssl_conn_connected; + return ret; + } + else if (ret == 0) { + ret = SSL_get_error (conn->ssl, ret); + + if (ret == SSL_ERROR_ZERO_RETURN) { + conn->state = ssl_conn_reset; + return 0; + } + else { + g_set_error (&err, rspamd_ssl_quark (), ret, + "ssl write error: %s", ERR_error_string (ret, NULL)); + conn->err_handler (conn->handler_data, err); + g_error_free (err); + errno = EINVAL; + + return -1; + } + } + else { + ret = SSL_get_error (conn->ssl, ret); + conn->state = ssl_next_read; + + if (ret == SSL_ERROR_WANT_READ) { + what = EV_READ; + } + else if (ret == SSL_ERROR_WANT_WRITE) { + what = EV_WRITE; + } + else { + g_set_error (&err, rspamd_ssl_quark (), ret, + "ssl read error: %s", ERR_error_string (ret, NULL)); + conn->err_handler (conn->handler_data, err); + g_error_free (err); + errno = EINVAL; + + return -1; + } + + event_set (conn->ev, conn->fd, what, rspamd_ssl_event_handler, conn); + event_base_set (conn->ev_base, conn->ev); + event_add (conn->ev, conn->tv); + + errno = EAGAIN; + + } + + return -1; +} + +gssize +rspamd_ssl_write (struct rspamd_ssl_connection *conn, gconstpointer buf, + gsize buflen) +{ + gint ret; + short what; + GError *err = NULL; + + g_assert (conn != NULL); + + if (conn->state != ssl_conn_connected && conn->state != ssl_next_write) { + errno = EINVAL; + return -1; + } + + ret = SSL_write (conn->ssl, buf, buflen); + + if (ret > 0) { + conn->state = ssl_conn_connected; + return ret; + } + else if (ret == 0) { + ret = SSL_get_error (conn->ssl, ret); + + if (ret == SSL_ERROR_ZERO_RETURN) { + conn->state = ssl_conn_reset; + return 0; + } + else { + g_set_error (&err, rspamd_ssl_quark (), ret, + "ssl write error: %s", ERR_error_string (ret, NULL)); + conn->err_handler (conn->handler_data, err); + g_error_free (err); + errno = EINVAL; + + return -1; + } + } + else { + ret = SSL_get_error (conn->ssl, ret); + conn->state = ssl_next_read; + + if (ret == SSL_ERROR_WANT_READ) { + what = EV_READ; + } + else if (ret == SSL_ERROR_WANT_WRITE) { + what = EV_WRITE; + } + else { + g_set_error (&err, rspamd_ssl_quark (), ret, + "ssl fatal write error: %s", ERR_error_string (ret, NULL)); + conn->err_handler (conn->handler_data, err); + g_error_free (err); + errno = EINVAL; + + return -1; + } + + event_set (conn->ev, conn->fd, what, rspamd_ssl_event_handler, conn); + event_base_set (conn->ev_base, conn->ev); + event_add (conn->ev, conn->tv); + + errno = EAGAIN; + } + + return -1; +} + +gssize +rspamd_ssl_writev (struct rspamd_ssl_connection *conn, struct iovec *iov, + gsize iovlen) +{ + static guchar ssl_buf[16000]; + guchar *p; + struct iovec *cur; + guint i, remain; + + remain = sizeof (ssl_buf); + p = ssl_buf; + + for (i = 0; i < iovlen; i ++) { + cur = &iov[i]; + + if (cur->iov_len > 0) { + if (remain >= cur->iov_len) { + memcpy (p, cur->iov_base, cur->iov_len); + p += cur->iov_len; + remain -= cur->iov_len; + } + else { + memcpy (p, cur->iov_base, remain); + p += remain; + remain = 0; + break; + } + } + } + + return rspamd_ssl_write (conn, ssl_buf, p - ssl_buf); +} + /** * Removes connection data * @param conn diff --git a/src/libutil/ssl_util.h b/src/libutil/ssl_util.h index 719c8ffd1..64e6a413e 100644 --- a/src/libutil/ssl_util.h +++ b/src/libutil/ssl_util.h @@ -48,6 +48,38 @@ gboolean rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, rspamd_ssl_handler_t handler, rspamd_ssl_error_handler_t err_handler, gpointer handler_data); +/** + * Perform async read from SSL socket + * @param conn + * @param buf + * @param buflen + * @return + */ +gssize rspamd_ssl_read (struct rspamd_ssl_connection *conn, gpointer buf, + gsize buflen); + +/** + * Perform async write to ssl buffer + * @param conn + * @param buf + * @param buflen + * @param ev + * @param tv + * @return + */ +gssize rspamd_ssl_write (struct rspamd_ssl_connection *conn, gconstpointer buf, + gsize buflen); + +/** + * Emulate writev by copying iovec to a temporary buffer + * @param conn + * @param buf + * @param buflen + * @return + */ +gssize rspamd_ssl_writev (struct rspamd_ssl_connection *conn, struct iovec *iov, + gsize iovlen); + /** * Removes connection data * @param conn -- cgit v1.2.3 From 6982f0ab13c551ea880315ee05dcc29479644eaa Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 17:30:41 +0100 Subject: [Feature] Implement HTTPS client --- src/libutil/http.c | 60 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/libutil/http.c b/src/libutil/http.c index b4a1692cc..7196c9221 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -898,16 +898,23 @@ rspamd_http_write_helper (struct rspamd_http_connection *conn) #ifdef MSG_NOSIGNAL flags = MSG_NOSIGNAL; #endif - r = sendmsg (conn->fd, &msg, flags); + + if (priv->ssl) { + r = rspamd_ssl_writev (priv->ssl, msg.msg_iov, msg.msg_iovlen); + } + else { + r = sendmsg (conn->fd, &msg, flags); + } if (r == -1) { - err = - g_error_new (HTTP_ERROR, errno, "IO write error: %s", strerror ( - errno)); - rspamd_http_connection_ref (conn); - conn->error_handler (conn, err); - rspamd_http_connection_unref (conn); - g_error_free (err); + if (!priv->ssl) { + err = g_error_new (HTTP_ERROR, errno, "IO write error: %s", strerror (errno)); + rspamd_http_connection_ref (conn); + conn->error_handler (conn, err); + rspamd_http_connection_unref (conn); + g_error_free (err); + } + return; } else { @@ -948,7 +955,13 @@ rspamd_http_try_read (gint fd, rspamd_fstring_t *buf; buf = priv->buf->data; - r = read (fd, buf->str, buf->allocated); + + if (priv->ssl) { + r = rspamd_ssl_read (priv->ssl, buf->str, buf->allocated); + } + else { + r = read (fd, buf->str, buf->allocated); + } if (r <= 0) { return r; @@ -1020,12 +1033,14 @@ rspamd_http_event_handler (int fd, short what, gpointer ud) return; } else { - err = g_error_new (HTTP_ERROR, - errno, - "IO read error: %s", - strerror (errno)); - conn->error_handler (conn, err); - g_error_free (err); + if (!priv->ssl) { + err = g_error_new (HTTP_ERROR, + errno, + "IO read error: %s", + strerror (errno)); + conn->error_handler (conn, err); + g_error_free (err); + } REF_RELEASE (pbuf); rspamd_http_connection_unref (conn); @@ -1178,11 +1193,6 @@ rspamd_http_connection_reset (struct rspamd_http_connection *conn) priv->out = NULL; } - if (priv->ssl) { - rspamd_ssl_connection_free (priv->ssl); - priv->ssl = NULL; - } - priv->flags |= RSPAMD_HTTP_CONN_FLAG_RESETED; } @@ -1325,6 +1335,11 @@ rspamd_http_connection_free (struct rspamd_http_connection *conn) if (priv != NULL) { rspamd_http_connection_reset (conn); + if (priv->ssl) { + rspamd_ssl_connection_free (priv->ssl); + priv->ssl = NULL; + } + if (priv->local_key) { rspamd_keypair_unref (priv->local_key); } @@ -1948,6 +1963,11 @@ rspamd_http_connection_write_message_common (struct rspamd_http_connection *conn return; } else { + if (priv->ssl) { + /* Cleanup the existing connection */ + rspamd_ssl_connection_free (priv->ssl); + } + priv->ssl = rspamd_ssl_connection_new (priv->ssl_ctx, base); g_assert (priv->ssl != NULL); -- cgit v1.2.3 From 7eedffbb4b6390d2deb4bbc9c0feca8c3ebd3b99 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 17:30:54 +0100 Subject: [Feature] Implement https maps --- src/libutil/map.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libutil/map.c b/src/libutil/map.c index d334f68ee..9bf6e5760 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -997,12 +997,11 @@ rspamd_map_check_proto (struct rspamd_config *cfg, } else if (g_ascii_strncasecmp (pos, "https://", sizeof ("https://") - 1) == 0) { bk->protocol = MAP_PROTO_HTTPS; - /* Include http:// */ + /* Include https:// */ bk->uri = g_strdup (pos); pos += sizeof ("https://") - 1; } - else if (g_ascii_strncasecmp (pos, "file://", sizeof ("file://") - - 1) == 0) { + else if (g_ascii_strncasecmp (pos, "file://", sizeof ("file://") - 1) == 0) { pos += sizeof ("file://") - 1; /* Exclude file:// */ bk->uri = g_strdup (pos); @@ -1037,7 +1036,10 @@ rspamd_map_is_map (const gchar *map_line) else if (g_ascii_strncasecmp (map_line, "file://", sizeof ("file://") - 1) == 0) { ret = TRUE; } - else if (g_ascii_strncasecmp (map_line, "http://", sizeof ("file://") - 1) == 0) { + else if (g_ascii_strncasecmp (map_line, "http://", sizeof ("http://") - 1) == 0) { + ret = TRUE; + } + else if (g_ascii_strncasecmp (map_line, "https://", sizeof ("https://") - 1) == 0) { ret = TRUE; } -- cgit v1.2.3 From 320a2ccbf52b77bef68cb7619ef06c0d74b883a1 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 17:31:05 +0100 Subject: [Feature] Support rspamd_updates via https --- src/plugins/lua/rspamd_update.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/lua/rspamd_update.lua b/src/plugins/lua/rspamd_update.lua index 25898d712..9af937263 100644 --- a/src/plugins/lua/rspamd_update.lua +++ b/src/plugins/lua/rspamd_update.lua @@ -144,7 +144,8 @@ if section then each(function(k, map) -- Check sanity for maps - if map:get_proto() == 'http' and not map:get_sign_key() then + local proto = map:get_proto() + if (proto == 'http' or proto == 'https') and not map:get_sign_key() then if trusted_key then map:set_sign_key(trusted_key) else -- cgit v1.2.3 From a1347ca2e256817a3829416088de0ee304f44711 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 18:53:03 +0100 Subject: [Feature] Improve error report for type missmatch in lua --- src/lua/lua_common.c | 57 ++++++++++++++++++++++++++++++++++++++-------------- src/lua/lua_common.h | 1 + 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c index 85dbfa372..725160ee0 100644 --- a/src/lua/lua_common.c +++ b/src/lua/lua_common.c @@ -68,36 +68,63 @@ rspamd_lua_new_class_full (lua_State *L, luaL_register (L, static_name, func); } -gint -rspamd_lua_class_tostring (lua_State * L) +static const gchar * +rspamd_lua_class_tostring_buf (lua_State *L, gboolean print_pointer, gint pos) { - gchar buf[32]; + static gchar buf[64]; + const gchar *ret = NULL; + gint pop = 0; - if (!lua_getmetatable (L, 1)) { - goto error; + if (!lua_getmetatable (L, pos)) { + goto err; } + lua_pushstring (L, "__index"); lua_gettable (L, -2); + pop ++; if (!lua_istable (L, -1)) { - goto error; + goto err; } + lua_pushstring (L, "class"); lua_gettable (L, -2); + pop ++; if (!lua_isstring (L, -1)) { - goto error; + goto err; } - snprintf (buf, sizeof (buf), "%p", lua_touserdata (L, 1)); + if (print_pointer) { + rspamd_snprintf (buf, sizeof (buf), "%s(%p)", lua_tostring (L, -1), + lua_touserdata (L, 1)); + } + else { + rspamd_snprintf (buf, sizeof (buf), "%s", lua_tostring (L, -1)); + } - lua_pushfstring (L, "%s: %s", lua_tostring (L, -1), buf); + ret = buf; - return 1; +err: + lua_pop (L, pop); + + return ret; +} + +gint +rspamd_lua_class_tostring (lua_State * L) +{ + const gchar *p; + + p = rspamd_lua_class_tostring_buf (L, TRUE, 1); + + if (!p) { + lua_pushstring (L, "invalid object passed to 'lua_common.c:__tostring'"); + return lua_error (L); + } + + lua_pushstring (L, p); -error: - lua_pushstring (L, "invalid object passed to 'lua_common.c:__tostring'"); - lua_error (L); return 1; } @@ -804,11 +831,11 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos, g_set_error (err, lua_error_quark (), 2, - "invalid class for key %*.s, expected %s, got %s", + "invalid class for key %.*s, expected %s, got %s", (gint) keylen, key, classbuf, - lua_tostring (L, idx)); + rspamd_lua_class_tostring_buf (L, FALSE, idx)); va_end (ap); return FALSE; diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h index 63039533c..ba389d7a6 100644 --- a/src/lua/lua_common.h +++ b/src/lua/lua_common.h @@ -302,6 +302,7 @@ struct rspamd_config * lua_check_config (lua_State * L, gint pos); * - V - size_t + const char * * - U{classname} - userdata of the following class (stored in gpointer) * - F - function + * - O - ucl_object_t * * * If any of keys is prefixed with `*` then it is treated as required argument * @param L lua state -- cgit v1.2.3 From f7e55dcc838006ed3be3d523b4768a4290ffce4f Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 19:02:18 +0100 Subject: [CritFix] Fix parsing of missing classes --- src/lua/lua_common.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c index 725160ee0..371567695 100644 --- a/src/lua/lua_common.c +++ b/src/lua/lua_common.c @@ -729,6 +729,7 @@ rspamd_lua_parse_table_arguments (lua_State *L, gint pos, case 'U': if (t == LUA_TNIL || t == LUA_TNONE) { failed = TRUE; + *(va_arg (ap, void **)) = NULL; } else if (t != LUA_TUSERDATA) { g_set_error (err, -- cgit v1.2.3 From 78a21e8200a671d1ebf2b9572bbcfdfcd4fba151 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 19:02:35 +0100 Subject: [Feature] Rework dns resolving API for lua, add 'forced' option --- src/lua/lua_dns.c | 124 +++++++++++++++++------------------------------------- 1 file changed, 39 insertions(+), 85 deletions(-) diff --git a/src/lua/lua_dns.c b/src/lua/lua_dns.c index 1a778c53d..cb834cf88 100644 --- a/src/lua/lua_dns.c +++ b/src/lua/lua_dns.c @@ -256,92 +256,34 @@ lua_dns_resolver_resolve_common (lua_State *L, enum rdns_request_type type, int first) { - struct rspamd_async_session *session = NULL, **psession; - rspamd_mempool_t *pool = NULL, **ppool; - const gchar *to_resolve, *user_str = NULL; + struct rspamd_async_session *session = NULL; + rspamd_mempool_t *pool = NULL; + const gchar *to_resolve = NULL, *user_str = NULL; struct lua_dns_cbdata *cbdata; - gint cbref = -1; + gint cbref = -1, ret; struct rspamd_task *task = NULL; + GError *err = NULL; + gboolean forced = FALSE; /* Check arguments */ - if (lua_type (L, first) == LUA_TUSERDATA) { - /* Legacy version */ - psession = rspamd_lua_check_udata (L, first, "rspamd{session}"); - luaL_argcheck (L, psession != NULL, first, "'session' expected"); - session = psession ? *(psession) : NULL; - ppool = rspamd_lua_check_udata (L, first + 1, "rspamd{mempool}"); - luaL_argcheck (L, ppool != NULL, first + 1, "'mempool' expected"); - pool = ppool ? *(ppool) : NULL; - to_resolve = luaL_checkstring (L, first + 2); - - lua_pushvalue (L, first + 3); - cbref = luaL_ref (L, LUA_REGISTRYINDEX); - - if (lua_gettop (L) > first + 3) { - user_str = lua_tostring (L, first + 4); - } - else { - user_str = NULL; - } - } - else if (lua_type (L, first) == LUA_TTABLE) { - lua_pushvalue (L, first); - - lua_pushstring (L, "name"); - lua_gettable (L, -2); - to_resolve = luaL_checkstring (L, -1); - lua_pop (L, 1); - - lua_pushstring (L, "callback"); - lua_gettable (L, -2); - - if (to_resolve == NULL || lua_type (L, -1) != LUA_TFUNCTION) { - lua_pop (L, 2); - msg_err ("DNS request has bad params"); - lua_pushboolean (L, FALSE); - return 1; - } - cbref = luaL_ref (L, LUA_REGISTRYINDEX); - - lua_pushstring (L, "task"); - lua_gettable (L, -2); - if (lua_type (L, -1) == LUA_TUSERDATA) { - task = lua_check_task (L, -1); - session = task->s; - pool = task->task_pool; - } - lua_pop (L, 1); + if (!rspamd_lua_parse_table_arguments (L, first, &err, + "session=U{session};mempool=U{mempool};*name=S;*callback=F;" + "option=S;task=U{task};forced=B", + &session, &pool, &to_resolve, &cbref, &user_str, &task, &forced)) { - if (task == NULL) { - lua_pushstring (L, "session"); - lua_gettable (L, -2); - if (rspamd_lua_check_udata (L, -1, "rspamd{session}")) { - session = *(struct rspamd_async_session **)lua_touserdata (L, -1); - } - else { - session = NULL; - } - lua_pop (L, 1); + if (err) { + ret = luaL_error (L, "invalid arguments: %s", err->message); + g_error_free (err); - lua_pushstring (L, "pool"); - lua_gettable (L, -2); - if (rspamd_lua_check_udata (L, -1, "rspamd{mempool}")) { - pool = *(rspamd_mempool_t **)lua_touserdata (L, -1); - } - else { - pool = NULL; - } - lua_pop (L, 1); + return ret; } - lua_pushstring (L, "option"); - lua_gettable (L, -2); - if (lua_type (L, -1) == LUA_TSTRING) { - user_str = luaL_checkstring (L, -1); - } - lua_pop (L, 1); + return luaL_error (L, "invalid arguments"); + } - lua_pop (L, 1); + if (task) { + pool = task->task_pool; + session = task->s; } if (pool != NULL && session != NULL && to_resolve != NULL && cbref != -1) { @@ -360,8 +302,10 @@ lua_dns_resolver_resolve_common (lua_State *L, ptr_str = rdns_generate_ptr_from_str (to_resolve); if (ptr_str == NULL) { - msg_err ("wrong resolve string to PTR request: %s", to_resolve); + msg_err_task_check ("wrong resolve string to PTR request: %s", + to_resolve); lua_pushnil (L); + return 1; } @@ -392,11 +336,22 @@ lua_dns_resolver_resolve_common (lua_State *L, } } else { - if (make_dns_request_task (task, - lua_dns_callback, - cbdata, - type, - to_resolve)) { + if (forced) { + ret = make_dns_request_task_forced (task, + lua_dns_callback, + cbdata, + type, + to_resolve); + } + else { + ret = make_dns_request_task (task, + lua_dns_callback, + cbdata, + type, + to_resolve); + } + + if (ret) { lua_pushboolean (L, TRUE); cbdata->s = session; cbdata->w = rspamd_session_get_watcher (session); @@ -408,8 +363,7 @@ lua_dns_resolver_resolve_common (lua_State *L, } } else { - msg_err ("invalid arguments to lua_resolve"); - lua_pushnil (L); + return luaL_error (L, "invalid arguments to lua_resolve"); } return 1; -- cgit v1.2.3 From 9b8f8d728cebc0e0fe777f55d6d02cff9ea9e792 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Jun 2016 19:06:16 +0100 Subject: [Feature] Enable forced resolving for some lua plugins Issue: #661 Reported by: @FelixSchwarz --- src/plugins/lua/dmarc.lua | 9 ++++++--- src/plugins/lua/once_received.lua | 3 ++- src/plugins/lua/rbl.lua | 23 ++++++++++++++++------- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/plugins/lua/dmarc.lua b/src/plugins/lua/dmarc.lua index 063142f24..cb65a6875 100644 --- a/src/plugins/lua/dmarc.lua +++ b/src/plugins/lua/dmarc.lua @@ -80,7 +80,8 @@ local function dmarc_callback(task) task:get_resolver():resolve_txt({ task=task, name = resolve_name, - callback = dmarc_dns_cb}) + callback = dmarc_dns_cb, + forced = true}) return end @@ -182,7 +183,8 @@ local function dmarc_callback(task) task:get_resolver():resolve_txt({ task=task, name = resolve_name, - callback = dmarc_dns_cb}) + callback = dmarc_dns_cb, + forced = true}) return else @@ -263,7 +265,8 @@ local function dmarc_callback(task) task:get_resolver():resolve_txt({ task=task, name = resolve_name, - callback = dmarc_dns_cb}) + callback = dmarc_dns_cb, + forced = true}) end local opts = rspamd_config:get_all_opt('dmarc') diff --git a/src/plugins/lua/once_received.lua b/src/plugins/lua/once_received.lua index 341618429..63de22776 100644 --- a/src/plugins/lua/once_received.lua +++ b/src/plugins/lua/once_received.lua @@ -80,7 +80,8 @@ local function check_quantity_received (task) if (not hn or hn == 'unknown') and task_ip and task_ip:is_valid() then task:get_resolver():resolve_ptr({task = task, name = task_ip:to_string(), - callback = recv_dns_cb + callback = recv_dns_cb, + forced = true }) return end diff --git a/src/plugins/lua/rbl.lua b/src/plugins/lua/rbl.lua index 91e20dc5b..2a0042019 100644 --- a/src/plugins/lua/rbl.lua +++ b/src/plugins/lua/rbl.lua @@ -147,7 +147,8 @@ local function rbl_cb (task) task:get_resolver():resolve_a({task = task, name = havegot['helo'] .. '.' .. rbl['rbl'], callback = rbl_dns_cb, - option = k}) + option = k, + forced = true}) end)() end @@ -173,7 +174,8 @@ local function rbl_cb (task) task:get_resolver():resolve_a({task = task, name = d .. '.' .. rbl['rbl'], callback = rbl_dns_cb, - option = k}) + option = k, + forced = true}) end end)() end @@ -214,14 +216,16 @@ local function rbl_cb (task) task:get_resolver():resolve_a({task = task, name = domain .. '.' .. rbl['rbl'], callback = rbl_dns_cb, - option = k}) + option = k, + forced = true}) end else for _, email in pairs(havegot['emails']) do task:get_resolver():resolve_a({task = task, name = email .. '.' .. rbl['rbl'], callback = rbl_dns_cb, - option = k}) + option = k, + forced = true}) end end end)() @@ -242,7 +246,8 @@ local function rbl_cb (task) task:get_resolver():resolve_a({task = task, name = havegot['rdns'] .. '.' .. rbl['rbl'], callback = rbl_dns_cb, - option = k}) + option = k, + forced = true}) end)() end @@ -263,7 +268,8 @@ local function rbl_cb (task) task:get_resolver():resolve_a({task = task, name = ip_to_rbl(havegot['from'], rbl['rbl']), callback = rbl_dns_cb, - option = k}) + option = k, + forced = true}) end end)() end @@ -287,10 +293,13 @@ local function rbl_cb (task) ((rbl['exclude_private_ips'] and not rh['real_ip']:is_local()) or not rbl['exclude_private_ips']) and ((rbl['exclude_local_ips'] and not is_excluded_ip(rh['real_ip'])) or not rbl['exclude_local_ips']) then + -- Disable forced for received resolving, as we have no control on + -- those headers count task:get_resolver():resolve_a({task = task, name = ip_to_rbl(rh['real_ip'], rbl['rbl']), callback = rbl_dns_cb, - option = k}) + option = k, + forced = false}) end end end -- cgit v1.2.3 From 8b0c9d52554909656b8db2d8c93d8d680776de0b Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 09:15:36 +0100 Subject: [Feature] Add openphish support to rspamd phishing module --- conf/metrics.conf | 6 +++++- conf/modules.d/phishing.conf | 1 + src/plugins/lua/phishing.lua | 43 ++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/conf/metrics.conf b/conf/metrics.conf index a3c8b27c8..aa4dab022 100644 --- a/conf/metrics.conf +++ b/conf/metrics.conf @@ -834,9 +834,13 @@ metric { group "phishing" { symbol "PHISHING" { weight = 4.0; - description = "Phished mail"; + description = "Phished URL"; one_shot = true; } + symbol "PHISHED_OPENPHISH" { + weight = 7.0; + description = "Phished URL found in openphish.com"; + } } group "date" { diff --git a/conf/modules.d/phishing.conf b/conf/modules.d/phishing.conf index c1b63909a..392708cde 100644 --- a/conf/modules.d/phishing.conf +++ b/conf/modules.d/phishing.conf @@ -18,6 +18,7 @@ phishing { .include(try=true,priority=1) "$LOCAL_CONFDIR/local.d/phishing.conf" .include(try=true,priority=10) "$LOCAL_CONFDIR/override.d/phishing.conf" symbol = "PHISHING"; + openphish_map = "https://www.openphish.com/feed.txt"; # Make exclusions for known redirectors redirector_domains = [ diff --git a/src/plugins/lua/phishing.lua b/src/plugins/lua/phishing.lua index ecf88679f..22a792223 100644 --- a/src/plugins/lua/phishing.lua +++ b/src/plugins/lua/phishing.lua @@ -18,9 +18,12 @@ limitations under the License. -- -- local symbol = 'PHISHED_URL' +local openphish_symbol = 'PHISHED_OPENPHISH' local domains = nil local strict_domains = {} local redirector_domains = {} +local openphish_map = 'https://www.openphish.com/feed.txt' +local openphish_hash local rspamd_logger = require "rspamd_logger" local util = require "rspamd_util" local opts = rspamd_config:get_all_opt('phishing') @@ -30,6 +33,14 @@ local function phishing_cb(task) if urls then for _,url in ipairs(urls) do + if openphish_hash then + local t = url:get_text() + + if openphish_hash:get_key(t) then + task:insert_result(openphish_symbol, 1.0, url:get_tld()) + end + end + if url:is_phished() and not url:is_redirected() then local found = false local purl = url:get_phished() @@ -94,7 +105,11 @@ local function phishing_map(mapname, phishmap) local sym = string.sub(d, s + 1, -1) local map = string.sub(d, 1, s - 1) rspamd_config:register_virtual_symbol(sym, 1, id) - local rmap = rspamd_config:add_hash_map (map, 'Phishing ' .. mapname .. ' map') + local rmap = rspamd_config:add_map ({ + type = 'set', + url = map, + description = 'Phishing ' .. mapname .. ' map', + }) if rmap then local rule = {symbol = sym, map = rmap} table.insert(phishmap, rule) @@ -113,13 +128,35 @@ if opts then if opts['symbol'] then symbol = opts['symbol'] -- Register symbol's callback - rspamd_config:register_symbol({ + local id = rspamd_config:register_symbol({ name = symbol, callback = phishing_cb }) + + if opts['openphish_map'] then + openphish_map = opts['openphish_map'] + end + + openphish_hash = rspamd_config:add_map({ + type = 'set', + url = openphish_map, + description = 'Open phishing feed map (see https://www.openphish.com for details)' + }) + + if openphish_hash then + rspamd_config:register_symbol({ + type = 'virtual', + parent = id, + name = openphish_symbol, + }) + end end if opts['domains'] and type(opt['domains']) == 'string' then - domains = rspamd_config:add_hash_map (opts['domains']) + domains = rspamd_config:add_map({ + url = opts['domains'], + type = 'set', + description = 'Phishing domains' + }) end phishing_map('strict_domains', strict_domains) phishing_map('redirector_domains', redirector_domains) -- cgit v1.2.3 From 6cfd6d651b45a6cdbdb3baa8bbfdb69e685aeb45 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 09:20:42 +0100 Subject: [Fix] Set host attribute properly when making HTTP request from lua --- src/lua/lua_http.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/lua/lua_http.c b/src/lua/lua_http.c index 298da5a47..0c4eb976d 100644 --- a/src/lua/lua_http.c +++ b/src/lua/lua_http.c @@ -65,6 +65,7 @@ struct lua_http_cbdata { struct timeval tv; rspamd_inet_addr_t *addr; gchar *mime_type; + gchar *host; gint fd; gint cbref; }; @@ -110,6 +111,10 @@ lua_http_fin (gpointer arg) g_free (cbd->mime_type); } + if (cbd->host) { + g_free (cbd->host); + } + g_slice_free1 (sizeof (struct lua_http_cbdata), cbd); } @@ -210,7 +215,8 @@ lua_http_make_connection (struct lua_http_cbdata *cbd) NULL); rspamd_http_connection_write_message (cbd->conn, cbd->msg, - NULL, cbd->mime_type, cbd, fd, &cbd->tv, cbd->ev_base); + cbd->host, cbd->mime_type, cbd, fd, + &cbd->tv, cbd->ev_base); /* Message is now owned by a connection object */ cbd->msg = NULL; @@ -451,6 +457,10 @@ lua_http_request (lua_State *L) msec_to_tv (timeout, &cbd->tv); cbd->fd = -1; + if (msg->host) { + cbd->host = rspamd_fstring_cstr (msg->host); + } + if (session) { cbd->session = session; rspamd_session_add_event (session, -- cgit v1.2.3 From 7dd96f361e62a95ef1c125a21bde385ea5bd8006 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 09:35:01 +0100 Subject: [Fix] Fix event bases for IO events --- src/plugins/fuzzy_check.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/plugins/fuzzy_check.c b/src/plugins/fuzzy_check.c index 78b215033..f71c1bf81 100644 --- a/src/plugins/fuzzy_check.c +++ b/src/plugins/fuzzy_check.c @@ -1475,6 +1475,7 @@ fuzzy_check_io_callback (gint fd, short what, void *arg) guchar buf[2048], *p; struct fuzzy_cmd_io *io; struct rspamd_fuzzy_cmd *cmd = NULL; + struct event_base *ev_base; guint i; gint r; @@ -1545,9 +1546,11 @@ fuzzy_check_io_callback (gint fd, short what, void *arg) if (ret == return_want_more) { /* Processed write, switch to reading */ + ev_base = event_get_base (&session->ev); event_del (&session->ev); event_set (&session->ev, fd, EV_READ, fuzzy_check_io_callback, session); + event_base_set (ev_base, &session->ev); event_add (&session->ev, NULL); } else if (ret == return_error) { @@ -1578,9 +1581,11 @@ fuzzy_check_io_callback (gint fd, short what, void *arg) } else { /* Need to read more */ + ev_base = event_get_base (&session->ev); event_del (&session->ev); event_set (&session->ev, fd, EV_READ, fuzzy_check_io_callback, session); + event_base_set (ev_base, &session->ev); event_add (&session->ev, NULL); } } @@ -1592,6 +1597,7 @@ fuzzy_check_timer_callback (gint fd, short what, void *arg) { struct fuzzy_client_session *session = arg; struct rspamd_task *task; + struct event_base *ev_base; task = session->task; @@ -1604,13 +1610,17 @@ fuzzy_check_timer_callback (gint fd, short what, void *arg) } else { /* Plan write event */ + ev_base = event_get_base (&session->ev); event_del (&session->ev); event_set (&session->ev, fd, EV_WRITE|EV_READ, fuzzy_check_io_callback, session); + event_base_set (ev_base, &session->ev); event_add (&session->ev, NULL); /* Plan new retransmit timer */ + ev_base = event_get_base (&session->timev); event_del (&session->timev); + event_base_set (ev_base, &session->timev); event_add (&session->timev, &session->tv); session->retransmits ++; } @@ -1628,6 +1638,7 @@ fuzzy_controller_io_callback (gint fd, short what, void *arg) struct fuzzy_cmd_io *io; struct rspamd_fuzzy_cmd *cmd = NULL; const gchar *symbol; + struct event_base *ev_base; gint r; enum { return_error = 0, @@ -1729,10 +1740,13 @@ fuzzy_controller_io_callback (gint fd, short what, void *arg) } if (ret == return_want_more) { + ev_base = event_get_base (&session->ev); event_del (&session->ev); event_set (&session->ev, fd, EV_READ, fuzzy_controller_io_callback, session); + event_base_set (ev_base, &session->ev); event_add (&session->ev, NULL); + return; } else if (ret == return_error) { @@ -1791,6 +1805,7 @@ fuzzy_controller_timer_callback (gint fd, short what, void *arg) { struct fuzzy_learn_session *session = arg; struct rspamd_task *task; + struct event_base *ev_base; task = session->task; @@ -1817,13 +1832,17 @@ fuzzy_controller_timer_callback (gint fd, short what, void *arg) } else { /* Plan write event */ + ev_base = event_get_base (&session->ev); event_del (&session->ev); event_set (&session->ev, fd, EV_WRITE|EV_READ, fuzzy_controller_io_callback, session); + event_base_set (ev_base, &session->ev); event_add (&session->ev, NULL); /* Plan new retransmit timer */ + ev_base = event_get_base (&session->timev); event_del (&session->timev); + event_base_set (ev_base, &session->timev); event_add (&session->timev, &session->tv); session->retransmits ++; } -- cgit v1.2.3 From 7fd590aabff817d200a3946872c8d0938e55814f Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 10:14:56 +0100 Subject: [Fix] More fixes to events logic --- src/libutil/ssl_util.c | 22 ++++++++++++++++++++++ src/lua/lua_map.c | 8 ++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/libutil/ssl_util.c b/src/libutil/ssl_util.c index a72f1de95..55d5a1ad4 100644 --- a/src/libutil/ssl_util.c +++ b/src/libutil/ssl_util.c @@ -382,6 +382,7 @@ rspamd_ssl_event_handler (gint fd, short what, gpointer ud) return; } + event_del (c->ev); event_set (c->ev, fd, what, rspamd_ssl_event_handler, c); event_base_set (c->ev_base, c->ev); event_add (c->ev, c->tv); @@ -389,12 +390,22 @@ rspamd_ssl_event_handler (gint fd, short what, gpointer ud) break; case ssl_next_read: event_del (c->ev); + /* Restore handler */ + event_set (c->ev, c->fd, EV_READ|EV_PERSIST, + c->handler, c->handler_data); + event_base_set (c->ev_base, c->ev); + event_add (c->ev, c->tv); c->state = ssl_conn_connected; c->handler (fd, EV_READ, c->handler_data); break; case ssl_next_write: case ssl_conn_connected: event_del (c->ev); + /* Restore handler */ + event_set (c->ev, c->fd, EV_WRITE, + c->handler, c->handler_data); + event_base_set (c->ev_base, c->ev); + event_add (c->ev, c->tv); c->state = ssl_conn_connected; c->handler (fd, EV_WRITE, c->handler_data); break; @@ -459,6 +470,11 @@ rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, if (ret == 1) { conn->state = ssl_conn_connected; + + if (event_get_base (ev)) { + event_del (ev); + } + event_set (ev, fd, EV_WRITE, rspamd_ssl_event_handler, conn); if (conn->ev_base) { @@ -480,6 +496,10 @@ rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, return FALSE; } + if (event_get_base (ev)) { + event_del (ev); + } + event_set (ev, fd, what, rspamd_ssl_event_handler, conn); event_base_set (conn->ev_base, ev); event_add (ev, tv); @@ -546,6 +566,7 @@ rspamd_ssl_read (struct rspamd_ssl_connection *conn, gpointer buf, return -1; } + event_del (conn->ev); event_set (conn->ev, conn->fd, what, rspamd_ssl_event_handler, conn); event_base_set (conn->ev_base, conn->ev); event_add (conn->ev, conn->tv); @@ -615,6 +636,7 @@ rspamd_ssl_write (struct rspamd_ssl_connection *conn, gconstpointer buf, return -1; } + event_del (conn->ev); event_set (conn->ev, conn->fd, what, rspamd_ssl_event_handler, conn); event_base_set (conn->ev_base, conn->ev); event_add (conn->ev, conn->tv); diff --git a/src/lua/lua_map.c b/src/lua/lua_map.c index cf2b29f04..570287c13 100644 --- a/src/lua/lua_map.c +++ b/src/lua/lua_map.c @@ -309,10 +309,6 @@ lua_map_fin (struct map_cb_data *data) map = data->map; - if (data->prev_data) { - data->prev_data = NULL; - } - if (data->cur_data) { cbdata = (struct lua_map_callback_data *)data->cur_data; } @@ -321,6 +317,10 @@ lua_map_fin (struct map_cb_data *data) return; } + if (data->prev_data) { + data->prev_data = NULL; + } + if (cbdata->ref == -1) { msg_err_map ("map has no callback set"); } -- cgit v1.2.3 From e1955662ec5a6d1b3b6b3d939d7d9be9346aa87d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 13:00:03 +0100 Subject: [Fix] Fix periodic scheduling when a map is not modified --- src/libutil/map.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/libutil/map.c b/src/libutil/map.c index 9bf6e5760..11d760fe5 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -475,6 +475,9 @@ http_map_finish (struct rspamd_http_connection *conn, else { cbd->data->last_checked = msg->date; } + + cbd->periodic->cur_backend ++; + rspamd_map_periodic_callback (-1, EV_TIMEOUT, cbd->periodic); } else { msg_info_map ("cannot load map %s from %s: HTTP error %d", @@ -566,6 +569,11 @@ read_map_file (struct rspamd_map *map, struct file_map_data *data, static void rspamd_map_periodic_dtor (struct map_periodic_cbdata *periodic) { + struct rspamd_map *map; + + map = periodic->map; + msg_debug_map ("periodic dtor %p", periodic); + if (periodic->need_modify) { /* We are done */ periodic->map->fin_callback (&periodic->cbdata); @@ -610,6 +618,8 @@ rspamd_map_schedule_periodic (struct rspamd_map *map, cbd->map = map; REF_INIT_RETAIN (cbd, rspamd_map_periodic_dtor); + msg_debug_map ("schedule new periodic event %p in %.2f seconds", cbd, timeout); + if (initial) { evtimer_set (&map->ev, rspamd_map_periodic_callback, cbd); event_base_set (map->ev_base, &map->ev); -- cgit v1.2.3 From 7e6126e0169e6397d1e9e989433f590398d20fd8 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 16:36:20 +0100 Subject: [Feature] Implement ragel parser for received headers --- src/ragel/smtp_addr_parser.rl | 5 + src/ragel/smtp_address.rl | 19 +-- src/ragel/smtp_date.rl | 27 +++++ src/ragel/smtp_ip.rl | 4 +- src/ragel/smtp_received.rl | 39 +++++++ src/ragel/smtp_received_parser.rl | 235 ++++++++++++++++++++++++++++++++++++++ src/ragel/smtp_whitespace.rl | 30 +++++ 7 files changed, 339 insertions(+), 20 deletions(-) create mode 100644 src/ragel/smtp_date.rl create mode 100644 src/ragel/smtp_received.rl create mode 100644 src/ragel/smtp_received_parser.rl create mode 100644 src/ragel/smtp_whitespace.rl diff --git a/src/ragel/smtp_addr_parser.rl b/src/ragel/smtp_addr_parser.rl index a480970ec..70f9c3ca0 100644 --- a/src/ragel/smtp_addr_parser.rl +++ b/src/ragel/smtp_addr_parser.rl @@ -2,6 +2,11 @@ machine smtp_addr_parser; + action IP6_start {} + action IP6_end {} + action IP4_start {} + action IP4_end {} + action User_start { addr->user = p; } diff --git a/src/ragel/smtp_address.rl b/src/ragel/smtp_address.rl index dd148d654..fc69a0138 100644 --- a/src/ragel/smtp_address.rl +++ b/src/ragel/smtp_address.rl @@ -2,28 +2,11 @@ machine smtp_address; include smtp_ip "smtp_ip.rl"; + include smtp_whitespace "smtp_whitespace.rl"; # SMTP address spec # Obtained from: https://tools.ietf.org/html/rfc5321#section-4.1.2 - LF = "\n"; - CR = "\r"; - CRLF = "\r\n"; - DQUOTE = '"'; - - atext = alpha | digit | "!" | "#" | "$" | "%" | "&" | - "'" | "*" | "+" | "_" | "/" | "=" | "?" | "^" | - "-" | "`" | "{" | "|" | "}" | "~"; - - dcontent = 33..90 | 94..126; - Let_dig = alpha | digit; - Ldh_str = ( alpha | digit | "_" | "-" )* Let_dig; - - quoted_pairSMTP = "\\" 32..126; - qtextSMTP = 32..33 | 35..91 | 93..126; - Atom = atext+; - Dot_string = Atom ("." Atom)*; - QcontentSMTP = qtextSMTP | quoted_pairSMTP %User_has_backslash; Quoted_string = ( DQUOTE QcontentSMTP* >User_start %User_end DQUOTE ) %Quoted_addr; Local_part = Dot_string >User_start %User_end | Quoted_string; diff --git a/src/ragel/smtp_date.rl b/src/ragel/smtp_date.rl new file mode 100644 index 000000000..d2efe61a6 --- /dev/null +++ b/src/ragel/smtp_date.rl @@ -0,0 +1,27 @@ +%%{ + machine smtp_date; + + include smtp_whitespace "smtp_whitespace.rl"; + + # SMTP date spec + # Obtained from: http://tools.ietf.org/html/rfc5322#section_3.3 + + digit_2 = digit{2}; + digit_4 = digit{4}; + day_name = "Mon" | "Tue" | "Wed" | "Thu" | + "Fri" | "Sat" | "Sun"; + day_of_week = FWS? day_name; + day = FWS? digit_2+ FWS; + month = "Jan" | "Feb" | "Mar" | "Apr" | + "May" | "Jun" | "Jul" | "Aug" | + "Sep" | "Oct" | "Nov" | "Dec"; + year = FWS digit{4,} FWS; + date = day month year; + hour = digit_2; + minute = digit_2; + second = digit_2; + time_of_day = hour ":" minute ( ":" second ); + zone = (FWS ( "+" |"_" ) digit_4); + time = time_of_day zone; + date_time = (day_of_week ",")? date time CFWS?; +}%% \ No newline at end of file diff --git a/src/ragel/smtp_ip.rl b/src/ragel/smtp_ip.rl index b6b0080f3..b060b750a 100644 --- a/src/ragel/smtp_ip.rl +++ b/src/ragel/smtp_ip.rl @@ -5,7 +5,7 @@ # Source: https://tools.ietf.org/html/rfc5321#section-4.1.3 Snum = digit{1,3}; - IPv4_address_literal = Snum ("." Snum){3}; + IPv4_address_literal = (Snum ("." Snum){3}) >IP4_start %IP4_end; IPv6_hex = xdigit{1,4}; IPv6_full = IPv6_hex (":" IPv6_hex){7}; IPv6_comp = (IPv6_hex (":" IPv6_hex){0,5})? "::" @@ -15,5 +15,5 @@ (IPv6_hex (":" IPv6_hex){0,3} ":")? IPv4_address_literal; IPv6_addr = IPv6_full | IPv6_comp | IPv6v4_full | IPv6v4_comp; - IPv6_address_literal = "IPv6:" IPv6_addr; + IPv6_address_literal = "IPv6:" (IPv6_addr >IP6_start %IP6_end); }%% \ No newline at end of file diff --git a/src/ragel/smtp_received.rl b/src/ragel/smtp_received.rl new file mode 100644 index 000000000..235c54906 --- /dev/null +++ b/src/ragel/smtp_received.rl @@ -0,0 +1,39 @@ +%%{ + machine smtp_received; + + include smtp_whitespace "smtp_whitespace.rl"; + include smtp_ip "smtp_ip.rl"; + include smtp_date "smtp_date.rl"; + include smtp_address"smtp_address.rl"; + + # http://tools.ietf.org/html/rfc5321#section-4.4 + + Addtl_Link = Atom; + Link = "TCP" | Addtl_Link; + Attdl_Protocol = Atom; + Protocol = "ESMTP" %ESMTP_proto | "SMTP" %SMTP_proto | "ESMTPS" %ESMTPS_proto | "LMTP" %LMTP_proto | "IMAP" %IMAP_proto | Attdl_Protocol; + + TCP_info = address_literal >Real_IP_Start %Real_IP_End | + ( Domain >Real_Domain_Start %Real_Domain_End FWS address_literal >Real_IP_Start %Real_IP_End ); + Extended_Domain = Domain >Real_Domain_Start %Real_Domain_End | # Used to be a real domain + ( Domain >Reported_Domain_Start %Reported_Domain_End FWS "(" TCP_info ")" ) | # Here domain is something specified by remote side + ( address_literal >Real_Domain_Start %Real_Domain_End FWS "(" TCP_info ")" ); + + From_domain = "FROM"i FWS Extended_Domain >From_Start %From_End; + By_domain = CFWS "BY"i FWS Extended_Domain >By_Start %By_End; + + Via = CFWS "VIA"i FWS Link; + With = CFWS "WITH"i FWS Protocol; + + id_left = dot_atom_text; + no_fold_literal = "[" dtext* "]"; + id_right = dot_atom_text | no_fold_literal; + msg_id = "<" id_left "@" id_right ">"; + ID = CFWS "ID"i FWS ( Atom | msg_id ); + + For = CFWS "FOR"i FWS ( Path | Mailbox ) %For_End; + Additional_Registered_Clauses = CFWS Atom FWS String; + Opt_info = Via? With? ID? For? Additional_Registered_Clauses?; + Received = From_domain By_domain Opt_info CFWS? ";" FWS date_time; + +}%% diff --git a/src/ragel/smtp_received_parser.rl b/src/ragel/smtp_received_parser.rl new file mode 100644 index 000000000..51cb90720 --- /dev/null +++ b/src/ragel/smtp_received_parser.rl @@ -0,0 +1,235 @@ +%%{ + + machine smtp_received_parser; + + + action IP6_start { + ip_start = p; + } + action IP6_end { + ip_end = p; + } + action IP4_start { + ip_start = p; + } + action IP4_end { + ip_end = p; + } + + action User_start { + addr->user = p; + } + + action User_end { + if (addr->user) { + addr->user_len = p - addr->user; + } + } + + action Domain_start { + addr->domain = p; + } + + action Domain_end { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } + + action Domain_addr_start { + addr->domain = p; + addr->flags |= RSPAMD_EMAIL_ADDR_IP; + } + + action Domain_addr_end { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } + + action User_has_backslash { + addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; + } + + action Quoted_addr { + addr->flags |= RSPAMD_EMAIL_ADDR_QUOTED; + } + + action Empty_addr { + addr->flags |= RSPAMD_EMAIL_ADDR_EMPTY; + addr->addr = ""; + addr->user = addr->addr; + addr->domain = addr->addr; + } + + action Valid_addr { + addr->flags |= RSPAMD_EMAIL_ADDR_VALID; + } + + action Addr_has_angle { + addr->flags |= RSPAMD_EMAIL_ADDR_BRACED; + } + + action Addr_start { + addr->addr = p; + } + + action Addr_end { + if (addr->addr) { + addr->addr_len = p - addr->addr; + } + } + + action Real_Domain_Start { + real_domain_start = p; + } + action Real_Domain_End { + real_domain_end = p; + } + action Reported_Domain_Start { + reported_domain_start = p; + } + action Reported_Domain_End { + reported_domain_end = p; + } + + action Real_IP_Start { + real_domain_start = p; + } + action Real_IP_End { + real_domain_end = p; + } + action Reported_IP_Start { + reported_domain_start = p; + } + action Reported_IP_End { + reported_domain_end = p; + } + + action From_Start { + real_domain_start = NULL; + real_domain_end = NULL; + real_ip_start = NULL; + real_ip_end = NULL; + reported_domain_start = NULL; + reported_domain_end = NULL; + reported_ip_start = NULL; + reported_ip_end = NULL; + ip_start = NULL; + ip_end = NULL; + } + + action By_Start { + real_domain_start = NULL; + real_domain_end = NULL; + real_ip_start = NULL; + real_ip_end = NULL; + reported_domain_start = NULL; + reported_domain_end = NULL; + reported_ip_start = NULL; + reported_ip_end = NULL; + ip_start = NULL; + ip_end = NULL; + } + + action By_End { + /* Do nothing here for now */ + } + + action From_End { + guint len; + + if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { + len = real_domain_end - real_domain_start; + rh->real_hostname = rspamd_mempool_alloc (len + 1); + rspamd_strlcpy (rh->real_hostname, real_domain_start, len + 1); + } + if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { + len = reported_domain_end - reported_domain_start; + rh->from_hostname = rspamd_mempool_alloc (len + 1); + rspamd_strlcpy (rh->from_hostname, reported_domain_start, len + 1); + } + if (real_ip_end && real_ip_start && real_ip_end > real_ip_start) { + len = real_ip_end - real_ip_start; + rh->real_ip = rspamd_mempool_alloc (len + 1); + rspamd_strlcpy (rh->real_ip, real_ip_start, len + 1); + } + if (reported_ip_end && reported_ip_start && reported_ip_end > reported_ip_start) { + len = reported_ip_end - reported_ip_start; + rh->from_ip = rspamd_mempool_alloc (len + 1); + rspamd_strlcpy (rh->from_ip, reported_ip_start, len + 1); + } + + if (rh->real_ip && !rh->from_ip) { + rh->from_ip = rh->real_ip; + } + if (rh->real_hostname && !rh->from_hostname) { + rh->from_hostname = rh->real_hostname; + } + + if (rh->real_ip && ip_start && ip_end && ip_end > ip_start) { + if (rspamd_parse_inet_address (&rh->addr, ip_start, ip_end)) { + rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t)rspamd_inet_address_destroy, rh->addr); + } + } + } + + action For_End { + + } + + action SMTP_proto { + rh->type = RSPAMD_RECEIVED_SMTP; + } + action ESMTPS_proto { + rh->type = RSPAMD_RECEIVED_ESMTPS; + } + action ESMTP_proto { + rh->type = RSPAMD_RECEIVED_ESMTP; + } + action LMTP_proto { + rh->type = RSPAMD_RECEIVED_LMTP; + } + action IMAP_proto { + rh->type = RSPAMD_RECEIVED_IMAP; + } + + include smtp_received "smtp_received.rl"; + + main := Received; + +}%% + +%% write data; + +static int +rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t len, struct received_header *rh) +{ + struct rspamd_email_address for_addr, *addr; + const gchar *real_domain_start, *real_domain_end, + *real_ip_start, *real_ip_end, + *reported_domain_start, *reported_domain_end, + *reported_ip_start, *reported_ip_end, + *ip_start, *ip_end; + + memset (rh, 0, sizeof (*rh)); + real_domain_start = NULL; + real_domain_end = NULL; + real_ip_start = NULL; + real_ip_end = NULL; + reported_domain_start = NULL; + reported_domain_end = NULL; + reported_ip_start = NULL; + reported_ip_end = NULL; + ip_start = NULL; + ip_end = NULL; + rh->type = RSPAMD_RECEIVED_UNKNOWN; + + memset (&for_addr, 0, sizeof (for_addr)); + addr = &for_addr; + + %% write init; + %% write exec; + + return cs; +} \ No newline at end of file diff --git a/src/ragel/smtp_whitespace.rl b/src/ragel/smtp_whitespace.rl new file mode 100644 index 000000000..5bac17a4e --- /dev/null +++ b/src/ragel/smtp_whitespace.rl @@ -0,0 +1,30 @@ +%%{ + machine smtp_whitespace; + + WSP = " "; + CRLF = "\r\n" | ("\r" [^\n]) | ([^\r] "\n"); + DQUOTE = '"'; + + # Printable US-ASCII characters not including specials + atext = alpha | digit | "!" | "#" | "$" | "%" | "&" | + "'" | "*" | "+" | "_" | "/" | "=" | "?" | "^" | + "-" | "`" | "{" | "|" | "}" | "~"; + # Printable US-ASCII characters not including "[", "]", or "\" + dtext = 33..90 | 94..126; + # Printable US-ASCII characters not including "(", ")", or "\" + ctext = 33..39 | 42..91 | 93..126; + + dcontent = 33..90 | 94..126; + Let_dig = alpha | digit; + Ldh_str = ( alpha | digit | "_" | "-" )* Let_dig; + + quoted_pairSMTP = "\\" 32..126; + qtextSMTP = 32..33 | 35..91 | 93..126; + Atom = atext+; + Dot_string = Atom ("." Atom)*; + dot_atom_text = atext+ ("." atext+)*; + FWS = ((WSP* CRLF)? WSP+); + + comment = "(" (FWS? ctext)* FWS? ")"; + CFWS = ((FWS? comment)+ FWS?) | FWS; +}%% \ No newline at end of file -- cgit v1.2.3 From a838cf4f8141baaab3b23877a41435a80f7804b3 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 16:41:44 +0100 Subject: [Feature] Use new ragel parser in message parsing code --- src/libmime/message.c | 1 + src/libmime/message.h | 13 + src/libmime/parsers/smtp_addr_parser.c | 7276 ++++++++++++++++++++++++++-- src/libmime/parsers/smtp_received_parser.c | 6765 ++++++++++++++++++++++++++ src/ragel/smtp_received_parser.rl | 17 +- 5 files changed, 13536 insertions(+), 536 deletions(-) create mode 100644 src/libmime/parsers/smtp_received_parser.c diff --git a/src/libmime/message.c b/src/libmime/message.c index b20da368a..e8f5cd96b 100644 --- a/src/libmime/message.c +++ b/src/libmime/message.c @@ -25,6 +25,7 @@ #include "utlist.h" #include "tokenizers/tokenizers.h" #include "cryptobox.h" +#include "./parsers/smtp_received_parser.c" #ifdef WITH_SNOWBALL #include "libstemmer.h" diff --git a/src/libmime/message.h b/src/libmime/message.h index 3994bd102..026233f3c 100644 --- a/src/libmime/message.h +++ b/src/libmime/message.h @@ -7,6 +7,8 @@ #define RSPAMD_MESSAGE_H #include "config.h" +#include "email_addr.h" +#include "addr.h" #include struct rspamd_task; @@ -54,12 +56,23 @@ struct mime_text_part { guint64 hash; }; +enum rspamd_received_type { + RSPAMD_RECEIVED_SMTP = 0, + RSPAMD_RECEIVED_ESMTP, + RSPAMD_RECEIVED_ESMTPS, + RSPAMD_RECEIVED_LMTP, + RSPAMD_RECEIVED_IMAP, + RSPAMD_RECEIVED_UNKNOWN +}; + struct received_header { gchar *from_hostname; gchar *from_ip; gchar *real_hostname; gchar *real_ip; gchar *by_hostname; + rspamd_inet_addr_t *addr; + enum rspamd_received_type type; gint is_error; }; diff --git a/src/libmime/parsers/smtp_addr_parser.c b/src/libmime/parsers/smtp_addr_parser.c index d97116faa..3a96e0f84 100644 --- a/src/libmime/parsers/smtp_addr_parser.c +++ b/src/libmime/parsers/smtp_addr_parser.c @@ -1,11 +1,11 @@ -#line 1 "src/ragel/smtp_addr_parser.rl" +#line 1 "../rspamd/src/ragel/smtp_addr_parser.rl" -#line 72 "src/ragel/smtp_addr_parser.rl" +#line 77 "../rspamd/src/ragel/smtp_addr_parser.rl" -#line 9 "src/libmime/parsers/smtp_addr_parser.c" +#line 9 "../rspamd/src/libmime/parsers/smtp_addr_parser.c" static const char _smtp_addr_parser_eof_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -16,17 +16,48 @@ static const char _smtp_addr_parser_eof_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 14, 0, 15, 16, 17 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 21, + 22, 23 }; static const int smtp_addr_parser_start = 1; -static const int smtp_addr_parser_first_final = 75; +static const int smtp_addr_parser_first_final = 317; static const int smtp_addr_parser_error = 0; static const int smtp_addr_parser_en_main = 1; -#line 75 "src/ragel/smtp_addr_parser.rl" +#line 80 "../rspamd/src/ragel/smtp_addr_parser.rl" static int rspamd_smtp_addr_parse (const char *data, size_t len, struct rspamd_email_address *addr) @@ -41,14 +72,14 @@ rspamd_smtp_addr_parse (const char *data, size_t len, struct rspamd_email_addres eof = pe; -#line 45 "src/libmime/parsers/smtp_addr_parser.c" +#line 76 "../rspamd/src/libmime/parsers/smtp_addr_parser.c" { cs = smtp_addr_parser_start; } -#line 89 "src/ragel/smtp_addr_parser.rl" +#line 94 "../rspamd/src/ragel/smtp_addr_parser.rl" -#line 52 "src/libmime/parsers/smtp_addr_parser.c" +#line 83 "../rspamd/src/libmime/parsers/smtp_addr_parser.c" { if ( p == pe ) goto _test_eof; @@ -141,16 +172,16 @@ case 4: } else goto tr9; goto tr1; -case 75: +case 317: switch( (*p) ) { - case 32: goto tr101; + case 32: goto tr349; case 45: goto tr11; - case 46: goto tr102; + case 46: goto tr350; case 95: goto tr11; } if ( (*p) < 48 ) { if ( 9 <= (*p) && (*p) <= 13 ) - goto tr101; + goto tr349; } else if ( (*p) > 57 ) { if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) @@ -160,11 +191,11 @@ case 75: } else goto tr12; goto tr1; -case 76: +case 318: if ( (*p) == 32 ) - goto tr103; + goto tr351; if ( 9 <= (*p) && (*p) <= 13 ) - goto tr103; + goto tr351; goto tr1; case 5: switch( (*p) ) { @@ -193,6 +224,7 @@ case 6: case 7: switch( (*p) ) { case 45: goto tr13; + case 73: goto tr16; case 95: goto tr13; } if ( (*p) < 65 ) { @@ -206,641 +238,6530 @@ case 7: goto tr1; case 8: switch( (*p) ) { - case 45: goto tr16; - case 95: goto tr16; + case 45: goto tr17; + case 95: goto tr17; } if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr17; + goto tr18; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr17; + goto tr18; } else - goto tr17; + goto tr18; goto tr1; case 9: switch( (*p) ) { - case 45: goto tr16; - case 58: goto tr18; - case 95: goto tr16; + case 45: goto tr17; + case 58: goto tr19; + case 95: goto tr17; } if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr17; + goto tr18; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr17; + goto tr18; } else - goto tr17; + goto tr18; goto tr1; case 10: if ( (*p) > 90 ) { if ( 94 <= (*p) && (*p) <= 126 ) - goto tr19; + goto tr20; } else if ( (*p) >= 33 ) - goto tr19; + goto tr20; goto tr1; case 11: if ( (*p) == 93 ) - goto tr20; + goto tr21; if ( (*p) > 90 ) { if ( 94 <= (*p) && (*p) <= 126 ) - goto tr19; + goto tr20; } else if ( (*p) >= 33 ) - goto tr19; + goto tr20; goto tr1; -case 77: +case 319: if ( (*p) == 32 ) - goto tr104; + goto tr352; if ( 9 <= (*p) && (*p) <= 13 ) - goto tr104; + goto tr352; goto tr1; case 12: switch( (*p) ) { - case 45: goto tr16; - case 46: goto tr21; - case 58: goto tr18; - case 95: goto tr16; + case 45: goto tr17; + case 46: goto tr22; + case 58: goto tr19; + case 95: goto tr17; } if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr22; + goto tr23; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr17; + goto tr18; } else - goto tr17; + goto tr18; goto tr1; case 13: if ( 48 <= (*p) && (*p) <= 57 ) - goto tr23; + goto tr24; goto tr1; case 14: if ( (*p) == 46 ) - goto tr24; - if ( 48 <= (*p) && (*p) <= 57 ) goto tr25; + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr26; goto tr1; case 15: if ( 48 <= (*p) && (*p) <= 57 ) - goto tr26; + goto tr27; goto tr1; case 16: if ( (*p) == 46 ) - goto tr27; - if ( 48 <= (*p) && (*p) <= 57 ) goto tr28; + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr29; goto tr1; case 17: if ( 48 <= (*p) && (*p) <= 57 ) - goto tr29; + goto tr30; goto tr1; case 18: if ( (*p) == 93 ) - goto tr20; + goto tr32; if ( 48 <= (*p) && (*p) <= 57 ) - goto tr30; + goto tr31; goto tr1; case 19: if ( (*p) == 93 ) - goto tr20; + goto tr32; if ( 48 <= (*p) && (*p) <= 57 ) - goto tr31; + goto tr33; goto tr1; case 20: if ( (*p) == 93 ) - goto tr20; + goto tr32; goto tr1; case 21: if ( (*p) == 46 ) - goto tr27; + goto tr28; if ( 48 <= (*p) && (*p) <= 57 ) - goto tr32; + goto tr34; goto tr1; case 22: if ( (*p) == 46 ) - goto tr27; + goto tr28; goto tr1; case 23: if ( (*p) == 46 ) - goto tr24; + goto tr25; if ( 48 <= (*p) && (*p) <= 57 ) - goto tr33; + goto tr35; goto tr1; case 24: if ( (*p) == 46 ) - goto tr24; + goto tr25; goto tr1; case 25: switch( (*p) ) { - case 45: goto tr16; - case 46: goto tr21; - case 58: goto tr18; - case 95: goto tr16; + case 45: goto tr17; + case 46: goto tr22; + case 58: goto tr19; + case 95: goto tr17; } if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr34; + goto tr36; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr17; + goto tr18; } else - goto tr17; + goto tr18; goto tr1; case 26: switch( (*p) ) { - case 45: goto tr16; - case 46: goto tr21; - case 58: goto tr18; - case 95: goto tr16; + case 45: goto tr17; + case 46: goto tr22; + case 58: goto tr19; + case 95: goto tr17; } if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr17; + goto tr18; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr17; + goto tr18; } else - goto tr17; + goto tr18; goto tr1; case 27: switch( (*p) ) { - case 34: goto tr36; - case 92: goto tr37; + case 45: goto tr17; + case 58: goto tr19; + case 80: goto tr37; + case 95: goto tr17; } - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr35; + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr18; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr18; + } else + goto tr18; goto tr1; case 28: switch( (*p) ) { - case 34: goto tr39; - case 92: goto tr40; + case 45: goto tr17; + case 58: goto tr19; + case 95: goto tr17; + case 118: goto tr38; } - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr38; + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr18; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr18; + } else + goto tr18; goto tr1; case 29: - if ( (*p) == 64 ) - goto tr41; + switch( (*p) ) { + case 45: goto tr17; + case 54: goto tr39; + case 58: goto tr19; + case 95: goto tr17; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr18; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr18; + } else + goto tr18; goto tr1; case 30: - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr42; - goto tr1; -case 31: switch( (*p) ) { - case 34: goto tr44; - case 92: goto tr45; + case 45: goto tr17; + case 58: goto tr40; + case 95: goto tr17; } - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr43; + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr18; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr18; + } else + goto tr18; + goto tr1; +case 31: + if ( (*p) == 58 ) + goto tr42; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr41; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr41; + } else + goto tr20; + } else + goto tr41; goto tr1; case 32: switch( (*p) ) { - case 34: goto tr47; - case 45: goto tr46; - case 62: goto tr48; - case 64: goto tr49; + case 58: goto tr44; + case 93: goto tr21; } - if ( (*p) < 47 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr46; - } else if ( (*p) >= 33 ) - goto tr46; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr46; - } else if ( (*p) >= 61 ) - goto tr46; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr43; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr43; + } else + goto tr20; } else - goto tr46; + goto tr43; goto tr1; case 33: switch( (*p) ) { - case 33: goto tr50; - case 46: goto tr51; - case 61: goto tr50; - case 64: goto tr52; + case 58: goto tr44; + case 93: goto tr21; } - if ( (*p) < 45 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr50; - } else if ( (*p) >= 35 ) - goto tr50; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr50; - } else if ( (*p) >= 63 ) - goto tr50; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr45; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr45; + } else + goto tr20; } else - goto tr50; + goto tr45; goto tr1; case 34: switch( (*p) ) { - case 33: goto tr50; - case 45: goto tr50; - case 61: goto tr50; - case 63: goto tr50; + case 58: goto tr44; + case 93: goto tr21; } - if ( (*p) < 47 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr50; - } else if ( (*p) >= 35 ) - goto tr50; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr50; - } else if ( (*p) >= 65 ) - goto tr50; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr46; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr46; + } else + goto tr20; } else - goto tr50; + goto tr46; goto tr1; case 35: - if ( (*p) == 91 ) - goto tr54; - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr53; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr53; - } else - goto tr53; + switch( (*p) ) { + case 58: goto tr44; + case 93: goto tr21; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; goto tr1; case 36: switch( (*p) ) { - case 45: goto tr55; - case 46: goto tr56; - case 62: goto tr58; - case 95: goto tr55; + case 58: goto tr48; + case 93: goto tr21; } if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr57; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr57; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr47; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr47; + } else + goto tr20; } else - goto tr57; + goto tr47; goto tr1; case 37: switch( (*p) ) { - case 45: goto tr55; - case 95: goto tr55; + case 58: goto tr50; + case 93: goto tr21; } if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr57; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr57; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr49; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr49; + } else + goto tr20; } else - goto tr57; + goto tr49; goto tr1; case 38: + switch( (*p) ) { + case 58: goto tr50; + case 93: goto tr21; + } if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr57; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr57; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr51; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr51; + } else + goto tr20; } else - goto tr57; - goto tr1; -case 78: - if ( (*p) == 32 ) - goto tr105; - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr105; + goto tr51; goto tr1; case 39: switch( (*p) ) { - case 45: goto tr59; - case 95: goto tr59; + case 58: goto tr50; + case 93: goto tr21; } if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr60; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr61; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr52; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr52; + } else + goto tr20; } else - goto tr61; + goto tr52; goto tr1; case 40: switch( (*p) ) { - case 45: goto tr62; - case 95: goto tr62; + case 58: goto tr50; + case 93: goto tr21; } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr63; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr63; - } else - goto tr63; + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; goto tr1; case 41: switch( (*p) ) { - case 45: goto tr62; - case 58: goto tr64; - case 95: goto tr62; + case 58: goto tr48; + case 93: goto tr21; } if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr63; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr63; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr53; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr53; + } else + goto tr20; } else - goto tr63; + goto tr53; goto tr1; case 42: - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr65; - } else if ( (*p) >= 33 ) - goto tr65; - goto tr1; -case 43: - if ( (*p) == 93 ) - goto tr66; - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr65; - } else if ( (*p) >= 33 ) - goto tr65; - goto tr1; -case 44: - if ( (*p) == 62 ) - goto tr67; - goto tr1; -case 45: switch( (*p) ) { - case 45: goto tr62; - case 46: goto tr68; - case 58: goto tr64; - case 95: goto tr62; + case 58: goto tr55; + case 93: goto tr21; } if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr69; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr63; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr54; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr54; + } else + goto tr20; + } else + goto tr54; + goto tr1; +case 43: + switch( (*p) ) { + case 58: goto tr55; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr56; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr56; + } else + goto tr20; + } else + goto tr56; + goto tr1; +case 44: + switch( (*p) ) { + case 58: goto tr55; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr57; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr57; + } else + goto tr20; + } else + goto tr57; + goto tr1; +case 45: + switch( (*p) ) { + case 58: goto tr55; + case 93: goto tr21; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 46: + switch( (*p) ) { + case 58: goto tr48; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr58; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr58; + } else + goto tr20; + } else + goto tr58; + goto tr1; +case 47: + switch( (*p) ) { + case 58: goto tr60; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr59; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr59; + } else + goto tr20; + } else + goto tr59; + goto tr1; +case 48: + switch( (*p) ) { + case 58: goto tr60; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr61; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr61; + } else + goto tr20; + } else + goto tr61; + goto tr1; +case 49: + switch( (*p) ) { + case 58: goto tr60; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr62; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr62; + } else + goto tr20; + } else + goto tr62; + goto tr1; +case 50: + switch( (*p) ) { + case 58: goto tr60; + case 93: goto tr21; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 51: + switch( (*p) ) { + case 58: goto tr48; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr63; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr63; + } else + goto tr20; + } else + goto tr63; + goto tr1; +case 52: + switch( (*p) ) { + case 58: goto tr65; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr64; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr64; + } else + goto tr20; + } else + goto tr64; + goto tr1; +case 53: + switch( (*p) ) { + case 58: goto tr65; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr66; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr66; + } else + goto tr20; + } else + goto tr66; + goto tr1; +case 54: + switch( (*p) ) { + case 58: goto tr65; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr67; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr67; + } else + goto tr20; + } else + goto tr67; + goto tr1; +case 55: + switch( (*p) ) { + case 58: goto tr65; + case 93: goto tr21; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 56: + switch( (*p) ) { + case 58: goto tr69; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr68; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr68; + } else + goto tr20; + } else + goto tr68; + goto tr1; +case 57: + switch( (*p) ) { + case 58: goto tr71; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr70; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr70; + } else + goto tr20; + } else + goto tr70; + goto tr1; +case 58: + switch( (*p) ) { + case 58: goto tr71; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr72; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr72; + } else + goto tr20; + } else + goto tr72; + goto tr1; +case 59: + switch( (*p) ) { + case 58: goto tr71; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr73; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr73; + } else + goto tr20; + } else + goto tr73; + goto tr1; +case 60: + switch( (*p) ) { + case 58: goto tr71; + case 93: goto tr21; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 61: + switch( (*p) ) { + case 58: goto tr69; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr74; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr75; + } else + goto tr20; + } else + goto tr75; + goto tr1; +case 62: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr78; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr77; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr79; + } else + goto tr20; + } else + goto tr79; + goto tr1; +case 63: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 58 ) + goto tr20; + } else + goto tr80; + goto tr1; +case 64: + switch( (*p) ) { + case 46: goto tr81; + case 93: goto tr21; + } + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 58 ) + goto tr20; + } else + goto tr82; + goto tr1; +case 65: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 58 ) + goto tr20; + } else + goto tr83; + goto tr1; +case 66: + switch( (*p) ) { + case 46: goto tr84; + case 93: goto tr21; + } + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 58 ) + goto tr20; + } else + goto tr85; + goto tr1; +case 67: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 58 ) + goto tr20; + } else + goto tr86; + goto tr1; +case 68: + if ( (*p) == 93 ) + goto tr88; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 58 ) + goto tr20; + } else + goto tr87; + goto tr1; +case 69: + if ( (*p) == 93 ) + goto tr88; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 58 ) + goto tr20; + } else + goto tr89; + goto tr1; +case 70: + if ( (*p) == 93 ) + goto tr88; + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 71: + switch( (*p) ) { + case 46: goto tr84; + case 93: goto tr21; + } + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 58 ) + goto tr20; + } else + goto tr90; + goto tr1; +case 72: + switch( (*p) ) { + case 46: goto tr84; + case 93: goto tr21; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 73: + switch( (*p) ) { + case 46: goto tr81; + case 93: goto tr21; + } + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 58 ) + goto tr20; + } else + goto tr91; + goto tr1; +case 74: + switch( (*p) ) { + case 46: goto tr81; + case 93: goto tr21; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 75: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr78; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr92; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr93; + } else + goto tr20; + } else + goto tr93; + goto tr1; +case 76: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr78; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr94; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr94; + } else + goto tr20; + } else + goto tr94; + goto tr1; +case 77: + switch( (*p) ) { + case 58: goto tr78; + case 93: goto tr21; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 78: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr95; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr95; + } else + goto tr20; + } else + goto tr95; + goto tr1; +case 79: + if ( (*p) == 93 ) + goto tr97; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr96; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr96; + } else + goto tr20; + } else + goto tr96; + goto tr1; +case 80: + if ( (*p) == 93 ) + goto tr97; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr98; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr98; + } else + goto tr20; + } else + goto tr98; + goto tr1; +case 81: + if ( (*p) == 93 ) + goto tr97; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr99; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr99; + } else + goto tr20; + } else + goto tr99; + goto tr1; +case 82: + if ( (*p) == 93 ) + goto tr97; + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 83: + switch( (*p) ) { + case 58: goto tr78; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr94; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr94; + } else + goto tr20; + } else + goto tr94; + goto tr1; +case 84: + switch( (*p) ) { + case 58: goto tr78; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr93; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr93; + } else + goto tr20; + } else + goto tr93; + goto tr1; +case 85: + if ( (*p) == 93 ) + goto tr97; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr100; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr100; + } else + goto tr20; + } else + goto tr100; + goto tr1; +case 86: + switch( (*p) ) { + case 58: goto tr102; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr101; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr101; + } else + goto tr20; + } else + goto tr101; + goto tr1; +case 87: + switch( (*p) ) { + case 58: goto tr102; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr103; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr103; + } else + goto tr20; + } else + goto tr103; + goto tr1; +case 88: + switch( (*p) ) { + case 58: goto tr102; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr104; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr104; + } else + goto tr20; + } else + goto tr104; + goto tr1; +case 89: + switch( (*p) ) { + case 58: goto tr102; + case 93: goto tr97; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 90: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr105; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr105; + } else + goto tr20; + } else + goto tr105; + goto tr1; +case 91: + switch( (*p) ) { + case 58: goto tr107; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr106; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr106; + } else + goto tr20; + } else + goto tr106; + goto tr1; +case 92: + switch( (*p) ) { + case 58: goto tr107; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr108; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr108; + } else + goto tr20; + } else + goto tr108; + goto tr1; +case 93: + switch( (*p) ) { + case 58: goto tr107; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr109; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr109; + } else + goto tr20; + } else + goto tr109; + goto tr1; +case 94: + switch( (*p) ) { + case 58: goto tr107; + case 93: goto tr97; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 95: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr110; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr110; + } else + goto tr20; + } else + goto tr110; + goto tr1; +case 96: + switch( (*p) ) { + case 58: goto tr112; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr111; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr111; + } else + goto tr20; + } else + goto tr111; + goto tr1; +case 97: + switch( (*p) ) { + case 58: goto tr112; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr113; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr113; + } else + goto tr20; + } else + goto tr113; + goto tr1; +case 98: + switch( (*p) ) { + case 58: goto tr112; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr114; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr114; + } else + goto tr20; + } else + goto tr114; + goto tr1; +case 99: + switch( (*p) ) { + case 58: goto tr112; + case 93: goto tr97; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 100: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr115; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr115; + } else + goto tr20; + } else + goto tr115; + goto tr1; +case 101: + switch( (*p) ) { + case 58: goto tr117; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr116; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr116; + } else + goto tr20; + } else + goto tr116; + goto tr1; +case 102: + switch( (*p) ) { + case 58: goto tr117; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr118; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr118; + } else + goto tr20; + } else + goto tr118; + goto tr1; +case 103: + switch( (*p) ) { + case 58: goto tr117; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr119; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr119; + } else + goto tr20; + } else + goto tr119; + goto tr1; +case 104: + switch( (*p) ) { + case 58: goto tr117; + case 93: goto tr97; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 105: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr120; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr120; + } else + goto tr20; + } else + goto tr120; + goto tr1; +case 106: + switch( (*p) ) { + case 58: goto tr78; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr121; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr121; + } else + goto tr20; + } else + goto tr121; + goto tr1; +case 107: + switch( (*p) ) { + case 58: goto tr78; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr122; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr122; + } else + goto tr20; + } else + goto tr122; + goto tr1; +case 108: + switch( (*p) ) { + case 58: goto tr78; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr123; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr123; + } else + goto tr20; + } else + goto tr123; + goto tr1; +case 109: + switch( (*p) ) { + case 58: goto tr78; + case 93: goto tr97; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 110: + switch( (*p) ) { + case 58: goto tr78; + case 93: goto tr21; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr79; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr79; + } else + goto tr20; + } else + goto tr79; + goto tr1; +case 111: + if ( (*p) == 93 ) + goto tr97; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr124; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr125; + } else + goto tr20; + } else + goto tr125; + goto tr1; +case 112: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr127; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr126; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr128; + } else + goto tr20; + } else + goto tr128; + goto tr1; +case 113: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr127; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr129; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr130; + } else + goto tr20; + } else + goto tr130; + goto tr1; +case 114: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr127; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr131; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr131; + } else + goto tr20; + } else + goto tr131; + goto tr1; +case 115: + switch( (*p) ) { + case 58: goto tr127; + case 93: goto tr97; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 116: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr132; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr133; + } else + goto tr20; + } else + goto tr133; + goto tr1; +case 117: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr135; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr134; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr136; + } else + goto tr20; + } else + goto tr136; + goto tr1; +case 118: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr135; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr137; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr138; + } else + goto tr20; + } else + goto tr138; + goto tr1; +case 119: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr135; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr139; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr139; + } else + goto tr20; + } else + goto tr139; + goto tr1; +case 120: + switch( (*p) ) { + case 58: goto tr135; + case 93: goto tr97; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 121: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr140; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr141; + } else + goto tr20; + } else + goto tr141; + goto tr1; +case 122: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr143; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr142; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr144; + } else + goto tr20; + } else + goto tr144; + goto tr1; +case 123: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr143; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr145; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr146; + } else + goto tr20; + } else + goto tr146; + goto tr1; +case 124: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr143; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr147; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr147; + } else + goto tr20; + } else + goto tr147; + goto tr1; +case 125: + switch( (*p) ) { + case 58: goto tr143; + case 93: goto tr97; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 126: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr148; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr149; + } else + goto tr20; + } else + goto tr149; + goto tr1; +case 127: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr151; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr150; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr152; + } else + goto tr20; + } else + goto tr152; + goto tr1; +case 128: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr151; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr153; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr154; + } else + goto tr20; + } else + goto tr154; + goto tr1; +case 129: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr151; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr155; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr155; + } else + goto tr20; + } else + goto tr155; + goto tr1; +case 130: + switch( (*p) ) { + case 58: goto tr151; + case 93: goto tr97; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 131: + if ( (*p) == 93 ) + goto tr21; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr156; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr120; + } else + goto tr20; + } else + goto tr120; + goto tr1; +case 132: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr78; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr157; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr121; + } else + goto tr20; + } else + goto tr121; + goto tr1; +case 133: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr78; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr158; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr122; + } else + goto tr20; + } else + goto tr122; + goto tr1; +case 134: + switch( (*p) ) { + case 46: goto tr76; + case 58: goto tr78; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr123; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr123; + } else + goto tr20; + } else + goto tr123; + goto tr1; +case 135: + switch( (*p) ) { + case 58: goto tr151; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr155; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr155; + } else + goto tr20; + } else + goto tr155; + goto tr1; +case 136: + switch( (*p) ) { + case 58: goto tr151; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr154; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr154; + } else + goto tr20; + } else + goto tr154; + goto tr1; +case 137: + switch( (*p) ) { + case 58: goto tr151; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr152; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr152; + } else + goto tr20; + } else + goto tr152; + goto tr1; +case 138: + switch( (*p) ) { + case 58: goto tr143; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr147; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr147; + } else + goto tr20; + } else + goto tr147; + goto tr1; +case 139: + switch( (*p) ) { + case 58: goto tr143; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr146; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr146; + } else + goto tr20; + } else + goto tr146; + goto tr1; +case 140: + switch( (*p) ) { + case 58: goto tr143; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr144; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr144; + } else + goto tr20; + } else + goto tr144; + goto tr1; +case 141: + switch( (*p) ) { + case 58: goto tr135; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr139; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr139; + } else + goto tr20; + } else + goto tr139; + goto tr1; +case 142: + switch( (*p) ) { + case 58: goto tr135; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr138; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr138; + } else + goto tr20; + } else + goto tr138; + goto tr1; +case 143: + switch( (*p) ) { + case 58: goto tr135; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr136; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr136; + } else + goto tr20; + } else + goto tr136; + goto tr1; +case 144: + switch( (*p) ) { + case 58: goto tr127; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr131; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr131; + } else + goto tr20; + } else + goto tr131; + goto tr1; +case 145: + switch( (*p) ) { + case 58: goto tr127; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr130; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr130; + } else + goto tr20; + } else + goto tr130; + goto tr1; +case 146: + switch( (*p) ) { + case 58: goto tr127; + case 93: goto tr97; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr20; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr20; + } else + goto tr128; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr20; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 97 ) + goto tr128; + } else + goto tr20; + } else + goto tr128; + goto tr1; +case 147: + switch( (*p) ) { + case 58: goto tr48; + case 93: goto tr21; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr20; + } else if ( (*p) >= 33 ) + goto tr20; + goto tr1; +case 148: + switch( (*p) ) { + case 34: goto tr160; + case 92: goto tr161; + } + if ( 32 <= (*p) && (*p) <= 126 ) + goto tr159; + goto tr1; +case 149: + switch( (*p) ) { + case 34: goto tr163; + case 92: goto tr164; + } + if ( 32 <= (*p) && (*p) <= 126 ) + goto tr162; + goto tr1; +case 150: + if ( (*p) == 64 ) + goto tr165; + goto tr1; +case 151: + if ( 32 <= (*p) && (*p) <= 126 ) + goto tr166; + goto tr1; +case 152: + switch( (*p) ) { + case 34: goto tr168; + case 92: goto tr169; + } + if ( 32 <= (*p) && (*p) <= 126 ) + goto tr167; + goto tr1; +case 153: + switch( (*p) ) { + case 34: goto tr171; + case 45: goto tr170; + case 62: goto tr172; + case 64: goto tr173; + } + if ( (*p) < 47 ) { + if ( (*p) > 39 ) { + if ( 42 <= (*p) && (*p) <= 43 ) + goto tr170; + } else if ( (*p) >= 33 ) + goto tr170; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr170; + } else if ( (*p) >= 61 ) + goto tr170; + } else + goto tr170; + goto tr1; +case 154: + switch( (*p) ) { + case 33: goto tr174; + case 46: goto tr175; + case 61: goto tr174; + case 64: goto tr176; + } + if ( (*p) < 45 ) { + if ( (*p) > 39 ) { + if ( 42 <= (*p) && (*p) <= 43 ) + goto tr174; + } else if ( (*p) >= 35 ) + goto tr174; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr174; + } else if ( (*p) >= 63 ) + goto tr174; + } else + goto tr174; + goto tr1; +case 155: + switch( (*p) ) { + case 33: goto tr174; + case 45: goto tr174; + case 61: goto tr174; + case 63: goto tr174; + } + if ( (*p) < 47 ) { + if ( (*p) > 39 ) { + if ( 42 <= (*p) && (*p) <= 43 ) + goto tr174; + } else if ( (*p) >= 35 ) + goto tr174; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr174; + } else if ( (*p) >= 65 ) + goto tr174; + } else + goto tr174; + goto tr1; +case 156: + if ( (*p) == 91 ) + goto tr178; + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr177; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr177; + } else + goto tr177; + goto tr1; +case 157: + switch( (*p) ) { + case 45: goto tr179; + case 46: goto tr180; + case 62: goto tr182; + case 95: goto tr179; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr181; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr181; + } else + goto tr181; + goto tr1; +case 158: + switch( (*p) ) { + case 45: goto tr179; + case 95: goto tr179; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr181; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr181; + } else + goto tr181; + goto tr1; +case 159: + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr181; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr181; + } else + goto tr181; + goto tr1; +case 320: + if ( (*p) == 32 ) + goto tr353; + if ( 9 <= (*p) && (*p) <= 13 ) + goto tr353; + goto tr1; +case 160: + switch( (*p) ) { + case 45: goto tr183; + case 73: goto tr186; + case 95: goto tr183; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr184; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr185; + } else + goto tr185; + goto tr1; +case 161: + switch( (*p) ) { + case 45: goto tr187; + case 95: goto tr187; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr188; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr188; + } else + goto tr188; + goto tr1; +case 162: + switch( (*p) ) { + case 45: goto tr187; + case 58: goto tr189; + case 95: goto tr187; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr188; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr188; + } else + goto tr188; + goto tr1; +case 163: + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 164: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 165: + if ( (*p) == 62 ) + goto tr192; + goto tr1; +case 166: + switch( (*p) ) { + case 45: goto tr187; + case 46: goto tr193; + case 58: goto tr189; + case 95: goto tr187; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr194; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr188; + } else + goto tr188; + goto tr1; +case 167: + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr195; + goto tr1; +case 168: + if ( (*p) == 46 ) + goto tr196; + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr197; + goto tr1; +case 169: + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr198; + goto tr1; +case 170: + if ( (*p) == 46 ) + goto tr199; + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr200; + goto tr1; +case 171: + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr201; + goto tr1; +case 172: + if ( (*p) == 93 ) + goto tr203; + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr202; + goto tr1; +case 173: + if ( (*p) == 93 ) + goto tr203; + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr204; + goto tr1; +case 174: + if ( (*p) == 93 ) + goto tr203; + goto tr1; +case 175: + if ( (*p) == 46 ) + goto tr199; + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr205; + goto tr1; +case 176: + if ( (*p) == 46 ) + goto tr199; + goto tr1; +case 177: + if ( (*p) == 46 ) + goto tr196; + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr206; + goto tr1; +case 178: + if ( (*p) == 46 ) + goto tr196; + goto tr1; +case 179: + switch( (*p) ) { + case 45: goto tr187; + case 46: goto tr193; + case 58: goto tr189; + case 95: goto tr187; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr207; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr188; + } else + goto tr188; + goto tr1; +case 180: + switch( (*p) ) { + case 45: goto tr187; + case 46: goto tr193; + case 58: goto tr189; + case 95: goto tr187; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr188; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr188; + } else + goto tr188; + goto tr1; +case 181: + switch( (*p) ) { + case 45: goto tr187; + case 58: goto tr189; + case 80: goto tr208; + case 95: goto tr187; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr188; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr188; + } else + goto tr188; + goto tr1; +case 182: + switch( (*p) ) { + case 45: goto tr187; + case 58: goto tr189; + case 95: goto tr187; + case 118: goto tr209; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr188; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr188; + } else + goto tr188; + goto tr1; +case 183: + switch( (*p) ) { + case 45: goto tr187; + case 54: goto tr210; + case 58: goto tr189; + case 95: goto tr187; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr188; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr188; + } else + goto tr188; + goto tr1; +case 184: + switch( (*p) ) { + case 45: goto tr187; + case 58: goto tr211; + case 95: goto tr187; + } + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr188; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr188; + } else + goto tr188; + goto tr1; +case 185: + if ( (*p) == 58 ) + goto tr213; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr212; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr212; + } else + goto tr190; + } else + goto tr212; + goto tr1; +case 186: + switch( (*p) ) { + case 58: goto tr215; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr214; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr214; + } else + goto tr190; + } else + goto tr214; + goto tr1; +case 187: + switch( (*p) ) { + case 58: goto tr215; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr216; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr216; + } else + goto tr190; + } else + goto tr216; + goto tr1; +case 188: + switch( (*p) ) { + case 58: goto tr215; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr217; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr217; + } else + goto tr190; + } else + goto tr217; + goto tr1; +case 189: + switch( (*p) ) { + case 58: goto tr215; + case 93: goto tr191; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 190: + switch( (*p) ) { + case 58: goto tr219; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr218; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr218; + } else + goto tr190; + } else + goto tr218; + goto tr1; +case 191: + switch( (*p) ) { + case 58: goto tr221; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr220; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr220; + } else + goto tr190; + } else + goto tr220; + goto tr1; +case 192: + switch( (*p) ) { + case 58: goto tr221; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr222; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr222; + } else + goto tr190; + } else + goto tr222; + goto tr1; +case 193: + switch( (*p) ) { + case 58: goto tr221; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr223; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr223; + } else + goto tr190; + } else + goto tr223; + goto tr1; +case 194: + switch( (*p) ) { + case 58: goto tr221; + case 93: goto tr191; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 195: + switch( (*p) ) { + case 58: goto tr219; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr224; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr224; + } else + goto tr190; + } else + goto tr224; + goto tr1; +case 196: + switch( (*p) ) { + case 58: goto tr226; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr225; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr225; + } else + goto tr190; + } else + goto tr225; + goto tr1; +case 197: + switch( (*p) ) { + case 58: goto tr226; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr227; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr227; + } else + goto tr190; + } else + goto tr227; + goto tr1; +case 198: + switch( (*p) ) { + case 58: goto tr226; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr228; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr228; + } else + goto tr190; + } else + goto tr228; + goto tr1; +case 199: + switch( (*p) ) { + case 58: goto tr226; + case 93: goto tr191; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 200: + switch( (*p) ) { + case 58: goto tr219; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr229; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr229; + } else + goto tr190; + } else + goto tr229; + goto tr1; +case 201: + switch( (*p) ) { + case 58: goto tr231; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr230; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr230; + } else + goto tr190; + } else + goto tr230; + goto tr1; +case 202: + switch( (*p) ) { + case 58: goto tr231; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr232; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr232; + } else + goto tr190; + } else + goto tr232; + goto tr1; +case 203: + switch( (*p) ) { + case 58: goto tr231; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr233; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr233; + } else + goto tr190; + } else + goto tr233; + goto tr1; +case 204: + switch( (*p) ) { + case 58: goto tr231; + case 93: goto tr191; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 205: + switch( (*p) ) { + case 58: goto tr219; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr234; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr234; + } else + goto tr190; + } else + goto tr234; + goto tr1; +case 206: + switch( (*p) ) { + case 58: goto tr236; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr235; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr235; + } else + goto tr190; + } else + goto tr235; + goto tr1; +case 207: + switch( (*p) ) { + case 58: goto tr236; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr237; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr237; + } else + goto tr190; + } else + goto tr237; + goto tr1; +case 208: + switch( (*p) ) { + case 58: goto tr236; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr238; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr238; + } else + goto tr190; + } else + goto tr238; + goto tr1; +case 209: + switch( (*p) ) { + case 58: goto tr236; + case 93: goto tr191; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 210: + switch( (*p) ) { + case 58: goto tr240; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr239; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr239; + } else + goto tr190; + } else + goto tr239; + goto tr1; +case 211: + switch( (*p) ) { + case 58: goto tr242; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr241; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr241; + } else + goto tr190; + } else + goto tr241; + goto tr1; +case 212: + switch( (*p) ) { + case 58: goto tr242; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr243; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr243; + } else + goto tr190; + } else + goto tr243; + goto tr1; +case 213: + switch( (*p) ) { + case 58: goto tr242; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr244; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr244; + } else + goto tr190; + } else + goto tr244; + goto tr1; +case 214: + switch( (*p) ) { + case 58: goto tr242; + case 93: goto tr191; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 215: + switch( (*p) ) { + case 58: goto tr240; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr245; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr246; + } else + goto tr190; + } else + goto tr246; + goto tr1; +case 216: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr249; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr248; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr250; + } else + goto tr190; + } else + goto tr250; + goto tr1; +case 217: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 58 ) + goto tr190; + } else + goto tr251; + goto tr1; +case 218: + switch( (*p) ) { + case 46: goto tr252; + case 93: goto tr191; + } + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 58 ) + goto tr190; + } else + goto tr253; + goto tr1; +case 219: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 58 ) + goto tr190; + } else + goto tr254; + goto tr1; +case 220: + switch( (*p) ) { + case 46: goto tr255; + case 93: goto tr191; + } + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 58 ) + goto tr190; + } else + goto tr256; + goto tr1; +case 221: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 58 ) + goto tr190; + } else + goto tr257; + goto tr1; +case 222: + if ( (*p) == 93 ) + goto tr259; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 58 ) + goto tr190; + } else + goto tr258; + goto tr1; +case 223: + if ( (*p) == 93 ) + goto tr259; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 58 ) + goto tr190; + } else + goto tr260; + goto tr1; +case 224: + if ( (*p) == 93 ) + goto tr259; + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 225: + switch( (*p) ) { + case 46: goto tr255; + case 93: goto tr191; + } + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 58 ) + goto tr190; + } else + goto tr261; + goto tr1; +case 226: + switch( (*p) ) { + case 46: goto tr255; + case 93: goto tr191; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 227: + switch( (*p) ) { + case 46: goto tr252; + case 93: goto tr191; + } + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 58 ) + goto tr190; + } else + goto tr262; + goto tr1; +case 228: + switch( (*p) ) { + case 46: goto tr252; + case 93: goto tr191; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 229: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr249; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr263; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr264; + } else + goto tr190; + } else + goto tr264; + goto tr1; +case 230: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr249; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr265; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr265; + } else + goto tr190; + } else + goto tr265; + goto tr1; +case 231: + switch( (*p) ) { + case 58: goto tr249; + case 93: goto tr191; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 232: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr266; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr266; + } else + goto tr190; + } else + goto tr266; + goto tr1; +case 233: + if ( (*p) == 93 ) + goto tr268; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr267; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr267; + } else + goto tr190; + } else + goto tr267; + goto tr1; +case 234: + if ( (*p) == 93 ) + goto tr268; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr269; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr269; + } else + goto tr190; + } else + goto tr269; + goto tr1; +case 235: + if ( (*p) == 93 ) + goto tr268; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr270; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr270; + } else + goto tr190; + } else + goto tr270; + goto tr1; +case 236: + if ( (*p) == 93 ) + goto tr268; + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 237: + switch( (*p) ) { + case 58: goto tr249; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr265; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr265; + } else + goto tr190; + } else + goto tr265; + goto tr1; +case 238: + switch( (*p) ) { + case 58: goto tr249; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr264; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr264; + } else + goto tr190; + } else + goto tr264; + goto tr1; +case 239: + if ( (*p) == 93 ) + goto tr268; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr271; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr271; + } else + goto tr190; + } else + goto tr271; + goto tr1; +case 240: + switch( (*p) ) { + case 58: goto tr273; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr272; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr272; + } else + goto tr190; + } else + goto tr272; + goto tr1; +case 241: + switch( (*p) ) { + case 58: goto tr273; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr274; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr274; + } else + goto tr190; + } else + goto tr274; + goto tr1; +case 242: + switch( (*p) ) { + case 58: goto tr273; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr275; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr275; + } else + goto tr190; + } else + goto tr275; + goto tr1; +case 243: + switch( (*p) ) { + case 58: goto tr273; + case 93: goto tr268; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 244: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr276; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr276; + } else + goto tr190; + } else + goto tr276; + goto tr1; +case 245: + switch( (*p) ) { + case 58: goto tr278; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr277; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr277; + } else + goto tr190; + } else + goto tr277; + goto tr1; +case 246: + switch( (*p) ) { + case 58: goto tr278; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr279; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr279; + } else + goto tr190; + } else + goto tr279; + goto tr1; +case 247: + switch( (*p) ) { + case 58: goto tr278; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr280; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr280; + } else + goto tr190; + } else + goto tr280; + goto tr1; +case 248: + switch( (*p) ) { + case 58: goto tr278; + case 93: goto tr268; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 249: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr281; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr281; + } else + goto tr190; + } else + goto tr281; + goto tr1; +case 250: + switch( (*p) ) { + case 58: goto tr283; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr282; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr282; + } else + goto tr190; + } else + goto tr282; + goto tr1; +case 251: + switch( (*p) ) { + case 58: goto tr283; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr284; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr284; + } else + goto tr190; + } else + goto tr284; + goto tr1; +case 252: + switch( (*p) ) { + case 58: goto tr283; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr285; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr285; + } else + goto tr190; + } else + goto tr285; + goto tr1; +case 253: + switch( (*p) ) { + case 58: goto tr283; + case 93: goto tr268; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 254: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr286; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr286; + } else + goto tr190; + } else + goto tr286; + goto tr1; +case 255: + switch( (*p) ) { + case 58: goto tr288; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr287; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr287; + } else + goto tr190; + } else + goto tr287; + goto tr1; +case 256: + switch( (*p) ) { + case 58: goto tr288; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr289; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr289; + } else + goto tr190; + } else + goto tr289; + goto tr1; +case 257: + switch( (*p) ) { + case 58: goto tr288; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr290; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr290; + } else + goto tr190; + } else + goto tr290; + goto tr1; +case 258: + switch( (*p) ) { + case 58: goto tr288; + case 93: goto tr268; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 259: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr291; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr291; + } else + goto tr190; + } else + goto tr291; + goto tr1; +case 260: + switch( (*p) ) { + case 58: goto tr249; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr292; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr292; + } else + goto tr190; + } else + goto tr292; + goto tr1; +case 261: + switch( (*p) ) { + case 58: goto tr249; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr293; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr293; + } else + goto tr190; + } else + goto tr293; + goto tr1; +case 262: + switch( (*p) ) { + case 58: goto tr249; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr294; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr294; + } else + goto tr190; + } else + goto tr294; + goto tr1; +case 263: + switch( (*p) ) { + case 58: goto tr249; + case 93: goto tr268; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 264: + switch( (*p) ) { + case 58: goto tr249; + case 93: goto tr191; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr250; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr250; + } else + goto tr190; + } else + goto tr250; + goto tr1; +case 265: + if ( (*p) == 93 ) + goto tr268; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr295; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr296; + } else + goto tr190; + } else + goto tr296; + goto tr1; +case 266: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr298; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr297; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr299; + } else + goto tr190; + } else + goto tr299; + goto tr1; +case 267: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr298; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr300; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr301; + } else + goto tr190; + } else + goto tr301; + goto tr1; +case 268: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr298; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr302; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr302; + } else + goto tr190; + } else + goto tr302; + goto tr1; +case 269: + switch( (*p) ) { + case 58: goto tr298; + case 93: goto tr268; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 270: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr303; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr304; + } else + goto tr190; + } else + goto tr304; + goto tr1; +case 271: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr306; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr305; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr307; + } else + goto tr190; + } else + goto tr307; + goto tr1; +case 272: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr306; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr308; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr309; + } else + goto tr190; + } else + goto tr309; + goto tr1; +case 273: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr306; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr310; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr310; + } else + goto tr190; + } else + goto tr310; + goto tr1; +case 274: + switch( (*p) ) { + case 58: goto tr306; + case 93: goto tr268; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 275: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr311; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr312; + } else + goto tr190; + } else + goto tr312; + goto tr1; +case 276: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr314; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr313; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr315; + } else + goto tr190; + } else + goto tr315; + goto tr1; +case 277: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr314; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr316; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr317; + } else + goto tr190; + } else + goto tr317; + goto tr1; +case 278: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr314; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr318; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr318; + } else + goto tr190; + } else + goto tr318; + goto tr1; +case 279: + switch( (*p) ) { + case 58: goto tr314; + case 93: goto tr268; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 280: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr319; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr320; + } else + goto tr190; + } else + goto tr320; + goto tr1; +case 281: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr322; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr321; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr323; + } else + goto tr190; } else - goto tr63; + goto tr323; goto tr1; -case 46: - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr70; +case 282: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr322; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr324; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr325; + } else + goto tr190; + } else + goto tr325; goto tr1; -case 47: - if ( (*p) == 46 ) - goto tr71; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr72; +case 283: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr322; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr326; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr326; + } else + goto tr190; + } else + goto tr326; goto tr1; -case 48: - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr73; +case 284: + switch( (*p) ) { + case 58: goto tr322; + case 93: goto tr268; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; goto tr1; -case 49: - if ( (*p) == 46 ) - goto tr74; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr75; +case 285: + if ( (*p) == 93 ) + goto tr191; + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 58 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr327; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr291; + } else + goto tr190; + } else + goto tr291; goto tr1; -case 50: - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr76; +case 286: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr249; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr328; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr292; + } else + goto tr190; + } else + goto tr292; goto tr1; -case 51: - if ( (*p) == 93 ) - goto tr66; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr77; +case 287: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr249; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr329; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr293; + } else + goto tr190; + } else + goto tr293; goto tr1; -case 52: - if ( (*p) == 93 ) - goto tr66; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr78; +case 288: + switch( (*p) ) { + case 46: goto tr247; + case 58: goto tr249; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr294; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr294; + } else + goto tr190; + } else + goto tr294; goto tr1; -case 53: - if ( (*p) == 93 ) - goto tr66; +case 289: + switch( (*p) ) { + case 58: goto tr322; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr326; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr326; + } else + goto tr190; + } else + goto tr326; goto tr1; -case 54: - if ( (*p) == 46 ) - goto tr74; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr79; +case 290: + switch( (*p) ) { + case 58: goto tr322; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr325; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr325; + } else + goto tr190; + } else + goto tr325; goto tr1; -case 55: - if ( (*p) == 46 ) - goto tr74; +case 291: + switch( (*p) ) { + case 58: goto tr322; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr323; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr323; + } else + goto tr190; + } else + goto tr323; goto tr1; -case 56: - if ( (*p) == 46 ) - goto tr71; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr80; +case 292: + switch( (*p) ) { + case 58: goto tr314; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr318; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr318; + } else + goto tr190; + } else + goto tr318; goto tr1; -case 57: - if ( (*p) == 46 ) - goto tr71; +case 293: + switch( (*p) ) { + case 58: goto tr314; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr317; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr317; + } else + goto tr190; + } else + goto tr317; goto tr1; -case 58: +case 294: switch( (*p) ) { - case 45: goto tr62; - case 46: goto tr68; - case 58: goto tr64; - case 95: goto tr62; + case 58: goto tr314; + case 93: goto tr268; } if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr81; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr63; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr315; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr315; + } else + goto tr190; } else - goto tr63; + goto tr315; goto tr1; -case 59: +case 295: switch( (*p) ) { - case 45: goto tr62; - case 46: goto tr68; - case 58: goto tr64; - case 95: goto tr62; + case 58: goto tr306; + case 93: goto tr268; } if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr63; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr63; + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr310; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr310; + } else + goto tr190; } else - goto tr63; + goto tr310; goto tr1; -case 60: +case 296: switch( (*p) ) { - case 34: goto tr83; - case 92: goto tr84; + case 58: goto tr306; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr309; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr309; + } else + goto tr190; + } else + goto tr309; + goto tr1; +case 297: + switch( (*p) ) { + case 58: goto tr306; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr307; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr307; + } else + goto tr190; + } else + goto tr307; + goto tr1; +case 298: + switch( (*p) ) { + case 58: goto tr298; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr302; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr302; + } else + goto tr190; + } else + goto tr302; + goto tr1; +case 299: + switch( (*p) ) { + case 58: goto tr298; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr301; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr301; + } else + goto tr190; + } else + goto tr301; + goto tr1; +case 300: + switch( (*p) ) { + case 58: goto tr298; + case 93: goto tr268; + } + if ( (*p) < 65 ) { + if ( (*p) < 48 ) { + if ( 33 <= (*p) && (*p) <= 47 ) + goto tr190; + } else if ( (*p) > 57 ) { + if ( 59 <= (*p) && (*p) <= 64 ) + goto tr190; + } else + goto tr299; + } else if ( (*p) > 70 ) { + if ( (*p) < 94 ) { + if ( 71 <= (*p) && (*p) <= 90 ) + goto tr190; + } else if ( (*p) > 96 ) { + if ( (*p) > 102 ) { + if ( 103 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 97 ) + goto tr299; + } else + goto tr190; + } else + goto tr299; + goto tr1; +case 301: + switch( (*p) ) { + case 58: goto tr219; + case 93: goto tr191; + } + if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 126 ) + goto tr190; + } else if ( (*p) >= 33 ) + goto tr190; + goto tr1; +case 302: + switch( (*p) ) { + case 34: goto tr331; + case 92: goto tr332; } if ( 32 <= (*p) && (*p) <= 126 ) - goto tr82; + goto tr330; goto tr1; -case 61: +case 303: switch( (*p) ) { - case 34: goto tr86; - case 92: goto tr87; + case 34: goto tr334; + case 92: goto tr335; } if ( 32 <= (*p) && (*p) <= 126 ) - goto tr85; + goto tr333; goto tr1; -case 62: +case 304: if ( (*p) == 64 ) - goto tr88; + goto tr336; goto tr1; -case 63: +case 305: if ( 32 <= (*p) && (*p) <= 126 ) - goto tr89; + goto tr337; goto tr1; -case 64: +case 306: switch( (*p) ) { - case 34: goto tr91; - case 92: goto tr92; + case 34: goto tr339; + case 92: goto tr340; } if ( 32 <= (*p) && (*p) <= 126 ) - goto tr90; + goto tr338; goto tr1; -case 79: +case 321: if ( (*p) == 32 ) - goto tr106; + goto tr354; if ( 9 <= (*p) && (*p) <= 13 ) - goto tr106; + goto tr354; goto tr1; -case 65: +case 307: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr93; + goto tr341; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr93; + goto tr341; } else - goto tr93; + goto tr341; goto tr1; -case 66: +case 308: switch( (*p) ) { - case 44: goto tr94; - case 45: goto tr95; - case 46: goto tr49; - case 58: goto tr96; - case 95: goto tr95; + case 44: goto tr342; + case 45: goto tr343; + case 46: goto tr173; + case 58: goto tr344; + case 95: goto tr343; } if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr93; + goto tr341; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr93; + goto tr341; } else - goto tr93; + goto tr341; goto tr1; -case 67: +case 309: if ( (*p) == 64 ) - goto tr49; + goto tr173; goto tr1; -case 68: +case 310: switch( (*p) ) { - case 45: goto tr95; - case 95: goto tr95; + case 45: goto tr343; + case 95: goto tr343; } if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr93; + goto tr341; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr93; + goto tr341; } else - goto tr93; + goto tr341; goto tr1; -case 69: +case 311: switch( (*p) ) { - case 34: goto tr47; - case 45: goto tr46; - case 61: goto tr46; - case 63: goto tr46; + case 34: goto tr171; + case 45: goto tr170; + case 61: goto tr170; + case 63: goto tr170; } if ( (*p) < 47 ) { if ( (*p) > 39 ) { if ( 42 <= (*p) && (*p) <= 43 ) - goto tr46; + goto tr170; } else if ( (*p) >= 33 ) - goto tr46; + goto tr170; } else if ( (*p) > 57 ) { if ( (*p) > 90 ) { if ( 94 <= (*p) && (*p) <= 126 ) - goto tr46; + goto tr170; } else if ( (*p) >= 65 ) - goto tr46; + goto tr170; } else - goto tr46; + goto tr170; goto tr1; -case 70: +case 312: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr97; + goto tr345; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr97; + goto tr345; } else - goto tr97; + goto tr345; goto tr1; -case 71: +case 313: switch( (*p) ) { - case 44: goto tr98; - case 45: goto tr99; + case 44: goto tr346; + case 45: goto tr347; case 46: goto tr5; - case 58: goto tr100; - case 95: goto tr99; + case 58: goto tr348; + case 95: goto tr347; } if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr97; + goto tr345; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr97; + goto tr345; } else - goto tr97; + goto tr345; goto tr1; -case 72: +case 314: if ( (*p) == 64 ) goto tr5; goto tr1; -case 73: +case 315: switch( (*p) ) { - case 45: goto tr99; - case 95: goto tr99; + case 45: goto tr347; + case 95: goto tr347; } if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) - goto tr97; + goto tr345; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) - goto tr97; + goto tr345; } else - goto tr97; + goto tr345; goto tr1; -case 74: +case 316: switch( (*p) ) { case 34: goto tr3; case 45: goto tr2; @@ -870,116 +6791,372 @@ case 74: tr2: cs = 2; goto f0; tr7: cs = 3; goto _again; tr8: cs = 4; goto f2; - tr41: cs = 4; goto f8; + tr165: cs = 4; goto f14; tr11: cs = 5; goto _again; - tr102: cs = 6; goto _again; + tr350: cs = 6; goto _again; tr10: cs = 7; goto _again; - tr16: cs = 8; goto _again; + tr17: cs = 8; goto _again; tr13: cs = 8; goto f4; - tr17: cs = 9; goto _again; + tr18: cs = 9; goto _again; tr15: cs = 9; goto f4; - tr18: cs = 10; goto _again; - tr19: cs = 11; goto _again; - tr14: cs = 12; goto f4; - tr21: cs = 13; goto _again; - tr23: cs = 14; goto _again; - tr24: cs = 15; goto _again; - tr26: cs = 16; goto _again; - tr27: cs = 17; goto _again; - tr29: cs = 18; goto _again; - tr30: cs = 19; goto _again; - tr31: cs = 20; goto _again; - tr28: cs = 21; goto _again; - tr32: cs = 22; goto _again; - tr25: cs = 23; goto _again; - tr33: cs = 24; goto _again; - tr22: cs = 25; goto _again; - tr34: cs = 26; goto _again; - tr3: cs = 27; goto f1; - tr38: cs = 28; goto _again; - tr35: cs = 28; goto f6; - tr43: cs = 28; goto f9; - tr39: cs = 29; goto f2; - tr36: cs = 29; goto f7; - tr44: cs = 29; goto f10; - tr40: cs = 30; goto _again; - tr37: cs = 30; goto f6; - tr45: cs = 30; goto f9; - tr42: cs = 31; goto _again; - tr4: cs = 32; goto _again; - tr50: cs = 33; goto _again; - tr46: cs = 33; goto f0; - tr51: cs = 34; goto _again; - tr52: cs = 35; goto f2; - tr88: cs = 35; goto f8; - tr57: cs = 36; goto _again; - tr53: cs = 36; goto f3; - tr55: cs = 37; goto _again; - tr56: cs = 38; goto _again; - tr54: cs = 39; goto _again; - tr62: cs = 40; goto _again; - tr59: cs = 40; goto f4; - tr63: cs = 41; goto _again; - tr61: cs = 41; goto f4; - tr64: cs = 42; goto _again; - tr65: cs = 43; goto _again; - tr66: cs = 44; goto f5; - tr60: cs = 45; goto f4; - tr68: cs = 46; goto _again; - tr70: cs = 47; goto _again; - tr71: cs = 48; goto _again; - tr73: cs = 49; goto _again; - tr74: cs = 50; goto _again; - tr76: cs = 51; goto _again; - tr77: cs = 52; goto _again; - tr78: cs = 53; goto _again; - tr75: cs = 54; goto _again; - tr79: cs = 55; goto _again; - tr72: cs = 56; goto _again; - tr80: cs = 57; goto _again; - tr69: cs = 58; goto _again; - tr81: cs = 59; goto _again; - tr47: cs = 60; goto f1; - tr85: cs = 61; goto _again; - tr82: cs = 61; goto f6; - tr90: cs = 61; goto f9; - tr86: cs = 62; goto f2; - tr83: cs = 62; goto f7; - tr91: cs = 62; goto f10; - tr87: cs = 63; goto _again; - tr84: cs = 63; goto f6; - tr92: cs = 63; goto f9; - tr89: cs = 64; goto _again; - tr49: cs = 65; goto _again; - tr93: cs = 66; goto _again; - tr94: cs = 67; goto _again; - tr95: cs = 68; goto _again; - tr96: cs = 69; goto _again; - tr5: cs = 70; goto _again; - tr97: cs = 71; goto _again; - tr98: cs = 72; goto _again; - tr99: cs = 73; goto _again; - tr100: cs = 74; goto _again; - tr12: cs = 75; goto _again; - tr9: cs = 75; goto f3; - tr103: cs = 76; goto _again; - tr101: cs = 76; goto f13; - tr104: cs = 76; goto f14; - tr105: cs = 76; goto f15; - tr106: cs = 76; goto f16; - tr20: cs = 77; goto f5; - tr58: cs = 78; goto f11; - tr67: cs = 78; goto f12; - tr48: cs = 79; goto _again; + tr19: cs = 10; goto _again; + tr20: cs = 11; goto _again; + tr14: cs = 12; goto f5; + tr22: cs = 13; goto _again; + tr24: cs = 14; goto _again; + tr25: cs = 15; goto _again; + tr27: cs = 16; goto _again; + tr28: cs = 17; goto _again; + tr30: cs = 18; goto _again; + tr31: cs = 19; goto _again; + tr33: cs = 20; goto _again; + tr29: cs = 21; goto _again; + tr34: cs = 22; goto _again; + tr26: cs = 23; goto _again; + tr35: cs = 24; goto _again; + tr23: cs = 25; goto _again; + tr36: cs = 26; goto _again; + tr16: cs = 27; goto f4; + tr37: cs = 28; goto _again; + tr38: cs = 29; goto _again; + tr39: cs = 30; goto _again; + tr40: cs = 31; goto _again; + tr41: cs = 32; goto f8; + tr43: cs = 33; goto _again; + tr45: cs = 34; goto _again; + tr46: cs = 35; goto _again; + tr44: cs = 36; goto _again; + tr47: cs = 37; goto _again; + tr49: cs = 38; goto _again; + tr51: cs = 39; goto _again; + tr52: cs = 40; goto _again; + tr50: cs = 41; goto _again; + tr53: cs = 42; goto _again; + tr54: cs = 43; goto _again; + tr56: cs = 44; goto _again; + tr57: cs = 45; goto _again; + tr55: cs = 46; goto _again; + tr58: cs = 47; goto _again; + tr59: cs = 48; goto _again; + tr61: cs = 49; goto _again; + tr62: cs = 50; goto _again; + tr60: cs = 51; goto _again; + tr63: cs = 52; goto _again; + tr64: cs = 53; goto _again; + tr66: cs = 54; goto _again; + tr67: cs = 55; goto _again; + tr65: cs = 56; goto _again; + tr68: cs = 57; goto _again; + tr70: cs = 58; goto _again; + tr72: cs = 59; goto _again; + tr73: cs = 60; goto _again; + tr71: cs = 61; goto _again; + tr74: cs = 62; goto f9; + tr76: cs = 63; goto _again; + tr80: cs = 64; goto _again; + tr81: cs = 65; goto _again; + tr83: cs = 66; goto _again; + tr84: cs = 67; goto _again; + tr86: cs = 68; goto _again; + tr87: cs = 69; goto _again; + tr89: cs = 70; goto _again; + tr85: cs = 71; goto _again; + tr90: cs = 72; goto _again; + tr82: cs = 73; goto _again; + tr91: cs = 74; goto _again; + tr77: cs = 75; goto _again; + tr92: cs = 76; goto _again; + tr94: cs = 77; goto _again; + tr78: cs = 78; goto _again; + tr95: cs = 79; goto _again; + tr96: cs = 80; goto _again; + tr98: cs = 81; goto _again; + tr99: cs = 82; goto _again; + tr93: cs = 83; goto _again; + tr79: cs = 84; goto _again; + tr69: cs = 85; goto _again; + tr100: cs = 86; goto _again; + tr101: cs = 87; goto _again; + tr103: cs = 88; goto _again; + tr104: cs = 89; goto _again; + tr102: cs = 90; goto _again; + tr105: cs = 91; goto _again; + tr106: cs = 92; goto _again; + tr108: cs = 93; goto _again; + tr109: cs = 94; goto _again; + tr107: cs = 95; goto _again; + tr110: cs = 96; goto _again; + tr111: cs = 97; goto _again; + tr113: cs = 98; goto _again; + tr114: cs = 99; goto _again; + tr112: cs = 100; goto _again; + tr115: cs = 101; goto _again; + tr116: cs = 102; goto _again; + tr118: cs = 103; goto _again; + tr119: cs = 104; goto _again; + tr117: cs = 105; goto _again; + tr120: cs = 106; goto _again; + tr121: cs = 107; goto _again; + tr122: cs = 108; goto _again; + tr123: cs = 109; goto _again; + tr75: cs = 110; goto _again; + tr48: cs = 111; goto _again; + tr124: cs = 112; goto f9; + tr126: cs = 113; goto _again; + tr129: cs = 114; goto _again; + tr131: cs = 115; goto _again; + tr127: cs = 116; goto _again; + tr132: cs = 117; goto f9; + tr134: cs = 118; goto _again; + tr137: cs = 119; goto _again; + tr139: cs = 120; goto _again; + tr135: cs = 121; goto _again; + tr140: cs = 122; goto f9; + tr142: cs = 123; goto _again; + tr145: cs = 124; goto _again; + tr147: cs = 125; goto _again; + tr143: cs = 126; goto _again; + tr148: cs = 127; goto f9; + tr150: cs = 128; goto _again; + tr153: cs = 129; goto _again; + tr155: cs = 130; goto _again; + tr151: cs = 131; goto _again; + tr156: cs = 132; goto f9; + tr157: cs = 133; goto _again; + tr158: cs = 134; goto _again; + tr154: cs = 135; goto _again; + tr152: cs = 136; goto _again; + tr149: cs = 137; goto _again; + tr146: cs = 138; goto _again; + tr144: cs = 139; goto _again; + tr141: cs = 140; goto _again; + tr138: cs = 141; goto _again; + tr136: cs = 142; goto _again; + tr133: cs = 143; goto _again; + tr130: cs = 144; goto _again; + tr128: cs = 145; goto _again; + tr125: cs = 146; goto _again; + tr42: cs = 147; goto f8; + tr3: cs = 148; goto f1; + tr162: cs = 149; goto _again; + tr159: cs = 149; goto f12; + tr167: cs = 149; goto f15; + tr163: cs = 150; goto f2; + tr160: cs = 150; goto f13; + tr168: cs = 150; goto f16; + tr164: cs = 151; goto _again; + tr161: cs = 151; goto f12; + tr169: cs = 151; goto f15; + tr166: cs = 152; goto _again; + tr4: cs = 153; goto _again; + tr174: cs = 154; goto _again; + tr170: cs = 154; goto f0; + tr175: cs = 155; goto _again; + tr176: cs = 156; goto f2; + tr336: cs = 156; goto f14; + tr181: cs = 157; goto _again; + tr177: cs = 157; goto f3; + tr179: cs = 158; goto _again; + tr180: cs = 159; goto _again; + tr178: cs = 160; goto _again; + tr187: cs = 161; goto _again; + tr183: cs = 161; goto f4; + tr188: cs = 162; goto _again; + tr185: cs = 162; goto f4; + tr189: cs = 163; goto _again; + tr190: cs = 164; goto _again; + tr191: cs = 165; goto f6; + tr203: cs = 165; goto f7; + tr259: cs = 165; goto f10; + tr268: cs = 165; goto f11; + tr184: cs = 166; goto f5; + tr193: cs = 167; goto _again; + tr195: cs = 168; goto _again; + tr196: cs = 169; goto _again; + tr198: cs = 170; goto _again; + tr199: cs = 171; goto _again; + tr201: cs = 172; goto _again; + tr202: cs = 173; goto _again; + tr204: cs = 174; goto _again; + tr200: cs = 175; goto _again; + tr205: cs = 176; goto _again; + tr197: cs = 177; goto _again; + tr206: cs = 178; goto _again; + tr194: cs = 179; goto _again; + tr207: cs = 180; goto _again; + tr186: cs = 181; goto f4; + tr208: cs = 182; goto _again; + tr209: cs = 183; goto _again; + tr210: cs = 184; goto _again; + tr211: cs = 185; goto _again; + tr212: cs = 186; goto f8; + tr214: cs = 187; goto _again; + tr216: cs = 188; goto _again; + tr217: cs = 189; goto _again; + tr215: cs = 190; goto _again; + tr218: cs = 191; goto _again; + tr220: cs = 192; goto _again; + tr222: cs = 193; goto _again; + tr223: cs = 194; goto _again; + tr221: cs = 195; goto _again; + tr224: cs = 196; goto _again; + tr225: cs = 197; goto _again; + tr227: cs = 198; goto _again; + tr228: cs = 199; goto _again; + tr226: cs = 200; goto _again; + tr229: cs = 201; goto _again; + tr230: cs = 202; goto _again; + tr232: cs = 203; goto _again; + tr233: cs = 204; goto _again; + tr231: cs = 205; goto _again; + tr234: cs = 206; goto _again; + tr235: cs = 207; goto _again; + tr237: cs = 208; goto _again; + tr238: cs = 209; goto _again; + tr236: cs = 210; goto _again; + tr239: cs = 211; goto _again; + tr241: cs = 212; goto _again; + tr243: cs = 213; goto _again; + tr244: cs = 214; goto _again; + tr242: cs = 215; goto _again; + tr245: cs = 216; goto f9; + tr247: cs = 217; goto _again; + tr251: cs = 218; goto _again; + tr252: cs = 219; goto _again; + tr254: cs = 220; goto _again; + tr255: cs = 221; goto _again; + tr257: cs = 222; goto _again; + tr258: cs = 223; goto _again; + tr260: cs = 224; goto _again; + tr256: cs = 225; goto _again; + tr261: cs = 226; goto _again; + tr253: cs = 227; goto _again; + tr262: cs = 228; goto _again; + tr248: cs = 229; goto _again; + tr263: cs = 230; goto _again; + tr265: cs = 231; goto _again; + tr249: cs = 232; goto _again; + tr266: cs = 233; goto _again; + tr267: cs = 234; goto _again; + tr269: cs = 235; goto _again; + tr270: cs = 236; goto _again; + tr264: cs = 237; goto _again; + tr250: cs = 238; goto _again; + tr240: cs = 239; goto _again; + tr271: cs = 240; goto _again; + tr272: cs = 241; goto _again; + tr274: cs = 242; goto _again; + tr275: cs = 243; goto _again; + tr273: cs = 244; goto _again; + tr276: cs = 245; goto _again; + tr277: cs = 246; goto _again; + tr279: cs = 247; goto _again; + tr280: cs = 248; goto _again; + tr278: cs = 249; goto _again; + tr281: cs = 250; goto _again; + tr282: cs = 251; goto _again; + tr284: cs = 252; goto _again; + tr285: cs = 253; goto _again; + tr283: cs = 254; goto _again; + tr286: cs = 255; goto _again; + tr287: cs = 256; goto _again; + tr289: cs = 257; goto _again; + tr290: cs = 258; goto _again; + tr288: cs = 259; goto _again; + tr291: cs = 260; goto _again; + tr292: cs = 261; goto _again; + tr293: cs = 262; goto _again; + tr294: cs = 263; goto _again; + tr246: cs = 264; goto _again; + tr219: cs = 265; goto _again; + tr295: cs = 266; goto f9; + tr297: cs = 267; goto _again; + tr300: cs = 268; goto _again; + tr302: cs = 269; goto _again; + tr298: cs = 270; goto _again; + tr303: cs = 271; goto f9; + tr305: cs = 272; goto _again; + tr308: cs = 273; goto _again; + tr310: cs = 274; goto _again; + tr306: cs = 275; goto _again; + tr311: cs = 276; goto f9; + tr313: cs = 277; goto _again; + tr316: cs = 278; goto _again; + tr318: cs = 279; goto _again; + tr314: cs = 280; goto _again; + tr319: cs = 281; goto f9; + tr321: cs = 282; goto _again; + tr324: cs = 283; goto _again; + tr326: cs = 284; goto _again; + tr322: cs = 285; goto _again; + tr327: cs = 286; goto f9; + tr328: cs = 287; goto _again; + tr329: cs = 288; goto _again; + tr325: cs = 289; goto _again; + tr323: cs = 290; goto _again; + tr320: cs = 291; goto _again; + tr317: cs = 292; goto _again; + tr315: cs = 293; goto _again; + tr312: cs = 294; goto _again; + tr309: cs = 295; goto _again; + tr307: cs = 296; goto _again; + tr304: cs = 297; goto _again; + tr301: cs = 298; goto _again; + tr299: cs = 299; goto _again; + tr296: cs = 300; goto _again; + tr213: cs = 301; goto f8; + tr171: cs = 302; goto f1; + tr333: cs = 303; goto _again; + tr330: cs = 303; goto f12; + tr338: cs = 303; goto f15; + tr334: cs = 304; goto f2; + tr331: cs = 304; goto f13; + tr339: cs = 304; goto f16; + tr335: cs = 305; goto _again; + tr332: cs = 305; goto f12; + tr340: cs = 305; goto f15; + tr337: cs = 306; goto _again; + tr173: cs = 307; goto _again; + tr341: cs = 308; goto _again; + tr342: cs = 309; goto _again; + tr343: cs = 310; goto _again; + tr344: cs = 311; goto _again; + tr5: cs = 312; goto _again; + tr345: cs = 313; goto _again; + tr346: cs = 314; goto _again; + tr347: cs = 315; goto _again; + tr348: cs = 316; goto _again; + tr12: cs = 317; goto _again; + tr9: cs = 317; goto f3; + tr351: cs = 318; goto _again; + tr349: cs = 318; goto f19; + tr352: cs = 318; goto f20; + tr353: cs = 318; goto f21; + tr354: cs = 318; goto f22; + tr21: cs = 319; goto f6; + tr32: cs = 319; goto f7; + tr88: cs = 319; goto f10; + tr97: cs = 319; goto f11; + tr182: cs = 320; goto f17; + tr192: cs = 320; goto f18; + tr172: cs = 321; goto _again; -f6: -#line 5 "src/ragel/smtp_addr_parser.rl" +f8: +#line 5 "../rspamd/src/ragel/smtp_addr_parser.rl" + {} + goto _again; +f9: +#line 7 "../rspamd/src/ragel/smtp_addr_parser.rl" + {} + goto _again; +f12: +#line 10 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->user = p; } goto _again; f2: -#line 9 "src/ragel/smtp_addr_parser.rl" +#line 14 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->user) { addr->user_len = p - addr->user; @@ -987,149 +7164,190 @@ f2: } goto _again; f3: -#line 15 "src/ragel/smtp_addr_parser.rl" +#line 20 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->domain = p; } goto _again; f4: -#line 25 "src/ragel/smtp_addr_parser.rl" +#line 30 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->domain = p; addr->flags |= RSPAMD_EMAIL_ADDR_IP; } goto _again; -f5: -#line 30 "src/ragel/smtp_addr_parser.rl" +f6: +#line 35 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->domain) { addr->domain_len = p - addr->domain; } } goto _again; -f9: -#line 36 "src/ragel/smtp_addr_parser.rl" +f15: +#line 41 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; } goto _again; -f8: -#line 40 "src/ragel/smtp_addr_parser.rl" +f14: +#line 45 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_QUOTED; } goto _again; f1: -#line 59 "src/ragel/smtp_addr_parser.rl" +#line 64 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->addr = p; } goto _again; -f12: -#line 63 "src/ragel/smtp_addr_parser.rl" +f18: +#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->addr) { addr->addr_len = p - addr->addr; } } goto _again; +f11: +#line 6 "../rspamd/src/ragel/smtp_addr_parser.rl" + {} +#line 35 "../rspamd/src/ragel/smtp_addr_parser.rl" + { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } + goto _again; f7: -#line 5 "src/ragel/smtp_addr_parser.rl" +#line 8 "../rspamd/src/ragel/smtp_addr_parser.rl" + {} +#line 35 "../rspamd/src/ragel/smtp_addr_parser.rl" + { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } + goto _again; +f13: +#line 10 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->user = p; } -#line 9 "src/ragel/smtp_addr_parser.rl" +#line 14 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->user) { addr->user_len = p - addr->user; } } goto _again; -f11: -#line 19 "src/ragel/smtp_addr_parser.rl" +f17: +#line 24 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->domain) { addr->domain_len = p - addr->domain; } } -#line 63 "src/ragel/smtp_addr_parser.rl" +#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->addr) { addr->addr_len = p - addr->addr; } } goto _again; -f10: -#line 36 "src/ragel/smtp_addr_parser.rl" +f5: +#line 30 "../rspamd/src/ragel/smtp_addr_parser.rl" + { + addr->domain = p; + addr->flags |= RSPAMD_EMAIL_ADDR_IP; + } +#line 7 "../rspamd/src/ragel/smtp_addr_parser.rl" + {} + goto _again; +f16: +#line 41 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; } -#line 9 "src/ragel/smtp_addr_parser.rl" +#line 14 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->user) { addr->user_len = p - addr->user; } } goto _again; -f16: -#line 44 "src/ragel/smtp_addr_parser.rl" +f22: +#line 49 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_EMPTY; addr->addr = ""; addr->user = addr->addr; addr->domain = addr->addr; } -#line 51 "src/ragel/smtp_addr_parser.rl" +#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_VALID; } goto _again; -f15: -#line 55 "src/ragel/smtp_addr_parser.rl" +f21: +#line 60 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_BRACED; } -#line 51 "src/ragel/smtp_addr_parser.rl" +#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_VALID; } goto _again; f0: -#line 59 "src/ragel/smtp_addr_parser.rl" +#line 64 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->addr = p; } -#line 5 "src/ragel/smtp_addr_parser.rl" +#line 10 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->user = p; } goto _again; -f14: -#line 63 "src/ragel/smtp_addr_parser.rl" +f20: +#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->addr) { addr->addr_len = p - addr->addr; } } -#line 51 "src/ragel/smtp_addr_parser.rl" +#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_VALID; } goto _again; -f13: -#line 19 "src/ragel/smtp_addr_parser.rl" +f10: +#line 8 "../rspamd/src/ragel/smtp_addr_parser.rl" + {} +#line 6 "../rspamd/src/ragel/smtp_addr_parser.rl" + {} +#line 35 "../rspamd/src/ragel/smtp_addr_parser.rl" + { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } + goto _again; +f19: +#line 24 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->domain) { addr->domain_len = p - addr->domain; } } -#line 63 "src/ragel/smtp_addr_parser.rl" +#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->addr) { addr->addr_len = p - addr->addr; } } -#line 51 "src/ragel/smtp_addr_parser.rl" +#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_VALID; } @@ -1144,67 +7362,67 @@ _again: if ( p == eof ) { switch ( _smtp_addr_parser_eof_actions[cs] ) { - case 17: -#line 44 "src/ragel/smtp_addr_parser.rl" + case 23: +#line 49 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_EMPTY; addr->addr = ""; addr->user = addr->addr; addr->domain = addr->addr; } -#line 51 "src/ragel/smtp_addr_parser.rl" +#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_VALID; } break; - case 16: -#line 55 "src/ragel/smtp_addr_parser.rl" + case 22: +#line 60 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_BRACED; } -#line 51 "src/ragel/smtp_addr_parser.rl" +#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_VALID; } break; - case 15: -#line 63 "src/ragel/smtp_addr_parser.rl" + case 21: +#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->addr) { addr->addr_len = p - addr->addr; } } -#line 51 "src/ragel/smtp_addr_parser.rl" +#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_VALID; } break; - case 14: -#line 19 "src/ragel/smtp_addr_parser.rl" + case 20: +#line 24 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->domain) { addr->domain_len = p - addr->domain; } } -#line 63 "src/ragel/smtp_addr_parser.rl" +#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" { if (addr->addr) { addr->addr_len = p - addr->addr; } } -#line 51 "src/ragel/smtp_addr_parser.rl" +#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_VALID; } break; -#line 1201 "src/libmime/parsers/smtp_addr_parser.c" +#line 7419 "../rspamd/src/libmime/parsers/smtp_addr_parser.c" } } _out: {} } -#line 90 "src/ragel/smtp_addr_parser.rl" +#line 95 "../rspamd/src/ragel/smtp_addr_parser.rl" return cs; } diff --git a/src/libmime/parsers/smtp_received_parser.c b/src/libmime/parsers/smtp_received_parser.c new file mode 100644 index 000000000..ffdfde8b4 --- /dev/null +++ b/src/libmime/parsers/smtp_received_parser.c @@ -0,0 +1,6765 @@ + +#line 1 "../rspamd/src/ragel/smtp_received_parser.rl" + +#line 201 "../rspamd/src/ragel/smtp_received_parser.rl" + + + +#line 9 "../rspamd/src/libmime/parsers/smtp_received_parser.c" +static const short _smtp_received_parser_key_offsets[] = { + 0, 0, 2, 4, 6, 8, 10, 11, + 12, 20, 32, 33, 34, 38, 57, 58, + 59, 67, 75, 75, 84, 86, 92, 93, + 94, 98, 100, 102, 103, 104, 112, 125, + 126, 127, 152, 168, 169, 170, 185, 203, + 204, 205, 208, 216, 217, 218, 226, 230, + 230, 235, 237, 246, 248, 248, 257, 259, + 264, 266, 269, 270, 271, 280, 281, 282, + 290, 292, 296, 297, 298, 307, 309, 310, + 312, 313, 314, 317, 319, 321, 323, 327, + 328, 329, 332, 334, 335, 337, 339, 340, + 342, 344, 346, 347, 348, 351, 353, 355, + 357, 359, 360, 361, 369, 370, 371, 379, + 379, 388, 390, 392, 392, 394, 403, 405, + 405, 410, 412, 415, 415, 420, 422, 425, + 430, 430, 435, 437, 440, 441, 442, 443, + 444, 445, 447, 448, 450, 451, 453, 454, + 455, 456, 457, 458, 459, 459, 470, 472, + 475, 477, 479, 482, 484, 486, 488, 490, + 493, 494, 495, 496, 500, 501, 502, 505, + 505, 510, 512, 515, 516, 517, 519, 520, + 522, 523, 524, 525, 526, 526, 536, 538, + 541, 543, 545, 548, 551, 553, 555, 555, + 565, 567, 570, 572, 574, 577, 580, 582, + 584, 603, 607, 611, 615, 617, 621, 621, + 638, 640, 659, 661, 666, 683, 702, 703, + 704, 712, 720, 720, 729, 731, 758, 759, + 760, 785, 803, 822, 839, 840, 841, 857, + 875, 894, 909, 923, 937, 944, 957, 958, + 959, 976, 984, 985, 986, 994, 1012, 1012, + 1031, 1033, 1050, 1052, 1061, 1063, 1063, 1072, + 1074, 1093, 1095, 1098, 1100, 1109, 1117, 1124, + 1138, 1147, 1155, 1164, 1168, 1173, 1177, 1187, + 1189, 1192, 1194, 1197, 1199, 1202, 1205, 1206, + 1209, 1210, 1213, 1214, 1224, 1234, 1244, 1254, + 1264, 1273, 1290, 1308, 1326, 1344, 1350, 1368, + 1386, 1404, 1422, 1428, 1446, 1464, 1482, 1500, + 1506, 1524, 1542, 1560, 1578, 1584, 1602, 1620, + 1638, 1656, 1662, 1680, 1698, 1716, 1734, 1740, + 1758, 1777, 1786, 1796, 1805, 1815, 1824, 1833, + 1842, 1847, 1857, 1863, 1873, 1879, 1898, 1917, + 1923, 1940, 1957, 1974, 1991, 1996, 2014, 2032, + 2049, 2067, 2085, 2103, 2109, 2126, 2144, 2162, + 2180, 2186, 2203, 2221, 2239, 2257, 2263, 2280, + 2298, 2316, 2334, 2340, 2357, 2375, 2393, 2411, + 2417, 2435, 2452, 2471, 2490, 2509, 2515, 2532, + 2551, 2570, 2589, 2595, 2612, 2631, 2650, 2669, + 2675, 2692, 2711, 2730, 2749, 2755, 2772, 2791, + 2810, 2829, 2847, 2865, 2883, 2901, 2919, 2937, + 2955, 2973, 2991, 3009, 3027, 3045, 3051, 3059, + 3063, 3067, 3072, 3074, 3078, 3092, 3106, 3120, + 3127, 3137, 3145, 3151, 3155, 3164, 3172, 3181, + 3185, 3190, 3191, 3201, 3203, 3206, 3208, 3211, + 3213, 3216, 3219, 3220, 3223, 3224, 3227, 3228, + 3238, 3248, 3258, 3268, 3278, 3287, 3304, 3322, + 3340, 3358, 3364, 3382, 3400, 3418, 3436, 3442, + 3460, 3478, 3496, 3514, 3520, 3538, 3556, 3574, + 3592, 3598, 3616, 3634, 3652, 3670, 3676, 3694, + 3712, 3730, 3748, 3754, 3772, 3791, 3800, 3810, + 3819, 3829, 3838, 3847, 3856, 3861, 3871, 3877, + 3887, 3893, 3912, 3931, 3937, 3954, 3971, 3988, + 4005, 4010, 4028, 4046, 4063, 4081, 4099, 4117, + 4123, 4140, 4158, 4176, 4194, 4200, 4217, 4235, + 4253, 4271, 4277, 4294, 4312, 4330, 4348, 4354, + 4371, 4389, 4407, 4425, 4431, 4449, 4466, 4485, + 4504, 4523, 4529, 4546, 4565, 4584, 4603, 4609, + 4626, 4645, 4664, 4683, 4689, 4706, 4725, 4744, + 4763, 4769, 4786, 4805, 4824, 4843, 4861, 4879, + 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, + 5041, 5059, 5065, 5069, 5073, 5074, 5076, 5080, + 5086, 5097, 5098, 5106, 5120, 5126, 5137, 5138, + 5146, 5160, 5164, 5168, 5169, 5171, 5175, 5177, + 5177, 5195, 5197, 5216, 5218, 5223, 5238, 5245, + 5262, 5264, 5282, 5299, 5300, 5301, 5317, 5335, + 5336, 5337, 5356, 5364, 5365, 5366, 5374, 5394, + 5394, 5415, 5417, 5434, 5436, 5445, 5447, 5447, + 5456, 5458, 5479, 5481, 5484, 5486, 5505, 5524, + 5538, 5552, 5567, 5582, 5596, 5600, 5605, 5606, + 5608, 5608, 5626, 5628, 5647, 5649, 5654, 5669, + 5686, 5688, 5706, 5725, 5742, 5743, 5744, 5759, + 5777, 5778, 5779, 5802, 5810, 5811, 5812, 5820, + 5844, 5844, 5869, 5871, 5888, 5890, 5899, 5901, + 5901, 5910, 5912, 5937, 5939, 5942, 5944, 5963, + 5982, 6001, 6020, 6039, 6056, 6057, 6058, 6077, + 6095, 6096, 6097, 6118, 6126, 6127, 6128, 6136, + 6158, 6158, 6181, 6183, 6200, 6202, 6211, 6213, + 6213, 6222, 6224, 6247, 6249, 6252, 6254, 6273, + 6292, 6311, 6330, 6350, 6370, 6390, 6410, 6429, + 6448, 6468, 6488, 6507, 6526, 6546, 6566, 6585, + 6604, 6624, 6644, 6663, 6665, 6665, 6686, 6688, + 6707, 6709, 6714, 6734, 6754, 6774, 6794, 6811, + 6813, 6831, 6850, 6852, 6852, 6869, 6871, 6890, + 6892, 6897, 6914, 6916, 6918, 6918, 6945, 6947, + 6964, 6966, 6975, 6977, 6980, 6982, 7001, 7020, + 7039, 7058, 7084, 7108, 7109, 7110, 7119, 7141, + 7163, 7186, 7197, 7208, 7214, 7219, 7220, 7224, + 7250, 7271, 7292, 7298, 7300, 7306, 7317, 7326, + 7353, 7361, 7367, 7369, 7392, 7415, 7436, 7457, + 7463, 7465, 7488, 7509, 7530, 7536, 7538, 7561, + 7584, 7605, 7626, 7632, 7634, 7657, 7680, 7703, + 7724, 7745, 7751, 7753, 7755, 7779, 7792, 7806, + 7819, 7833, 7846, 7860, 7874, 7884, 7898, 7908, + 7922, 7932, 7956, 7980, 8004, 8028, 8052, 8075, + 8099, 8123, 8147, 8171, 8183, 8207, 8231, 8255, + 8279, 8291, 8315, 8339, 8363, 8387, 8399, 8423, + 8447, 8471, 8495, 8507, 8531, 8555, 8579, 8603, + 8615, 8639, 8663, 8687, 8711, 8723, 8747, 8772, + 8787, 8803, 8818, 8834, 8849, 8864, 8879, 8890, + 8906, 8918, 8934, 8946, 8971, 8996, 9008, 9031, + 9054, 9077, 9100, 9111, 9135, 9159, 9182, 9206, + 9230, 9254, 9266, 9289, 9313, 9337, 9361, 9373, + 9396, 9420, 9444, 9468, 9480, 9503, 9527, 9551, + 9575, 9587, 9610, 9634, 9658, 9682, 9694, 9718, + 9741, 9766, 9791, 9816, 9828, 9851, 9876, 9901, + 9926, 9938, 9961, 9986, 10011, 10036, 10048, 10071, + 10096, 10121, 10146, 10158, 10181, 10206, 10231, 10256, + 10280, 10304, 10328, 10352, 10376, 10400, 10424, 10448, + 10472, 10496, 10520, 10544, 10556, 10558, 10558, 10569, + 10571, 10580, 10582, 10609, 10611, 10634, 10656, 10678, + 10698, 10722, 10745, 10745, 10772, 10774, 10791, 10793, + 10813, 10815, 10818, 10820, 10839, 10858, 10877, 10896, + 10905, 10914, 10922, 10929, 10943, 10952, 10960, 10969, + 10973, 10978, 10980, 10981, 10982, 10984, 10991, 11002, + 11003, 11004, 11006, 11015, 11023, 11032, 11036, 11046, + 11048, 11051, 11053, 11056, 11058, 11061, 11064, 11065, + 11068, 11069, 11072, 11073, 11083, 11093, 11103, 11113, + 11123, 11132, 11149, 11167, 11185, 11203, 11209, 11227, + 11245, 11263, 11281, 11287, 11305, 11323, 11341, 11359, + 11365, 11383, 11401, 11419, 11437, 11443, 11461, 11479, + 11497, 11515, 11521, 11539, 11557, 11575, 11593, 11599, + 11617, 11636, 11645, 11655, 11664, 11674, 11683, 11692, + 11701, 11706, 11716, 11722, 11732, 11738, 11757, 11776, + 11782, 11799, 11816, 11833, 11850, 11855, 11873, 11891, + 11908, 11926, 11944, 11962, 11968, 11985, 12003, 12021, + 12039, 12045, 12062, 12080, 12098, 12116, 12122, 12139, + 12157, 12175, 12193, 12199, 12216, 12234, 12252, 12270, + 12276, 12294, 12311, 12330, 12349, 12368, 12374, 12391, + 12410, 12429, 12448, 12454, 12471, 12490, 12509, 12528, + 12534, 12551, 12570, 12589, 12608, 12614, 12631, 12650, + 12669, 12688, 12706, 12724, 12742, 12760, 12778, 12796, + 12814, 12832, 12850, 12868, 12886, 12904, 12910, 12910, + 12914, 12916, 12926, 12935, 12943, 12950, 12962, 12962, + 12966, 12968, 12976, 12986, 12988, 12991, 12993, 12996, + 12998, 13001, 13004, 13005, 13008, 13009, 13012, 13013, + 13023, 13033, 13043, 13053, 13063, 13072, 13089, 13107, + 13125, 13143, 13149, 13167, 13185, 13203, 13221, 13227, + 13245, 13263, 13281, 13299, 13305, 13323, 13341, 13359, + 13377, 13383, 13401, 13419, 13437, 13455, 13461, 13479, + 13497, 13515, 13533, 13539, 13557, 13576, 13585, 13595, + 13604, 13614, 13623, 13632, 13641, 13646, 13656, 13662, + 13672, 13678, 13697, 13716, 13722, 13739, 13756, 13773, + 13790, 13795, 13813, 13831, 13848, 13866, 13884, 13902, + 13908, 13925, 13943, 13961, 13979, 13985, 14002, 14020, + 14038, 14056, 14062, 14079, 14097, 14115, 14133, 14139, + 14156, 14174, 14192, 14210, 14216, 14234, 14251, 14270, + 14289, 14308, 14314, 14331, 14350, 14369, 14388, 14394, + 14411, 14430, 14449, 14468, 14474, 14491, 14510, 14529, + 14548, 14554, 14571, 14590, 14609, 14628, 14646, 14664, + 14682, 14700, 14718, 14736, 14754, 14772, 14790, 14808, + 14826, 14844, 14850, 14850, 14860, 14862, 14876, 14878, + 14888, 14890, 14890, 14896, 14898, 14907, 14909, 14912, + 14917, 14941, 14942, 14943, 14952, 14974, 14996, 15019, + 15030, 15041, 15047, 15052, 15053, 15056, 15067, 15073, + 15084, 15093, 15099, 15107, 15114, 15120, 15122, 15124, + 15148, 15161, 15175, 15188, 15202, 15215, 15229, 15243, + 15253, 15267, 15277, 15291, 15301, 15325, 15349, 15373, + 15397, 15421, 15444, 15468, 15492, 15516, 15540, 15552, + 15576, 15600, 15624, 15648, 15660, 15684, 15708, 15732, + 15756, 15768, 15792, 15816, 15840, 15864, 15876, 15900, + 15924, 15948, 15972, 15984, 16008, 16032, 16056, 16080, + 16092, 16116, 16141, 16156, 16172, 16187, 16203, 16218, + 16233, 16248, 16259, 16275, 16287, 16303, 16315, 16340, + 16365, 16377, 16400, 16423, 16446, 16469, 16480, 16504, + 16528, 16551, 16575, 16599, 16623, 16635, 16658, 16682, + 16706, 16730, 16742, 16765, 16789, 16813, 16837, 16849, + 16872, 16896, 16920, 16944, 16956, 16979, 17003, 17027, + 17051, 17063, 17087, 17110, 17135, 17160, 17185, 17197, + 17220, 17245, 17270, 17295, 17307, 17330, 17355, 17380, + 17405, 17417, 17440, 17465, 17490, 17515, 17527, 17550, + 17575, 17600, 17625, 17649, 17673, 17697, 17721, 17745, + 17769, 17793, 17817, 17841, 17865, 17889, 17913, 17925, + 17927, 17927, 17938, 17940, 17949, 17951, 17957, 17959, + 17982, 18004, 18026, 18046, 18070, 18093, 18093, 18099, + 18101, 18121, 18123, 18126, 18135, 18144, 18152, 18159, + 18172, 18181, 18189, 18198, 18202, 18207, 18209, 18210, + 18211, 18213, 18220, 18231, 18232, 18233, 18235, 18244, + 18252, 18261, 18265, 18275, 18277, 18280, 18282, 18285, + 18287, 18290, 18293, 18294, 18297, 18298, 18301, 18302, + 18312, 18322, 18332, 18342, 18352, 18361, 18378, 18396, + 18414, 18432, 18438, 18456, 18474, 18492, 18510, 18516, + 18534, 18552, 18570, 18588, 18594, 18612, 18630, 18648, + 18666, 18672, 18690, 18708, 18726, 18744, 18750, 18768, + 18786, 18804, 18822, 18828, 18846, 18865, 18874, 18884, + 18893, 18903, 18912, 18921, 18930, 18935, 18945, 18951, + 18961, 18967, 18986, 19005, 19011, 19028, 19045, 19062, + 19079, 19084, 19102, 19120, 19137, 19155, 19173, 19191, + 19197, 19214, 19232, 19250, 19268, 19274, 19291, 19309, + 19327, 19345, 19351, 19368, 19386, 19404, 19422, 19428, + 19445, 19463, 19481, 19499, 19505, 19523, 19540, 19559, + 19578, 19597, 19603, 19620, 19639, 19658, 19677, 19683, + 19700, 19719, 19738, 19757, 19763, 19780, 19799, 19818, + 19837, 19843, 19860, 19879, 19898, 19917, 19935, 19953, + 19971, 19989, 20007, 20025, 20043, 20061, 20079, 20097, + 20115, 20133, 20139, 20139, 20143, 20145, 20155, 20164, + 20172, 20179, 20191, 20191, 20195, 20197, 20205, 20215, + 20217, 20220, 20222, 20225, 20227, 20230, 20233, 20234, + 20237, 20238, 20241, 20242, 20252, 20262, 20272, 20282, + 20292, 20301, 20318, 20336, 20354, 20372, 20378, 20396, + 20414, 20432, 20450, 20456, 20474, 20492, 20510, 20528, + 20534, 20552, 20570, 20588, 20606, 20612, 20630, 20648, + 20666, 20684, 20690, 20708, 20726, 20744, 20762, 20768, + 20786, 20805, 20814, 20824, 20833, 20843, 20852, 20861, + 20870, 20875, 20885, 20891, 20901, 20907, 20926, 20945, + 20951, 20968, 20985, 21002, 21019, 21024, 21042, 21060, + 21077, 21095, 21113, 21131, 21137, 21154, 21172, 21190, + 21208, 21214, 21231, 21249, 21267, 21285, 21291, 21308, + 21326, 21344, 21362, 21368, 21385, 21403, 21421, 21439, + 21445, 21463, 21480, 21499, 21518, 21537, 21543, 21560, + 21579, 21598, 21617, 21623, 21640, 21659, 21678, 21697, + 21703, 21720, 21739, 21758, 21777, 21783, 21800, 21819, + 21838, 21857, 21875, 21893, 21911, 21929, 21947, 21965, + 21983, 22001, 22019, 22037, 22055, 22073, 22079, 22079, + 22089, 22091, 22104, 22106, 22116, 22119, 22121, 22125 +}; + +static const char _smtp_received_parser_trans_keys[] = { + 70, 102, 82, 114, 79, 111, 77, 109, + 13, 32, 10, 32, 32, 91, 48, 57, + 65, 90, 97, 122, 13, 32, 40, 45, + 46, 95, 48, 57, 65, 90, 97, 122, + 10, 32, 32, 40, 66, 98, 13, 41, + 91, 32, 39, 42, 47, 48, 57, 58, + 64, 65, 90, 93, 96, 97, 122, 123, + 126, 10, 32, 32, 41, 33, 39, 42, + 91, 93, 126, 13, 41, 32, 39, 42, + 91, 93, 126, 10, 13, 41, 32, 39, + 42, 91, 93, 126, 10, 32, 10, 13, + 32, 40, 66, 98, 10, 32, 32, 40, + 66, 98, 89, 121, 13, 32, 10, 32, + 32, 91, 48, 57, 65, 90, 97, 122, + 13, 32, 40, 45, 46, 59, 95, 48, + 57, 65, 90, 97, 122, 10, 32, 32, + 33, 40, 45, 59, 61, 63, 70, 73, + 86, 87, 102, 105, 118, 119, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 13, 32, 33, 45, 61, 63, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 10, 32, 32, 34, 45, 61, 63, 33, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 13, 32, 33, 40, 45, 59, 61, + 63, 35, 39, 42, 43, 47, 57, 65, + 90, 94, 126, 10, 32, 32, 40, 59, + 13, 41, 32, 39, 42, 91, 93, 126, + 10, 32, 32, 41, 33, 39, 42, 91, + 93, 126, 13, 32, 40, 59, 10, 13, + 32, 40, 59, 10, 32, 10, 13, 41, + 32, 39, 42, 91, 93, 126, 10, 32, + 10, 13, 41, 32, 39, 42, 91, 93, + 126, 10, 32, 10, 13, 32, 40, 59, + 10, 32, 10, 13, 32, 10, 32, 13, + 32, 70, 77, 83, 84, 87, 48, 57, + 10, 32, 32, 70, 77, 83, 84, 87, + 48, 57, 48, 57, 13, 32, 48, 57, + 10, 32, 32, 65, 68, 70, 74, 77, + 78, 79, 83, 112, 117, 114, 13, 32, + 10, 32, 32, 48, 57, 48, 57, 48, + 57, 48, 57, 13, 32, 48, 57, 10, + 32, 32, 48, 57, 48, 57, 58, 48, + 57, 48, 57, 58, 48, 57, 48, 57, + 13, 32, 10, 32, 32, 43, 95, 48, + 57, 48, 57, 48, 57, 48, 57, 10, + 32, 13, 41, 32, 39, 42, 91, 93, + 126, 10, 32, 32, 41, 33, 39, 42, + 91, 93, 126, 10, 13, 41, 32, 39, + 42, 91, 93, 126, 10, 32, 10, 32, + 10, 32, 10, 13, 41, 32, 39, 42, + 91, 93, 126, 10, 32, 10, 13, 32, + 43, 95, 10, 32, 10, 48, 57, 10, + 13, 32, 48, 57, 10, 32, 10, 48, + 57, 10, 13, 32, 48, 57, 10, 13, + 32, 48, 57, 10, 32, 10, 48, 57, + 103, 101, 99, 101, 98, 97, 117, 110, + 108, 110, 97, 114, 121, 111, 118, 99, + 116, 101, 112, 10, 13, 32, 65, 68, + 70, 74, 77, 78, 79, 83, 10, 32, + 10, 112, 117, 10, 101, 10, 101, 10, + 97, 117, 10, 97, 10, 111, 10, 99, + 10, 101, 10, 48, 57, 114, 105, 44, + 13, 32, 48, 57, 10, 32, 32, 48, + 57, 10, 13, 32, 48, 57, 10, 32, + 10, 48, 57, 111, 110, 97, 117, 116, + 104, 117, 117, 101, 101, 100, 10, 13, + 32, 70, 77, 83, 84, 87, 48, 57, + 10, 32, 10, 48, 57, 10, 114, 10, + 111, 10, 97, 117, 10, 104, 117, 10, + 101, 10, 32, 10, 13, 32, 70, 77, + 83, 84, 87, 48, 57, 10, 32, 10, + 48, 57, 10, 114, 10, 111, 10, 97, + 117, 10, 104, 117, 10, 101, 13, 32, + 10, 13, 32, 33, 40, 45, 59, 61, + 63, 35, 39, 42, 43, 47, 57, 65, + 90, 94, 126, 34, 92, 32, 126, 34, + 92, 32, 126, 13, 32, 40, 59, 32, + 126, 34, 92, 32, 126, 10, 13, 32, + 34, 45, 61, 63, 33, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 32, + 10, 13, 32, 33, 40, 45, 59, 61, + 63, 35, 39, 42, 43, 47, 57, 65, + 90, 94, 126, 10, 32, 10, 34, 92, + 32, 126, 10, 13, 32, 33, 45, 61, + 63, 35, 39, 42, 43, 47, 57, 65, + 90, 94, 126, 13, 41, 91, 32, 39, + 42, 47, 48, 57, 58, 64, 65, 90, + 93, 96, 97, 122, 123, 126, 10, 32, + 32, 41, 33, 39, 42, 91, 93, 126, + 13, 41, 32, 39, 42, 91, 93, 126, + 10, 13, 41, 32, 39, 42, 91, 93, + 126, 10, 32, 10, 13, 32, 33, 40, + 45, 59, 61, 63, 70, 73, 86, 87, + 102, 105, 118, 119, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 32, + 32, 33, 40, 45, 59, 61, 63, 70, + 73, 86, 87, 102, 105, 118, 119, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 13, 32, 33, 45, 61, 63, 79, + 111, 35, 39, 42, 43, 47, 57, 65, + 90, 94, 126, 10, 13, 32, 33, 45, + 61, 63, 82, 114, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 13, + 32, 33, 45, 61, 63, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 32, 32, 34, 45, 60, 61, 64, 33, + 39, 42, 43, 47, 57, 63, 90, 94, + 126, 13, 32, 33, 40, 46, 59, 61, + 64, 35, 39, 42, 43, 45, 57, 63, + 90, 94, 126, 10, 13, 32, 33, 40, + 46, 59, 61, 64, 35, 39, 42, 43, + 45, 57, 63, 90, 94, 126, 10, 33, + 45, 61, 63, 35, 39, 42, 43, 47, + 57, 65, 90, 94, 126, 33, 46, 61, + 64, 35, 39, 42, 43, 45, 57, 63, + 90, 94, 126, 33, 45, 61, 63, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 91, 48, 57, 65, 90, 97, 122, + 13, 32, 40, 45, 46, 59, 95, 48, + 57, 65, 90, 97, 122, 10, 32, 32, + 33, 40, 45, 59, 61, 63, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 13, 41, 32, 39, 42, 91, 93, 126, + 10, 32, 32, 41, 33, 39, 42, 91, + 93, 126, 13, 32, 33, 40, 45, 59, + 61, 63, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 10, 13, 32, 33, + 40, 45, 59, 61, 63, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 32, 10, 13, 32, 33, 45, 61, 63, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 32, 10, 13, 41, 32, + 39, 42, 91, 93, 126, 10, 32, 10, + 13, 41, 32, 39, 42, 91, 93, 126, + 10, 32, 10, 13, 32, 33, 40, 45, + 59, 61, 63, 35, 39, 42, 43, 47, + 57, 65, 90, 94, 126, 10, 32, 10, + 13, 32, 10, 32, 10, 45, 95, 48, + 57, 65, 90, 97, 122, 45, 95, 48, + 57, 65, 90, 97, 122, 10, 48, 57, + 65, 90, 97, 122, 10, 13, 32, 40, + 45, 46, 59, 95, 48, 57, 65, 90, + 97, 122, 45, 73, 95, 48, 57, 65, + 90, 97, 122, 45, 95, 48, 57, 65, + 90, 97, 122, 45, 58, 95, 48, 57, + 65, 90, 97, 122, 33, 90, 94, 126, + 93, 33, 90, 94, 126, 13, 32, 40, + 59, 45, 46, 58, 95, 48, 57, 65, + 90, 97, 122, 48, 57, 46, 48, 57, + 48, 57, 46, 48, 57, 48, 57, 93, + 48, 57, 93, 48, 57, 93, 46, 48, + 57, 46, 46, 48, 57, 46, 45, 46, + 58, 95, 48, 57, 65, 90, 97, 122, + 45, 46, 58, 95, 48, 57, 65, 90, + 97, 122, 45, 58, 80, 95, 48, 57, + 65, 90, 97, 122, 45, 58, 95, 118, + 48, 57, 65, 90, 97, 122, 45, 54, + 58, 95, 48, 57, 65, 90, 97, 122, + 45, 58, 95, 48, 57, 65, 90, 97, + 122, 58, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 90, 94, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 93, 33, 47, 48, 57, 58, 90, + 94, 126, 46, 93, 33, 47, 48, 57, + 58, 90, 94, 126, 93, 33, 47, 48, + 57, 58, 90, 94, 126, 46, 93, 33, + 47, 48, 57, 58, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 93, 33, 47, 48, 57, 58, 90, + 94, 126, 93, 33, 90, 94, 126, 46, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 46, 93, 33, 90, 94, 126, 46, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 46, 93, 33, 90, 94, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 93, + 33, 90, 94, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 93, 33, 47, 48, 57, 58, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 90, 94, 126, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 10, 91, 48, 57, 65, + 90, 97, 122, 34, 92, 32, 126, 34, + 92, 32, 126, 13, 32, 40, 59, 64, + 32, 126, 34, 92, 32, 126, 34, 45, + 61, 64, 33, 39, 42, 43, 47, 57, + 63, 90, 94, 126, 33, 46, 61, 64, + 35, 39, 42, 43, 45, 57, 63, 90, + 94, 126, 33, 45, 61, 63, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 91, 48, 57, 65, 90, 97, 122, 45, + 46, 62, 95, 48, 57, 65, 90, 97, + 122, 45, 95, 48, 57, 65, 90, 97, + 122, 48, 57, 65, 90, 97, 122, 13, + 32, 40, 59, 45, 73, 95, 48, 57, + 65, 90, 97, 122, 45, 95, 48, 57, + 65, 90, 97, 122, 45, 58, 95, 48, + 57, 65, 90, 97, 122, 33, 90, 94, + 126, 93, 33, 90, 94, 126, 62, 45, + 46, 58, 95, 48, 57, 65, 90, 97, + 122, 48, 57, 46, 48, 57, 48, 57, + 46, 48, 57, 48, 57, 93, 48, 57, + 93, 48, 57, 93, 46, 48, 57, 46, + 46, 48, 57, 46, 45, 46, 58, 95, + 48, 57, 65, 90, 97, 122, 45, 46, + 58, 95, 48, 57, 65, 90, 97, 122, + 45, 58, 80, 95, 48, 57, 65, 90, + 97, 122, 45, 58, 95, 118, 48, 57, + 65, 90, 97, 122, 45, 54, 58, 95, + 48, 57, 65, 90, 97, 122, 45, 58, + 95, 48, 57, 65, 90, 97, 122, 58, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 90, 94, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 46, 93, 33, 47, 48, 57, 58, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 90, 94, 126, 46, 93, 33, 47, 48, + 57, 58, 90, 94, 126, 93, 33, 47, + 48, 57, 58, 90, 94, 126, 93, 33, + 47, 48, 57, 58, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 93, 33, 90, 94, 126, 46, 93, 33, + 47, 48, 57, 58, 90, 94, 126, 46, + 93, 33, 90, 94, 126, 46, 93, 33, + 47, 48, 57, 58, 90, 94, 126, 46, + 93, 33, 90, 94, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 93, 33, 90, + 94, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 90, 94, 126, + 93, 33, 47, 48, 57, 58, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 90, 94, 126, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 34, 92, 32, 126, 34, 92, 32, + 126, 64, 32, 126, 34, 92, 32, 126, + 48, 57, 65, 90, 97, 122, 44, 45, + 46, 58, 95, 48, 57, 65, 90, 97, + 122, 64, 45, 95, 48, 57, 65, 90, + 97, 122, 34, 45, 61, 63, 33, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 48, 57, 65, 90, 97, 122, 44, 45, + 46, 58, 95, 48, 57, 65, 90, 97, + 122, 64, 45, 95, 48, 57, 65, 90, + 97, 122, 34, 45, 61, 63, 33, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 34, 92, 32, 126, 34, 92, 32, 126, + 64, 32, 126, 34, 92, 32, 126, 10, + 32, 10, 13, 32, 34, 45, 60, 61, + 64, 33, 39, 42, 43, 47, 57, 63, + 90, 94, 126, 10, 32, 10, 13, 32, + 33, 40, 46, 59, 61, 64, 35, 39, + 42, 43, 45, 57, 63, 90, 94, 126, + 10, 32, 10, 34, 92, 32, 126, 10, + 34, 45, 61, 64, 33, 39, 42, 43, + 47, 57, 63, 90, 94, 126, 10, 48, + 57, 65, 90, 97, 122, 10, 13, 32, + 33, 45, 61, 63, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 32, + 13, 32, 33, 45, 61, 63, 68, 100, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 13, 32, 33, 45, 61, + 63, 35, 39, 42, 43, 47, 57, 65, + 90, 94, 126, 10, 32, 32, 34, 45, + 60, 61, 63, 33, 39, 42, 43, 47, + 57, 65, 90, 94, 126, 13, 32, 33, + 40, 45, 59, 61, 63, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 32, 32, 33, 40, 45, 59, 61, 63, + 70, 102, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 13, 41, 32, 39, + 42, 91, 93, 126, 10, 32, 32, 41, + 33, 39, 42, 91, 93, 126, 13, 32, + 33, 40, 45, 59, 61, 63, 70, 102, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 13, 32, 33, 40, 45, + 59, 61, 63, 70, 102, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 32, 10, 13, 32, 33, 45, 61, 63, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 32, 10, 13, 41, 32, + 39, 42, 91, 93, 126, 10, 32, 10, + 13, 41, 32, 39, 42, 91, 93, 126, + 10, 32, 10, 13, 32, 33, 40, 45, + 59, 61, 63, 70, 102, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 32, 10, 13, 32, 10, 32, 10, 13, + 32, 33, 45, 61, 63, 79, 111, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 10, 13, 32, 33, 40, 45, 59, + 61, 63, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 33, 45, 61, 63, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 33, 46, 61, 64, 35, 39, + 42, 43, 45, 57, 63, 90, 94, 126, + 33, 45, 61, 63, 91, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 33, + 46, 62, 35, 39, 42, 43, 45, 57, + 61, 63, 65, 90, 94, 126, 33, 45, + 61, 63, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 13, 32, 40, 59, + 93, 33, 90, 94, 126, 62, 10, 32, + 10, 13, 32, 34, 45, 60, 61, 63, + 33, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 32, 10, 13, 32, 33, + 40, 45, 59, 61, 63, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 32, 10, 34, 92, 32, 126, 10, 33, + 45, 61, 63, 35, 39, 42, 43, 47, + 57, 65, 90, 94, 126, 10, 13, 32, + 33, 45, 61, 63, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 32, + 13, 32, 33, 45, 61, 63, 73, 105, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 13, 32, 33, 45, 61, + 63, 65, 97, 35, 39, 42, 43, 47, + 57, 66, 90, 94, 126, 10, 13, 32, + 33, 45, 61, 63, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 32, + 32, 34, 45, 61, 63, 33, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 13, + 32, 33, 40, 45, 59, 61, 63, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 10, 32, 32, 33, 40, 45, 59, + 61, 63, 70, 73, 87, 102, 105, 119, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 13, 41, 32, 39, 42, 91, + 93, 126, 10, 32, 32, 41, 33, 39, + 42, 91, 93, 126, 13, 32, 33, 40, + 45, 59, 61, 63, 70, 73, 87, 102, + 105, 119, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 10, 13, 32, 33, + 40, 45, 59, 61, 63, 70, 73, 87, + 102, 105, 119, 35, 39, 42, 43, 47, + 57, 65, 90, 94, 126, 10, 32, 10, + 13, 32, 33, 45, 61, 63, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 10, 32, 10, 13, 41, 32, 39, 42, + 91, 93, 126, 10, 32, 10, 13, 41, + 32, 39, 42, 91, 93, 126, 10, 32, + 10, 13, 32, 33, 40, 45, 59, 61, + 63, 70, 73, 87, 102, 105, 119, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 10, 32, 10, 13, 32, 10, 32, + 10, 13, 32, 33, 45, 61, 63, 79, + 111, 35, 39, 42, 43, 47, 57, 65, + 90, 94, 126, 10, 13, 32, 33, 45, + 61, 63, 68, 100, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 13, + 32, 33, 45, 61, 63, 73, 105, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 10, 13, 32, 33, 45, 61, 63, + 84, 116, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 10, 13, 32, 33, + 45, 61, 63, 72, 104, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 13, 32, 33, 45, 61, 63, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 10, 32, 32, 34, 45, 61, 63, 69, + 73, 76, 83, 33, 39, 42, 43, 47, + 57, 65, 90, 94, 126, 13, 32, 33, + 40, 45, 59, 61, 63, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 32, 32, 33, 40, 45, 59, 61, 63, + 70, 73, 102, 105, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 13, 41, + 32, 39, 42, 91, 93, 126, 10, 32, + 32, 41, 33, 39, 42, 91, 93, 126, + 13, 32, 33, 40, 45, 59, 61, 63, + 70, 73, 102, 105, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 13, + 32, 33, 40, 45, 59, 61, 63, 70, + 73, 102, 105, 35, 39, 42, 43, 47, + 57, 65, 90, 94, 126, 10, 32, 10, + 13, 32, 33, 45, 61, 63, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 10, 32, 10, 13, 41, 32, 39, 42, + 91, 93, 126, 10, 32, 10, 13, 41, + 32, 39, 42, 91, 93, 126, 10, 32, + 10, 13, 32, 33, 40, 45, 59, 61, + 63, 70, 73, 102, 105, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 32, 10, 13, 32, 10, 32, 10, 13, + 32, 33, 45, 61, 63, 79, 111, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 10, 13, 32, 33, 45, 61, 63, + 68, 100, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 10, 13, 32, 33, + 40, 45, 59, 61, 63, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 13, + 32, 33, 40, 45, 59, 61, 63, 83, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 13, 32, 33, 40, 45, + 59, 61, 63, 77, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 13, + 32, 33, 40, 45, 59, 61, 63, 84, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 13, 32, 33, 40, 45, + 59, 61, 63, 80, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 13, + 32, 33, 40, 45, 59, 61, 63, 83, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 13, 32, 33, 40, 45, + 59, 61, 63, 35, 39, 42, 43, 47, + 57, 65, 90, 94, 126, 13, 32, 33, + 40, 45, 59, 61, 63, 77, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 10, 13, 32, 33, 40, 45, 59, 61, + 63, 65, 35, 39, 42, 43, 47, 57, + 66, 90, 94, 126, 10, 13, 32, 33, + 40, 45, 59, 61, 63, 80, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 10, 13, 32, 33, 40, 45, 59, 61, + 63, 35, 39, 42, 43, 47, 57, 65, + 90, 94, 126, 13, 32, 33, 40, 45, + 59, 61, 63, 77, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 13, + 32, 33, 40, 45, 59, 61, 63, 84, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 13, 32, 33, 40, 45, + 59, 61, 63, 80, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 13, + 32, 33, 40, 45, 59, 61, 63, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 13, 32, 33, 40, 45, 59, 61, + 63, 77, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 10, 13, 32, 33, + 40, 45, 59, 61, 63, 84, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 10, 13, 32, 33, 40, 45, 59, 61, + 63, 80, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 10, 13, 32, 33, + 40, 45, 59, 61, 63, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 32, 10, 13, 32, 34, 45, 61, 63, + 69, 73, 76, 83, 33, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 32, + 10, 13, 32, 33, 40, 45, 59, 61, + 63, 35, 39, 42, 43, 47, 57, 65, + 90, 94, 126, 10, 32, 10, 34, 92, + 32, 126, 10, 13, 32, 33, 40, 45, + 59, 61, 63, 83, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 13, + 32, 33, 40, 45, 59, 61, 63, 77, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 13, 32, 33, 40, 45, + 59, 61, 63, 77, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, 10, 13, + 32, 33, 40, 45, 59, 61, 63, 77, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 13, 32, 33, 45, 61, + 63, 35, 39, 42, 43, 47, 57, 65, + 90, 94, 126, 10, 32, 13, 32, 33, + 45, 61, 63, 73, 105, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 13, 32, 33, 40, 45, 59, 61, 63, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 32, 10, 13, 32, 34, + 45, 61, 63, 33, 39, 42, 43, 47, + 57, 65, 90, 94, 126, 10, 32, 10, + 13, 32, 33, 40, 45, 59, 61, 63, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 32, 10, 34, 92, 32, + 126, 10, 13, 32, 33, 45, 61, 63, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 32, 10, 32, 10, 13, + 32, 33, 40, 45, 59, 61, 63, 70, + 73, 86, 87, 102, 105, 118, 119, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 10, 32, 10, 13, 32, 33, 45, + 61, 63, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 10, 32, 10, 13, + 41, 32, 39, 42, 91, 93, 126, 10, + 32, 10, 13, 32, 10, 32, 10, 13, + 32, 33, 45, 61, 63, 79, 111, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 10, 13, 32, 33, 45, 61, 63, + 68, 100, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 10, 13, 32, 33, + 45, 61, 63, 73, 105, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 13, 32, 33, 45, 61, 63, 73, 105, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 13, 32, 33, 40, 45, 59, + 61, 63, 70, 73, 86, 87, 102, 105, + 118, 119, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 10, 13, 32, 41, + 45, 46, 91, 95, 33, 39, 42, 47, + 48, 57, 58, 64, 65, 90, 93, 96, + 97, 122, 123, 126, 10, 32, 32, 41, + 91, 33, 39, 42, 90, 93, 126, 13, + 41, 45, 73, 91, 95, 32, 39, 42, + 47, 48, 57, 58, 64, 65, 90, 93, + 96, 97, 122, 123, 126, 10, 13, 41, + 45, 91, 95, 32, 39, 42, 47, 48, + 57, 58, 64, 65, 90, 93, 96, 97, + 122, 123, 126, 10, 13, 41, 45, 58, + 91, 95, 32, 39, 42, 47, 48, 57, + 59, 64, 65, 90, 93, 96, 97, 122, + 123, 126, 10, 13, 32, 40, 41, 91, + 93, 33, 90, 94, 126, 10, 13, 32, + 40, 41, 91, 93, 33, 90, 94, 126, + 10, 93, 33, 90, 94, 126, 93, 33, + 90, 94, 126, 41, 13, 32, 40, 59, + 10, 13, 32, 34, 40, 41, 44, 46, + 58, 59, 60, 62, 64, 70, 73, 86, + 87, 93, 102, 105, 118, 119, 33, 90, + 94, 126, 10, 13, 32, 34, 44, 46, + 61, 63, 93, 33, 39, 40, 41, 42, + 57, 58, 64, 65, 90, 94, 126, 10, + 13, 32, 34, 44, 46, 61, 63, 93, + 33, 39, 40, 41, 42, 57, 58, 64, + 65, 90, 94, 126, 10, 93, 33, 90, + 94, 126, 10, 41, 10, 93, 33, 90, + 94, 126, 10, 13, 32, 40, 41, 91, + 93, 33, 90, 94, 126, 10, 13, 41, + 32, 39, 42, 91, 93, 126, 10, 13, + 32, 33, 40, 45, 59, 61, 63, 70, + 73, 86, 87, 102, 105, 118, 119, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 10, 13, 32, 93, 33, 90, 94, + 126, 10, 93, 33, 90, 94, 126, 10, + 41, 10, 13, 32, 34, 44, 46, 61, + 63, 79, 93, 111, 33, 39, 40, 41, + 42, 57, 58, 64, 65, 90, 94, 126, + 10, 13, 32, 34, 44, 46, 61, 63, + 82, 93, 114, 33, 39, 40, 41, 42, + 57, 58, 64, 65, 90, 94, 126, 10, + 13, 32, 34, 44, 46, 61, 63, 93, + 33, 39, 40, 41, 42, 57, 58, 64, + 65, 90, 94, 126, 10, 13, 32, 34, + 44, 46, 61, 63, 93, 33, 39, 40, + 41, 42, 57, 58, 64, 65, 90, 94, + 126, 10, 93, 33, 90, 94, 126, 10, + 41, 10, 13, 32, 34, 44, 46, 61, + 63, 68, 93, 100, 33, 39, 40, 41, + 42, 57, 58, 64, 65, 90, 94, 126, + 10, 13, 32, 34, 44, 46, 61, 63, + 93, 33, 39, 40, 41, 42, 57, 58, + 64, 65, 90, 94, 126, 10, 13, 32, + 34, 44, 46, 61, 63, 93, 33, 39, + 40, 41, 42, 57, 58, 64, 65, 90, + 94, 126, 10, 93, 33, 90, 94, 126, + 10, 41, 10, 13, 32, 34, 44, 46, + 61, 63, 73, 93, 105, 33, 39, 40, + 41, 42, 57, 58, 64, 65, 90, 94, + 126, 10, 13, 32, 34, 44, 46, 61, + 63, 65, 93, 97, 33, 39, 40, 41, + 42, 57, 58, 64, 66, 90, 94, 126, + 10, 13, 32, 34, 44, 46, 61, 63, + 93, 33, 39, 40, 41, 42, 57, 58, + 64, 65, 90, 94, 126, 10, 13, 32, + 34, 44, 46, 61, 63, 93, 33, 39, + 40, 41, 42, 57, 58, 64, 65, 90, + 94, 126, 10, 93, 33, 90, 94, 126, + 10, 41, 10, 13, 32, 34, 44, 46, + 61, 63, 73, 93, 105, 33, 39, 40, + 41, 42, 57, 58, 64, 65, 90, 94, + 126, 10, 13, 32, 34, 44, 46, 61, + 63, 84, 93, 116, 33, 39, 40, 41, + 42, 57, 58, 64, 65, 90, 94, 126, + 10, 13, 32, 34, 44, 46, 61, 63, + 72, 93, 104, 33, 39, 40, 41, 42, + 57, 58, 64, 65, 90, 94, 126, 10, + 13, 32, 34, 44, 46, 61, 63, 93, + 33, 39, 40, 41, 42, 57, 58, 64, + 65, 90, 94, 126, 10, 13, 32, 34, + 44, 46, 61, 63, 93, 33, 39, 40, + 41, 42, 57, 58, 64, 65, 90, 94, + 126, 10, 93, 33, 90, 94, 126, 10, + 41, 10, 41, 10, 13, 41, 45, 46, + 58, 91, 95, 32, 39, 42, 47, 48, + 57, 59, 64, 65, 90, 93, 96, 97, + 122, 123, 126, 10, 13, 41, 32, 39, + 42, 47, 48, 57, 58, 91, 93, 126, + 10, 13, 41, 46, 32, 39, 42, 47, + 48, 57, 58, 91, 93, 126, 10, 13, + 41, 32, 39, 42, 47, 48, 57, 58, + 91, 93, 126, 10, 13, 41, 46, 32, + 39, 42, 47, 48, 57, 58, 91, 93, + 126, 10, 13, 41, 32, 39, 42, 47, + 48, 57, 58, 91, 93, 126, 10, 13, + 41, 93, 32, 39, 42, 47, 48, 57, + 58, 91, 94, 126, 10, 13, 41, 93, + 32, 39, 42, 47, 48, 57, 58, 91, + 94, 126, 10, 13, 41, 93, 32, 39, + 42, 91, 94, 126, 10, 13, 41, 46, + 32, 39, 42, 47, 48, 57, 58, 91, + 93, 126, 10, 13, 41, 46, 32, 39, + 42, 91, 93, 126, 10, 13, 41, 46, + 32, 39, 42, 47, 48, 57, 58, 91, + 93, 126, 10, 13, 41, 46, 32, 39, + 42, 91, 93, 126, 10, 13, 41, 45, + 46, 58, 91, 95, 32, 39, 42, 47, + 48, 57, 59, 64, 65, 90, 93, 96, + 97, 122, 123, 126, 10, 13, 41, 45, + 46, 58, 91, 95, 32, 39, 42, 47, + 48, 57, 59, 64, 65, 90, 93, 96, + 97, 122, 123, 126, 10, 13, 41, 45, + 58, 80, 91, 95, 32, 39, 42, 47, + 48, 57, 59, 64, 65, 90, 93, 96, + 97, 122, 123, 126, 10, 13, 41, 45, + 58, 91, 95, 118, 32, 39, 42, 47, + 48, 57, 59, 64, 65, 90, 93, 96, + 97, 122, 123, 126, 10, 13, 41, 45, + 54, 58, 91, 95, 32, 39, 42, 47, + 48, 57, 59, 64, 65, 90, 93, 96, + 97, 122, 123, 126, 10, 13, 41, 45, + 58, 91, 95, 32, 39, 42, 47, 48, + 57, 59, 64, 65, 90, 93, 96, 97, + 122, 123, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 90, 94, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 90, 94, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 90, 94, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 90, 94, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 90, 94, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 90, 94, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 46, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 91, 93, 33, 47, 48, 57, 58, + 90, 94, 126, 10, 13, 32, 40, 41, + 46, 91, 93, 33, 47, 48, 57, 58, + 90, 94, 126, 10, 13, 32, 40, 41, + 91, 93, 33, 47, 48, 57, 58, 90, + 94, 126, 10, 13, 32, 40, 41, 46, + 91, 93, 33, 47, 48, 57, 58, 90, + 94, 126, 10, 13, 32, 40, 41, 91, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 10, 13, 32, 40, 41, 91, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 10, 13, 32, 40, 41, 91, 93, 33, + 47, 48, 57, 58, 90, 94, 126, 10, + 13, 32, 40, 41, 91, 93, 33, 90, + 94, 126, 10, 13, 32, 40, 41, 46, + 91, 93, 33, 47, 48, 57, 58, 90, + 94, 126, 10, 13, 32, 40, 41, 46, + 91, 93, 33, 90, 94, 126, 10, 13, + 32, 40, 41, 46, 91, 93, 33, 47, + 48, 57, 58, 90, 94, 126, 10, 13, + 32, 40, 41, 46, 91, 93, 33, 90, + 94, 126, 10, 13, 32, 40, 41, 46, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 46, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 90, 94, 126, + 10, 13, 32, 40, 41, 91, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 91, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 91, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 91, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 91, 93, 33, 90, 94, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 91, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 58, 91, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 58, 91, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 58, 91, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 58, 91, 93, 33, 90, + 94, 126, 10, 13, 32, 40, 41, 91, + 93, 33, 47, 48, 57, 58, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 90, 94, 126, 10, 13, 32, + 40, 41, 91, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 90, 94, 126, + 10, 13, 32, 40, 41, 91, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 90, 94, 126, 10, 13, 32, 40, 41, + 91, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 58, + 91, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 58, + 91, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 58, + 91, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 58, + 91, 93, 33, 90, 94, 126, 10, 13, + 32, 40, 41, 58, 91, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 91, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 46, 58, 91, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 46, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 46, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 90, 94, 126, 10, 13, 32, 40, + 41, 91, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 46, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 46, 58, 91, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 46, 58, 91, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 58, 91, 93, 33, 90, + 94, 126, 10, 13, 32, 40, 41, 91, + 93, 33, 47, 48, 57, 58, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 46, 58, + 91, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 46, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 46, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 90, 94, 126, + 10, 13, 32, 40, 41, 91, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 46, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 46, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 46, 58, + 91, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 58, + 91, 93, 33, 90, 94, 126, 10, 13, + 32, 40, 41, 91, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 46, 58, 91, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 46, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 46, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 90, 94, 126, 10, 32, 10, 13, + 32, 41, 91, 33, 39, 42, 90, 93, + 126, 10, 32, 10, 13, 41, 32, 39, + 42, 91, 93, 126, 10, 32, 10, 13, + 32, 33, 40, 45, 59, 61, 63, 70, + 73, 86, 87, 102, 105, 118, 119, 35, + 39, 42, 43, 47, 57, 65, 90, 94, + 126, 10, 32, 10, 13, 41, 45, 73, + 91, 95, 32, 39, 42, 47, 48, 57, + 58, 64, 65, 90, 93, 96, 97, 122, + 123, 126, 10, 13, 41, 45, 91, 95, + 32, 39, 42, 47, 48, 57, 58, 64, + 65, 90, 93, 96, 97, 122, 123, 126, + 10, 13, 41, 45, 91, 95, 32, 39, + 42, 47, 48, 57, 58, 64, 65, 90, + 93, 96, 97, 122, 123, 126, 10, 13, + 41, 91, 32, 39, 42, 47, 48, 57, + 58, 64, 65, 90, 93, 96, 97, 122, + 123, 126, 10, 13, 32, 41, 45, 46, + 91, 95, 33, 39, 42, 47, 48, 57, + 58, 64, 65, 90, 93, 96, 97, 122, + 123, 126, 10, 13, 41, 45, 73, 91, + 95, 32, 39, 42, 47, 48, 57, 58, + 64, 65, 90, 93, 96, 97, 122, 123, + 126, 10, 13, 32, 33, 40, 45, 59, + 61, 63, 70, 73, 86, 87, 102, 105, + 118, 119, 35, 39, 42, 43, 47, 57, + 65, 90, 94, 126, 10, 32, 10, 13, + 32, 33, 45, 61, 63, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 32, 10, 13, 41, 91, 32, 39, 42, + 47, 48, 57, 58, 64, 65, 90, 93, + 96, 97, 122, 123, 126, 10, 32, 10, + 13, 32, 10, 32, 10, 13, 32, 33, + 45, 61, 63, 79, 111, 35, 39, 42, + 43, 47, 57, 65, 90, 94, 126, 10, + 13, 32, 33, 45, 61, 63, 68, 100, + 35, 39, 42, 43, 47, 57, 65, 90, + 94, 126, 10, 13, 32, 33, 45, 61, + 63, 73, 105, 35, 39, 42, 43, 47, + 57, 65, 90, 94, 126, 10, 13, 32, + 33, 45, 61, 63, 73, 105, 35, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + 10, 13, 41, 32, 39, 42, 91, 93, + 126, 10, 45, 95, 48, 57, 65, 90, + 97, 122, 45, 95, 48, 57, 65, 90, + 97, 122, 10, 48, 57, 65, 90, 97, + 122, 10, 13, 32, 40, 45, 46, 59, + 95, 48, 57, 65, 90, 97, 122, 45, + 73, 95, 48, 57, 65, 90, 97, 122, + 45, 95, 48, 57, 65, 90, 97, 122, + 45, 58, 95, 48, 57, 65, 90, 97, + 122, 33, 90, 94, 126, 93, 33, 90, + 94, 126, 13, 32, 10, 32, 32, 40, + 91, 48, 57, 65, 90, 97, 122, 13, + 32, 45, 46, 95, 48, 57, 65, 90, + 97, 122, 10, 32, 32, 91, 45, 73, + 95, 48, 57, 65, 90, 97, 122, 45, + 95, 48, 57, 65, 90, 97, 122, 45, + 58, 95, 48, 57, 65, 90, 97, 122, + 33, 90, 94, 126, 45, 46, 58, 95, + 48, 57, 65, 90, 97, 122, 48, 57, + 46, 48, 57, 48, 57, 46, 48, 57, + 48, 57, 93, 48, 57, 93, 48, 57, + 93, 46, 48, 57, 46, 46, 48, 57, + 46, 45, 46, 58, 95, 48, 57, 65, + 90, 97, 122, 45, 46, 58, 95, 48, + 57, 65, 90, 97, 122, 45, 58, 80, + 95, 48, 57, 65, 90, 97, 122, 45, + 58, 95, 118, 48, 57, 65, 90, 97, + 122, 45, 54, 58, 95, 48, 57, 65, + 90, 97, 122, 45, 58, 95, 48, 57, + 65, 90, 97, 122, 58, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 90, 94, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 46, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 93, 33, 47, 48, + 57, 58, 90, 94, 126, 46, 93, 33, + 47, 48, 57, 58, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 46, 93, 33, 47, 48, 57, 58, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 90, 94, 126, 93, 33, 47, 48, + 57, 58, 90, 94, 126, 93, 33, 90, + 94, 126, 46, 93, 33, 47, 48, 57, + 58, 90, 94, 126, 46, 93, 33, 90, + 94, 126, 46, 93, 33, 47, 48, 57, + 58, 90, 94, 126, 46, 93, 33, 90, + 94, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 93, 33, 47, 48, 57, 58, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 93, 33, 90, 94, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 90, 94, 126, + 93, 33, 47, 48, 57, 58, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 90, 94, 126, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 10, 13, + 32, 91, 10, 32, 10, 45, 73, 95, + 48, 57, 65, 90, 97, 122, 10, 45, + 95, 48, 57, 65, 90, 97, 122, 45, + 95, 48, 57, 65, 90, 97, 122, 10, + 48, 57, 65, 90, 97, 122, 10, 13, + 32, 45, 46, 95, 48, 57, 65, 90, + 97, 122, 10, 13, 32, 40, 10, 32, + 10, 91, 48, 57, 65, 90, 97, 122, + 45, 46, 58, 95, 48, 57, 65, 90, + 97, 122, 48, 57, 46, 48, 57, 48, + 57, 46, 48, 57, 48, 57, 93, 48, + 57, 93, 48, 57, 93, 46, 48, 57, + 46, 46, 48, 57, 46, 45, 46, 58, + 95, 48, 57, 65, 90, 97, 122, 45, + 46, 58, 95, 48, 57, 65, 90, 97, + 122, 45, 58, 80, 95, 48, 57, 65, + 90, 97, 122, 45, 58, 95, 118, 48, + 57, 65, 90, 97, 122, 45, 54, 58, + 95, 48, 57, 65, 90, 97, 122, 45, + 58, 95, 48, 57, 65, 90, 97, 122, + 58, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 90, 94, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 90, 94, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 46, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 46, 93, 33, 47, 48, 57, 58, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 90, 94, 126, 46, 93, 33, 47, + 48, 57, 58, 90, 94, 126, 93, 33, + 47, 48, 57, 58, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 93, 33, 90, 94, 126, 46, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 46, 93, 33, 90, 94, 126, 46, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 46, 93, 33, 90, 94, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 46, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 93, 33, + 90, 94, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 90, 94, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 46, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 46, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 46, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 46, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 46, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 10, 13, 32, 91, 48, 57, + 65, 90, 97, 122, 10, 32, 10, 13, + 32, 40, 45, 46, 59, 95, 48, 57, + 65, 90, 97, 122, 10, 32, 10, 45, + 73, 95, 48, 57, 65, 90, 97, 122, + 10, 32, 10, 13, 32, 40, 66, 98, + 10, 32, 10, 13, 41, 32, 39, 42, + 91, 93, 126, 10, 32, 10, 89, 121, + 13, 32, 40, 66, 98, 10, 13, 32, + 41, 45, 46, 91, 95, 33, 39, 42, + 47, 48, 57, 58, 64, 65, 90, 93, + 96, 97, 122, 123, 126, 10, 32, 32, + 41, 91, 33, 39, 42, 90, 93, 126, + 13, 41, 45, 73, 91, 95, 32, 39, + 42, 47, 48, 57, 58, 64, 65, 90, + 93, 96, 97, 122, 123, 126, 10, 13, + 41, 45, 91, 95, 32, 39, 42, 47, + 48, 57, 58, 64, 65, 90, 93, 96, + 97, 122, 123, 126, 10, 13, 41, 45, + 58, 91, 95, 32, 39, 42, 47, 48, + 57, 59, 64, 65, 90, 93, 96, 97, + 122, 123, 126, 10, 13, 32, 40, 41, + 91, 93, 33, 90, 94, 126, 10, 13, + 32, 40, 41, 91, 93, 33, 90, 94, + 126, 10, 93, 33, 90, 94, 126, 93, + 33, 90, 94, 126, 41, 13, 32, 40, + 10, 13, 32, 40, 66, 93, 98, 33, + 90, 94, 126, 10, 93, 33, 90, 94, + 126, 10, 13, 32, 40, 41, 91, 93, + 33, 90, 94, 126, 10, 13, 41, 32, + 39, 42, 91, 93, 126, 10, 13, 32, + 40, 66, 98, 10, 89, 93, 121, 33, + 90, 94, 126, 13, 32, 93, 33, 90, + 94, 126, 10, 93, 33, 90, 94, 126, + 10, 41, 10, 41, 10, 13, 41, 45, + 46, 58, 91, 95, 32, 39, 42, 47, + 48, 57, 59, 64, 65, 90, 93, 96, + 97, 122, 123, 126, 10, 13, 41, 32, + 39, 42, 47, 48, 57, 58, 91, 93, + 126, 10, 13, 41, 46, 32, 39, 42, + 47, 48, 57, 58, 91, 93, 126, 10, + 13, 41, 32, 39, 42, 47, 48, 57, + 58, 91, 93, 126, 10, 13, 41, 46, + 32, 39, 42, 47, 48, 57, 58, 91, + 93, 126, 10, 13, 41, 32, 39, 42, + 47, 48, 57, 58, 91, 93, 126, 10, + 13, 41, 93, 32, 39, 42, 47, 48, + 57, 58, 91, 94, 126, 10, 13, 41, + 93, 32, 39, 42, 47, 48, 57, 58, + 91, 94, 126, 10, 13, 41, 93, 32, + 39, 42, 91, 94, 126, 10, 13, 41, + 46, 32, 39, 42, 47, 48, 57, 58, + 91, 93, 126, 10, 13, 41, 46, 32, + 39, 42, 91, 93, 126, 10, 13, 41, + 46, 32, 39, 42, 47, 48, 57, 58, + 91, 93, 126, 10, 13, 41, 46, 32, + 39, 42, 91, 93, 126, 10, 13, 41, + 45, 46, 58, 91, 95, 32, 39, 42, + 47, 48, 57, 59, 64, 65, 90, 93, + 96, 97, 122, 123, 126, 10, 13, 41, + 45, 46, 58, 91, 95, 32, 39, 42, + 47, 48, 57, 59, 64, 65, 90, 93, + 96, 97, 122, 123, 126, 10, 13, 41, + 45, 58, 80, 91, 95, 32, 39, 42, + 47, 48, 57, 59, 64, 65, 90, 93, + 96, 97, 122, 123, 126, 10, 13, 41, + 45, 58, 91, 95, 118, 32, 39, 42, + 47, 48, 57, 59, 64, 65, 90, 93, + 96, 97, 122, 123, 126, 10, 13, 41, + 45, 54, 58, 91, 95, 32, 39, 42, + 47, 48, 57, 59, 64, 65, 90, 93, + 96, 97, 122, 123, 126, 10, 13, 41, + 45, 58, 91, 95, 32, 39, 42, 47, + 48, 57, 59, 64, 65, 90, 93, 96, + 97, 122, 123, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 90, 94, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 90, 94, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 90, 94, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 90, 94, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 90, 94, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 90, 94, 126, 10, 13, 32, 40, + 41, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 46, 58, 91, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 91, 93, 33, 47, 48, 57, + 58, 90, 94, 126, 10, 13, 32, 40, + 41, 46, 91, 93, 33, 47, 48, 57, + 58, 90, 94, 126, 10, 13, 32, 40, + 41, 91, 93, 33, 47, 48, 57, 58, + 90, 94, 126, 10, 13, 32, 40, 41, + 46, 91, 93, 33, 47, 48, 57, 58, + 90, 94, 126, 10, 13, 32, 40, 41, + 91, 93, 33, 47, 48, 57, 58, 90, + 94, 126, 10, 13, 32, 40, 41, 91, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 10, 13, 32, 40, 41, 91, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 10, 13, 32, 40, 41, 91, 93, 33, + 90, 94, 126, 10, 13, 32, 40, 41, + 46, 91, 93, 33, 47, 48, 57, 58, + 90, 94, 126, 10, 13, 32, 40, 41, + 46, 91, 93, 33, 90, 94, 126, 10, + 13, 32, 40, 41, 46, 91, 93, 33, + 47, 48, 57, 58, 90, 94, 126, 10, + 13, 32, 40, 41, 46, 91, 93, 33, + 90, 94, 126, 10, 13, 32, 40, 41, + 46, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 46, 58, 91, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 58, 91, 93, 33, 90, 94, + 126, 10, 13, 32, 40, 41, 91, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 91, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 91, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 91, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 91, 93, 33, 90, 94, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 91, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 90, 94, 126, 10, 13, 32, 40, 41, + 91, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 58, + 91, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 58, + 91, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 58, + 91, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 58, + 91, 93, 33, 90, 94, 126, 10, 13, + 32, 40, 41, 91, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 58, 91, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 58, 91, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 58, 91, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 58, 91, 93, 33, 90, 94, + 126, 10, 13, 32, 40, 41, 91, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 58, 91, 93, + 33, 90, 94, 126, 10, 13, 32, 40, + 41, 91, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 90, 94, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 91, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 46, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 46, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 46, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 90, 94, 126, 10, 13, 32, + 40, 41, 91, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 46, 58, 91, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 46, 58, 91, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 46, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 58, 91, 93, 33, + 90, 94, 126, 10, 13, 32, 40, 41, + 91, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 46, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 46, 58, 91, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 10, 13, 32, 40, + 41, 46, 58, 91, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 10, 13, 32, + 40, 41, 58, 91, 93, 33, 90, 94, + 126, 10, 13, 32, 40, 41, 91, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 46, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 46, 58, + 91, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 10, 13, 32, 40, 41, 46, + 58, 91, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 10, 13, 32, 40, 41, + 58, 91, 93, 33, 90, 94, 126, 10, + 13, 32, 40, 41, 91, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 10, 13, + 32, 40, 41, 46, 58, 91, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 10, + 13, 32, 40, 41, 46, 58, 91, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 10, 13, 32, 40, 41, 46, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 10, 13, 32, 40, 41, 58, 91, + 93, 33, 90, 94, 126, 10, 32, 10, + 13, 32, 41, 91, 33, 39, 42, 90, + 93, 126, 10, 32, 10, 13, 41, 32, + 39, 42, 91, 93, 126, 10, 32, 10, + 13, 32, 40, 66, 98, 10, 32, 10, + 13, 41, 45, 73, 91, 95, 32, 39, + 42, 47, 48, 57, 58, 64, 65, 90, + 93, 96, 97, 122, 123, 126, 10, 13, + 41, 45, 91, 95, 32, 39, 42, 47, + 48, 57, 58, 64, 65, 90, 93, 96, + 97, 122, 123, 126, 10, 13, 41, 45, + 91, 95, 32, 39, 42, 47, 48, 57, + 58, 64, 65, 90, 93, 96, 97, 122, + 123, 126, 10, 13, 41, 91, 32, 39, + 42, 47, 48, 57, 58, 64, 65, 90, + 93, 96, 97, 122, 123, 126, 10, 13, + 32, 41, 45, 46, 91, 95, 33, 39, + 42, 47, 48, 57, 58, 64, 65, 90, + 93, 96, 97, 122, 123, 126, 10, 13, + 41, 45, 73, 91, 95, 32, 39, 42, + 47, 48, 57, 58, 64, 65, 90, 93, + 96, 97, 122, 123, 126, 10, 13, 32, + 40, 66, 98, 10, 32, 10, 13, 41, + 91, 32, 39, 42, 47, 48, 57, 58, + 64, 65, 90, 93, 96, 97, 122, 123, + 126, 10, 32, 10, 89, 121, 10, 13, + 41, 32, 39, 42, 91, 93, 126, 10, + 45, 95, 48, 57, 65, 90, 97, 122, + 45, 95, 48, 57, 65, 90, 97, 122, + 10, 48, 57, 65, 90, 97, 122, 10, + 13, 32, 40, 45, 46, 95, 48, 57, + 65, 90, 97, 122, 45, 73, 95, 48, + 57, 65, 90, 97, 122, 45, 95, 48, + 57, 65, 90, 97, 122, 45, 58, 95, + 48, 57, 65, 90, 97, 122, 33, 90, + 94, 126, 93, 33, 90, 94, 126, 13, + 32, 10, 32, 32, 40, 91, 48, 57, + 65, 90, 97, 122, 13, 32, 45, 46, + 95, 48, 57, 65, 90, 97, 122, 10, + 32, 32, 91, 45, 73, 95, 48, 57, + 65, 90, 97, 122, 45, 95, 48, 57, + 65, 90, 97, 122, 45, 58, 95, 48, + 57, 65, 90, 97, 122, 33, 90, 94, + 126, 45, 46, 58, 95, 48, 57, 65, + 90, 97, 122, 48, 57, 46, 48, 57, + 48, 57, 46, 48, 57, 48, 57, 93, + 48, 57, 93, 48, 57, 93, 46, 48, + 57, 46, 46, 48, 57, 46, 45, 46, + 58, 95, 48, 57, 65, 90, 97, 122, + 45, 46, 58, 95, 48, 57, 65, 90, + 97, 122, 45, 58, 80, 95, 48, 57, + 65, 90, 97, 122, 45, 58, 95, 118, + 48, 57, 65, 90, 97, 122, 45, 54, + 58, 95, 48, 57, 65, 90, 97, 122, + 45, 58, 95, 48, 57, 65, 90, 97, + 122, 58, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 90, 94, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 93, 33, 47, 48, 57, 58, 90, + 94, 126, 46, 93, 33, 47, 48, 57, + 58, 90, 94, 126, 93, 33, 47, 48, + 57, 58, 90, 94, 126, 46, 93, 33, + 47, 48, 57, 58, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 93, 33, 47, 48, 57, 58, 90, + 94, 126, 93, 33, 90, 94, 126, 46, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 46, 93, 33, 90, 94, 126, 46, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 46, 93, 33, 90, 94, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 93, + 33, 90, 94, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 93, 33, 47, 48, 57, 58, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 90, 94, 126, 93, 33, 47, + 48, 57, 58, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 46, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 46, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 10, 13, 32, 91, 10, + 32, 10, 45, 73, 95, 48, 57, 65, + 90, 97, 122, 10, 45, 95, 48, 57, + 65, 90, 97, 122, 45, 95, 48, 57, + 65, 90, 97, 122, 10, 48, 57, 65, + 90, 97, 122, 10, 13, 32, 45, 46, + 95, 48, 57, 65, 90, 97, 122, 10, + 13, 32, 40, 10, 32, 10, 91, 48, + 57, 65, 90, 97, 122, 45, 46, 58, + 95, 48, 57, 65, 90, 97, 122, 48, + 57, 46, 48, 57, 48, 57, 46, 48, + 57, 48, 57, 93, 48, 57, 93, 48, + 57, 93, 46, 48, 57, 46, 46, 48, + 57, 46, 45, 46, 58, 95, 48, 57, + 65, 90, 97, 122, 45, 46, 58, 95, + 48, 57, 65, 90, 97, 122, 45, 58, + 80, 95, 48, 57, 65, 90, 97, 122, + 45, 58, 95, 118, 48, 57, 65, 90, + 97, 122, 45, 54, 58, 95, 48, 57, + 65, 90, 97, 122, 45, 58, 95, 48, + 57, 65, 90, 97, 122, 58, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 90, 94, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 90, 94, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 90, + 94, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 90, 94, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 46, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 93, 33, 47, + 48, 57, 58, 90, 94, 126, 46, 93, + 33, 47, 48, 57, 58, 90, 94, 126, + 93, 33, 47, 48, 57, 58, 90, 94, + 126, 46, 93, 33, 47, 48, 57, 58, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 90, 94, 126, 93, 33, 47, 48, + 57, 58, 90, 94, 126, 93, 33, 47, + 48, 57, 58, 90, 94, 126, 93, 33, + 90, 94, 126, 46, 93, 33, 47, 48, + 57, 58, 90, 94, 126, 46, 93, 33, + 90, 94, 126, 46, 93, 33, 47, 48, + 57, 58, 90, 94, 126, 46, 93, 33, + 90, 94, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 93, 33, 47, 48, 57, 58, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 93, 33, 47, 48, 57, 58, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 93, 33, 90, 94, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 93, 33, 47, 48, + 57, 58, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 90, 94, + 126, 93, 33, 47, 48, 57, 58, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 47, 48, 57, + 59, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 90, 94, 126, 93, 33, + 47, 48, 57, 58, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 90, 94, 126, 93, 33, 47, 48, 57, + 58, 64, 65, 70, 71, 90, 94, 96, + 97, 102, 103, 126, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 58, 93, + 33, 47, 48, 57, 59, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 58, 93, 33, 47, 48, 57, 59, 64, + 65, 70, 71, 90, 94, 96, 97, 102, + 103, 126, 58, 93, 33, 90, 94, 126, + 93, 33, 47, 48, 57, 58, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 90, 94, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 93, + 33, 47, 48, 57, 58, 64, 65, 70, + 71, 90, 94, 96, 97, 102, 103, 126, + 46, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 46, 58, 93, 33, 47, + 48, 57, 59, 64, 65, 70, 71, 90, + 94, 96, 97, 102, 103, 126, 46, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 47, 48, 57, 59, + 64, 65, 70, 71, 90, 94, 96, 97, + 102, 103, 126, 58, 93, 33, 47, 48, + 57, 59, 64, 65, 70, 71, 90, 94, + 96, 97, 102, 103, 126, 58, 93, 33, + 47, 48, 57, 59, 64, 65, 70, 71, + 90, 94, 96, 97, 102, 103, 126, 58, + 93, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 33, 90, 94, 126, 10, + 13, 32, 91, 48, 57, 65, 90, 97, + 122, 10, 32, 10, 13, 32, 40, 45, + 46, 95, 48, 57, 65, 90, 97, 122, + 10, 32, 10, 45, 73, 95, 48, 57, + 65, 90, 97, 122, 13, 32, 40, 32, + 40, 10, 13, 32, 40, 10, 13, 32, + 40, 0 +}; + +static const char _smtp_received_parser_single_lengths[] = { + 0, 2, 2, 2, 2, 2, 1, 1, + 2, 6, 1, 1, 4, 3, 1, 1, + 2, 2, 0, 3, 2, 6, 1, 1, + 4, 2, 2, 1, 1, 2, 7, 1, + 1, 15, 6, 1, 1, 5, 8, 1, + 1, 3, 2, 1, 1, 2, 4, 0, + 5, 2, 3, 2, 0, 3, 2, 5, + 2, 3, 1, 1, 7, 1, 1, 6, + 0, 2, 1, 1, 9, 2, 1, 2, + 1, 1, 1, 0, 0, 0, 2, 1, + 1, 1, 0, 1, 0, 0, 1, 0, + 0, 2, 1, 1, 3, 0, 0, 0, + 0, 1, 1, 2, 1, 1, 2, 0, + 3, 2, 2, 0, 2, 3, 2, 0, + 5, 2, 1, 0, 3, 2, 1, 3, + 0, 3, 2, 1, 1, 1, 1, 1, + 1, 2, 1, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 0, 11, 2, 3, + 2, 2, 3, 2, 2, 2, 2, 1, + 1, 1, 1, 2, 1, 1, 1, 0, + 3, 2, 1, 1, 1, 2, 1, 2, + 1, 1, 1, 1, 0, 8, 2, 1, + 2, 2, 3, 3, 2, 2, 0, 8, + 2, 1, 2, 2, 3, 3, 2, 2, + 9, 2, 2, 4, 0, 2, 0, 7, + 2, 9, 2, 3, 7, 3, 1, 1, + 2, 2, 0, 3, 2, 17, 1, 1, + 15, 8, 9, 7, 1, 1, 6, 8, + 9, 5, 4, 4, 1, 7, 1, 1, + 7, 2, 1, 1, 2, 8, 0, 9, + 2, 7, 2, 3, 2, 0, 3, 2, + 9, 2, 3, 2, 3, 2, 1, 8, + 3, 2, 3, 0, 1, 4, 4, 0, + 1, 0, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 4, 4, 4, 4, 4, + 3, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 3, 1, 2, 1, 2, 1, 1, 1, + 1, 2, 2, 2, 2, 3, 3, 2, + 1, 1, 1, 1, 1, 2, 2, 1, + 2, 2, 2, 2, 1, 2, 2, 2, + 2, 1, 2, 2, 2, 2, 1, 2, + 2, 2, 2, 1, 2, 2, 2, 2, + 2, 1, 3, 3, 3, 2, 1, 3, + 3, 3, 2, 1, 3, 3, 3, 2, + 1, 3, 3, 3, 2, 1, 3, 3, + 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 5, 0, 2, 4, 4, 4, 1, + 4, 2, 0, 4, 3, 2, 3, 0, + 1, 1, 4, 0, 1, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 4, 4, 3, 1, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 1, 2, 1, + 2, 1, 1, 1, 1, 2, 2, 2, + 2, 3, 3, 2, 1, 1, 1, 1, + 1, 2, 2, 1, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 1, 2, 2, + 2, 2, 1, 2, 2, 2, 2, 1, + 2, 2, 2, 2, 2, 1, 3, 3, + 3, 2, 1, 3, 3, 3, 2, 1, + 3, 3, 3, 2, 1, 3, 3, 3, + 2, 1, 3, 3, 3, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 1, 0, 2, 0, + 5, 1, 2, 4, 0, 5, 1, 2, + 4, 2, 2, 1, 0, 2, 2, 0, + 8, 2, 9, 2, 3, 5, 1, 7, + 2, 8, 7, 1, 1, 6, 8, 1, + 1, 9, 2, 1, 1, 2, 10, 0, + 11, 2, 7, 2, 3, 2, 0, 3, + 2, 11, 2, 3, 2, 9, 9, 4, + 4, 5, 3, 4, 4, 1, 1, 2, + 0, 8, 2, 9, 2, 3, 5, 7, + 2, 8, 9, 7, 1, 1, 5, 8, + 1, 1, 13, 2, 1, 1, 2, 14, + 0, 15, 2, 7, 2, 3, 2, 0, + 3, 2, 15, 2, 3, 2, 9, 9, + 9, 9, 9, 7, 1, 1, 9, 8, + 1, 1, 11, 2, 1, 1, 2, 12, + 0, 13, 2, 7, 2, 3, 2, 0, + 3, 2, 13, 2, 3, 2, 9, 9, + 9, 9, 10, 10, 10, 10, 9, 9, + 10, 10, 9, 9, 10, 10, 9, 9, + 10, 10, 9, 2, 0, 11, 2, 9, + 2, 3, 10, 10, 10, 10, 7, 2, + 8, 9, 2, 0, 7, 2, 9, 2, + 3, 7, 2, 2, 0, 17, 2, 7, + 2, 3, 2, 3, 2, 9, 9, 9, + 9, 16, 8, 1, 1, 3, 6, 6, + 7, 7, 7, 2, 1, 1, 4, 22, + 9, 9, 2, 2, 2, 7, 3, 17, + 4, 2, 2, 11, 11, 9, 9, 2, + 2, 11, 9, 9, 2, 2, 11, 11, + 9, 9, 2, 2, 11, 11, 11, 9, + 9, 2, 2, 2, 8, 3, 4, 3, + 4, 3, 4, 4, 4, 4, 4, 4, + 4, 8, 8, 8, 8, 8, 7, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 9, 7, + 8, 7, 8, 7, 7, 7, 7, 8, + 8, 8, 8, 9, 9, 8, 7, 7, + 7, 7, 7, 8, 8, 7, 8, 8, + 8, 8, 7, 8, 8, 8, 8, 7, + 8, 8, 8, 8, 7, 8, 8, 8, + 8, 7, 8, 8, 8, 8, 8, 7, + 9, 9, 9, 8, 7, 9, 9, 9, + 8, 7, 9, 9, 9, 8, 7, 9, + 9, 9, 8, 7, 9, 9, 9, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 2, 0, 5, 2, + 3, 2, 17, 2, 7, 6, 6, 4, + 8, 7, 0, 17, 2, 7, 2, 4, + 2, 3, 2, 9, 9, 9, 9, 3, + 3, 2, 1, 8, 3, 2, 3, 0, + 1, 2, 1, 1, 2, 1, 5, 1, + 1, 2, 3, 2, 3, 0, 4, 0, + 1, 0, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 4, 4, 4, 4, 4, + 3, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 3, 1, 2, 1, 2, 1, 1, 1, + 1, 2, 2, 2, 2, 3, 3, 2, + 1, 1, 1, 1, 1, 2, 2, 1, + 2, 2, 2, 2, 1, 2, 2, 2, + 2, 1, 2, 2, 2, 2, 1, 2, + 2, 2, 2, 1, 2, 2, 2, 2, + 2, 1, 3, 3, 3, 2, 1, 3, + 3, 3, 2, 1, 3, 3, 3, 2, + 1, 3, 3, 3, 2, 1, 3, 3, + 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 4, + 2, 4, 3, 2, 1, 6, 0, 4, + 2, 2, 4, 0, 1, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 4, 4, 3, 1, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 1, 2, 1, + 2, 1, 1, 1, 1, 2, 2, 2, + 2, 3, 3, 2, 1, 1, 1, 1, + 1, 2, 2, 1, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 1, 2, 2, + 2, 2, 1, 2, 2, 2, 2, 1, + 2, 2, 2, 2, 2, 1, 3, 3, + 3, 2, 1, 3, 3, 3, 2, 1, + 3, 3, 3, 2, 1, 3, 3, 3, + 2, 1, 3, 3, 3, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 4, 2, 8, 2, 4, + 2, 0, 6, 2, 3, 2, 3, 5, + 8, 1, 1, 3, 6, 6, 7, 7, + 7, 2, 1, 1, 3, 7, 2, 7, + 3, 6, 4, 3, 2, 2, 2, 8, + 3, 4, 3, 4, 3, 4, 4, 4, + 4, 4, 4, 4, 8, 8, 8, 8, + 8, 7, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 9, 7, 8, 7, 8, 7, 7, + 7, 7, 8, 8, 8, 8, 9, 9, + 8, 7, 7, 7, 7, 7, 8, 8, + 7, 8, 8, 8, 8, 7, 8, 8, + 8, 8, 7, 8, 8, 8, 8, 7, + 8, 8, 8, 8, 7, 8, 8, 8, + 8, 8, 7, 9, 9, 9, 8, 7, + 9, 9, 9, 8, 7, 9, 9, 9, + 8, 7, 9, 9, 9, 8, 7, 9, + 9, 9, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 2, + 0, 5, 2, 3, 2, 6, 2, 7, + 6, 6, 4, 8, 7, 0, 6, 2, + 4, 2, 3, 3, 3, 2, 1, 7, + 3, 2, 3, 0, 1, 2, 1, 1, + 2, 1, 5, 1, 1, 2, 3, 2, + 3, 0, 4, 0, 1, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 4, 4, 3, 1, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 1, 2, 1, + 2, 1, 1, 1, 1, 2, 2, 2, + 2, 3, 3, 2, 1, 1, 1, 1, + 1, 2, 2, 1, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 1, 2, 2, + 2, 2, 1, 2, 2, 2, 2, 1, + 2, 2, 2, 2, 2, 1, 3, 3, + 3, 2, 1, 3, 3, 3, 2, 1, + 3, 3, 3, 2, 1, 3, 3, 3, + 2, 1, 3, 3, 3, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 4, 2, 4, 3, 2, + 1, 6, 0, 4, 2, 2, 4, 0, + 1, 0, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 4, 4, 4, 4, 4, + 3, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 3, 1, 2, 1, 2, 1, 1, 1, + 1, 2, 2, 2, 2, 3, 3, 2, + 1, 1, 1, 1, 1, 2, 2, 1, + 2, 2, 2, 2, 1, 2, 2, 2, + 2, 1, 2, 2, 2, 2, 1, 2, + 2, 2, 2, 1, 2, 2, 2, 2, + 2, 1, 3, 3, 3, 2, 1, 3, + 3, 3, 2, 1, 3, 3, 3, 2, + 1, 3, 3, 3, 2, 1, 3, 3, + 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 4, + 2, 7, 2, 4, 3, 2, 4, 4 +}; + +static const char _smtp_received_parser_range_lengths[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 0, 8, 0, 0, + 3, 3, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 0, + 0, 5, 5, 0, 0, 5, 5, 0, + 0, 0, 3, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 0, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 0, 3, 0, 0, 3, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 1, 0, 1, 0, 1, 1, + 0, 1, 0, 1, 0, 0, 0, 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, 1, 0, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 0, 0, + 5, 1, 1, 0, 1, 1, 0, 5, + 0, 5, 0, 1, 5, 8, 0, 0, + 3, 3, 0, 3, 0, 5, 0, 0, + 5, 5, 5, 5, 0, 0, 5, 5, + 5, 5, 5, 5, 3, 3, 0, 0, + 5, 3, 0, 0, 3, 5, 0, 5, + 0, 5, 0, 3, 0, 0, 3, 0, + 5, 0, 0, 0, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 0, 3, 1, + 1, 1, 1, 1, 1, 1, 0, 1, + 0, 1, 0, 3, 3, 3, 3, 3, + 3, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 4, 4, 4, 4, 4, 4, 4, + 2, 4, 2, 4, 2, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 2, 3, 1, + 1, 0, 1, 1, 5, 5, 5, 3, + 3, 3, 3, 0, 3, 3, 3, 2, + 2, 0, 3, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 3, + 3, 3, 3, 3, 3, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 4, 4, 4, + 4, 4, 4, 4, 2, 4, 2, 4, + 2, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 2, 1, 1, 0, 1, 1, 3, + 3, 0, 3, 5, 3, 3, 0, 3, + 5, 1, 1, 0, 1, 1, 0, 0, + 5, 0, 5, 0, 1, 5, 3, 5, + 0, 5, 5, 0, 0, 5, 5, 0, + 0, 5, 3, 0, 0, 3, 5, 0, + 5, 0, 5, 0, 3, 0, 0, 3, + 0, 5, 0, 0, 0, 5, 5, 5, + 5, 5, 6, 5, 0, 2, 0, 0, + 0, 5, 0, 5, 0, 1, 5, 5, + 0, 5, 5, 5, 0, 0, 5, 5, + 0, 0, 5, 3, 0, 0, 3, 5, + 0, 5, 0, 5, 0, 3, 0, 0, + 3, 0, 5, 0, 0, 0, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, + 0, 0, 5, 3, 0, 0, 3, 5, + 0, 5, 0, 5, 0, 3, 0, 0, + 3, 0, 5, 0, 0, 0, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 0, 0, 5, 0, 5, + 0, 1, 5, 5, 5, 5, 5, 0, + 5, 5, 0, 0, 5, 0, 5, 0, + 1, 5, 0, 0, 0, 5, 0, 5, + 0, 3, 0, 0, 0, 5, 5, 5, + 5, 5, 8, 0, 0, 3, 8, 8, + 8, 2, 2, 2, 2, 0, 0, 2, + 6, 6, 2, 0, 2, 2, 3, 5, + 2, 2, 0, 6, 6, 6, 6, 2, + 0, 6, 6, 6, 2, 0, 6, 6, + 6, 6, 2, 0, 6, 6, 6, 6, + 6, 2, 0, 0, 8, 5, 5, 5, + 5, 5, 5, 5, 3, 5, 3, 5, + 3, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 4, + 4, 4, 4, 4, 4, 4, 2, 4, + 2, 4, 2, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 2, 0, 0, 3, 0, + 3, 0, 5, 0, 8, 8, 8, 8, + 8, 8, 0, 5, 0, 5, 0, 8, + 0, 0, 0, 5, 5, 5, 5, 3, + 3, 3, 3, 3, 3, 3, 3, 2, + 2, 0, 0, 0, 0, 3, 3, 0, + 0, 0, 3, 3, 3, 2, 3, 1, + 1, 1, 1, 1, 1, 1, 0, 1, + 0, 1, 0, 3, 3, 3, 3, 3, + 3, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 4, 4, 4, 4, 4, 4, 4, + 2, 4, 2, 4, 2, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 2, 0, 0, + 0, 3, 3, 3, 3, 3, 0, 0, + 0, 3, 3, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 3, + 3, 3, 3, 3, 3, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 4, 4, 4, + 4, 4, 4, 4, 2, 4, 2, 4, + 2, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 2, 0, 3, 0, 3, 0, 3, + 0, 0, 0, 0, 3, 0, 0, 0, + 8, 0, 0, 3, 8, 8, 8, 2, + 2, 2, 2, 0, 0, 2, 2, 2, + 3, 0, 2, 2, 2, 0, 0, 8, + 5, 5, 5, 5, 5, 5, 5, 3, + 5, 3, 5, 3, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 4, 4, 4, 4, 4, 4, + 4, 2, 4, 2, 4, 2, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 2, 0, + 0, 3, 0, 3, 0, 0, 0, 8, + 8, 8, 8, 8, 8, 0, 0, 0, + 8, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 0, 0, 0, + 0, 3, 3, 0, 0, 0, 3, 3, + 3, 2, 3, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 3, + 3, 3, 3, 3, 3, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 4, 4, 4, + 4, 4, 4, 4, 2, 4, 2, 4, + 2, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 2, 0, 0, 0, 3, 3, 3, + 3, 3, 0, 0, 0, 3, 3, 1, + 1, 1, 1, 1, 1, 1, 0, 1, + 0, 1, 0, 3, 3, 3, 3, 3, + 3, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 2, 8, 8, 8, 8, 2, 8, + 8, 4, 4, 4, 4, 4, 4, 4, + 2, 4, 2, 4, 2, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 8, 8, 2, 8, 8, 8, 8, + 2, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 8, 2, 8, 8, + 8, 8, 2, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 2, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 2, 0, 3, + 0, 3, 0, 3, 0, 0, 0, 0 +}; + +static const short _smtp_received_parser_index_offsets[] = { + 0, 0, 3, 6, 9, 12, 15, 17, + 19, 25, 35, 37, 39, 44, 56, 58, + 60, 66, 72, 73, 80, 83, 90, 92, + 94, 99, 102, 105, 107, 109, 115, 126, + 128, 130, 151, 163, 165, 167, 178, 192, + 194, 196, 200, 206, 208, 210, 216, 221, + 222, 228, 231, 238, 241, 242, 249, 252, + 258, 261, 265, 267, 269, 278, 280, 282, + 290, 292, 296, 298, 300, 310, 313, 315, + 318, 320, 322, 325, 327, 329, 331, 335, + 337, 339, 342, 344, 346, 348, 350, 352, + 354, 356, 359, 361, 363, 367, 369, 371, + 373, 375, 377, 379, 385, 387, 389, 395, + 396, 403, 406, 409, 410, 413, 420, 423, + 424, 430, 433, 436, 437, 442, 445, 448, + 453, 454, 459, 462, 465, 467, 469, 471, + 473, 475, 478, 480, 483, 485, 488, 490, + 492, 494, 496, 498, 500, 501, 513, 516, + 520, 523, 526, 530, 533, 536, 539, 542, + 545, 547, 549, 551, 555, 557, 559, 562, + 563, 568, 571, 574, 576, 578, 581, 583, + 586, 588, 590, 592, 594, 595, 605, 608, + 611, 614, 617, 621, 625, 628, 631, 632, + 642, 645, 648, 651, 654, 658, 662, 665, + 668, 683, 687, 691, 696, 698, 702, 703, + 716, 719, 734, 737, 742, 755, 767, 769, + 771, 777, 783, 784, 791, 794, 817, 819, + 821, 842, 856, 871, 884, 886, 888, 900, + 914, 929, 940, 950, 960, 965, 976, 978, + 980, 993, 999, 1001, 1003, 1009, 1023, 1024, + 1039, 1042, 1055, 1058, 1065, 1068, 1069, 1076, + 1079, 1094, 1097, 1101, 1104, 1111, 1117, 1122, + 1134, 1141, 1147, 1154, 1157, 1161, 1166, 1174, + 1176, 1179, 1181, 1184, 1186, 1189, 1192, 1194, + 1197, 1199, 1202, 1204, 1212, 1220, 1228, 1236, + 1244, 1251, 1261, 1272, 1283, 1294, 1299, 1310, + 1321, 1332, 1343, 1348, 1359, 1370, 1381, 1392, + 1397, 1408, 1419, 1430, 1441, 1446, 1457, 1468, + 1479, 1490, 1495, 1506, 1517, 1528, 1539, 1544, + 1555, 1567, 1573, 1580, 1586, 1593, 1599, 1605, + 1611, 1615, 1622, 1627, 1634, 1639, 1651, 1663, + 1668, 1678, 1688, 1698, 1708, 1712, 1723, 1734, + 1744, 1755, 1766, 1777, 1782, 1792, 1803, 1814, + 1825, 1830, 1840, 1851, 1862, 1873, 1878, 1888, + 1899, 1910, 1921, 1926, 1936, 1947, 1958, 1969, + 1974, 1985, 1995, 2007, 2019, 2031, 2036, 2046, + 2058, 2070, 2082, 2087, 2097, 2109, 2121, 2133, + 2138, 2148, 2160, 2172, 2184, 2189, 2199, 2211, + 2223, 2235, 2246, 2257, 2268, 2279, 2290, 2301, + 2312, 2323, 2334, 2345, 2356, 2367, 2372, 2378, + 2382, 2386, 2392, 2394, 2398, 2408, 2418, 2428, + 2433, 2441, 2447, 2451, 2456, 2463, 2469, 2476, + 2479, 2483, 2485, 2493, 2495, 2498, 2500, 2503, + 2505, 2508, 2511, 2513, 2516, 2518, 2521, 2523, + 2531, 2539, 2547, 2555, 2563, 2570, 2580, 2591, + 2602, 2613, 2618, 2629, 2640, 2651, 2662, 2667, + 2678, 2689, 2700, 2711, 2716, 2727, 2738, 2749, + 2760, 2765, 2776, 2787, 2798, 2809, 2814, 2825, + 2836, 2847, 2858, 2863, 2874, 2886, 2892, 2899, + 2905, 2912, 2918, 2924, 2930, 2934, 2941, 2946, + 2953, 2958, 2970, 2982, 2987, 2997, 3007, 3017, + 3027, 3031, 3042, 3053, 3063, 3074, 3085, 3096, + 3101, 3111, 3122, 3133, 3144, 3149, 3159, 3170, + 3181, 3192, 3197, 3207, 3218, 3229, 3240, 3245, + 3255, 3266, 3277, 3288, 3293, 3304, 3314, 3326, + 3338, 3350, 3355, 3365, 3377, 3389, 3401, 3406, + 3416, 3428, 3440, 3452, 3457, 3467, 3479, 3491, + 3503, 3508, 3518, 3530, 3542, 3554, 3565, 3576, + 3587, 3598, 3609, 3620, 3631, 3642, 3653, 3664, + 3675, 3686, 3691, 3695, 3699, 3701, 3703, 3707, + 3711, 3720, 3722, 3728, 3738, 3742, 3751, 3753, + 3759, 3769, 3773, 3777, 3779, 3781, 3785, 3788, + 3789, 3803, 3806, 3821, 3824, 3829, 3840, 3845, + 3858, 3861, 3875, 3888, 3890, 3892, 3904, 3918, + 3920, 3922, 3937, 3943, 3945, 3947, 3953, 3969, + 3970, 3987, 3990, 4003, 4006, 4013, 4016, 4017, + 4024, 4027, 4044, 4047, 4051, 4054, 4069, 4084, + 4094, 4104, 4115, 4125, 4135, 4140, 4144, 4146, + 4149, 4150, 4164, 4167, 4182, 4185, 4190, 4201, + 4214, 4217, 4231, 4246, 4259, 4261, 4263, 4274, + 4288, 4290, 4292, 4311, 4317, 4319, 4321, 4327, + 4347, 4348, 4369, 4372, 4385, 4388, 4395, 4398, + 4399, 4406, 4409, 4430, 4433, 4437, 4440, 4455, + 4470, 4485, 4500, 4515, 4528, 4530, 4532, 4547, + 4561, 4563, 4565, 4582, 4588, 4590, 4592, 4598, + 4616, 4617, 4636, 4639, 4652, 4655, 4662, 4665, + 4666, 4673, 4676, 4695, 4698, 4702, 4705, 4720, + 4735, 4750, 4765, 4781, 4797, 4813, 4829, 4844, + 4859, 4875, 4891, 4906, 4921, 4937, 4953, 4968, + 4983, 4999, 5015, 5030, 5033, 5034, 5051, 5054, + 5069, 5072, 5077, 5093, 5109, 5125, 5141, 5154, + 5157, 5171, 5186, 5189, 5190, 5203, 5206, 5221, + 5224, 5229, 5242, 5245, 5248, 5249, 5272, 5275, + 5288, 5291, 5298, 5301, 5305, 5308, 5323, 5338, + 5353, 5368, 5390, 5407, 5409, 5411, 5418, 5433, + 5448, 5464, 5474, 5484, 5489, 5493, 5495, 5500, + 5525, 5541, 5557, 5562, 5565, 5570, 5580, 5587, + 5610, 5617, 5622, 5625, 5643, 5661, 5677, 5693, + 5698, 5701, 5719, 5735, 5751, 5756, 5759, 5777, + 5795, 5811, 5827, 5832, 5835, 5853, 5871, 5889, + 5905, 5921, 5926, 5929, 5932, 5949, 5958, 5968, + 5977, 5987, 5996, 6006, 6016, 6024, 6034, 6042, + 6052, 6060, 6077, 6094, 6111, 6128, 6145, 6161, + 6178, 6195, 6212, 6229, 6240, 6257, 6274, 6291, + 6308, 6319, 6336, 6353, 6370, 6387, 6398, 6415, + 6432, 6449, 6466, 6477, 6494, 6511, 6528, 6545, + 6556, 6573, 6590, 6607, 6624, 6635, 6652, 6670, + 6682, 6695, 6707, 6720, 6732, 6744, 6756, 6766, + 6779, 6790, 6803, 6814, 6832, 6850, 6861, 6877, + 6893, 6909, 6925, 6935, 6952, 6969, 6985, 7002, + 7019, 7036, 7047, 7063, 7080, 7097, 7114, 7125, + 7141, 7158, 7175, 7192, 7203, 7219, 7236, 7253, + 7270, 7281, 7297, 7314, 7331, 7348, 7359, 7376, + 7392, 7410, 7428, 7446, 7457, 7473, 7491, 7509, + 7527, 7538, 7554, 7572, 7590, 7608, 7619, 7635, + 7653, 7671, 7689, 7700, 7716, 7734, 7752, 7770, + 7787, 7804, 7821, 7838, 7855, 7872, 7889, 7906, + 7923, 7940, 7957, 7974, 7985, 7988, 7989, 7998, + 8001, 8008, 8011, 8034, 8037, 8053, 8068, 8083, + 8096, 8113, 8129, 8130, 8153, 8156, 8169, 8172, + 8185, 8188, 8192, 8195, 8210, 8225, 8240, 8255, + 8262, 8269, 8275, 8280, 8292, 8299, 8305, 8312, + 8315, 8319, 8322, 8324, 8326, 8329, 8334, 8343, + 8345, 8347, 8350, 8357, 8363, 8370, 8373, 8381, + 8383, 8386, 8388, 8391, 8393, 8396, 8399, 8401, + 8404, 8406, 8409, 8411, 8419, 8427, 8435, 8443, + 8451, 8458, 8468, 8479, 8490, 8501, 8506, 8517, + 8528, 8539, 8550, 8555, 8566, 8577, 8588, 8599, + 8604, 8615, 8626, 8637, 8648, 8653, 8664, 8675, + 8686, 8697, 8702, 8713, 8724, 8735, 8746, 8751, + 8762, 8774, 8780, 8787, 8793, 8800, 8806, 8812, + 8818, 8822, 8829, 8834, 8841, 8846, 8858, 8870, + 8875, 8885, 8895, 8905, 8915, 8919, 8930, 8941, + 8951, 8962, 8973, 8984, 8989, 8999, 9010, 9021, + 9032, 9037, 9047, 9058, 9069, 9080, 9085, 9095, + 9106, 9117, 9128, 9133, 9143, 9154, 9165, 9176, + 9181, 9192, 9202, 9214, 9226, 9238, 9243, 9253, + 9265, 9277, 9289, 9294, 9304, 9316, 9328, 9340, + 9345, 9355, 9367, 9379, 9391, 9396, 9406, 9418, + 9430, 9442, 9453, 9464, 9475, 9486, 9497, 9508, + 9519, 9530, 9541, 9552, 9563, 9574, 9579, 9580, + 9585, 9588, 9596, 9603, 9609, 9614, 9624, 9625, + 9630, 9633, 9639, 9647, 9649, 9652, 9654, 9657, + 9659, 9662, 9665, 9667, 9670, 9672, 9675, 9677, + 9685, 9693, 9701, 9709, 9717, 9724, 9734, 9745, + 9756, 9767, 9772, 9783, 9794, 9805, 9816, 9821, + 9832, 9843, 9854, 9865, 9870, 9881, 9892, 9903, + 9914, 9919, 9930, 9941, 9952, 9963, 9968, 9979, + 9990, 10001, 10012, 10017, 10028, 10040, 10046, 10053, + 10059, 10066, 10072, 10078, 10084, 10088, 10095, 10100, + 10107, 10112, 10124, 10136, 10141, 10151, 10161, 10171, + 10181, 10185, 10196, 10207, 10217, 10228, 10239, 10250, + 10255, 10265, 10276, 10287, 10298, 10303, 10313, 10324, + 10335, 10346, 10351, 10361, 10372, 10383, 10394, 10399, + 10409, 10420, 10431, 10442, 10447, 10458, 10468, 10480, + 10492, 10504, 10509, 10519, 10531, 10543, 10555, 10560, + 10570, 10582, 10594, 10606, 10611, 10621, 10633, 10645, + 10657, 10662, 10672, 10684, 10696, 10708, 10719, 10730, + 10741, 10752, 10763, 10774, 10785, 10796, 10807, 10818, + 10829, 10840, 10845, 10846, 10854, 10857, 10869, 10872, + 10880, 10883, 10884, 10891, 10894, 10901, 10904, 10908, + 10914, 10931, 10933, 10935, 10942, 10957, 10972, 10988, + 10998, 11008, 11013, 11017, 11019, 11023, 11033, 11038, + 11048, 11055, 11062, 11069, 11075, 11080, 11083, 11086, + 11103, 11112, 11122, 11131, 11141, 11150, 11160, 11170, + 11178, 11188, 11196, 11206, 11214, 11231, 11248, 11265, + 11282, 11299, 11315, 11332, 11349, 11366, 11383, 11394, + 11411, 11428, 11445, 11462, 11473, 11490, 11507, 11524, + 11541, 11552, 11569, 11586, 11603, 11620, 11631, 11648, + 11665, 11682, 11699, 11710, 11727, 11744, 11761, 11778, + 11789, 11806, 11824, 11836, 11849, 11861, 11874, 11886, + 11898, 11910, 11920, 11933, 11944, 11957, 11968, 11986, + 12004, 12015, 12031, 12047, 12063, 12079, 12089, 12106, + 12123, 12139, 12156, 12173, 12190, 12201, 12217, 12234, + 12251, 12268, 12279, 12295, 12312, 12329, 12346, 12357, + 12373, 12390, 12407, 12424, 12435, 12451, 12468, 12485, + 12502, 12513, 12530, 12546, 12564, 12582, 12600, 12611, + 12627, 12645, 12663, 12681, 12692, 12708, 12726, 12744, + 12762, 12773, 12789, 12807, 12825, 12843, 12854, 12870, + 12888, 12906, 12924, 12941, 12958, 12975, 12992, 13009, + 13026, 13043, 13060, 13077, 13094, 13111, 13128, 13139, + 13142, 13143, 13152, 13155, 13162, 13165, 13172, 13175, + 13191, 13206, 13221, 13234, 13251, 13267, 13268, 13275, + 13278, 13291, 13294, 13298, 13305, 13312, 13318, 13323, + 13334, 13341, 13347, 13354, 13357, 13361, 13364, 13366, + 13368, 13371, 13376, 13385, 13387, 13389, 13392, 13399, + 13405, 13412, 13415, 13423, 13425, 13428, 13430, 13433, + 13435, 13438, 13441, 13443, 13446, 13448, 13451, 13453, + 13461, 13469, 13477, 13485, 13493, 13500, 13510, 13521, + 13532, 13543, 13548, 13559, 13570, 13581, 13592, 13597, + 13608, 13619, 13630, 13641, 13646, 13657, 13668, 13679, + 13690, 13695, 13706, 13717, 13728, 13739, 13744, 13755, + 13766, 13777, 13788, 13793, 13804, 13816, 13822, 13829, + 13835, 13842, 13848, 13854, 13860, 13864, 13871, 13876, + 13883, 13888, 13900, 13912, 13917, 13927, 13937, 13947, + 13957, 13961, 13972, 13983, 13993, 14004, 14015, 14026, + 14031, 14041, 14052, 14063, 14074, 14079, 14089, 14100, + 14111, 14122, 14127, 14137, 14148, 14159, 14170, 14175, + 14185, 14196, 14207, 14218, 14223, 14234, 14244, 14256, + 14268, 14280, 14285, 14295, 14307, 14319, 14331, 14336, + 14346, 14358, 14370, 14382, 14387, 14397, 14409, 14421, + 14433, 14438, 14448, 14460, 14472, 14484, 14495, 14506, + 14517, 14528, 14539, 14550, 14561, 14572, 14583, 14594, + 14605, 14616, 14621, 14622, 14627, 14630, 14638, 14645, + 14651, 14656, 14666, 14667, 14672, 14675, 14681, 14689, + 14691, 14694, 14696, 14699, 14701, 14704, 14707, 14709, + 14712, 14714, 14717, 14719, 14727, 14735, 14743, 14751, + 14759, 14766, 14776, 14787, 14798, 14809, 14814, 14825, + 14836, 14847, 14858, 14863, 14874, 14885, 14896, 14907, + 14912, 14923, 14934, 14945, 14956, 14961, 14972, 14983, + 14994, 15005, 15010, 15021, 15032, 15043, 15054, 15059, + 15070, 15082, 15088, 15095, 15101, 15108, 15114, 15120, + 15126, 15130, 15137, 15142, 15149, 15154, 15166, 15178, + 15183, 15193, 15203, 15213, 15223, 15227, 15238, 15249, + 15259, 15270, 15281, 15292, 15297, 15307, 15318, 15329, + 15340, 15345, 15355, 15366, 15377, 15388, 15393, 15403, + 15414, 15425, 15436, 15441, 15451, 15462, 15473, 15484, + 15489, 15500, 15510, 15522, 15534, 15546, 15551, 15561, + 15573, 15585, 15597, 15602, 15612, 15624, 15636, 15648, + 15653, 15663, 15675, 15687, 15699, 15704, 15714, 15726, + 15738, 15750, 15761, 15772, 15783, 15794, 15805, 15816, + 15827, 15838, 15849, 15860, 15871, 15882, 15887, 15888, + 15896, 15899, 15910, 15913, 15921, 15925, 15928, 15933 +}; + +static const short _smtp_received_parser_indicies[] = { + 0, 0, 1, 2, 2, 1, 3, 3, + 1, 4, 4, 1, 6, 7, 5, 8, + 1, 9, 1, 9, 11, 10, 10, 10, + 1, 13, 14, 15, 16, 17, 16, 18, + 18, 18, 12, 19, 1, 20, 1, 20, + 21, 22, 22, 1, 24, 26, 28, 25, + 25, 27, 25, 27, 25, 27, 25, 23, + 29, 1, 30, 1, 30, 32, 31, 31, + 31, 1, 24, 26, 25, 25, 25, 23, + 29, 33, 24, 26, 25, 25, 25, 23, + 29, 30, 1, 35, 36, 37, 38, 39, + 39, 34, 40, 1, 41, 1, 41, 31, + 22, 22, 1, 42, 42, 1, 44, 45, + 43, 46, 1, 47, 1, 47, 49, 48, + 48, 48, 1, 51, 52, 53, 54, 55, + 57, 54, 56, 56, 56, 50, 58, 1, + 59, 1, 59, 60, 61, 60, 62, 60, + 60, 63, 64, 65, 66, 63, 64, 65, + 66, 60, 60, 60, 60, 60, 1, 68, + 69, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 67, 71, 1, 72, 1, 72, + 74, 73, 73, 73, 73, 73, 73, 73, + 73, 1, 76, 77, 78, 79, 78, 80, + 78, 78, 78, 78, 78, 78, 78, 75, + 81, 1, 82, 1, 82, 83, 62, 1, + 85, 87, 86, 86, 86, 84, 88, 1, + 89, 1, 89, 90, 83, 83, 83, 1, + 76, 77, 79, 80, 75, 81, 91, 76, + 77, 79, 80, 75, 81, 82, 1, 92, + 85, 87, 86, 86, 86, 84, 88, 82, + 1, 88, 93, 85, 87, 86, 86, 86, + 84, 88, 89, 1, 94, 76, 77, 79, + 80, 75, 81, 89, 1, 96, 97, 98, + 95, 99, 1, 100, 1, 102, 103, 105, + 106, 107, 108, 109, 104, 101, 110, 1, + 111, 1, 111, 113, 114, 115, 116, 117, + 112, 1, 118, 1, 120, 121, 122, 119, + 123, 1, 124, 1, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 1, 133, 134, + 1, 135, 1, 137, 138, 136, 139, 1, + 140, 1, 140, 141, 1, 142, 1, 143, + 1, 144, 1, 146, 147, 148, 145, 149, + 1, 150, 1, 150, 151, 1, 152, 1, + 153, 1, 154, 1, 155, 1, 156, 1, + 157, 1, 158, 1, 160, 161, 159, 162, + 1, 163, 1, 163, 164, 164, 1, 165, + 1, 166, 1, 167, 1, 168, 1, 169, + 1, 170, 1, 172, 174, 173, 173, 173, + 171, 175, 1, 176, 1, 176, 168, 177, + 177, 177, 1, 175, 178, 172, 174, 173, + 173, 173, 171, 175, 176, 1, 169, 176, + 1, 169, 169, 170, 1, 179, 172, 174, + 173, 173, 173, 171, 175, 170, 1, 162, + 180, 160, 161, 181, 181, 159, 162, 163, + 1, 162, 165, 1, 149, 182, 146, 147, + 183, 145, 149, 150, 1, 149, 152, 1, + 182, 146, 147, 148, 145, 139, 184, 137, + 138, 185, 136, 139, 140, 1, 139, 142, + 1, 135, 1, 186, 1, 135, 1, 187, + 1, 135, 1, 188, 189, 1, 135, 1, + 135, 135, 1, 190, 1, 135, 135, 1, + 191, 1, 135, 1, 192, 1, 135, 1, + 193, 1, 135, 1, 123, 194, 120, 121, + 195, 196, 197, 198, 199, 200, 201, 202, + 119, 123, 124, 1, 123, 133, 134, 1, + 123, 186, 1, 123, 187, 1, 123, 188, + 189, 1, 123, 190, 1, 123, 191, 1, + 123, 192, 1, 123, 193, 1, 123, 118, + 1, 203, 1, 204, 1, 205, 1, 207, + 208, 209, 206, 210, 1, 211, 1, 211, + 112, 1, 210, 212, 207, 208, 209, 206, + 210, 211, 1, 210, 118, 1, 213, 1, + 204, 1, 214, 213, 1, 204, 1, 215, + 216, 1, 204, 1, 204, 1, 217, 1, + 204, 1, 110, 218, 102, 103, 105, 106, + 107, 108, 109, 104, 101, 110, 111, 1, + 110, 118, 1, 110, 203, 1, 110, 213, + 1, 110, 214, 213, 1, 110, 215, 216, + 1, 110, 217, 1, 99, 82, 1, 99, + 219, 97, 98, 221, 222, 223, 224, 225, + 220, 95, 99, 100, 1, 99, 118, 1, + 99, 203, 1, 99, 213, 1, 99, 214, + 213, 1, 99, 215, 216, 1, 99, 217, + 1, 97, 98, 95, 91, 76, 77, 78, + 79, 78, 80, 78, 78, 78, 78, 78, + 78, 78, 75, 227, 228, 226, 1, 230, + 231, 229, 1, 233, 234, 235, 236, 232, + 237, 1, 239, 240, 238, 1, 71, 241, + 68, 69, 243, 242, 242, 242, 242, 242, + 242, 242, 242, 67, 71, 72, 1, 244, + 76, 77, 78, 79, 78, 80, 78, 78, + 78, 78, 78, 78, 78, 75, 81, 72, + 1, 71, 227, 228, 226, 1, 241, 68, + 69, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 67, 246, 248, 250, 247, 247, + 249, 247, 249, 247, 249, 247, 245, 251, + 1, 252, 1, 252, 254, 253, 253, 253, + 1, 246, 248, 247, 247, 247, 245, 251, + 255, 246, 248, 247, 247, 247, 245, 251, + 252, 1, 257, 258, 259, 260, 261, 260, + 262, 260, 260, 263, 264, 265, 266, 263, + 264, 265, 266, 260, 260, 260, 260, 260, + 256, 267, 1, 268, 1, 268, 60, 253, + 60, 62, 60, 60, 63, 64, 65, 66, + 63, 64, 65, 66, 60, 60, 60, 60, + 60, 1, 68, 69, 70, 70, 70, 70, + 269, 269, 70, 70, 70, 70, 70, 67, + 241, 68, 69, 70, 70, 70, 70, 270, + 270, 70, 70, 70, 70, 70, 67, 272, + 273, 274, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 271, 276, 1, 277, 1, + 277, 279, 278, 280, 278, 281, 278, 278, + 278, 278, 278, 1, 76, 77, 282, 79, + 283, 80, 282, 284, 282, 282, 282, 282, + 282, 75, 91, 76, 77, 282, 79, 283, + 80, 282, 284, 282, 282, 282, 282, 282, + 75, 81, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 1, 285, 286, 285, 287, + 285, 285, 285, 285, 285, 1, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 1, + 289, 288, 288, 288, 1, 291, 292, 293, + 294, 295, 297, 294, 296, 296, 296, 290, + 298, 1, 299, 1, 299, 60, 300, 60, + 62, 60, 60, 60, 60, 60, 60, 60, + 1, 302, 304, 303, 303, 303, 301, 305, + 1, 306, 1, 306, 307, 300, 300, 300, + 1, 309, 310, 311, 312, 311, 313, 311, + 311, 311, 311, 311, 311, 311, 308, 298, + 314, 309, 310, 311, 312, 311, 313, 311, + 311, 311, 311, 311, 311, 311, 308, 298, + 299, 1, 315, 68, 69, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 67, 71, + 299, 1, 316, 302, 304, 303, 303, 303, + 301, 305, 299, 1, 305, 317, 302, 304, + 303, 303, 303, 301, 305, 306, 1, 318, + 309, 310, 311, 312, 311, 313, 311, 311, + 311, 311, 311, 311, 311, 308, 298, 306, + 1, 319, 97, 98, 95, 99, 299, 1, + 298, 320, 320, 321, 321, 321, 1, 320, + 320, 321, 321, 321, 1, 298, 321, 321, + 321, 1, 322, 291, 292, 293, 294, 295, + 297, 294, 296, 296, 296, 290, 323, 326, + 323, 324, 325, 325, 1, 327, 327, 328, + 328, 328, 1, 327, 329, 327, 328, 328, + 328, 1, 330, 330, 1, 331, 330, 330, + 1, 333, 334, 335, 336, 332, 327, 337, + 329, 327, 338, 328, 328, 1, 339, 1, + 340, 341, 1, 342, 1, 343, 344, 1, + 345, 1, 347, 346, 1, 347, 348, 1, + 347, 1, 343, 349, 1, 343, 1, 340, + 350, 1, 340, 1, 327, 337, 329, 327, + 351, 328, 328, 1, 327, 337, 329, 327, + 328, 328, 328, 1, 327, 329, 352, 327, + 328, 328, 328, 1, 327, 329, 327, 353, + 328, 328, 328, 1, 327, 354, 329, 327, + 328, 328, 328, 1, 327, 355, 327, 328, + 328, 328, 1, 357, 330, 356, 330, 356, + 330, 330, 356, 330, 1, 359, 331, 330, + 358, 330, 358, 330, 330, 358, 330, 1, + 359, 331, 330, 360, 330, 360, 330, 330, + 360, 330, 1, 359, 331, 330, 361, 330, + 361, 330, 330, 361, 330, 1, 359, 331, + 330, 330, 1, 363, 331, 330, 362, 330, + 362, 330, 330, 362, 330, 1, 365, 331, + 330, 364, 330, 364, 330, 330, 364, 330, + 1, 365, 331, 330, 366, 330, 366, 330, + 330, 366, 330, 1, 365, 331, 330, 367, + 330, 367, 330, 330, 367, 330, 1, 365, + 331, 330, 330, 1, 363, 331, 330, 368, + 330, 368, 330, 330, 368, 330, 1, 370, + 331, 330, 369, 330, 369, 330, 330, 369, + 330, 1, 370, 331, 330, 371, 330, 371, + 330, 330, 371, 330, 1, 370, 331, 330, + 372, 330, 372, 330, 330, 372, 330, 1, + 370, 331, 330, 330, 1, 363, 331, 330, + 373, 330, 373, 330, 330, 373, 330, 1, + 375, 331, 330, 374, 330, 374, 330, 330, + 374, 330, 1, 375, 331, 330, 376, 330, + 376, 330, 330, 376, 330, 1, 375, 331, + 330, 377, 330, 377, 330, 330, 377, 330, + 1, 375, 331, 330, 330, 1, 363, 331, + 330, 378, 330, 378, 330, 330, 378, 330, + 1, 380, 331, 330, 379, 330, 379, 330, + 330, 379, 330, 1, 380, 331, 330, 381, + 330, 381, 330, 330, 381, 330, 1, 380, + 331, 330, 382, 330, 382, 330, 330, 382, + 330, 1, 380, 331, 330, 330, 1, 384, + 331, 330, 383, 330, 383, 330, 330, 383, + 330, 1, 386, 331, 330, 385, 330, 385, + 330, 330, 385, 330, 1, 386, 331, 330, + 387, 330, 387, 330, 330, 387, 330, 1, + 386, 331, 330, 388, 330, 388, 330, 330, + 388, 330, 1, 386, 331, 330, 330, 1, + 384, 331, 330, 389, 330, 390, 330, 330, + 390, 330, 1, 391, 393, 331, 330, 392, + 330, 394, 330, 330, 394, 330, 1, 331, + 330, 395, 330, 330, 1, 396, 331, 330, + 397, 330, 330, 1, 331, 330, 398, 330, + 330, 1, 399, 331, 330, 400, 330, 330, + 1, 331, 330, 401, 330, 330, 1, 403, + 330, 402, 330, 330, 1, 403, 330, 404, + 330, 330, 1, 403, 330, 330, 1, 399, + 331, 330, 405, 330, 330, 1, 399, 331, + 330, 330, 1, 396, 331, 330, 406, 330, + 330, 1, 396, 331, 330, 330, 1, 391, + 393, 331, 330, 407, 330, 408, 330, 330, + 408, 330, 1, 391, 393, 331, 330, 409, + 330, 409, 330, 330, 409, 330, 1, 393, + 331, 330, 330, 1, 331, 330, 410, 330, + 410, 330, 330, 410, 330, 1, 412, 330, + 411, 330, 411, 330, 330, 411, 330, 1, + 412, 330, 413, 330, 413, 330, 330, 413, + 330, 1, 412, 330, 414, 330, 414, 330, + 330, 414, 330, 1, 412, 330, 330, 1, + 393, 331, 330, 409, 330, 409, 330, 330, + 409, 330, 1, 393, 331, 330, 408, 330, + 408, 330, 330, 408, 330, 1, 412, 330, + 415, 330, 415, 330, 330, 415, 330, 1, + 417, 412, 330, 416, 330, 416, 330, 330, + 416, 330, 1, 417, 412, 330, 418, 330, + 418, 330, 330, 418, 330, 1, 417, 412, + 330, 419, 330, 419, 330, 330, 419, 330, + 1, 417, 412, 330, 330, 1, 331, 330, + 420, 330, 420, 330, 330, 420, 330, 1, + 422, 412, 330, 421, 330, 421, 330, 330, + 421, 330, 1, 422, 412, 330, 423, 330, + 423, 330, 330, 423, 330, 1, 422, 412, + 330, 424, 330, 424, 330, 330, 424, 330, + 1, 422, 412, 330, 330, 1, 331, 330, + 425, 330, 425, 330, 330, 425, 330, 1, + 427, 412, 330, 426, 330, 426, 330, 330, + 426, 330, 1, 427, 412, 330, 428, 330, + 428, 330, 330, 428, 330, 1, 427, 412, + 330, 429, 330, 429, 330, 330, 429, 330, + 1, 427, 412, 330, 330, 1, 331, 330, + 430, 330, 430, 330, 330, 430, 330, 1, + 432, 412, 330, 431, 330, 431, 330, 330, + 431, 330, 1, 432, 412, 330, 433, 330, + 433, 330, 330, 433, 330, 1, 432, 412, + 330, 434, 330, 434, 330, 330, 434, 330, + 1, 432, 412, 330, 330, 1, 331, 330, + 435, 330, 435, 330, 330, 435, 330, 1, + 393, 412, 330, 436, 330, 436, 330, 330, + 436, 330, 1, 393, 412, 330, 437, 330, + 437, 330, 330, 437, 330, 1, 393, 412, + 330, 438, 330, 438, 330, 330, 438, 330, + 1, 393, 412, 330, 330, 1, 393, 331, + 330, 394, 330, 394, 330, 330, 394, 330, + 1, 412, 330, 439, 330, 440, 330, 330, + 440, 330, 1, 391, 442, 412, 330, 441, + 330, 443, 330, 330, 443, 330, 1, 391, + 442, 412, 330, 444, 330, 445, 330, 330, + 445, 330, 1, 391, 442, 412, 330, 446, + 330, 446, 330, 330, 446, 330, 1, 442, + 412, 330, 330, 1, 331, 330, 447, 330, + 448, 330, 330, 448, 330, 1, 391, 450, + 412, 330, 449, 330, 451, 330, 330, 451, + 330, 1, 391, 450, 412, 330, 452, 330, + 453, 330, 330, 453, 330, 1, 391, 450, + 412, 330, 454, 330, 454, 330, 330, 454, + 330, 1, 450, 412, 330, 330, 1, 331, + 330, 455, 330, 456, 330, 330, 456, 330, + 1, 391, 458, 412, 330, 457, 330, 459, + 330, 330, 459, 330, 1, 391, 458, 412, + 330, 460, 330, 461, 330, 330, 461, 330, + 1, 391, 458, 412, 330, 462, 330, 462, + 330, 330, 462, 330, 1, 458, 412, 330, + 330, 1, 331, 330, 463, 330, 464, 330, + 330, 464, 330, 1, 391, 466, 412, 330, + 465, 330, 467, 330, 330, 467, 330, 1, + 391, 466, 412, 330, 468, 330, 469, 330, + 330, 469, 330, 1, 391, 466, 412, 330, + 470, 330, 470, 330, 330, 470, 330, 1, + 466, 412, 330, 330, 1, 331, 330, 471, + 330, 435, 330, 330, 435, 330, 1, 391, + 393, 412, 330, 472, 330, 436, 330, 330, + 436, 330, 1, 391, 393, 412, 330, 473, + 330, 437, 330, 330, 437, 330, 1, 391, + 393, 412, 330, 438, 330, 438, 330, 330, + 438, 330, 1, 466, 412, 330, 470, 330, + 470, 330, 330, 470, 330, 1, 466, 412, + 330, 469, 330, 469, 330, 330, 469, 330, + 1, 466, 412, 330, 467, 330, 467, 330, + 330, 467, 330, 1, 458, 412, 330, 462, + 330, 462, 330, 330, 462, 330, 1, 458, + 412, 330, 461, 330, 461, 330, 330, 461, + 330, 1, 458, 412, 330, 459, 330, 459, + 330, 330, 459, 330, 1, 450, 412, 330, + 454, 330, 454, 330, 330, 454, 330, 1, + 450, 412, 330, 453, 330, 453, 330, 330, + 453, 330, 1, 450, 412, 330, 451, 330, + 451, 330, 330, 451, 330, 1, 442, 412, + 330, 446, 330, 446, 330, 330, 446, 330, + 1, 442, 412, 330, 445, 330, 445, 330, + 330, 445, 330, 1, 442, 412, 330, 443, + 330, 443, 330, 330, 443, 330, 1, 363, + 331, 330, 330, 1, 81, 289, 288, 288, + 288, 1, 475, 476, 474, 1, 478, 479, + 477, 1, 233, 234, 235, 236, 480, 232, + 481, 1, 483, 484, 482, 1, 486, 485, + 485, 487, 485, 485, 485, 485, 485, 1, + 488, 489, 488, 490, 488, 488, 488, 488, + 488, 1, 488, 488, 488, 488, 488, 488, + 488, 488, 488, 1, 492, 491, 491, 491, + 1, 493, 494, 496, 493, 495, 495, 495, + 1, 493, 493, 495, 495, 495, 1, 495, + 495, 495, 1, 498, 499, 500, 501, 497, + 502, 505, 502, 503, 504, 504, 1, 506, + 506, 507, 507, 507, 1, 506, 508, 506, + 507, 507, 507, 1, 509, 509, 1, 510, + 509, 509, 1, 511, 1, 506, 512, 508, + 506, 513, 507, 507, 1, 514, 1, 515, + 516, 1, 517, 1, 518, 519, 1, 520, + 1, 522, 521, 1, 522, 523, 1, 522, + 1, 518, 524, 1, 518, 1, 515, 525, + 1, 515, 1, 506, 512, 508, 506, 526, + 507, 507, 1, 506, 512, 508, 506, 507, + 507, 507, 1, 506, 508, 527, 506, 507, + 507, 507, 1, 506, 508, 506, 528, 507, + 507, 507, 1, 506, 529, 508, 506, 507, + 507, 507, 1, 506, 530, 506, 507, 507, + 507, 1, 532, 509, 531, 509, 531, 509, + 509, 531, 509, 1, 534, 510, 509, 533, + 509, 533, 509, 509, 533, 509, 1, 534, + 510, 509, 535, 509, 535, 509, 509, 535, + 509, 1, 534, 510, 509, 536, 509, 536, + 509, 509, 536, 509, 1, 534, 510, 509, + 509, 1, 538, 510, 509, 537, 509, 537, + 509, 509, 537, 509, 1, 540, 510, 509, + 539, 509, 539, 509, 509, 539, 509, 1, + 540, 510, 509, 541, 509, 541, 509, 509, + 541, 509, 1, 540, 510, 509, 542, 509, + 542, 509, 509, 542, 509, 1, 540, 510, + 509, 509, 1, 538, 510, 509, 543, 509, + 543, 509, 509, 543, 509, 1, 545, 510, + 509, 544, 509, 544, 509, 509, 544, 509, + 1, 545, 510, 509, 546, 509, 546, 509, + 509, 546, 509, 1, 545, 510, 509, 547, + 509, 547, 509, 509, 547, 509, 1, 545, + 510, 509, 509, 1, 538, 510, 509, 548, + 509, 548, 509, 509, 548, 509, 1, 550, + 510, 509, 549, 509, 549, 509, 509, 549, + 509, 1, 550, 510, 509, 551, 509, 551, + 509, 509, 551, 509, 1, 550, 510, 509, + 552, 509, 552, 509, 509, 552, 509, 1, + 550, 510, 509, 509, 1, 538, 510, 509, + 553, 509, 553, 509, 509, 553, 509, 1, + 555, 510, 509, 554, 509, 554, 509, 509, + 554, 509, 1, 555, 510, 509, 556, 509, + 556, 509, 509, 556, 509, 1, 555, 510, + 509, 557, 509, 557, 509, 509, 557, 509, + 1, 555, 510, 509, 509, 1, 559, 510, + 509, 558, 509, 558, 509, 509, 558, 509, + 1, 561, 510, 509, 560, 509, 560, 509, + 509, 560, 509, 1, 561, 510, 509, 562, + 509, 562, 509, 509, 562, 509, 1, 561, + 510, 509, 563, 509, 563, 509, 509, 563, + 509, 1, 561, 510, 509, 509, 1, 559, + 510, 509, 564, 509, 565, 509, 509, 565, + 509, 1, 566, 568, 510, 509, 567, 509, + 569, 509, 509, 569, 509, 1, 510, 509, + 570, 509, 509, 1, 571, 510, 509, 572, + 509, 509, 1, 510, 509, 573, 509, 509, + 1, 574, 510, 509, 575, 509, 509, 1, + 510, 509, 576, 509, 509, 1, 578, 509, + 577, 509, 509, 1, 578, 509, 579, 509, + 509, 1, 578, 509, 509, 1, 574, 510, + 509, 580, 509, 509, 1, 574, 510, 509, + 509, 1, 571, 510, 509, 581, 509, 509, + 1, 571, 510, 509, 509, 1, 566, 568, + 510, 509, 582, 509, 583, 509, 509, 583, + 509, 1, 566, 568, 510, 509, 584, 509, + 584, 509, 509, 584, 509, 1, 568, 510, + 509, 509, 1, 510, 509, 585, 509, 585, + 509, 509, 585, 509, 1, 587, 509, 586, + 509, 586, 509, 509, 586, 509, 1, 587, + 509, 588, 509, 588, 509, 509, 588, 509, + 1, 587, 509, 589, 509, 589, 509, 509, + 589, 509, 1, 587, 509, 509, 1, 568, + 510, 509, 584, 509, 584, 509, 509, 584, + 509, 1, 568, 510, 509, 583, 509, 583, + 509, 509, 583, 509, 1, 587, 509, 590, + 509, 590, 509, 509, 590, 509, 1, 592, + 587, 509, 591, 509, 591, 509, 509, 591, + 509, 1, 592, 587, 509, 593, 509, 593, + 509, 509, 593, 509, 1, 592, 587, 509, + 594, 509, 594, 509, 509, 594, 509, 1, + 592, 587, 509, 509, 1, 510, 509, 595, + 509, 595, 509, 509, 595, 509, 1, 597, + 587, 509, 596, 509, 596, 509, 509, 596, + 509, 1, 597, 587, 509, 598, 509, 598, + 509, 509, 598, 509, 1, 597, 587, 509, + 599, 509, 599, 509, 509, 599, 509, 1, + 597, 587, 509, 509, 1, 510, 509, 600, + 509, 600, 509, 509, 600, 509, 1, 602, + 587, 509, 601, 509, 601, 509, 509, 601, + 509, 1, 602, 587, 509, 603, 509, 603, + 509, 509, 603, 509, 1, 602, 587, 509, + 604, 509, 604, 509, 509, 604, 509, 1, + 602, 587, 509, 509, 1, 510, 509, 605, + 509, 605, 509, 509, 605, 509, 1, 607, + 587, 509, 606, 509, 606, 509, 509, 606, + 509, 1, 607, 587, 509, 608, 509, 608, + 509, 509, 608, 509, 1, 607, 587, 509, + 609, 509, 609, 509, 509, 609, 509, 1, + 607, 587, 509, 509, 1, 510, 509, 610, + 509, 610, 509, 509, 610, 509, 1, 568, + 587, 509, 611, 509, 611, 509, 509, 611, + 509, 1, 568, 587, 509, 612, 509, 612, + 509, 509, 612, 509, 1, 568, 587, 509, + 613, 509, 613, 509, 509, 613, 509, 1, + 568, 587, 509, 509, 1, 568, 510, 509, + 569, 509, 569, 509, 509, 569, 509, 1, + 587, 509, 614, 509, 615, 509, 509, 615, + 509, 1, 566, 617, 587, 509, 616, 509, + 618, 509, 509, 618, 509, 1, 566, 617, + 587, 509, 619, 509, 620, 509, 509, 620, + 509, 1, 566, 617, 587, 509, 621, 509, + 621, 509, 509, 621, 509, 1, 617, 587, + 509, 509, 1, 510, 509, 622, 509, 623, + 509, 509, 623, 509, 1, 566, 625, 587, + 509, 624, 509, 626, 509, 509, 626, 509, + 1, 566, 625, 587, 509, 627, 509, 628, + 509, 509, 628, 509, 1, 566, 625, 587, + 509, 629, 509, 629, 509, 509, 629, 509, + 1, 625, 587, 509, 509, 1, 510, 509, + 630, 509, 631, 509, 509, 631, 509, 1, + 566, 633, 587, 509, 632, 509, 634, 509, + 509, 634, 509, 1, 566, 633, 587, 509, + 635, 509, 636, 509, 509, 636, 509, 1, + 566, 633, 587, 509, 637, 509, 637, 509, + 509, 637, 509, 1, 633, 587, 509, 509, + 1, 510, 509, 638, 509, 639, 509, 509, + 639, 509, 1, 566, 641, 587, 509, 640, + 509, 642, 509, 509, 642, 509, 1, 566, + 641, 587, 509, 643, 509, 644, 509, 509, + 644, 509, 1, 566, 641, 587, 509, 645, + 509, 645, 509, 509, 645, 509, 1, 641, + 587, 509, 509, 1, 510, 509, 646, 509, + 610, 509, 509, 610, 509, 1, 566, 568, + 587, 509, 647, 509, 611, 509, 509, 611, + 509, 1, 566, 568, 587, 509, 648, 509, + 612, 509, 509, 612, 509, 1, 566, 568, + 587, 509, 613, 509, 613, 509, 509, 613, + 509, 1, 641, 587, 509, 645, 509, 645, + 509, 509, 645, 509, 1, 641, 587, 509, + 644, 509, 644, 509, 509, 644, 509, 1, + 641, 587, 509, 642, 509, 642, 509, 509, + 642, 509, 1, 633, 587, 509, 637, 509, + 637, 509, 509, 637, 509, 1, 633, 587, + 509, 636, 509, 636, 509, 509, 636, 509, + 1, 633, 587, 509, 634, 509, 634, 509, + 509, 634, 509, 1, 625, 587, 509, 629, + 509, 629, 509, 509, 629, 509, 1, 625, + 587, 509, 628, 509, 628, 509, 509, 628, + 509, 1, 625, 587, 509, 626, 509, 626, + 509, 509, 626, 509, 1, 617, 587, 509, + 621, 509, 621, 509, 509, 621, 509, 1, + 617, 587, 509, 620, 509, 620, 509, 509, + 620, 509, 1, 617, 587, 509, 618, 509, + 618, 509, 509, 618, 509, 1, 538, 510, + 509, 509, 1, 650, 651, 649, 1, 653, + 654, 652, 1, 655, 1, 656, 1, 658, + 659, 657, 1, 660, 660, 660, 1, 661, + 662, 487, 663, 662, 660, 660, 660, 1, + 487, 1, 662, 662, 660, 660, 660, 1, + 486, 485, 485, 485, 485, 485, 485, 485, + 485, 1, 664, 664, 664, 1, 665, 666, + 281, 667, 666, 664, 664, 664, 1, 281, + 1, 666, 666, 664, 664, 664, 1, 669, + 668, 668, 668, 668, 668, 668, 668, 668, + 1, 671, 672, 670, 1, 674, 675, 673, + 1, 676, 1, 677, 1, 679, 680, 678, + 1, 276, 72, 1, 276, 681, 273, 274, + 683, 682, 684, 682, 685, 682, 682, 682, + 682, 682, 271, 276, 277, 1, 686, 76, + 77, 282, 79, 283, 80, 282, 284, 282, + 282, 282, 282, 282, 75, 81, 277, 1, + 276, 475, 476, 474, 1, 276, 486, 485, + 485, 487, 485, 485, 485, 485, 485, 1, + 276, 664, 664, 664, 1, 687, 68, 69, + 70, 70, 70, 70, 70, 70, 70, 70, + 70, 67, 71, 277, 1, 68, 69, 70, + 70, 70, 70, 688, 688, 70, 70, 70, + 70, 70, 67, 690, 691, 692, 693, 693, + 693, 693, 693, 693, 693, 693, 693, 689, + 694, 1, 695, 1, 695, 74, 696, 697, + 696, 696, 696, 696, 696, 696, 696, 1, + 699, 700, 701, 702, 701, 703, 701, 701, + 701, 701, 701, 701, 701, 698, 704, 1, + 705, 1, 705, 60, 706, 60, 62, 60, + 60, 63, 63, 60, 60, 60, 60, 60, + 1, 708, 710, 709, 709, 709, 707, 711, + 1, 712, 1, 712, 713, 706, 706, 706, + 1, 699, 700, 714, 702, 714, 703, 714, + 714, 715, 715, 714, 714, 714, 714, 714, + 698, 704, 716, 699, 700, 714, 702, 714, + 703, 714, 714, 715, 715, 714, 714, 714, + 714, 714, 698, 704, 705, 1, 717, 68, + 69, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 67, 71, 705, 1, 718, 708, + 710, 709, 709, 709, 707, 711, 705, 1, + 711, 719, 708, 710, 709, 709, 709, 707, + 711, 712, 1, 720, 699, 700, 714, 702, + 714, 703, 714, 714, 715, 715, 714, 714, + 714, 714, 714, 698, 704, 712, 1, 721, + 97, 98, 95, 99, 705, 1, 717, 68, + 69, 70, 70, 70, 70, 269, 269, 70, + 70, 70, 70, 70, 67, 716, 699, 700, + 701, 702, 701, 703, 701, 701, 701, 701, + 701, 701, 701, 698, 722, 722, 722, 722, + 722, 722, 722, 722, 722, 1, 722, 697, + 722, 723, 722, 722, 722, 722, 722, 1, + 724, 724, 724, 724, 725, 724, 724, 724, + 724, 724, 1, 724, 726, 727, 724, 724, + 724, 724, 724, 724, 1, 724, 724, 724, + 724, 724, 724, 724, 724, 724, 1, 699, + 700, 702, 703, 698, 728, 725, 725, 1, + 727, 1, 694, 72, 1, 694, 729, 691, + 692, 731, 730, 732, 730, 730, 730, 730, + 730, 730, 730, 689, 694, 695, 1, 733, + 699, 700, 701, 702, 701, 703, 701, 701, + 701, 701, 701, 701, 701, 698, 704, 695, + 1, 694, 227, 228, 226, 1, 694, 722, + 722, 722, 722, 722, 722, 722, 722, 722, + 1, 734, 68, 69, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 67, 71, 695, + 1, 68, 69, 70, 70, 70, 70, 735, + 735, 70, 70, 70, 70, 70, 67, 241, + 68, 69, 70, 70, 70, 70, 736, 736, + 70, 70, 70, 70, 70, 67, 738, 739, + 740, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 737, 742, 1, 743, 1, 743, + 74, 744, 744, 744, 744, 744, 744, 744, + 744, 1, 746, 747, 748, 749, 748, 750, + 748, 748, 748, 748, 748, 748, 748, 745, + 751, 1, 752, 1, 752, 60, 753, 60, + 62, 60, 60, 63, 64, 66, 63, 64, + 66, 60, 60, 60, 60, 60, 1, 755, + 757, 756, 756, 756, 754, 758, 1, 759, + 1, 759, 760, 753, 753, 753, 1, 746, + 747, 761, 749, 761, 750, 761, 761, 762, + 763, 764, 762, 763, 764, 761, 761, 761, + 761, 761, 745, 751, 765, 746, 747, 761, + 749, 761, 750, 761, 761, 762, 763, 764, + 762, 763, 764, 761, 761, 761, 761, 761, + 745, 751, 752, 1, 766, 68, 69, 70, + 70, 70, 70, 70, 70, 70, 70, 70, + 67, 71, 752, 1, 767, 755, 757, 756, + 756, 756, 754, 758, 752, 1, 758, 768, + 755, 757, 756, 756, 756, 754, 758, 759, + 1, 769, 746, 747, 761, 749, 761, 750, + 761, 761, 762, 763, 764, 762, 763, 764, + 761, 761, 761, 761, 761, 745, 751, 759, + 1, 770, 97, 98, 95, 99, 752, 1, + 766, 68, 69, 70, 70, 70, 70, 269, + 269, 70, 70, 70, 70, 70, 67, 766, + 68, 69, 70, 70, 70, 70, 688, 688, + 70, 70, 70, 70, 70, 67, 766, 68, + 69, 70, 70, 70, 70, 771, 771, 70, + 70, 70, 70, 70, 67, 241, 68, 69, + 70, 70, 70, 70, 772, 772, 70, 70, + 70, 70, 70, 67, 241, 68, 69, 70, + 70, 70, 70, 773, 773, 70, 70, 70, + 70, 70, 67, 775, 776, 777, 778, 778, + 778, 778, 778, 778, 778, 778, 778, 774, + 779, 1, 780, 1, 780, 74, 781, 781, + 781, 782, 783, 784, 785, 781, 781, 781, + 781, 781, 1, 787, 788, 789, 790, 789, + 791, 789, 789, 789, 789, 789, 789, 789, + 786, 792, 1, 793, 1, 793, 60, 794, + 60, 62, 60, 60, 63, 64, 63, 64, + 60, 60, 60, 60, 60, 1, 796, 798, + 797, 797, 797, 795, 799, 1, 800, 1, + 800, 801, 794, 794, 794, 1, 787, 788, + 802, 790, 802, 791, 802, 802, 803, 804, + 803, 804, 802, 802, 802, 802, 802, 786, + 792, 805, 787, 788, 802, 790, 802, 791, + 802, 802, 803, 804, 803, 804, 802, 802, + 802, 802, 802, 786, 792, 793, 1, 806, + 68, 69, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 67, 71, 793, 1, 807, + 796, 798, 797, 797, 797, 795, 799, 793, + 1, 799, 808, 796, 798, 797, 797, 797, + 795, 799, 800, 1, 809, 787, 788, 802, + 790, 802, 791, 802, 802, 803, 804, 803, + 804, 802, 802, 802, 802, 802, 786, 792, + 800, 1, 810, 97, 98, 95, 99, 793, + 1, 806, 68, 69, 70, 70, 70, 70, + 269, 269, 70, 70, 70, 70, 70, 67, + 806, 68, 69, 70, 70, 70, 70, 688, + 688, 70, 70, 70, 70, 70, 67, 805, + 787, 788, 789, 790, 789, 791, 789, 789, + 789, 789, 789, 789, 789, 786, 787, 788, + 789, 790, 789, 791, 789, 789, 811, 789, + 789, 789, 789, 789, 786, 805, 787, 788, + 789, 790, 789, 791, 789, 789, 812, 789, + 789, 789, 789, 789, 786, 805, 787, 788, + 789, 790, 789, 791, 789, 789, 813, 789, + 789, 789, 789, 789, 786, 805, 787, 788, + 789, 790, 789, 791, 789, 789, 814, 789, + 789, 789, 789, 789, 786, 816, 817, 818, + 819, 820, 819, 821, 819, 819, 822, 819, + 819, 819, 819, 819, 815, 824, 825, 826, + 827, 828, 827, 829, 827, 827, 827, 827, + 827, 827, 827, 823, 787, 788, 789, 790, + 789, 791, 789, 789, 830, 789, 789, 789, + 789, 789, 786, 805, 787, 788, 789, 790, + 789, 791, 789, 789, 831, 789, 789, 789, + 789, 789, 786, 805, 787, 788, 789, 790, + 789, 791, 789, 789, 832, 789, 789, 789, + 789, 789, 786, 834, 835, 836, 837, 838, + 837, 839, 837, 837, 837, 837, 837, 837, + 837, 833, 787, 788, 789, 790, 789, 791, + 789, 789, 840, 789, 789, 789, 789, 789, + 786, 805, 787, 788, 789, 790, 789, 791, + 789, 789, 841, 789, 789, 789, 789, 789, + 786, 805, 787, 788, 789, 790, 789, 791, + 789, 789, 842, 789, 789, 789, 789, 789, + 786, 844, 845, 846, 847, 848, 847, 849, + 847, 847, 847, 847, 847, 847, 847, 843, + 787, 788, 789, 790, 789, 791, 789, 789, + 850, 789, 789, 789, 789, 789, 786, 805, + 787, 788, 789, 790, 789, 791, 789, 789, + 851, 789, 789, 789, 789, 789, 786, 805, + 787, 788, 789, 790, 789, 791, 789, 789, + 852, 789, 789, 789, 789, 789, 786, 854, + 855, 856, 857, 858, 857, 859, 857, 857, + 857, 857, 857, 857, 857, 853, 779, 72, + 1, 779, 860, 776, 777, 862, 861, 861, + 861, 863, 864, 865, 866, 861, 861, 861, + 861, 861, 774, 779, 780, 1, 867, 787, + 788, 789, 790, 789, 791, 789, 789, 789, + 789, 789, 789, 789, 786, 792, 780, 1, + 779, 227, 228, 226, 1, 867, 787, 788, + 789, 790, 789, 791, 789, 789, 811, 789, + 789, 789, 789, 789, 786, 867, 787, 788, + 789, 790, 789, 791, 789, 789, 830, 789, + 789, 789, 789, 789, 786, 867, 787, 788, + 789, 790, 789, 791, 789, 789, 840, 789, + 789, 789, 789, 789, 786, 867, 787, 788, + 789, 790, 789, 791, 789, 789, 850, 789, + 789, 789, 789, 789, 786, 868, 68, 69, + 70, 70, 70, 70, 70, 70, 70, 70, + 70, 67, 71, 780, 1, 68, 69, 70, + 70, 70, 70, 771, 771, 70, 70, 70, + 70, 70, 67, 765, 746, 747, 748, 749, + 748, 750, 748, 748, 748, 748, 748, 748, + 748, 745, 742, 72, 1, 742, 869, 739, + 740, 871, 870, 870, 870, 870, 870, 870, + 870, 870, 737, 742, 743, 1, 872, 746, + 747, 748, 749, 748, 750, 748, 748, 748, + 748, 748, 748, 748, 745, 751, 743, 1, + 742, 227, 228, 226, 1, 873, 68, 69, + 70, 70, 70, 70, 70, 70, 70, 70, + 70, 67, 71, 743, 1, 267, 252, 1, + 267, 874, 258, 259, 260, 261, 260, 262, + 260, 260, 263, 264, 265, 266, 263, 264, + 265, 266, 260, 260, 260, 260, 260, 256, + 267, 268, 1, 875, 68, 69, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 67, + 71, 268, 1, 876, 246, 248, 247, 247, + 247, 245, 251, 268, 1, 877, 97, 98, + 95, 99, 268, 1, 875, 68, 69, 70, + 70, 70, 70, 269, 269, 70, 70, 70, + 70, 70, 67, 875, 68, 69, 70, 70, + 70, 70, 688, 688, 70, 70, 70, 70, + 70, 67, 875, 68, 69, 70, 70, 70, + 70, 735, 735, 70, 70, 70, 70, 70, + 67, 875, 68, 69, 70, 70, 70, 70, + 771, 771, 70, 70, 70, 70, 70, 67, + 258, 259, 260, 261, 260, 262, 260, 260, + 263, 264, 265, 266, 263, 264, 265, 266, + 260, 260, 260, 260, 260, 256, 879, 880, + 881, 883, 884, 885, 882, 884, 882, 882, + 886, 882, 886, 882, 886, 882, 878, 887, + 1, 888, 1, 888, 254, 889, 253, 253, + 253, 1, 246, 248, 890, 893, 247, 890, + 247, 247, 891, 247, 892, 247, 892, 247, + 245, 255, 246, 248, 894, 247, 894, 247, + 247, 895, 247, 895, 247, 895, 247, 245, + 255, 246, 248, 894, 896, 247, 894, 247, + 247, 895, 247, 895, 247, 895, 247, 245, + 255, 246, 247, 898, 899, 247, 247, 897, + 897, 245, 255, 246, 247, 898, 899, 247, + 900, 897, 897, 245, 251, 902, 901, 901, + 1, 902, 901, 901, 1, 903, 1, 905, + 906, 907, 908, 904, 257, 258, 259, 910, + 911, 910, 910, 910, 910, 912, 910, 910, + 910, 913, 914, 915, 916, 917, 913, 914, + 915, 916, 909, 909, 256, 875, 68, 69, + 919, 919, 919, 918, 918, 920, 918, 919, + 918, 919, 918, 918, 67, 241, 68, 69, + 919, 919, 919, 918, 918, 920, 918, 919, + 918, 919, 918, 918, 67, 71, 902, 901, + 901, 1, 71, 903, 1, 267, 902, 901, + 901, 1, 876, 246, 247, 898, 899, 247, + 900, 897, 897, 245, 255, 246, 921, 247, + 247, 247, 245, 922, 905, 906, 923, 907, + 923, 908, 923, 923, 924, 925, 926, 927, + 924, 925, 926, 927, 923, 923, 923, 923, + 923, 904, 877, 97, 98, 929, 928, 928, + 95, 99, 902, 901, 901, 1, 99, 903, + 1, 875, 68, 69, 919, 919, 919, 918, + 918, 930, 920, 930, 918, 919, 918, 919, + 918, 918, 67, 241, 68, 69, 919, 919, + 919, 918, 918, 931, 920, 931, 918, 919, + 918, 919, 918, 918, 67, 272, 273, 274, + 933, 933, 933, 932, 932, 934, 932, 933, + 932, 933, 932, 932, 271, 687, 68, 69, + 919, 919, 919, 918, 918, 920, 918, 919, + 918, 919, 918, 918, 67, 276, 902, 901, + 901, 1, 276, 903, 1, 875, 68, 69, + 919, 919, 919, 918, 918, 935, 920, 935, + 918, 919, 918, 919, 918, 918, 67, 690, + 691, 692, 937, 937, 937, 936, 936, 938, + 936, 937, 936, 937, 936, 936, 689, 734, + 68, 69, 919, 919, 919, 918, 918, 920, + 918, 919, 918, 919, 918, 918, 67, 694, + 902, 901, 901, 1, 694, 903, 1, 875, + 68, 69, 919, 919, 919, 918, 918, 939, + 920, 939, 918, 919, 918, 919, 918, 918, + 67, 241, 68, 69, 919, 919, 919, 918, + 918, 940, 920, 940, 918, 919, 918, 919, + 918, 918, 67, 738, 739, 740, 942, 942, + 942, 941, 941, 943, 941, 942, 941, 942, + 941, 941, 737, 873, 68, 69, 919, 919, + 919, 918, 918, 920, 918, 919, 918, 919, + 918, 918, 67, 742, 902, 901, 901, 1, + 742, 903, 1, 875, 68, 69, 919, 919, + 919, 918, 918, 944, 920, 944, 918, 919, + 918, 919, 918, 918, 67, 241, 68, 69, + 919, 919, 919, 918, 918, 945, 920, 945, + 918, 919, 918, 919, 918, 918, 67, 241, + 68, 69, 919, 919, 919, 918, 918, 946, + 920, 946, 918, 919, 918, 919, 918, 918, + 67, 775, 776, 777, 948, 948, 948, 947, + 947, 949, 947, 948, 947, 948, 947, 947, + 774, 868, 68, 69, 919, 919, 919, 918, + 918, 920, 918, 919, 918, 919, 918, 918, + 67, 779, 902, 901, 901, 1, 779, 903, + 1, 267, 903, 1, 255, 246, 248, 894, + 950, 896, 247, 894, 247, 247, 951, 247, + 895, 247, 895, 247, 245, 255, 246, 248, + 247, 247, 952, 247, 247, 245, 255, 246, + 248, 953, 247, 247, 954, 247, 247, 245, + 255, 246, 248, 247, 247, 955, 247, 247, + 245, 255, 246, 248, 956, 247, 247, 957, + 247, 247, 245, 255, 246, 248, 247, 247, + 958, 247, 247, 245, 255, 246, 248, 960, + 247, 247, 959, 247, 247, 245, 255, 246, + 248, 960, 247, 247, 961, 247, 247, 245, + 255, 246, 248, 960, 247, 247, 247, 245, + 255, 246, 248, 956, 247, 247, 962, 247, + 247, 245, 255, 246, 248, 956, 247, 247, + 247, 245, 255, 246, 248, 953, 247, 247, + 963, 247, 247, 245, 255, 246, 248, 953, + 247, 247, 247, 245, 255, 246, 248, 894, + 950, 896, 247, 894, 247, 247, 964, 247, + 895, 247, 895, 247, 245, 255, 246, 248, + 894, 950, 896, 247, 894, 247, 247, 895, + 247, 895, 247, 895, 247, 245, 255, 246, + 248, 894, 896, 965, 247, 894, 247, 247, + 895, 247, 895, 247, 895, 247, 245, 255, + 246, 248, 894, 896, 247, 894, 966, 247, + 247, 895, 247, 895, 247, 895, 247, 245, + 255, 246, 248, 894, 967, 896, 247, 894, + 247, 247, 895, 247, 895, 247, 895, 247, + 245, 255, 246, 248, 894, 968, 247, 894, + 247, 247, 895, 247, 895, 247, 895, 247, + 245, 255, 246, 247, 898, 899, 970, 247, + 247, 897, 969, 897, 969, 897, 897, 969, + 897, 245, 255, 246, 247, 898, 899, 972, + 247, 900, 897, 971, 897, 971, 897, 897, + 971, 897, 245, 255, 246, 247, 898, 899, + 972, 247, 900, 897, 973, 897, 973, 897, + 897, 973, 897, 245, 255, 246, 247, 898, + 899, 972, 247, 900, 897, 974, 897, 974, + 897, 897, 974, 897, 245, 255, 246, 247, + 898, 899, 972, 247, 900, 897, 897, 245, + 255, 246, 247, 898, 899, 976, 247, 900, + 897, 975, 897, 975, 897, 897, 975, 897, + 245, 255, 246, 247, 898, 899, 978, 247, + 900, 897, 977, 897, 977, 897, 897, 977, + 897, 245, 255, 246, 247, 898, 899, 978, + 247, 900, 897, 979, 897, 979, 897, 897, + 979, 897, 245, 255, 246, 247, 898, 899, + 978, 247, 900, 897, 980, 897, 980, 897, + 897, 980, 897, 245, 255, 246, 247, 898, + 899, 978, 247, 900, 897, 897, 245, 255, + 246, 247, 898, 899, 976, 247, 900, 897, + 981, 897, 981, 897, 897, 981, 897, 245, + 255, 246, 247, 898, 899, 983, 247, 900, + 897, 982, 897, 982, 897, 897, 982, 897, + 245, 255, 246, 247, 898, 899, 983, 247, + 900, 897, 984, 897, 984, 897, 897, 984, + 897, 245, 255, 246, 247, 898, 899, 983, + 247, 900, 897, 985, 897, 985, 897, 897, + 985, 897, 245, 255, 246, 247, 898, 899, + 983, 247, 900, 897, 897, 245, 255, 246, + 247, 898, 899, 976, 247, 900, 897, 986, + 897, 986, 897, 897, 986, 897, 245, 255, + 246, 247, 898, 899, 988, 247, 900, 897, + 987, 897, 987, 897, 897, 987, 897, 245, + 255, 246, 247, 898, 899, 988, 247, 900, + 897, 989, 897, 989, 897, 897, 989, 897, + 245, 255, 246, 247, 898, 899, 988, 247, + 900, 897, 990, 897, 990, 897, 897, 990, + 897, 245, 255, 246, 247, 898, 899, 988, + 247, 900, 897, 897, 245, 255, 246, 247, + 898, 899, 976, 247, 900, 897, 991, 897, + 991, 897, 897, 991, 897, 245, 255, 246, + 247, 898, 899, 993, 247, 900, 897, 992, + 897, 992, 897, 897, 992, 897, 245, 255, + 246, 247, 898, 899, 993, 247, 900, 897, + 994, 897, 994, 897, 897, 994, 897, 245, + 255, 246, 247, 898, 899, 993, 247, 900, + 897, 995, 897, 995, 897, 897, 995, 897, + 245, 255, 246, 247, 898, 899, 993, 247, + 900, 897, 897, 245, 255, 246, 247, 898, + 899, 997, 247, 900, 897, 996, 897, 996, + 897, 897, 996, 897, 245, 255, 246, 247, + 898, 899, 999, 247, 900, 897, 998, 897, + 998, 897, 897, 998, 897, 245, 255, 246, + 247, 898, 899, 999, 247, 900, 897, 1000, + 897, 1000, 897, 897, 1000, 897, 245, 255, + 246, 247, 898, 899, 999, 247, 900, 897, + 1001, 897, 1001, 897, 897, 1001, 897, 245, + 255, 246, 247, 898, 899, 999, 247, 900, + 897, 897, 245, 255, 246, 247, 898, 899, + 997, 247, 900, 897, 1002, 897, 1003, 897, + 897, 1003, 897, 245, 255, 246, 247, 898, + 899, 1004, 1006, 247, 900, 897, 1005, 897, + 1007, 897, 897, 1007, 897, 245, 255, 246, + 247, 898, 899, 247, 900, 897, 1008, 897, + 897, 245, 255, 246, 247, 898, 899, 1009, + 247, 900, 897, 1010, 897, 897, 245, 255, + 246, 247, 898, 899, 247, 900, 897, 1011, + 897, 897, 245, 255, 246, 247, 898, 899, + 1012, 247, 900, 897, 1013, 897, 897, 245, + 255, 246, 247, 898, 899, 247, 900, 897, + 1014, 897, 897, 245, 255, 246, 247, 898, + 899, 247, 1016, 897, 1015, 897, 897, 245, + 255, 246, 247, 898, 899, 247, 1016, 897, + 1017, 897, 897, 245, 255, 246, 247, 898, + 899, 247, 1016, 897, 897, 245, 255, 246, + 247, 898, 899, 1012, 247, 900, 897, 1018, + 897, 897, 245, 255, 246, 247, 898, 899, + 1012, 247, 900, 897, 897, 245, 255, 246, + 247, 898, 899, 1009, 247, 900, 897, 1019, + 897, 897, 245, 255, 246, 247, 898, 899, + 1009, 247, 900, 897, 897, 245, 255, 246, + 247, 898, 899, 1004, 1006, 247, 900, 897, + 1020, 897, 1021, 897, 897, 1021, 897, 245, + 255, 246, 247, 898, 899, 1004, 1006, 247, + 900, 897, 1022, 897, 1022, 897, 897, 1022, + 897, 245, 255, 246, 247, 898, 899, 1006, + 247, 900, 897, 897, 245, 255, 246, 247, + 898, 899, 247, 900, 897, 1023, 897, 1023, + 897, 897, 1023, 897, 245, 255, 246, 247, + 898, 899, 247, 1025, 897, 1024, 897, 1024, + 897, 897, 1024, 897, 245, 255, 246, 247, + 898, 899, 247, 1025, 897, 1026, 897, 1026, + 897, 897, 1026, 897, 245, 255, 246, 247, + 898, 899, 247, 1025, 897, 1027, 897, 1027, + 897, 897, 1027, 897, 245, 255, 246, 247, + 898, 899, 247, 1025, 897, 897, 245, 255, + 246, 247, 898, 899, 1006, 247, 900, 897, + 1022, 897, 1022, 897, 897, 1022, 897, 245, + 255, 246, 247, 898, 899, 1006, 247, 900, + 897, 1021, 897, 1021, 897, 897, 1021, 897, + 245, 255, 246, 247, 898, 899, 247, 1025, + 897, 1028, 897, 1028, 897, 897, 1028, 897, + 245, 255, 246, 247, 898, 899, 1030, 247, + 1025, 897, 1029, 897, 1029, 897, 897, 1029, + 897, 245, 255, 246, 247, 898, 899, 1030, + 247, 1025, 897, 1031, 897, 1031, 897, 897, + 1031, 897, 245, 255, 246, 247, 898, 899, + 1030, 247, 1025, 897, 1032, 897, 1032, 897, + 897, 1032, 897, 245, 255, 246, 247, 898, + 899, 1030, 247, 1025, 897, 897, 245, 255, + 246, 247, 898, 899, 247, 900, 897, 1033, + 897, 1033, 897, 897, 1033, 897, 245, 255, + 246, 247, 898, 899, 1035, 247, 1025, 897, + 1034, 897, 1034, 897, 897, 1034, 897, 245, + 255, 246, 247, 898, 899, 1035, 247, 1025, + 897, 1036, 897, 1036, 897, 897, 1036, 897, + 245, 255, 246, 247, 898, 899, 1035, 247, + 1025, 897, 1037, 897, 1037, 897, 897, 1037, + 897, 245, 255, 246, 247, 898, 899, 1035, + 247, 1025, 897, 897, 245, 255, 246, 247, + 898, 899, 247, 900, 897, 1038, 897, 1038, + 897, 897, 1038, 897, 245, 255, 246, 247, + 898, 899, 1040, 247, 1025, 897, 1039, 897, + 1039, 897, 897, 1039, 897, 245, 255, 246, + 247, 898, 899, 1040, 247, 1025, 897, 1041, + 897, 1041, 897, 897, 1041, 897, 245, 255, + 246, 247, 898, 899, 1040, 247, 1025, 897, + 1042, 897, 1042, 897, 897, 1042, 897, 245, + 255, 246, 247, 898, 899, 1040, 247, 1025, + 897, 897, 245, 255, 246, 247, 898, 899, + 247, 900, 897, 1043, 897, 1043, 897, 897, + 1043, 897, 245, 255, 246, 247, 898, 899, + 1045, 247, 1025, 897, 1044, 897, 1044, 897, + 897, 1044, 897, 245, 255, 246, 247, 898, + 899, 1045, 247, 1025, 897, 1046, 897, 1046, + 897, 897, 1046, 897, 245, 255, 246, 247, + 898, 899, 1045, 247, 1025, 897, 1047, 897, + 1047, 897, 897, 1047, 897, 245, 255, 246, + 247, 898, 899, 1045, 247, 1025, 897, 897, + 245, 255, 246, 247, 898, 899, 247, 900, + 897, 1048, 897, 1048, 897, 897, 1048, 897, + 245, 255, 246, 247, 898, 899, 1006, 247, + 1025, 897, 1049, 897, 1049, 897, 897, 1049, + 897, 245, 255, 246, 247, 898, 899, 1006, + 247, 1025, 897, 1050, 897, 1050, 897, 897, + 1050, 897, 245, 255, 246, 247, 898, 899, + 1006, 247, 1025, 897, 1051, 897, 1051, 897, + 897, 1051, 897, 245, 255, 246, 247, 898, + 899, 1006, 247, 1025, 897, 897, 245, 255, + 246, 247, 898, 899, 1006, 247, 900, 897, + 1007, 897, 1007, 897, 897, 1007, 897, 245, + 255, 246, 247, 898, 899, 247, 1025, 897, + 1052, 897, 1053, 897, 897, 1053, 897, 245, + 255, 246, 247, 898, 899, 1004, 1055, 247, + 1025, 897, 1054, 897, 1056, 897, 897, 1056, + 897, 245, 255, 246, 247, 898, 899, 1004, + 1055, 247, 1025, 897, 1057, 897, 1058, 897, + 897, 1058, 897, 245, 255, 246, 247, 898, + 899, 1004, 1055, 247, 1025, 897, 1059, 897, + 1059, 897, 897, 1059, 897, 245, 255, 246, + 247, 898, 899, 1055, 247, 1025, 897, 897, + 245, 255, 246, 247, 898, 899, 247, 900, + 897, 1060, 897, 1061, 897, 897, 1061, 897, + 245, 255, 246, 247, 898, 899, 1004, 1063, + 247, 1025, 897, 1062, 897, 1064, 897, 897, + 1064, 897, 245, 255, 246, 247, 898, 899, + 1004, 1063, 247, 1025, 897, 1065, 897, 1066, + 897, 897, 1066, 897, 245, 255, 246, 247, + 898, 899, 1004, 1063, 247, 1025, 897, 1067, + 897, 1067, 897, 897, 1067, 897, 245, 255, + 246, 247, 898, 899, 1063, 247, 1025, 897, + 897, 245, 255, 246, 247, 898, 899, 247, + 900, 897, 1068, 897, 1069, 897, 897, 1069, + 897, 245, 255, 246, 247, 898, 899, 1004, + 1071, 247, 1025, 897, 1070, 897, 1072, 897, + 897, 1072, 897, 245, 255, 246, 247, 898, + 899, 1004, 1071, 247, 1025, 897, 1073, 897, + 1074, 897, 897, 1074, 897, 245, 255, 246, + 247, 898, 899, 1004, 1071, 247, 1025, 897, + 1075, 897, 1075, 897, 897, 1075, 897, 245, + 255, 246, 247, 898, 899, 1071, 247, 1025, + 897, 897, 245, 255, 246, 247, 898, 899, + 247, 900, 897, 1076, 897, 1077, 897, 897, + 1077, 897, 245, 255, 246, 247, 898, 899, + 1004, 1079, 247, 1025, 897, 1078, 897, 1080, + 897, 897, 1080, 897, 245, 255, 246, 247, + 898, 899, 1004, 1079, 247, 1025, 897, 1081, + 897, 1082, 897, 897, 1082, 897, 245, 255, + 246, 247, 898, 899, 1004, 1079, 247, 1025, + 897, 1083, 897, 1083, 897, 897, 1083, 897, + 245, 255, 246, 247, 898, 899, 1079, 247, + 1025, 897, 897, 245, 255, 246, 247, 898, + 899, 247, 900, 897, 1084, 897, 1048, 897, + 897, 1048, 897, 245, 255, 246, 247, 898, + 899, 1004, 1006, 247, 1025, 897, 1085, 897, + 1049, 897, 897, 1049, 897, 245, 255, 246, + 247, 898, 899, 1004, 1006, 247, 1025, 897, + 1086, 897, 1050, 897, 897, 1050, 897, 245, + 255, 246, 247, 898, 899, 1004, 1006, 247, + 1025, 897, 1051, 897, 1051, 897, 897, 1051, + 897, 245, 255, 246, 247, 898, 899, 1079, + 247, 1025, 897, 1083, 897, 1083, 897, 897, + 1083, 897, 245, 255, 246, 247, 898, 899, + 1079, 247, 1025, 897, 1082, 897, 1082, 897, + 897, 1082, 897, 245, 255, 246, 247, 898, + 899, 1079, 247, 1025, 897, 1080, 897, 1080, + 897, 897, 1080, 897, 245, 255, 246, 247, + 898, 899, 1071, 247, 1025, 897, 1075, 897, + 1075, 897, 897, 1075, 897, 245, 255, 246, + 247, 898, 899, 1071, 247, 1025, 897, 1074, + 897, 1074, 897, 897, 1074, 897, 245, 255, + 246, 247, 898, 899, 1071, 247, 1025, 897, + 1072, 897, 1072, 897, 897, 1072, 897, 245, + 255, 246, 247, 898, 899, 1063, 247, 1025, + 897, 1067, 897, 1067, 897, 897, 1067, 897, + 245, 255, 246, 247, 898, 899, 1063, 247, + 1025, 897, 1066, 897, 1066, 897, 897, 1066, + 897, 245, 255, 246, 247, 898, 899, 1063, + 247, 1025, 897, 1064, 897, 1064, 897, 897, + 1064, 897, 245, 255, 246, 247, 898, 899, + 1055, 247, 1025, 897, 1059, 897, 1059, 897, + 897, 1059, 897, 245, 255, 246, 247, 898, + 899, 1055, 247, 1025, 897, 1058, 897, 1058, + 897, 897, 1058, 897, 245, 255, 246, 247, + 898, 899, 1055, 247, 1025, 897, 1056, 897, + 1056, 897, 897, 1056, 897, 245, 255, 246, + 247, 898, 899, 976, 247, 900, 897, 897, + 245, 887, 252, 1, 887, 1088, 1089, 1090, + 1092, 1093, 1091, 1091, 1091, 1087, 887, 888, + 1, 1094, 246, 248, 247, 247, 247, 245, + 251, 888, 1, 1095, 258, 259, 260, 261, + 260, 262, 260, 260, 263, 264, 265, 266, + 263, 264, 265, 266, 260, 260, 260, 260, + 260, 256, 267, 888, 1, 1094, 246, 248, + 890, 893, 247, 890, 247, 247, 891, 247, + 892, 247, 892, 247, 245, 1094, 246, 248, + 1096, 247, 1096, 247, 247, 1097, 247, 1097, + 247, 1097, 247, 245, 255, 246, 248, 1096, + 247, 1096, 247, 247, 1097, 247, 1097, 247, + 1097, 247, 245, 1094, 246, 248, 247, 247, + 247, 1097, 247, 1097, 247, 1097, 247, 245, + 1098, 880, 881, 883, 884, 885, 882, 884, + 882, 882, 886, 882, 886, 882, 886, 882, + 878, 255, 246, 248, 890, 893, 247, 890, + 247, 247, 891, 247, 892, 247, 892, 247, + 245, 58, 1100, 1101, 1102, 1103, 1104, 1103, + 1105, 1103, 1103, 1106, 1107, 1108, 1109, 1106, + 1107, 1108, 1109, 1103, 1103, 1103, 1103, 1103, + 1099, 58, 59, 1, 1110, 68, 69, 70, + 70, 70, 70, 70, 70, 70, 70, 70, + 67, 71, 59, 1, 1111, 246, 248, 250, + 247, 247, 249, 247, 249, 247, 249, 247, + 245, 251, 59, 1, 1112, 97, 98, 95, + 99, 59, 1, 1110, 68, 69, 70, 70, + 70, 70, 269, 269, 70, 70, 70, 70, + 70, 67, 1110, 68, 69, 70, 70, 70, + 70, 688, 688, 70, 70, 70, 70, 70, + 67, 1110, 68, 69, 70, 70, 70, 70, + 735, 735, 70, 70, 70, 70, 70, 67, + 1110, 68, 69, 70, 70, 70, 70, 771, + 771, 70, 70, 70, 70, 70, 67, 1111, + 246, 248, 247, 247, 247, 245, 58, 1113, + 1113, 1114, 1114, 1114, 1, 1113, 1113, 1114, + 1114, 1114, 1, 58, 1114, 1114, 1114, 1, + 1115, 51, 52, 53, 54, 55, 57, 54, + 56, 56, 56, 50, 1116, 1119, 1116, 1117, + 1118, 1118, 1, 1120, 1120, 1121, 1121, 1121, + 1, 1120, 1122, 1120, 1121, 1121, 1121, 1, + 1123, 1123, 1, 1124, 1123, 1123, 1, 1126, + 1127, 1125, 1128, 1, 1129, 1, 1129, 1130, + 1, 1132, 1131, 1131, 1131, 1, 1134, 1135, + 1136, 1137, 1136, 1138, 1138, 1138, 1133, 1139, + 1, 1140, 1, 1140, 1132, 1, 1141, 1144, + 1141, 1142, 1143, 1143, 1, 1145, 1145, 1146, + 1146, 1146, 1, 1145, 1147, 1145, 1146, 1146, + 1146, 1, 901, 901, 1, 1145, 1148, 1147, + 1145, 1149, 1146, 1146, 1, 1150, 1, 1151, + 1152, 1, 1153, 1, 1154, 1155, 1, 1156, + 1, 1158, 1157, 1, 1158, 1159, 1, 1158, + 1, 1154, 1160, 1, 1154, 1, 1151, 1161, + 1, 1151, 1, 1145, 1148, 1147, 1145, 1162, + 1146, 1146, 1, 1145, 1148, 1147, 1145, 1146, + 1146, 1146, 1, 1145, 1147, 1163, 1145, 1146, + 1146, 1146, 1, 1145, 1147, 1145, 1164, 1146, + 1146, 1146, 1, 1145, 1165, 1147, 1145, 1146, + 1146, 1146, 1, 1145, 1166, 1145, 1146, 1146, + 1146, 1, 1168, 901, 1167, 901, 1167, 901, + 901, 1167, 901, 1, 1170, 902, 901, 1169, + 901, 1169, 901, 901, 1169, 901, 1, 1170, + 902, 901, 1171, 901, 1171, 901, 901, 1171, + 901, 1, 1170, 902, 901, 1172, 901, 1172, + 901, 901, 1172, 901, 1, 1170, 902, 901, + 901, 1, 1174, 902, 901, 1173, 901, 1173, + 901, 901, 1173, 901, 1, 1176, 902, 901, + 1175, 901, 1175, 901, 901, 1175, 901, 1, + 1176, 902, 901, 1177, 901, 1177, 901, 901, + 1177, 901, 1, 1176, 902, 901, 1178, 901, + 1178, 901, 901, 1178, 901, 1, 1176, 902, + 901, 901, 1, 1174, 902, 901, 1179, 901, + 1179, 901, 901, 1179, 901, 1, 1181, 902, + 901, 1180, 901, 1180, 901, 901, 1180, 901, + 1, 1181, 902, 901, 1182, 901, 1182, 901, + 901, 1182, 901, 1, 1181, 902, 901, 1183, + 901, 1183, 901, 901, 1183, 901, 1, 1181, + 902, 901, 901, 1, 1174, 902, 901, 1184, + 901, 1184, 901, 901, 1184, 901, 1, 1186, + 902, 901, 1185, 901, 1185, 901, 901, 1185, + 901, 1, 1186, 902, 901, 1187, 901, 1187, + 901, 901, 1187, 901, 1, 1186, 902, 901, + 1188, 901, 1188, 901, 901, 1188, 901, 1, + 1186, 902, 901, 901, 1, 1174, 902, 901, + 1189, 901, 1189, 901, 901, 1189, 901, 1, + 1191, 902, 901, 1190, 901, 1190, 901, 901, + 1190, 901, 1, 1191, 902, 901, 1192, 901, + 1192, 901, 901, 1192, 901, 1, 1191, 902, + 901, 1193, 901, 1193, 901, 901, 1193, 901, + 1, 1191, 902, 901, 901, 1, 1195, 902, + 901, 1194, 901, 1194, 901, 901, 1194, 901, + 1, 1197, 902, 901, 1196, 901, 1196, 901, + 901, 1196, 901, 1, 1197, 902, 901, 1198, + 901, 1198, 901, 901, 1198, 901, 1, 1197, + 902, 901, 1199, 901, 1199, 901, 901, 1199, + 901, 1, 1197, 902, 901, 901, 1, 1195, + 902, 901, 1200, 901, 1201, 901, 901, 1201, + 901, 1, 1202, 1204, 902, 901, 1203, 901, + 1205, 901, 901, 1205, 901, 1, 902, 901, + 1206, 901, 901, 1, 1207, 902, 901, 1208, + 901, 901, 1, 902, 901, 1209, 901, 901, + 1, 1210, 902, 901, 1211, 901, 901, 1, + 902, 901, 1212, 901, 901, 1, 1214, 901, + 1213, 901, 901, 1, 1214, 901, 1215, 901, + 901, 1, 1214, 901, 901, 1, 1210, 902, + 901, 1216, 901, 901, 1, 1210, 902, 901, + 901, 1, 1207, 902, 901, 1217, 901, 901, + 1, 1207, 902, 901, 901, 1, 1202, 1204, + 902, 901, 1218, 901, 1219, 901, 901, 1219, + 901, 1, 1202, 1204, 902, 901, 1220, 901, + 1220, 901, 901, 1220, 901, 1, 1204, 902, + 901, 901, 1, 902, 901, 1221, 901, 1221, + 901, 901, 1221, 901, 1, 1223, 901, 1222, + 901, 1222, 901, 901, 1222, 901, 1, 1223, + 901, 1224, 901, 1224, 901, 901, 1224, 901, + 1, 1223, 901, 1225, 901, 1225, 901, 901, + 1225, 901, 1, 1223, 901, 901, 1, 1204, + 902, 901, 1220, 901, 1220, 901, 901, 1220, + 901, 1, 1204, 902, 901, 1219, 901, 1219, + 901, 901, 1219, 901, 1, 1223, 901, 1226, + 901, 1226, 901, 901, 1226, 901, 1, 1228, + 1223, 901, 1227, 901, 1227, 901, 901, 1227, + 901, 1, 1228, 1223, 901, 1229, 901, 1229, + 901, 901, 1229, 901, 1, 1228, 1223, 901, + 1230, 901, 1230, 901, 901, 1230, 901, 1, + 1228, 1223, 901, 901, 1, 902, 901, 1231, + 901, 1231, 901, 901, 1231, 901, 1, 1233, + 1223, 901, 1232, 901, 1232, 901, 901, 1232, + 901, 1, 1233, 1223, 901, 1234, 901, 1234, + 901, 901, 1234, 901, 1, 1233, 1223, 901, + 1235, 901, 1235, 901, 901, 1235, 901, 1, + 1233, 1223, 901, 901, 1, 902, 901, 1236, + 901, 1236, 901, 901, 1236, 901, 1, 1238, + 1223, 901, 1237, 901, 1237, 901, 901, 1237, + 901, 1, 1238, 1223, 901, 1239, 901, 1239, + 901, 901, 1239, 901, 1, 1238, 1223, 901, + 1240, 901, 1240, 901, 901, 1240, 901, 1, + 1238, 1223, 901, 901, 1, 902, 901, 1241, + 901, 1241, 901, 901, 1241, 901, 1, 1243, + 1223, 901, 1242, 901, 1242, 901, 901, 1242, + 901, 1, 1243, 1223, 901, 1244, 901, 1244, + 901, 901, 1244, 901, 1, 1243, 1223, 901, + 1245, 901, 1245, 901, 901, 1245, 901, 1, + 1243, 1223, 901, 901, 1, 902, 901, 1246, + 901, 1246, 901, 901, 1246, 901, 1, 1204, + 1223, 901, 1247, 901, 1247, 901, 901, 1247, + 901, 1, 1204, 1223, 901, 1248, 901, 1248, + 901, 901, 1248, 901, 1, 1204, 1223, 901, + 1249, 901, 1249, 901, 901, 1249, 901, 1, + 1204, 1223, 901, 901, 1, 1204, 902, 901, + 1205, 901, 1205, 901, 901, 1205, 901, 1, + 1223, 901, 1250, 901, 1251, 901, 901, 1251, + 901, 1, 1202, 1253, 1223, 901, 1252, 901, + 1254, 901, 901, 1254, 901, 1, 1202, 1253, + 1223, 901, 1255, 901, 1256, 901, 901, 1256, + 901, 1, 1202, 1253, 1223, 901, 1257, 901, + 1257, 901, 901, 1257, 901, 1, 1253, 1223, + 901, 901, 1, 902, 901, 1258, 901, 1259, + 901, 901, 1259, 901, 1, 1202, 1261, 1223, + 901, 1260, 901, 1262, 901, 901, 1262, 901, + 1, 1202, 1261, 1223, 901, 1263, 901, 1264, + 901, 901, 1264, 901, 1, 1202, 1261, 1223, + 901, 1265, 901, 1265, 901, 901, 1265, 901, + 1, 1261, 1223, 901, 901, 1, 902, 901, + 1266, 901, 1267, 901, 901, 1267, 901, 1, + 1202, 1269, 1223, 901, 1268, 901, 1270, 901, + 901, 1270, 901, 1, 1202, 1269, 1223, 901, + 1271, 901, 1272, 901, 901, 1272, 901, 1, + 1202, 1269, 1223, 901, 1273, 901, 1273, 901, + 901, 1273, 901, 1, 1269, 1223, 901, 901, + 1, 902, 901, 1274, 901, 1275, 901, 901, + 1275, 901, 1, 1202, 1277, 1223, 901, 1276, + 901, 1278, 901, 901, 1278, 901, 1, 1202, + 1277, 1223, 901, 1279, 901, 1280, 901, 901, + 1280, 901, 1, 1202, 1277, 1223, 901, 1281, + 901, 1281, 901, 901, 1281, 901, 1, 1277, + 1223, 901, 901, 1, 902, 901, 1282, 901, + 1246, 901, 901, 1246, 901, 1, 1202, 1204, + 1223, 901, 1283, 901, 1247, 901, 901, 1247, + 901, 1, 1202, 1204, 1223, 901, 1284, 901, + 1248, 901, 901, 1248, 901, 1, 1202, 1204, + 1223, 901, 1249, 901, 1249, 901, 901, 1249, + 901, 1, 1277, 1223, 901, 1281, 901, 1281, + 901, 901, 1281, 901, 1, 1277, 1223, 901, + 1280, 901, 1280, 901, 901, 1280, 901, 1, + 1277, 1223, 901, 1278, 901, 1278, 901, 901, + 1278, 901, 1, 1269, 1223, 901, 1273, 901, + 1273, 901, 901, 1273, 901, 1, 1269, 1223, + 901, 1272, 901, 1272, 901, 901, 1272, 901, + 1, 1269, 1223, 901, 1270, 901, 1270, 901, + 901, 1270, 901, 1, 1261, 1223, 901, 1265, + 901, 1265, 901, 901, 1265, 901, 1, 1261, + 1223, 901, 1264, 901, 1264, 901, 901, 1264, + 901, 1, 1261, 1223, 901, 1262, 901, 1262, + 901, 901, 1262, 901, 1, 1253, 1223, 901, + 1257, 901, 1257, 901, 901, 1257, 901, 1, + 1253, 1223, 901, 1256, 901, 1256, 901, 901, + 1256, 901, 1, 1253, 1223, 901, 1254, 901, + 1254, 901, 901, 1254, 901, 1, 1174, 902, + 901, 901, 1, 1139, 1286, 1287, 1288, 1289, + 1285, 1139, 1140, 1, 1139, 1141, 1144, 1141, + 1142, 1143, 1143, 1, 1139, 1290, 1290, 1291, + 1291, 1291, 1, 1290, 1290, 1291, 1291, 1291, + 1, 1139, 1291, 1291, 1291, 1, 1292, 1134, + 1135, 1136, 1137, 1136, 1138, 1138, 1138, 1133, + 1128, 1294, 1295, 1296, 1297, 1293, 1128, 1129, + 1, 1128, 1132, 1131, 1131, 1131, 1, 1120, + 1298, 1122, 1120, 1299, 1121, 1121, 1, 1300, + 1, 1301, 1302, 1, 1303, 1, 1304, 1305, + 1, 1306, 1, 1308, 1307, 1, 1308, 1309, + 1, 1308, 1, 1304, 1310, 1, 1304, 1, + 1301, 1311, 1, 1301, 1, 1120, 1298, 1122, + 1120, 1312, 1121, 1121, 1, 1120, 1298, 1122, + 1120, 1121, 1121, 1121, 1, 1120, 1122, 1313, + 1120, 1121, 1121, 1121, 1, 1120, 1122, 1120, + 1314, 1121, 1121, 1121, 1, 1120, 1315, 1122, + 1120, 1121, 1121, 1121, 1, 1120, 1316, 1120, + 1121, 1121, 1121, 1, 1318, 1123, 1317, 1123, + 1317, 1123, 1123, 1317, 1123, 1, 1320, 1124, + 1123, 1319, 1123, 1319, 1123, 1123, 1319, 1123, + 1, 1320, 1124, 1123, 1321, 1123, 1321, 1123, + 1123, 1321, 1123, 1, 1320, 1124, 1123, 1322, + 1123, 1322, 1123, 1123, 1322, 1123, 1, 1320, + 1124, 1123, 1123, 1, 1324, 1124, 1123, 1323, + 1123, 1323, 1123, 1123, 1323, 1123, 1, 1326, + 1124, 1123, 1325, 1123, 1325, 1123, 1123, 1325, + 1123, 1, 1326, 1124, 1123, 1327, 1123, 1327, + 1123, 1123, 1327, 1123, 1, 1326, 1124, 1123, + 1328, 1123, 1328, 1123, 1123, 1328, 1123, 1, + 1326, 1124, 1123, 1123, 1, 1324, 1124, 1123, + 1329, 1123, 1329, 1123, 1123, 1329, 1123, 1, + 1331, 1124, 1123, 1330, 1123, 1330, 1123, 1123, + 1330, 1123, 1, 1331, 1124, 1123, 1332, 1123, + 1332, 1123, 1123, 1332, 1123, 1, 1331, 1124, + 1123, 1333, 1123, 1333, 1123, 1123, 1333, 1123, + 1, 1331, 1124, 1123, 1123, 1, 1324, 1124, + 1123, 1334, 1123, 1334, 1123, 1123, 1334, 1123, + 1, 1336, 1124, 1123, 1335, 1123, 1335, 1123, + 1123, 1335, 1123, 1, 1336, 1124, 1123, 1337, + 1123, 1337, 1123, 1123, 1337, 1123, 1, 1336, + 1124, 1123, 1338, 1123, 1338, 1123, 1123, 1338, + 1123, 1, 1336, 1124, 1123, 1123, 1, 1324, + 1124, 1123, 1339, 1123, 1339, 1123, 1123, 1339, + 1123, 1, 1341, 1124, 1123, 1340, 1123, 1340, + 1123, 1123, 1340, 1123, 1, 1341, 1124, 1123, + 1342, 1123, 1342, 1123, 1123, 1342, 1123, 1, + 1341, 1124, 1123, 1343, 1123, 1343, 1123, 1123, + 1343, 1123, 1, 1341, 1124, 1123, 1123, 1, + 1345, 1124, 1123, 1344, 1123, 1344, 1123, 1123, + 1344, 1123, 1, 1347, 1124, 1123, 1346, 1123, + 1346, 1123, 1123, 1346, 1123, 1, 1347, 1124, + 1123, 1348, 1123, 1348, 1123, 1123, 1348, 1123, + 1, 1347, 1124, 1123, 1349, 1123, 1349, 1123, + 1123, 1349, 1123, 1, 1347, 1124, 1123, 1123, + 1, 1345, 1124, 1123, 1350, 1123, 1351, 1123, + 1123, 1351, 1123, 1, 1352, 1354, 1124, 1123, + 1353, 1123, 1355, 1123, 1123, 1355, 1123, 1, + 1124, 1123, 1356, 1123, 1123, 1, 1357, 1124, + 1123, 1358, 1123, 1123, 1, 1124, 1123, 1359, + 1123, 1123, 1, 1360, 1124, 1123, 1361, 1123, + 1123, 1, 1124, 1123, 1362, 1123, 1123, 1, + 1364, 1123, 1363, 1123, 1123, 1, 1364, 1123, + 1365, 1123, 1123, 1, 1364, 1123, 1123, 1, + 1360, 1124, 1123, 1366, 1123, 1123, 1, 1360, + 1124, 1123, 1123, 1, 1357, 1124, 1123, 1367, + 1123, 1123, 1, 1357, 1124, 1123, 1123, 1, + 1352, 1354, 1124, 1123, 1368, 1123, 1369, 1123, + 1123, 1369, 1123, 1, 1352, 1354, 1124, 1123, + 1370, 1123, 1370, 1123, 1123, 1370, 1123, 1, + 1354, 1124, 1123, 1123, 1, 1124, 1123, 1371, + 1123, 1371, 1123, 1123, 1371, 1123, 1, 1373, + 1123, 1372, 1123, 1372, 1123, 1123, 1372, 1123, + 1, 1373, 1123, 1374, 1123, 1374, 1123, 1123, + 1374, 1123, 1, 1373, 1123, 1375, 1123, 1375, + 1123, 1123, 1375, 1123, 1, 1373, 1123, 1123, + 1, 1354, 1124, 1123, 1370, 1123, 1370, 1123, + 1123, 1370, 1123, 1, 1354, 1124, 1123, 1369, + 1123, 1369, 1123, 1123, 1369, 1123, 1, 1373, + 1123, 1376, 1123, 1376, 1123, 1123, 1376, 1123, + 1, 1378, 1373, 1123, 1377, 1123, 1377, 1123, + 1123, 1377, 1123, 1, 1378, 1373, 1123, 1379, + 1123, 1379, 1123, 1123, 1379, 1123, 1, 1378, + 1373, 1123, 1380, 1123, 1380, 1123, 1123, 1380, + 1123, 1, 1378, 1373, 1123, 1123, 1, 1124, + 1123, 1381, 1123, 1381, 1123, 1123, 1381, 1123, + 1, 1383, 1373, 1123, 1382, 1123, 1382, 1123, + 1123, 1382, 1123, 1, 1383, 1373, 1123, 1384, + 1123, 1384, 1123, 1123, 1384, 1123, 1, 1383, + 1373, 1123, 1385, 1123, 1385, 1123, 1123, 1385, + 1123, 1, 1383, 1373, 1123, 1123, 1, 1124, + 1123, 1386, 1123, 1386, 1123, 1123, 1386, 1123, + 1, 1388, 1373, 1123, 1387, 1123, 1387, 1123, + 1123, 1387, 1123, 1, 1388, 1373, 1123, 1389, + 1123, 1389, 1123, 1123, 1389, 1123, 1, 1388, + 1373, 1123, 1390, 1123, 1390, 1123, 1123, 1390, + 1123, 1, 1388, 1373, 1123, 1123, 1, 1124, + 1123, 1391, 1123, 1391, 1123, 1123, 1391, 1123, + 1, 1393, 1373, 1123, 1392, 1123, 1392, 1123, + 1123, 1392, 1123, 1, 1393, 1373, 1123, 1394, + 1123, 1394, 1123, 1123, 1394, 1123, 1, 1393, + 1373, 1123, 1395, 1123, 1395, 1123, 1123, 1395, + 1123, 1, 1393, 1373, 1123, 1123, 1, 1124, + 1123, 1396, 1123, 1396, 1123, 1123, 1396, 1123, + 1, 1354, 1373, 1123, 1397, 1123, 1397, 1123, + 1123, 1397, 1123, 1, 1354, 1373, 1123, 1398, + 1123, 1398, 1123, 1123, 1398, 1123, 1, 1354, + 1373, 1123, 1399, 1123, 1399, 1123, 1123, 1399, + 1123, 1, 1354, 1373, 1123, 1123, 1, 1354, + 1124, 1123, 1355, 1123, 1355, 1123, 1123, 1355, + 1123, 1, 1373, 1123, 1400, 1123, 1401, 1123, + 1123, 1401, 1123, 1, 1352, 1403, 1373, 1123, + 1402, 1123, 1404, 1123, 1123, 1404, 1123, 1, + 1352, 1403, 1373, 1123, 1405, 1123, 1406, 1123, + 1123, 1406, 1123, 1, 1352, 1403, 1373, 1123, + 1407, 1123, 1407, 1123, 1123, 1407, 1123, 1, + 1403, 1373, 1123, 1123, 1, 1124, 1123, 1408, + 1123, 1409, 1123, 1123, 1409, 1123, 1, 1352, + 1411, 1373, 1123, 1410, 1123, 1412, 1123, 1123, + 1412, 1123, 1, 1352, 1411, 1373, 1123, 1413, + 1123, 1414, 1123, 1123, 1414, 1123, 1, 1352, + 1411, 1373, 1123, 1415, 1123, 1415, 1123, 1123, + 1415, 1123, 1, 1411, 1373, 1123, 1123, 1, + 1124, 1123, 1416, 1123, 1417, 1123, 1123, 1417, + 1123, 1, 1352, 1419, 1373, 1123, 1418, 1123, + 1420, 1123, 1123, 1420, 1123, 1, 1352, 1419, + 1373, 1123, 1421, 1123, 1422, 1123, 1123, 1422, + 1123, 1, 1352, 1419, 1373, 1123, 1423, 1123, + 1423, 1123, 1123, 1423, 1123, 1, 1419, 1373, + 1123, 1123, 1, 1124, 1123, 1424, 1123, 1425, + 1123, 1123, 1425, 1123, 1, 1352, 1427, 1373, + 1123, 1426, 1123, 1428, 1123, 1123, 1428, 1123, + 1, 1352, 1427, 1373, 1123, 1429, 1123, 1430, + 1123, 1123, 1430, 1123, 1, 1352, 1427, 1373, + 1123, 1431, 1123, 1431, 1123, 1123, 1431, 1123, + 1, 1427, 1373, 1123, 1123, 1, 1124, 1123, + 1432, 1123, 1396, 1123, 1123, 1396, 1123, 1, + 1352, 1354, 1373, 1123, 1433, 1123, 1397, 1123, + 1123, 1397, 1123, 1, 1352, 1354, 1373, 1123, + 1434, 1123, 1398, 1123, 1123, 1398, 1123, 1, + 1352, 1354, 1373, 1123, 1399, 1123, 1399, 1123, + 1123, 1399, 1123, 1, 1427, 1373, 1123, 1431, + 1123, 1431, 1123, 1123, 1431, 1123, 1, 1427, + 1373, 1123, 1430, 1123, 1430, 1123, 1123, 1430, + 1123, 1, 1427, 1373, 1123, 1428, 1123, 1428, + 1123, 1123, 1428, 1123, 1, 1419, 1373, 1123, + 1423, 1123, 1423, 1123, 1123, 1423, 1123, 1, + 1419, 1373, 1123, 1422, 1123, 1422, 1123, 1123, + 1422, 1123, 1, 1419, 1373, 1123, 1420, 1123, + 1420, 1123, 1123, 1420, 1123, 1, 1411, 1373, + 1123, 1415, 1123, 1415, 1123, 1123, 1415, 1123, + 1, 1411, 1373, 1123, 1414, 1123, 1414, 1123, + 1123, 1414, 1123, 1, 1411, 1373, 1123, 1412, + 1123, 1412, 1123, 1123, 1412, 1123, 1, 1403, + 1373, 1123, 1407, 1123, 1407, 1123, 1123, 1407, + 1123, 1, 1403, 1373, 1123, 1406, 1123, 1406, + 1123, 1123, 1406, 1123, 1, 1403, 1373, 1123, + 1404, 1123, 1404, 1123, 1123, 1404, 1123, 1, + 1324, 1124, 1123, 1123, 1, 46, 1435, 44, + 45, 1437, 1436, 1436, 1436, 43, 46, 47, + 1, 1438, 51, 52, 53, 54, 55, 57, + 54, 56, 56, 56, 50, 58, 47, 1, + 46, 1116, 1119, 1116, 1117, 1118, 1118, 1, + 40, 30, 1, 40, 1439, 36, 37, 38, + 39, 39, 34, 40, 41, 1, 1440, 24, + 26, 25, 25, 25, 23, 29, 41, 1, + 40, 42, 42, 1, 36, 37, 38, 39, + 39, 34, 1442, 1443, 1444, 1446, 1447, 1448, + 1445, 1447, 1445, 1445, 1449, 1445, 1449, 1445, + 1449, 1445, 1441, 1450, 1, 1451, 1, 1451, + 32, 1452, 31, 31, 31, 1, 24, 26, + 1453, 1456, 25, 1453, 25, 25, 1454, 25, + 1455, 25, 1455, 25, 23, 33, 24, 26, + 1457, 25, 1457, 25, 25, 1458, 25, 1458, + 25, 1458, 25, 23, 33, 24, 26, 1457, + 1459, 25, 1457, 25, 25, 1458, 25, 1458, + 25, 1458, 25, 23, 33, 24, 25, 1461, + 1462, 25, 25, 1460, 1460, 23, 33, 24, + 25, 1461, 1462, 25, 1463, 1460, 1460, 23, + 29, 1465, 1464, 1464, 1, 1465, 1464, 1464, + 1, 1466, 1, 1468, 1469, 1470, 1467, 35, + 36, 37, 1472, 1473, 1474, 1473, 1471, 1471, + 34, 40, 1465, 1464, 1464, 1, 1440, 24, + 25, 1461, 1462, 25, 1463, 1460, 1460, 23, + 33, 24, 1475, 25, 25, 25, 23, 1476, + 1468, 1469, 1470, 1477, 1477, 1467, 40, 1478, + 1465, 1478, 1464, 1464, 1, 44, 45, 1480, + 1479, 1479, 43, 46, 1465, 1464, 1464, 1, + 46, 1466, 1, 40, 1466, 1, 33, 24, + 26, 1457, 1481, 1459, 25, 1457, 25, 25, + 1482, 25, 1458, 25, 1458, 25, 23, 33, + 24, 26, 25, 25, 1483, 25, 25, 23, + 33, 24, 26, 1484, 25, 25, 1485, 25, + 25, 23, 33, 24, 26, 25, 25, 1486, + 25, 25, 23, 33, 24, 26, 1487, 25, + 25, 1488, 25, 25, 23, 33, 24, 26, + 25, 25, 1489, 25, 25, 23, 33, 24, + 26, 1491, 25, 25, 1490, 25, 25, 23, + 33, 24, 26, 1491, 25, 25, 1492, 25, + 25, 23, 33, 24, 26, 1491, 25, 25, + 25, 23, 33, 24, 26, 1487, 25, 25, + 1493, 25, 25, 23, 33, 24, 26, 1487, + 25, 25, 25, 23, 33, 24, 26, 1484, + 25, 25, 1494, 25, 25, 23, 33, 24, + 26, 1484, 25, 25, 25, 23, 33, 24, + 26, 1457, 1481, 1459, 25, 1457, 25, 25, + 1495, 25, 1458, 25, 1458, 25, 23, 33, + 24, 26, 1457, 1481, 1459, 25, 1457, 25, + 25, 1458, 25, 1458, 25, 1458, 25, 23, + 33, 24, 26, 1457, 1459, 1496, 25, 1457, + 25, 25, 1458, 25, 1458, 25, 1458, 25, + 23, 33, 24, 26, 1457, 1459, 25, 1457, + 1497, 25, 25, 1458, 25, 1458, 25, 1458, + 25, 23, 33, 24, 26, 1457, 1498, 1459, + 25, 1457, 25, 25, 1458, 25, 1458, 25, + 1458, 25, 23, 33, 24, 26, 1457, 1499, + 25, 1457, 25, 25, 1458, 25, 1458, 25, + 1458, 25, 23, 33, 24, 25, 1461, 1462, + 1501, 25, 25, 1460, 1500, 1460, 1500, 1460, + 1460, 1500, 1460, 23, 33, 24, 25, 1461, + 1462, 1503, 25, 1463, 1460, 1502, 1460, 1502, + 1460, 1460, 1502, 1460, 23, 33, 24, 25, + 1461, 1462, 1503, 25, 1463, 1460, 1504, 1460, + 1504, 1460, 1460, 1504, 1460, 23, 33, 24, + 25, 1461, 1462, 1503, 25, 1463, 1460, 1505, + 1460, 1505, 1460, 1460, 1505, 1460, 23, 33, + 24, 25, 1461, 1462, 1503, 25, 1463, 1460, + 1460, 23, 33, 24, 25, 1461, 1462, 1507, + 25, 1463, 1460, 1506, 1460, 1506, 1460, 1460, + 1506, 1460, 23, 33, 24, 25, 1461, 1462, + 1509, 25, 1463, 1460, 1508, 1460, 1508, 1460, + 1460, 1508, 1460, 23, 33, 24, 25, 1461, + 1462, 1509, 25, 1463, 1460, 1510, 1460, 1510, + 1460, 1460, 1510, 1460, 23, 33, 24, 25, + 1461, 1462, 1509, 25, 1463, 1460, 1511, 1460, + 1511, 1460, 1460, 1511, 1460, 23, 33, 24, + 25, 1461, 1462, 1509, 25, 1463, 1460, 1460, + 23, 33, 24, 25, 1461, 1462, 1507, 25, + 1463, 1460, 1512, 1460, 1512, 1460, 1460, 1512, + 1460, 23, 33, 24, 25, 1461, 1462, 1514, + 25, 1463, 1460, 1513, 1460, 1513, 1460, 1460, + 1513, 1460, 23, 33, 24, 25, 1461, 1462, + 1514, 25, 1463, 1460, 1515, 1460, 1515, 1460, + 1460, 1515, 1460, 23, 33, 24, 25, 1461, + 1462, 1514, 25, 1463, 1460, 1516, 1460, 1516, + 1460, 1460, 1516, 1460, 23, 33, 24, 25, + 1461, 1462, 1514, 25, 1463, 1460, 1460, 23, + 33, 24, 25, 1461, 1462, 1507, 25, 1463, + 1460, 1517, 1460, 1517, 1460, 1460, 1517, 1460, + 23, 33, 24, 25, 1461, 1462, 1519, 25, + 1463, 1460, 1518, 1460, 1518, 1460, 1460, 1518, + 1460, 23, 33, 24, 25, 1461, 1462, 1519, + 25, 1463, 1460, 1520, 1460, 1520, 1460, 1460, + 1520, 1460, 23, 33, 24, 25, 1461, 1462, + 1519, 25, 1463, 1460, 1521, 1460, 1521, 1460, + 1460, 1521, 1460, 23, 33, 24, 25, 1461, + 1462, 1519, 25, 1463, 1460, 1460, 23, 33, + 24, 25, 1461, 1462, 1507, 25, 1463, 1460, + 1522, 1460, 1522, 1460, 1460, 1522, 1460, 23, + 33, 24, 25, 1461, 1462, 1524, 25, 1463, + 1460, 1523, 1460, 1523, 1460, 1460, 1523, 1460, + 23, 33, 24, 25, 1461, 1462, 1524, 25, + 1463, 1460, 1525, 1460, 1525, 1460, 1460, 1525, + 1460, 23, 33, 24, 25, 1461, 1462, 1524, + 25, 1463, 1460, 1526, 1460, 1526, 1460, 1460, + 1526, 1460, 23, 33, 24, 25, 1461, 1462, + 1524, 25, 1463, 1460, 1460, 23, 33, 24, + 25, 1461, 1462, 1528, 25, 1463, 1460, 1527, + 1460, 1527, 1460, 1460, 1527, 1460, 23, 33, + 24, 25, 1461, 1462, 1530, 25, 1463, 1460, + 1529, 1460, 1529, 1460, 1460, 1529, 1460, 23, + 33, 24, 25, 1461, 1462, 1530, 25, 1463, + 1460, 1531, 1460, 1531, 1460, 1460, 1531, 1460, + 23, 33, 24, 25, 1461, 1462, 1530, 25, + 1463, 1460, 1532, 1460, 1532, 1460, 1460, 1532, + 1460, 23, 33, 24, 25, 1461, 1462, 1530, + 25, 1463, 1460, 1460, 23, 33, 24, 25, + 1461, 1462, 1528, 25, 1463, 1460, 1533, 1460, + 1534, 1460, 1460, 1534, 1460, 23, 33, 24, + 25, 1461, 1462, 1535, 1537, 25, 1463, 1460, + 1536, 1460, 1538, 1460, 1460, 1538, 1460, 23, + 33, 24, 25, 1461, 1462, 25, 1463, 1460, + 1539, 1460, 1460, 23, 33, 24, 25, 1461, + 1462, 1540, 25, 1463, 1460, 1541, 1460, 1460, + 23, 33, 24, 25, 1461, 1462, 25, 1463, + 1460, 1542, 1460, 1460, 23, 33, 24, 25, + 1461, 1462, 1543, 25, 1463, 1460, 1544, 1460, + 1460, 23, 33, 24, 25, 1461, 1462, 25, + 1463, 1460, 1545, 1460, 1460, 23, 33, 24, + 25, 1461, 1462, 25, 1547, 1460, 1546, 1460, + 1460, 23, 33, 24, 25, 1461, 1462, 25, + 1547, 1460, 1548, 1460, 1460, 23, 33, 24, + 25, 1461, 1462, 25, 1547, 1460, 1460, 23, + 33, 24, 25, 1461, 1462, 1543, 25, 1463, + 1460, 1549, 1460, 1460, 23, 33, 24, 25, + 1461, 1462, 1543, 25, 1463, 1460, 1460, 23, + 33, 24, 25, 1461, 1462, 1540, 25, 1463, + 1460, 1550, 1460, 1460, 23, 33, 24, 25, + 1461, 1462, 1540, 25, 1463, 1460, 1460, 23, + 33, 24, 25, 1461, 1462, 1535, 1537, 25, + 1463, 1460, 1551, 1460, 1552, 1460, 1460, 1552, + 1460, 23, 33, 24, 25, 1461, 1462, 1535, + 1537, 25, 1463, 1460, 1553, 1460, 1553, 1460, + 1460, 1553, 1460, 23, 33, 24, 25, 1461, + 1462, 1537, 25, 1463, 1460, 1460, 23, 33, + 24, 25, 1461, 1462, 25, 1463, 1460, 1554, + 1460, 1554, 1460, 1460, 1554, 1460, 23, 33, + 24, 25, 1461, 1462, 25, 1556, 1460, 1555, + 1460, 1555, 1460, 1460, 1555, 1460, 23, 33, + 24, 25, 1461, 1462, 25, 1556, 1460, 1557, + 1460, 1557, 1460, 1460, 1557, 1460, 23, 33, + 24, 25, 1461, 1462, 25, 1556, 1460, 1558, + 1460, 1558, 1460, 1460, 1558, 1460, 23, 33, + 24, 25, 1461, 1462, 25, 1556, 1460, 1460, + 23, 33, 24, 25, 1461, 1462, 1537, 25, + 1463, 1460, 1553, 1460, 1553, 1460, 1460, 1553, + 1460, 23, 33, 24, 25, 1461, 1462, 1537, + 25, 1463, 1460, 1552, 1460, 1552, 1460, 1460, + 1552, 1460, 23, 33, 24, 25, 1461, 1462, + 25, 1556, 1460, 1559, 1460, 1559, 1460, 1460, + 1559, 1460, 23, 33, 24, 25, 1461, 1462, + 1561, 25, 1556, 1460, 1560, 1460, 1560, 1460, + 1460, 1560, 1460, 23, 33, 24, 25, 1461, + 1462, 1561, 25, 1556, 1460, 1562, 1460, 1562, + 1460, 1460, 1562, 1460, 23, 33, 24, 25, + 1461, 1462, 1561, 25, 1556, 1460, 1563, 1460, + 1563, 1460, 1460, 1563, 1460, 23, 33, 24, + 25, 1461, 1462, 1561, 25, 1556, 1460, 1460, + 23, 33, 24, 25, 1461, 1462, 25, 1463, + 1460, 1564, 1460, 1564, 1460, 1460, 1564, 1460, + 23, 33, 24, 25, 1461, 1462, 1566, 25, + 1556, 1460, 1565, 1460, 1565, 1460, 1460, 1565, + 1460, 23, 33, 24, 25, 1461, 1462, 1566, + 25, 1556, 1460, 1567, 1460, 1567, 1460, 1460, + 1567, 1460, 23, 33, 24, 25, 1461, 1462, + 1566, 25, 1556, 1460, 1568, 1460, 1568, 1460, + 1460, 1568, 1460, 23, 33, 24, 25, 1461, + 1462, 1566, 25, 1556, 1460, 1460, 23, 33, + 24, 25, 1461, 1462, 25, 1463, 1460, 1569, + 1460, 1569, 1460, 1460, 1569, 1460, 23, 33, + 24, 25, 1461, 1462, 1571, 25, 1556, 1460, + 1570, 1460, 1570, 1460, 1460, 1570, 1460, 23, + 33, 24, 25, 1461, 1462, 1571, 25, 1556, + 1460, 1572, 1460, 1572, 1460, 1460, 1572, 1460, + 23, 33, 24, 25, 1461, 1462, 1571, 25, + 1556, 1460, 1573, 1460, 1573, 1460, 1460, 1573, + 1460, 23, 33, 24, 25, 1461, 1462, 1571, + 25, 1556, 1460, 1460, 23, 33, 24, 25, + 1461, 1462, 25, 1463, 1460, 1574, 1460, 1574, + 1460, 1460, 1574, 1460, 23, 33, 24, 25, + 1461, 1462, 1576, 25, 1556, 1460, 1575, 1460, + 1575, 1460, 1460, 1575, 1460, 23, 33, 24, + 25, 1461, 1462, 1576, 25, 1556, 1460, 1577, + 1460, 1577, 1460, 1460, 1577, 1460, 23, 33, + 24, 25, 1461, 1462, 1576, 25, 1556, 1460, + 1578, 1460, 1578, 1460, 1460, 1578, 1460, 23, + 33, 24, 25, 1461, 1462, 1576, 25, 1556, + 1460, 1460, 23, 33, 24, 25, 1461, 1462, + 25, 1463, 1460, 1579, 1460, 1579, 1460, 1460, + 1579, 1460, 23, 33, 24, 25, 1461, 1462, + 1537, 25, 1556, 1460, 1580, 1460, 1580, 1460, + 1460, 1580, 1460, 23, 33, 24, 25, 1461, + 1462, 1537, 25, 1556, 1460, 1581, 1460, 1581, + 1460, 1460, 1581, 1460, 23, 33, 24, 25, + 1461, 1462, 1537, 25, 1556, 1460, 1582, 1460, + 1582, 1460, 1460, 1582, 1460, 23, 33, 24, + 25, 1461, 1462, 1537, 25, 1556, 1460, 1460, + 23, 33, 24, 25, 1461, 1462, 1537, 25, + 1463, 1460, 1538, 1460, 1538, 1460, 1460, 1538, + 1460, 23, 33, 24, 25, 1461, 1462, 25, + 1556, 1460, 1583, 1460, 1584, 1460, 1460, 1584, + 1460, 23, 33, 24, 25, 1461, 1462, 1535, + 1586, 25, 1556, 1460, 1585, 1460, 1587, 1460, + 1460, 1587, 1460, 23, 33, 24, 25, 1461, + 1462, 1535, 1586, 25, 1556, 1460, 1588, 1460, + 1589, 1460, 1460, 1589, 1460, 23, 33, 24, + 25, 1461, 1462, 1535, 1586, 25, 1556, 1460, + 1590, 1460, 1590, 1460, 1460, 1590, 1460, 23, + 33, 24, 25, 1461, 1462, 1586, 25, 1556, + 1460, 1460, 23, 33, 24, 25, 1461, 1462, + 25, 1463, 1460, 1591, 1460, 1592, 1460, 1460, + 1592, 1460, 23, 33, 24, 25, 1461, 1462, + 1535, 1594, 25, 1556, 1460, 1593, 1460, 1595, + 1460, 1460, 1595, 1460, 23, 33, 24, 25, + 1461, 1462, 1535, 1594, 25, 1556, 1460, 1596, + 1460, 1597, 1460, 1460, 1597, 1460, 23, 33, + 24, 25, 1461, 1462, 1535, 1594, 25, 1556, + 1460, 1598, 1460, 1598, 1460, 1460, 1598, 1460, + 23, 33, 24, 25, 1461, 1462, 1594, 25, + 1556, 1460, 1460, 23, 33, 24, 25, 1461, + 1462, 25, 1463, 1460, 1599, 1460, 1600, 1460, + 1460, 1600, 1460, 23, 33, 24, 25, 1461, + 1462, 1535, 1602, 25, 1556, 1460, 1601, 1460, + 1603, 1460, 1460, 1603, 1460, 23, 33, 24, + 25, 1461, 1462, 1535, 1602, 25, 1556, 1460, + 1604, 1460, 1605, 1460, 1460, 1605, 1460, 23, + 33, 24, 25, 1461, 1462, 1535, 1602, 25, + 1556, 1460, 1606, 1460, 1606, 1460, 1460, 1606, + 1460, 23, 33, 24, 25, 1461, 1462, 1602, + 25, 1556, 1460, 1460, 23, 33, 24, 25, + 1461, 1462, 25, 1463, 1460, 1607, 1460, 1608, + 1460, 1460, 1608, 1460, 23, 33, 24, 25, + 1461, 1462, 1535, 1610, 25, 1556, 1460, 1609, + 1460, 1611, 1460, 1460, 1611, 1460, 23, 33, + 24, 25, 1461, 1462, 1535, 1610, 25, 1556, + 1460, 1612, 1460, 1613, 1460, 1460, 1613, 1460, + 23, 33, 24, 25, 1461, 1462, 1535, 1610, + 25, 1556, 1460, 1614, 1460, 1614, 1460, 1460, + 1614, 1460, 23, 33, 24, 25, 1461, 1462, + 1610, 25, 1556, 1460, 1460, 23, 33, 24, + 25, 1461, 1462, 25, 1463, 1460, 1615, 1460, + 1579, 1460, 1460, 1579, 1460, 23, 33, 24, + 25, 1461, 1462, 1535, 1537, 25, 1556, 1460, + 1616, 1460, 1580, 1460, 1460, 1580, 1460, 23, + 33, 24, 25, 1461, 1462, 1535, 1537, 25, + 1556, 1460, 1617, 1460, 1581, 1460, 1460, 1581, + 1460, 23, 33, 24, 25, 1461, 1462, 1535, + 1537, 25, 1556, 1460, 1582, 1460, 1582, 1460, + 1460, 1582, 1460, 23, 33, 24, 25, 1461, + 1462, 1610, 25, 1556, 1460, 1614, 1460, 1614, + 1460, 1460, 1614, 1460, 23, 33, 24, 25, + 1461, 1462, 1610, 25, 1556, 1460, 1613, 1460, + 1613, 1460, 1460, 1613, 1460, 23, 33, 24, + 25, 1461, 1462, 1610, 25, 1556, 1460, 1611, + 1460, 1611, 1460, 1460, 1611, 1460, 23, 33, + 24, 25, 1461, 1462, 1602, 25, 1556, 1460, + 1606, 1460, 1606, 1460, 1460, 1606, 1460, 23, + 33, 24, 25, 1461, 1462, 1602, 25, 1556, + 1460, 1605, 1460, 1605, 1460, 1460, 1605, 1460, + 23, 33, 24, 25, 1461, 1462, 1602, 25, + 1556, 1460, 1603, 1460, 1603, 1460, 1460, 1603, + 1460, 23, 33, 24, 25, 1461, 1462, 1594, + 25, 1556, 1460, 1598, 1460, 1598, 1460, 1460, + 1598, 1460, 23, 33, 24, 25, 1461, 1462, + 1594, 25, 1556, 1460, 1597, 1460, 1597, 1460, + 1460, 1597, 1460, 23, 33, 24, 25, 1461, + 1462, 1594, 25, 1556, 1460, 1595, 1460, 1595, + 1460, 1460, 1595, 1460, 23, 33, 24, 25, + 1461, 1462, 1586, 25, 1556, 1460, 1590, 1460, + 1590, 1460, 1460, 1590, 1460, 23, 33, 24, + 25, 1461, 1462, 1586, 25, 1556, 1460, 1589, + 1460, 1589, 1460, 1460, 1589, 1460, 23, 33, + 24, 25, 1461, 1462, 1586, 25, 1556, 1460, + 1587, 1460, 1587, 1460, 1460, 1587, 1460, 23, + 33, 24, 25, 1461, 1462, 1507, 25, 1463, + 1460, 1460, 23, 1450, 30, 1, 1450, 1619, + 1620, 1621, 1623, 1624, 1622, 1622, 1622, 1618, + 1450, 1451, 1, 1625, 24, 26, 25, 25, + 25, 23, 29, 1451, 1, 1626, 36, 37, + 38, 39, 39, 34, 40, 1451, 1, 1625, + 24, 26, 1453, 1456, 25, 1453, 25, 25, + 1454, 25, 1455, 25, 1455, 25, 23, 1625, + 24, 26, 1627, 25, 1627, 25, 25, 1628, + 25, 1628, 25, 1628, 25, 23, 33, 24, + 26, 1627, 25, 1627, 25, 25, 1628, 25, + 1628, 25, 1628, 25, 23, 1625, 24, 26, + 25, 25, 25, 1628, 25, 1628, 25, 1628, + 25, 23, 1629, 1443, 1444, 1446, 1447, 1448, + 1445, 1447, 1445, 1445, 1449, 1445, 1449, 1445, + 1449, 1445, 1441, 33, 24, 26, 1453, 1456, + 25, 1453, 25, 25, 1454, 25, 1455, 25, + 1455, 25, 23, 19, 1631, 1632, 1633, 1634, + 1635, 1635, 1630, 19, 20, 1, 1636, 24, + 26, 28, 25, 25, 27, 25, 27, 25, + 27, 25, 23, 29, 20, 1, 19, 42, + 42, 1, 1636, 24, 26, 25, 25, 25, + 23, 19, 1637, 1637, 1638, 1638, 1638, 1, + 1637, 1637, 1638, 1638, 1638, 1, 19, 1638, + 1638, 1638, 1, 1639, 13, 14, 15, 16, + 17, 16, 18, 18, 18, 12, 1640, 1643, + 1640, 1641, 1642, 1642, 1, 1644, 1644, 1645, + 1645, 1645, 1, 1644, 1646, 1644, 1645, 1645, + 1645, 1, 1647, 1647, 1, 1648, 1647, 1647, + 1, 1650, 1651, 1649, 1652, 1, 1653, 1, + 1653, 1654, 1, 1656, 1655, 1655, 1655, 1, + 1658, 1659, 1660, 1661, 1660, 1662, 1662, 1662, + 1657, 1663, 1, 1664, 1, 1664, 1656, 1, + 1665, 1668, 1665, 1666, 1667, 1667, 1, 1669, + 1669, 1670, 1670, 1670, 1, 1669, 1671, 1669, + 1670, 1670, 1670, 1, 1464, 1464, 1, 1669, + 1672, 1671, 1669, 1673, 1670, 1670, 1, 1674, + 1, 1675, 1676, 1, 1677, 1, 1678, 1679, + 1, 1680, 1, 1682, 1681, 1, 1682, 1683, + 1, 1682, 1, 1678, 1684, 1, 1678, 1, + 1675, 1685, 1, 1675, 1, 1669, 1672, 1671, + 1669, 1686, 1670, 1670, 1, 1669, 1672, 1671, + 1669, 1670, 1670, 1670, 1, 1669, 1671, 1687, + 1669, 1670, 1670, 1670, 1, 1669, 1671, 1669, + 1688, 1670, 1670, 1670, 1, 1669, 1689, 1671, + 1669, 1670, 1670, 1670, 1, 1669, 1690, 1669, + 1670, 1670, 1670, 1, 1692, 1464, 1691, 1464, + 1691, 1464, 1464, 1691, 1464, 1, 1694, 1465, + 1464, 1693, 1464, 1693, 1464, 1464, 1693, 1464, + 1, 1694, 1465, 1464, 1695, 1464, 1695, 1464, + 1464, 1695, 1464, 1, 1694, 1465, 1464, 1696, + 1464, 1696, 1464, 1464, 1696, 1464, 1, 1694, + 1465, 1464, 1464, 1, 1698, 1465, 1464, 1697, + 1464, 1697, 1464, 1464, 1697, 1464, 1, 1700, + 1465, 1464, 1699, 1464, 1699, 1464, 1464, 1699, + 1464, 1, 1700, 1465, 1464, 1701, 1464, 1701, + 1464, 1464, 1701, 1464, 1, 1700, 1465, 1464, + 1702, 1464, 1702, 1464, 1464, 1702, 1464, 1, + 1700, 1465, 1464, 1464, 1, 1698, 1465, 1464, + 1703, 1464, 1703, 1464, 1464, 1703, 1464, 1, + 1705, 1465, 1464, 1704, 1464, 1704, 1464, 1464, + 1704, 1464, 1, 1705, 1465, 1464, 1706, 1464, + 1706, 1464, 1464, 1706, 1464, 1, 1705, 1465, + 1464, 1707, 1464, 1707, 1464, 1464, 1707, 1464, + 1, 1705, 1465, 1464, 1464, 1, 1698, 1465, + 1464, 1708, 1464, 1708, 1464, 1464, 1708, 1464, + 1, 1710, 1465, 1464, 1709, 1464, 1709, 1464, + 1464, 1709, 1464, 1, 1710, 1465, 1464, 1711, + 1464, 1711, 1464, 1464, 1711, 1464, 1, 1710, + 1465, 1464, 1712, 1464, 1712, 1464, 1464, 1712, + 1464, 1, 1710, 1465, 1464, 1464, 1, 1698, + 1465, 1464, 1713, 1464, 1713, 1464, 1464, 1713, + 1464, 1, 1715, 1465, 1464, 1714, 1464, 1714, + 1464, 1464, 1714, 1464, 1, 1715, 1465, 1464, + 1716, 1464, 1716, 1464, 1464, 1716, 1464, 1, + 1715, 1465, 1464, 1717, 1464, 1717, 1464, 1464, + 1717, 1464, 1, 1715, 1465, 1464, 1464, 1, + 1719, 1465, 1464, 1718, 1464, 1718, 1464, 1464, + 1718, 1464, 1, 1721, 1465, 1464, 1720, 1464, + 1720, 1464, 1464, 1720, 1464, 1, 1721, 1465, + 1464, 1722, 1464, 1722, 1464, 1464, 1722, 1464, + 1, 1721, 1465, 1464, 1723, 1464, 1723, 1464, + 1464, 1723, 1464, 1, 1721, 1465, 1464, 1464, + 1, 1719, 1465, 1464, 1724, 1464, 1725, 1464, + 1464, 1725, 1464, 1, 1726, 1728, 1465, 1464, + 1727, 1464, 1729, 1464, 1464, 1729, 1464, 1, + 1465, 1464, 1730, 1464, 1464, 1, 1731, 1465, + 1464, 1732, 1464, 1464, 1, 1465, 1464, 1733, + 1464, 1464, 1, 1734, 1465, 1464, 1735, 1464, + 1464, 1, 1465, 1464, 1736, 1464, 1464, 1, + 1738, 1464, 1737, 1464, 1464, 1, 1738, 1464, + 1739, 1464, 1464, 1, 1738, 1464, 1464, 1, + 1734, 1465, 1464, 1740, 1464, 1464, 1, 1734, + 1465, 1464, 1464, 1, 1731, 1465, 1464, 1741, + 1464, 1464, 1, 1731, 1465, 1464, 1464, 1, + 1726, 1728, 1465, 1464, 1742, 1464, 1743, 1464, + 1464, 1743, 1464, 1, 1726, 1728, 1465, 1464, + 1744, 1464, 1744, 1464, 1464, 1744, 1464, 1, + 1728, 1465, 1464, 1464, 1, 1465, 1464, 1745, + 1464, 1745, 1464, 1464, 1745, 1464, 1, 1747, + 1464, 1746, 1464, 1746, 1464, 1464, 1746, 1464, + 1, 1747, 1464, 1748, 1464, 1748, 1464, 1464, + 1748, 1464, 1, 1747, 1464, 1749, 1464, 1749, + 1464, 1464, 1749, 1464, 1, 1747, 1464, 1464, + 1, 1728, 1465, 1464, 1744, 1464, 1744, 1464, + 1464, 1744, 1464, 1, 1728, 1465, 1464, 1743, + 1464, 1743, 1464, 1464, 1743, 1464, 1, 1747, + 1464, 1750, 1464, 1750, 1464, 1464, 1750, 1464, + 1, 1752, 1747, 1464, 1751, 1464, 1751, 1464, + 1464, 1751, 1464, 1, 1752, 1747, 1464, 1753, + 1464, 1753, 1464, 1464, 1753, 1464, 1, 1752, + 1747, 1464, 1754, 1464, 1754, 1464, 1464, 1754, + 1464, 1, 1752, 1747, 1464, 1464, 1, 1465, + 1464, 1755, 1464, 1755, 1464, 1464, 1755, 1464, + 1, 1757, 1747, 1464, 1756, 1464, 1756, 1464, + 1464, 1756, 1464, 1, 1757, 1747, 1464, 1758, + 1464, 1758, 1464, 1464, 1758, 1464, 1, 1757, + 1747, 1464, 1759, 1464, 1759, 1464, 1464, 1759, + 1464, 1, 1757, 1747, 1464, 1464, 1, 1465, + 1464, 1760, 1464, 1760, 1464, 1464, 1760, 1464, + 1, 1762, 1747, 1464, 1761, 1464, 1761, 1464, + 1464, 1761, 1464, 1, 1762, 1747, 1464, 1763, + 1464, 1763, 1464, 1464, 1763, 1464, 1, 1762, + 1747, 1464, 1764, 1464, 1764, 1464, 1464, 1764, + 1464, 1, 1762, 1747, 1464, 1464, 1, 1465, + 1464, 1765, 1464, 1765, 1464, 1464, 1765, 1464, + 1, 1767, 1747, 1464, 1766, 1464, 1766, 1464, + 1464, 1766, 1464, 1, 1767, 1747, 1464, 1768, + 1464, 1768, 1464, 1464, 1768, 1464, 1, 1767, + 1747, 1464, 1769, 1464, 1769, 1464, 1464, 1769, + 1464, 1, 1767, 1747, 1464, 1464, 1, 1465, + 1464, 1770, 1464, 1770, 1464, 1464, 1770, 1464, + 1, 1728, 1747, 1464, 1771, 1464, 1771, 1464, + 1464, 1771, 1464, 1, 1728, 1747, 1464, 1772, + 1464, 1772, 1464, 1464, 1772, 1464, 1, 1728, + 1747, 1464, 1773, 1464, 1773, 1464, 1464, 1773, + 1464, 1, 1728, 1747, 1464, 1464, 1, 1728, + 1465, 1464, 1729, 1464, 1729, 1464, 1464, 1729, + 1464, 1, 1747, 1464, 1774, 1464, 1775, 1464, + 1464, 1775, 1464, 1, 1726, 1777, 1747, 1464, + 1776, 1464, 1778, 1464, 1464, 1778, 1464, 1, + 1726, 1777, 1747, 1464, 1779, 1464, 1780, 1464, + 1464, 1780, 1464, 1, 1726, 1777, 1747, 1464, + 1781, 1464, 1781, 1464, 1464, 1781, 1464, 1, + 1777, 1747, 1464, 1464, 1, 1465, 1464, 1782, + 1464, 1783, 1464, 1464, 1783, 1464, 1, 1726, + 1785, 1747, 1464, 1784, 1464, 1786, 1464, 1464, + 1786, 1464, 1, 1726, 1785, 1747, 1464, 1787, + 1464, 1788, 1464, 1464, 1788, 1464, 1, 1726, + 1785, 1747, 1464, 1789, 1464, 1789, 1464, 1464, + 1789, 1464, 1, 1785, 1747, 1464, 1464, 1, + 1465, 1464, 1790, 1464, 1791, 1464, 1464, 1791, + 1464, 1, 1726, 1793, 1747, 1464, 1792, 1464, + 1794, 1464, 1464, 1794, 1464, 1, 1726, 1793, + 1747, 1464, 1795, 1464, 1796, 1464, 1464, 1796, + 1464, 1, 1726, 1793, 1747, 1464, 1797, 1464, + 1797, 1464, 1464, 1797, 1464, 1, 1793, 1747, + 1464, 1464, 1, 1465, 1464, 1798, 1464, 1799, + 1464, 1464, 1799, 1464, 1, 1726, 1801, 1747, + 1464, 1800, 1464, 1802, 1464, 1464, 1802, 1464, + 1, 1726, 1801, 1747, 1464, 1803, 1464, 1804, + 1464, 1464, 1804, 1464, 1, 1726, 1801, 1747, + 1464, 1805, 1464, 1805, 1464, 1464, 1805, 1464, + 1, 1801, 1747, 1464, 1464, 1, 1465, 1464, + 1806, 1464, 1770, 1464, 1464, 1770, 1464, 1, + 1726, 1728, 1747, 1464, 1807, 1464, 1771, 1464, + 1464, 1771, 1464, 1, 1726, 1728, 1747, 1464, + 1808, 1464, 1772, 1464, 1464, 1772, 1464, 1, + 1726, 1728, 1747, 1464, 1773, 1464, 1773, 1464, + 1464, 1773, 1464, 1, 1801, 1747, 1464, 1805, + 1464, 1805, 1464, 1464, 1805, 1464, 1, 1801, + 1747, 1464, 1804, 1464, 1804, 1464, 1464, 1804, + 1464, 1, 1801, 1747, 1464, 1802, 1464, 1802, + 1464, 1464, 1802, 1464, 1, 1793, 1747, 1464, + 1797, 1464, 1797, 1464, 1464, 1797, 1464, 1, + 1793, 1747, 1464, 1796, 1464, 1796, 1464, 1464, + 1796, 1464, 1, 1793, 1747, 1464, 1794, 1464, + 1794, 1464, 1464, 1794, 1464, 1, 1785, 1747, + 1464, 1789, 1464, 1789, 1464, 1464, 1789, 1464, + 1, 1785, 1747, 1464, 1788, 1464, 1788, 1464, + 1464, 1788, 1464, 1, 1785, 1747, 1464, 1786, + 1464, 1786, 1464, 1464, 1786, 1464, 1, 1777, + 1747, 1464, 1781, 1464, 1781, 1464, 1464, 1781, + 1464, 1, 1777, 1747, 1464, 1780, 1464, 1780, + 1464, 1464, 1780, 1464, 1, 1777, 1747, 1464, + 1778, 1464, 1778, 1464, 1464, 1778, 1464, 1, + 1698, 1465, 1464, 1464, 1, 1663, 1810, 1811, + 1812, 1813, 1809, 1663, 1664, 1, 1663, 1665, + 1668, 1665, 1666, 1667, 1667, 1, 1663, 1814, + 1814, 1815, 1815, 1815, 1, 1814, 1814, 1815, + 1815, 1815, 1, 1663, 1815, 1815, 1815, 1, + 1816, 1658, 1659, 1660, 1661, 1660, 1662, 1662, + 1662, 1657, 1652, 1818, 1819, 1820, 1821, 1817, + 1652, 1653, 1, 1652, 1656, 1655, 1655, 1655, + 1, 1644, 1822, 1646, 1644, 1823, 1645, 1645, + 1, 1824, 1, 1825, 1826, 1, 1827, 1, + 1828, 1829, 1, 1830, 1, 1832, 1831, 1, + 1832, 1833, 1, 1832, 1, 1828, 1834, 1, + 1828, 1, 1825, 1835, 1, 1825, 1, 1644, + 1822, 1646, 1644, 1836, 1645, 1645, 1, 1644, + 1822, 1646, 1644, 1645, 1645, 1645, 1, 1644, + 1646, 1837, 1644, 1645, 1645, 1645, 1, 1644, + 1646, 1644, 1838, 1645, 1645, 1645, 1, 1644, + 1839, 1646, 1644, 1645, 1645, 1645, 1, 1644, + 1840, 1644, 1645, 1645, 1645, 1, 1842, 1647, + 1841, 1647, 1841, 1647, 1647, 1841, 1647, 1, + 1844, 1648, 1647, 1843, 1647, 1843, 1647, 1647, + 1843, 1647, 1, 1844, 1648, 1647, 1845, 1647, + 1845, 1647, 1647, 1845, 1647, 1, 1844, 1648, + 1647, 1846, 1647, 1846, 1647, 1647, 1846, 1647, + 1, 1844, 1648, 1647, 1647, 1, 1848, 1648, + 1647, 1847, 1647, 1847, 1647, 1647, 1847, 1647, + 1, 1850, 1648, 1647, 1849, 1647, 1849, 1647, + 1647, 1849, 1647, 1, 1850, 1648, 1647, 1851, + 1647, 1851, 1647, 1647, 1851, 1647, 1, 1850, + 1648, 1647, 1852, 1647, 1852, 1647, 1647, 1852, + 1647, 1, 1850, 1648, 1647, 1647, 1, 1848, + 1648, 1647, 1853, 1647, 1853, 1647, 1647, 1853, + 1647, 1, 1855, 1648, 1647, 1854, 1647, 1854, + 1647, 1647, 1854, 1647, 1, 1855, 1648, 1647, + 1856, 1647, 1856, 1647, 1647, 1856, 1647, 1, + 1855, 1648, 1647, 1857, 1647, 1857, 1647, 1647, + 1857, 1647, 1, 1855, 1648, 1647, 1647, 1, + 1848, 1648, 1647, 1858, 1647, 1858, 1647, 1647, + 1858, 1647, 1, 1860, 1648, 1647, 1859, 1647, + 1859, 1647, 1647, 1859, 1647, 1, 1860, 1648, + 1647, 1861, 1647, 1861, 1647, 1647, 1861, 1647, + 1, 1860, 1648, 1647, 1862, 1647, 1862, 1647, + 1647, 1862, 1647, 1, 1860, 1648, 1647, 1647, + 1, 1848, 1648, 1647, 1863, 1647, 1863, 1647, + 1647, 1863, 1647, 1, 1865, 1648, 1647, 1864, + 1647, 1864, 1647, 1647, 1864, 1647, 1, 1865, + 1648, 1647, 1866, 1647, 1866, 1647, 1647, 1866, + 1647, 1, 1865, 1648, 1647, 1867, 1647, 1867, + 1647, 1647, 1867, 1647, 1, 1865, 1648, 1647, + 1647, 1, 1869, 1648, 1647, 1868, 1647, 1868, + 1647, 1647, 1868, 1647, 1, 1871, 1648, 1647, + 1870, 1647, 1870, 1647, 1647, 1870, 1647, 1, + 1871, 1648, 1647, 1872, 1647, 1872, 1647, 1647, + 1872, 1647, 1, 1871, 1648, 1647, 1873, 1647, + 1873, 1647, 1647, 1873, 1647, 1, 1871, 1648, + 1647, 1647, 1, 1869, 1648, 1647, 1874, 1647, + 1875, 1647, 1647, 1875, 1647, 1, 1876, 1878, + 1648, 1647, 1877, 1647, 1879, 1647, 1647, 1879, + 1647, 1, 1648, 1647, 1880, 1647, 1647, 1, + 1881, 1648, 1647, 1882, 1647, 1647, 1, 1648, + 1647, 1883, 1647, 1647, 1, 1884, 1648, 1647, + 1885, 1647, 1647, 1, 1648, 1647, 1886, 1647, + 1647, 1, 1888, 1647, 1887, 1647, 1647, 1, + 1888, 1647, 1889, 1647, 1647, 1, 1888, 1647, + 1647, 1, 1884, 1648, 1647, 1890, 1647, 1647, + 1, 1884, 1648, 1647, 1647, 1, 1881, 1648, + 1647, 1891, 1647, 1647, 1, 1881, 1648, 1647, + 1647, 1, 1876, 1878, 1648, 1647, 1892, 1647, + 1893, 1647, 1647, 1893, 1647, 1, 1876, 1878, + 1648, 1647, 1894, 1647, 1894, 1647, 1647, 1894, + 1647, 1, 1878, 1648, 1647, 1647, 1, 1648, + 1647, 1895, 1647, 1895, 1647, 1647, 1895, 1647, + 1, 1897, 1647, 1896, 1647, 1896, 1647, 1647, + 1896, 1647, 1, 1897, 1647, 1898, 1647, 1898, + 1647, 1647, 1898, 1647, 1, 1897, 1647, 1899, + 1647, 1899, 1647, 1647, 1899, 1647, 1, 1897, + 1647, 1647, 1, 1878, 1648, 1647, 1894, 1647, + 1894, 1647, 1647, 1894, 1647, 1, 1878, 1648, + 1647, 1893, 1647, 1893, 1647, 1647, 1893, 1647, + 1, 1897, 1647, 1900, 1647, 1900, 1647, 1647, + 1900, 1647, 1, 1902, 1897, 1647, 1901, 1647, + 1901, 1647, 1647, 1901, 1647, 1, 1902, 1897, + 1647, 1903, 1647, 1903, 1647, 1647, 1903, 1647, + 1, 1902, 1897, 1647, 1904, 1647, 1904, 1647, + 1647, 1904, 1647, 1, 1902, 1897, 1647, 1647, + 1, 1648, 1647, 1905, 1647, 1905, 1647, 1647, + 1905, 1647, 1, 1907, 1897, 1647, 1906, 1647, + 1906, 1647, 1647, 1906, 1647, 1, 1907, 1897, + 1647, 1908, 1647, 1908, 1647, 1647, 1908, 1647, + 1, 1907, 1897, 1647, 1909, 1647, 1909, 1647, + 1647, 1909, 1647, 1, 1907, 1897, 1647, 1647, + 1, 1648, 1647, 1910, 1647, 1910, 1647, 1647, + 1910, 1647, 1, 1912, 1897, 1647, 1911, 1647, + 1911, 1647, 1647, 1911, 1647, 1, 1912, 1897, + 1647, 1913, 1647, 1913, 1647, 1647, 1913, 1647, + 1, 1912, 1897, 1647, 1914, 1647, 1914, 1647, + 1647, 1914, 1647, 1, 1912, 1897, 1647, 1647, + 1, 1648, 1647, 1915, 1647, 1915, 1647, 1647, + 1915, 1647, 1, 1917, 1897, 1647, 1916, 1647, + 1916, 1647, 1647, 1916, 1647, 1, 1917, 1897, + 1647, 1918, 1647, 1918, 1647, 1647, 1918, 1647, + 1, 1917, 1897, 1647, 1919, 1647, 1919, 1647, + 1647, 1919, 1647, 1, 1917, 1897, 1647, 1647, + 1, 1648, 1647, 1920, 1647, 1920, 1647, 1647, + 1920, 1647, 1, 1878, 1897, 1647, 1921, 1647, + 1921, 1647, 1647, 1921, 1647, 1, 1878, 1897, + 1647, 1922, 1647, 1922, 1647, 1647, 1922, 1647, + 1, 1878, 1897, 1647, 1923, 1647, 1923, 1647, + 1647, 1923, 1647, 1, 1878, 1897, 1647, 1647, + 1, 1878, 1648, 1647, 1879, 1647, 1879, 1647, + 1647, 1879, 1647, 1, 1897, 1647, 1924, 1647, + 1925, 1647, 1647, 1925, 1647, 1, 1876, 1927, + 1897, 1647, 1926, 1647, 1928, 1647, 1647, 1928, + 1647, 1, 1876, 1927, 1897, 1647, 1929, 1647, + 1930, 1647, 1647, 1930, 1647, 1, 1876, 1927, + 1897, 1647, 1931, 1647, 1931, 1647, 1647, 1931, + 1647, 1, 1927, 1897, 1647, 1647, 1, 1648, + 1647, 1932, 1647, 1933, 1647, 1647, 1933, 1647, + 1, 1876, 1935, 1897, 1647, 1934, 1647, 1936, + 1647, 1647, 1936, 1647, 1, 1876, 1935, 1897, + 1647, 1937, 1647, 1938, 1647, 1647, 1938, 1647, + 1, 1876, 1935, 1897, 1647, 1939, 1647, 1939, + 1647, 1647, 1939, 1647, 1, 1935, 1897, 1647, + 1647, 1, 1648, 1647, 1940, 1647, 1941, 1647, + 1647, 1941, 1647, 1, 1876, 1943, 1897, 1647, + 1942, 1647, 1944, 1647, 1647, 1944, 1647, 1, + 1876, 1943, 1897, 1647, 1945, 1647, 1946, 1647, + 1647, 1946, 1647, 1, 1876, 1943, 1897, 1647, + 1947, 1647, 1947, 1647, 1647, 1947, 1647, 1, + 1943, 1897, 1647, 1647, 1, 1648, 1647, 1948, + 1647, 1949, 1647, 1647, 1949, 1647, 1, 1876, + 1951, 1897, 1647, 1950, 1647, 1952, 1647, 1647, + 1952, 1647, 1, 1876, 1951, 1897, 1647, 1953, + 1647, 1954, 1647, 1647, 1954, 1647, 1, 1876, + 1951, 1897, 1647, 1955, 1647, 1955, 1647, 1647, + 1955, 1647, 1, 1951, 1897, 1647, 1647, 1, + 1648, 1647, 1956, 1647, 1920, 1647, 1647, 1920, + 1647, 1, 1876, 1878, 1897, 1647, 1957, 1647, + 1921, 1647, 1647, 1921, 1647, 1, 1876, 1878, + 1897, 1647, 1958, 1647, 1922, 1647, 1647, 1922, + 1647, 1, 1876, 1878, 1897, 1647, 1923, 1647, + 1923, 1647, 1647, 1923, 1647, 1, 1951, 1897, + 1647, 1955, 1647, 1955, 1647, 1647, 1955, 1647, + 1, 1951, 1897, 1647, 1954, 1647, 1954, 1647, + 1647, 1954, 1647, 1, 1951, 1897, 1647, 1952, + 1647, 1952, 1647, 1647, 1952, 1647, 1, 1943, + 1897, 1647, 1947, 1647, 1947, 1647, 1647, 1947, + 1647, 1, 1943, 1897, 1647, 1946, 1647, 1946, + 1647, 1647, 1946, 1647, 1, 1943, 1897, 1647, + 1944, 1647, 1944, 1647, 1647, 1944, 1647, 1, + 1935, 1897, 1647, 1939, 1647, 1939, 1647, 1647, + 1939, 1647, 1, 1935, 1897, 1647, 1938, 1647, + 1938, 1647, 1647, 1938, 1647, 1, 1935, 1897, + 1647, 1936, 1647, 1936, 1647, 1647, 1936, 1647, + 1, 1927, 1897, 1647, 1931, 1647, 1931, 1647, + 1647, 1931, 1647, 1, 1927, 1897, 1647, 1930, + 1647, 1930, 1647, 1647, 1930, 1647, 1, 1927, + 1897, 1647, 1928, 1647, 1928, 1647, 1647, 1928, + 1647, 1, 1848, 1648, 1647, 1647, 1, 8, + 1959, 6, 7, 1961, 1960, 1960, 1960, 5, + 8, 9, 1, 1962, 13, 14, 15, 16, + 17, 16, 18, 18, 18, 12, 19, 9, + 1, 8, 1640, 1643, 1640, 1641, 1642, 1642, + 1, 1964, 1965, 1966, 1963, 170, 177, 1, + 1967, 1964, 1965, 1966, 1963, 1968, 1964, 1965, + 1966, 1963, 0 +}; + +static const short _smtp_received_parser_trans_targs[] = { + 2, 0, 3, 4, 5, 6, 1774, 1775, + 7, 8, 9, 1472, 10, 1461, 1462, 1467, + 1468, 1470, 1471, 11, 12, 13, 25, 14, + 18, 19, 21, 1288, 1460, 15, 16, 17, + 1287, 20, 22, 1280, 1281, 1282, 1284, 1286, + 23, 24, 26, 27, 1274, 1275, 28, 29, + 30, 972, 31, 954, 955, 967, 968, 970, + 971, 961, 32, 33, 34, 205, 191, 217, + 585, 633, 728, 35, 198, 199, 204, 36, + 37, 38, 193, 39, 47, 48, 192, 50, + 57, 40, 41, 42, 43, 52, 53, 55, + 44, 45, 46, 49, 51, 54, 56, 58, + 181, 182, 183, 59, 60, 61, 172, 173, + 175, 176, 177, 178, 179, 180, 62, 63, + 64, 152, 163, 165, 167, 170, 65, 66, + 140, 141, 151, 67, 68, 69, 125, 127, + 129, 132, 134, 136, 138, 70, 124, 71, + 72, 120, 121, 73, 74, 75, 76, 77, + 78, 79, 115, 116, 119, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, + 111, 112, 91, 92, 93, 94, 95, 96, + 1780, 98, 1781, 100, 103, 104, 1782, 101, + 102, 99, 105, 110, 113, 114, 117, 118, + 122, 123, 126, 128, 130, 131, 133, 135, + 137, 139, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 153, 154, 155, 156, 159, + 160, 162, 157, 158, 161, 164, 166, 168, + 169, 171, 174, 184, 185, 186, 187, 188, + 189, 190, 194, 195, 196, 194, 195, 196, + 39, 47, 48, 50, 57, 197, 194, 195, + 196, 200, 201, 203, 202, 206, 210, 211, + 213, 754, 953, 207, 208, 209, 753, 212, + 214, 739, 740, 741, 743, 745, 747, 749, + 750, 751, 752, 215, 216, 218, 219, 220, + 574, 575, 576, 583, 221, 222, 223, 399, + 404, 564, 224, 225, 398, 226, 227, 228, + 229, 256, 230, 238, 239, 243, 252, 254, + 255, 250, 231, 232, 233, 234, 245, 246, + 248, 235, 236, 237, 230, 238, 239, 241, + 243, 250, 240, 242, 244, 247, 249, 251, + 253, 229, 240, 257, 262, 258, 277, 257, + 258, 259, 260, 261, 230, 238, 239, 243, + 250, 263, 275, 264, 265, 273, 266, 267, + 271, 268, 269, 261, 270, 272, 274, 276, + 278, 279, 280, 281, 282, 397, 283, 286, + 284, 285, 287, 361, 288, 291, 289, 290, + 292, 293, 296, 294, 295, 297, 298, 301, + 299, 300, 302, 303, 306, 304, 305, 307, + 335, 308, 311, 309, 310, 312, 360, 313, + 325, 328, 334, 314, 315, 323, 316, 317, + 321, 318, 319, 261, 320, 322, 324, 326, + 333, 327, 329, 330, 261, 331, 332, 336, + 337, 340, 338, 339, 341, 342, 345, 343, + 344, 346, 347, 350, 348, 349, 351, 352, + 355, 353, 354, 356, 357, 358, 359, 362, + 396, 363, 366, 395, 364, 394, 365, 367, + 393, 368, 371, 392, 369, 391, 370, 372, + 390, 373, 376, 389, 374, 388, 375, 377, + 387, 378, 381, 386, 379, 385, 380, 382, + 383, 384, 400, 401, 402, 400, 401, 402, + 398, 403, 400, 401, 402, 405, 554, 559, + 405, 406, 407, 408, 412, 409, 410, 408, + 411, 230, 238, 239, 243, 250, 413, 418, + 414, 433, 413, 414, 415, 416, 417, 411, + 419, 431, 420, 421, 429, 422, 423, 427, + 424, 425, 417, 426, 428, 430, 432, 434, + 435, 436, 437, 438, 553, 439, 442, 440, + 441, 443, 517, 444, 447, 445, 446, 448, + 449, 452, 450, 451, 453, 454, 457, 455, + 456, 458, 459, 462, 460, 461, 463, 491, + 464, 467, 465, 466, 468, 516, 469, 481, + 484, 490, 470, 471, 479, 472, 473, 477, + 474, 475, 417, 476, 478, 480, 482, 489, + 483, 485, 486, 417, 487, 488, 492, 493, + 496, 494, 495, 497, 498, 501, 499, 500, + 502, 503, 506, 504, 505, 507, 508, 511, + 509, 510, 512, 513, 514, 515, 518, 552, + 519, 522, 551, 520, 550, 521, 523, 549, + 524, 527, 548, 525, 547, 526, 528, 546, + 529, 532, 545, 530, 544, 531, 533, 543, + 534, 537, 542, 535, 541, 536, 538, 539, + 540, 555, 556, 557, 555, 556, 557, 407, + 558, 555, 556, 557, 560, 561, 562, 563, + 565, 566, 567, 568, 226, 569, 570, 571, + 572, 570, 571, 572, 228, 573, 570, 571, + 572, 577, 578, 580, 581, 582, 579, 584, + 586, 587, 623, 624, 625, 631, 588, 589, + 590, 615, 591, 599, 600, 614, 604, 611, + 592, 593, 594, 595, 606, 607, 609, 596, + 597, 598, 602, 613, 601, 603, 605, 608, + 610, 612, 616, 617, 618, 621, 619, 620, + 622, 626, 627, 629, 630, 628, 632, 634, + 635, 636, 730, 731, 732, 737, 637, 638, + 639, 640, 648, 649, 729, 653, 660, 641, + 642, 643, 644, 655, 656, 658, 645, 646, + 647, 651, 662, 663, 664, 650, 652, 654, + 657, 659, 661, 665, 666, 667, 668, 715, + 716, 717, 726, 669, 670, 671, 697, 703, + 707, 711, 672, 680, 681, 696, 685, 692, + 673, 674, 675, 676, 687, 688, 690, 677, + 678, 679, 683, 694, 695, 682, 684, 686, + 689, 691, 693, 698, 699, 700, 701, 672, + 682, 680, 681, 696, 685, 692, 702, 672, + 682, 680, 681, 696, 685, 692, 704, 705, + 706, 672, 682, 680, 681, 696, 685, 692, + 708, 709, 710, 672, 682, 680, 681, 696, + 685, 692, 712, 713, 714, 672, 682, 680, + 681, 696, 685, 692, 718, 719, 721, 722, + 723, 724, 725, 720, 727, 733, 734, 736, + 735, 738, 742, 744, 746, 748, 755, 940, + 941, 942, 944, 946, 949, 951, 952, 756, + 757, 758, 759, 804, 760, 819, 759, 760, + 761, 762, 763, 767, 774, 764, 765, 766, + 214, 740, 741, 745, 747, 768, 772, 773, + 776, 779, 785, 790, 796, 803, 769, 770, + 771, 775, 739, 743, 749, 750, 751, 752, + 777, 778, 780, 781, 782, 783, 784, 786, + 787, 788, 789, 791, 792, 793, 794, 795, + 797, 798, 799, 800, 801, 802, 805, 817, + 806, 807, 815, 808, 809, 813, 810, 811, + 774, 812, 814, 816, 818, 820, 821, 822, + 823, 824, 939, 825, 828, 826, 827, 829, + 903, 830, 833, 831, 832, 834, 835, 838, + 836, 837, 839, 840, 843, 841, 842, 844, + 845, 848, 846, 847, 849, 877, 850, 853, + 851, 852, 854, 902, 855, 867, 870, 876, + 856, 857, 865, 858, 859, 863, 860, 861, + 774, 862, 864, 866, 868, 875, 869, 871, + 872, 774, 873, 874, 878, 879, 882, 880, + 881, 883, 884, 887, 885, 886, 888, 889, + 892, 890, 891, 893, 894, 897, 895, 896, + 898, 899, 900, 901, 904, 938, 905, 908, + 937, 906, 936, 907, 909, 935, 910, 913, + 934, 911, 933, 912, 914, 932, 915, 918, + 931, 916, 930, 917, 919, 929, 920, 923, + 928, 921, 927, 922, 924, 925, 926, 755, + 943, 941, 942, 944, 946, 948, 945, 947, + 950, 754, 943, 31, 956, 954, 955, 957, + 959, 961, 963, 964, 965, 966, 958, 960, + 962, 969, 30, 956, 973, 1138, 974, 1153, + 973, 974, 975, 976, 977, 978, 1134, 1135, + 979, 980, 981, 982, 986, 983, 1126, 1127, + 1130, 1132, 1133, 984, 985, 987, 990, 988, + 1005, 987, 988, 989, 991, 1003, 992, 993, + 1001, 994, 995, 999, 996, 997, 765, 998, + 1000, 1002, 1004, 1006, 1007, 1008, 1009, 1010, + 1125, 1011, 1014, 1012, 1013, 1015, 1089, 1016, + 1019, 1017, 1018, 1020, 1021, 1024, 1022, 1023, + 1025, 1026, 1029, 1027, 1028, 1030, 1031, 1034, + 1032, 1033, 1035, 1063, 1036, 1039, 1037, 1038, + 1040, 1088, 1041, 1053, 1056, 1062, 1042, 1043, + 1051, 1044, 1045, 1049, 1046, 1047, 765, 1048, + 1050, 1052, 1054, 1061, 1055, 1057, 1058, 765, + 1059, 1060, 1064, 1065, 1068, 1066, 1067, 1069, + 1070, 1073, 1071, 1072, 1074, 1075, 1078, 1076, + 1077, 1079, 1080, 1083, 1081, 1082, 1084, 1085, + 1086, 1087, 1090, 1124, 1091, 1094, 1123, 1092, + 1122, 1093, 1095, 1121, 1096, 1099, 1120, 1097, + 1119, 1098, 1100, 1118, 1101, 1104, 1117, 1102, + 1116, 1103, 1105, 1115, 1106, 1109, 1114, 1107, + 1113, 1108, 1110, 1111, 1112, 983, 1128, 1126, + 1127, 1129, 1131, 982, 1128, 978, 1136, 1134, + 1135, 1137, 1139, 1151, 1140, 1141, 1149, 1142, + 1143, 1147, 1144, 1145, 977, 1146, 1148, 1150, + 1152, 1154, 1155, 1156, 1157, 1158, 1273, 1159, + 1162, 1160, 1161, 1163, 1237, 1164, 1167, 1165, + 1166, 1168, 1169, 1172, 1170, 1171, 1173, 1174, + 1177, 1175, 1176, 1178, 1179, 1182, 1180, 1181, + 1183, 1211, 1184, 1187, 1185, 1186, 1188, 1236, + 1189, 1201, 1204, 1210, 1190, 1191, 1199, 1192, + 1193, 1197, 1194, 1195, 977, 1196, 1198, 1200, + 1202, 1209, 1203, 1205, 1206, 977, 1207, 1208, + 1212, 1213, 1216, 1214, 1215, 1217, 1218, 1221, + 1219, 1220, 1222, 1223, 1226, 1224, 1225, 1227, + 1228, 1231, 1229, 1230, 1232, 1233, 1234, 1235, + 1238, 1272, 1239, 1242, 1271, 1240, 1270, 1241, + 1243, 1269, 1244, 1247, 1268, 1245, 1267, 1246, + 1248, 1266, 1249, 1252, 1265, 1250, 1264, 1251, + 1253, 1263, 1254, 1257, 1262, 1255, 1261, 1256, + 1258, 1259, 1260, 1276, 1277, 1279, 1278, 1283, + 1285, 1289, 1447, 1448, 1449, 1451, 1453, 1456, + 1458, 1459, 1290, 1291, 1292, 1293, 1311, 1294, + 1326, 1293, 1294, 1295, 1296, 1297, 1301, 1304, + 1298, 1299, 1300, 22, 1281, 1282, 1284, 1302, + 1303, 1306, 1310, 1305, 1280, 1286, 1307, 1308, + 1309, 1312, 1324, 1313, 1314, 1322, 1315, 1316, + 1320, 1317, 1318, 1304, 1319, 1321, 1323, 1325, + 1327, 1328, 1329, 1330, 1331, 1446, 1332, 1335, + 1333, 1334, 1336, 1410, 1337, 1340, 1338, 1339, + 1341, 1342, 1345, 1343, 1344, 1346, 1347, 1350, + 1348, 1349, 1351, 1352, 1355, 1353, 1354, 1356, + 1384, 1357, 1360, 1358, 1359, 1361, 1409, 1362, + 1374, 1377, 1383, 1363, 1364, 1372, 1365, 1366, + 1370, 1367, 1368, 1304, 1369, 1371, 1373, 1375, + 1382, 1376, 1378, 1379, 1304, 1380, 1381, 1385, + 1386, 1389, 1387, 1388, 1390, 1391, 1394, 1392, + 1393, 1395, 1396, 1399, 1397, 1398, 1400, 1401, + 1404, 1402, 1403, 1405, 1406, 1407, 1408, 1411, + 1445, 1412, 1415, 1444, 1413, 1443, 1414, 1416, + 1442, 1417, 1420, 1441, 1418, 1440, 1419, 1421, + 1439, 1422, 1425, 1438, 1423, 1437, 1424, 1426, + 1436, 1427, 1430, 1435, 1428, 1434, 1429, 1431, + 1432, 1433, 1289, 1450, 1448, 1449, 1451, 1453, + 1455, 1452, 1454, 1457, 1288, 1450, 10, 1463, + 1461, 1462, 1464, 1466, 1465, 1469, 9, 1463, + 1473, 1638, 1474, 1653, 1473, 1474, 1475, 1476, + 1477, 1478, 1634, 1635, 1479, 1480, 1481, 1482, + 1486, 1483, 1626, 1627, 1630, 1632, 1633, 1484, + 1485, 1487, 1490, 1488, 1505, 1487, 1488, 1489, + 1491, 1503, 1492, 1493, 1501, 1494, 1495, 1499, + 1496, 1497, 1299, 1498, 1500, 1502, 1504, 1506, + 1507, 1508, 1509, 1510, 1625, 1511, 1514, 1512, + 1513, 1515, 1589, 1516, 1519, 1517, 1518, 1520, + 1521, 1524, 1522, 1523, 1525, 1526, 1529, 1527, + 1528, 1530, 1531, 1534, 1532, 1533, 1535, 1563, + 1536, 1539, 1537, 1538, 1540, 1588, 1541, 1553, + 1556, 1562, 1542, 1543, 1551, 1544, 1545, 1549, + 1546, 1547, 1299, 1548, 1550, 1552, 1554, 1561, + 1555, 1557, 1558, 1299, 1559, 1560, 1564, 1565, + 1568, 1566, 1567, 1569, 1570, 1573, 1571, 1572, + 1574, 1575, 1578, 1576, 1577, 1579, 1580, 1583, + 1581, 1582, 1584, 1585, 1586, 1587, 1590, 1624, + 1591, 1594, 1623, 1592, 1622, 1593, 1595, 1621, + 1596, 1599, 1620, 1597, 1619, 1598, 1600, 1618, + 1601, 1604, 1617, 1602, 1616, 1603, 1605, 1615, + 1606, 1609, 1614, 1607, 1613, 1608, 1610, 1611, + 1612, 1483, 1628, 1626, 1627, 1629, 1631, 1482, + 1628, 1478, 1636, 1634, 1635, 1637, 1639, 1651, + 1640, 1641, 1649, 1642, 1643, 1647, 1644, 1645, + 1477, 1646, 1648, 1650, 1652, 1654, 1655, 1656, + 1657, 1658, 1773, 1659, 1662, 1660, 1661, 1663, + 1737, 1664, 1667, 1665, 1666, 1668, 1669, 1672, + 1670, 1671, 1673, 1674, 1677, 1675, 1676, 1678, + 1679, 1682, 1680, 1681, 1683, 1711, 1684, 1687, + 1685, 1686, 1688, 1736, 1689, 1701, 1704, 1710, + 1690, 1691, 1699, 1692, 1693, 1697, 1694, 1695, + 1477, 1696, 1698, 1700, 1702, 1709, 1703, 1705, + 1706, 1477, 1707, 1708, 1712, 1713, 1716, 1714, + 1715, 1717, 1718, 1721, 1719, 1720, 1722, 1723, + 1726, 1724, 1725, 1727, 1728, 1731, 1729, 1730, + 1732, 1733, 1734, 1735, 1738, 1772, 1739, 1742, + 1771, 1740, 1770, 1741, 1743, 1769, 1744, 1747, + 1768, 1745, 1767, 1746, 1748, 1766, 1749, 1752, + 1765, 1750, 1764, 1751, 1753, 1763, 1754, 1757, + 1762, 1755, 1761, 1756, 1758, 1759, 1760, 1776, + 1777, 1779, 1778, 97, 107, 1783, 109, 106, + 108 +}; + +static const char _smtp_received_parser_trans_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 3, 3, 3, + 3, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 7, 8, 8, 8, 8, 8, 8, + 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 10, 9, 0, 11, 0, + 12, 12, 12, 12, 12, 0, 13, 14, + 13, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 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, 15, 16, + 0, 0, 0, 0, 11, 0, 0, 11, + 17, 0, 18, 18, 18, 18, 18, 18, + 18, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 19, 20, 19, 19, 0, + 0, 0, 0, 21, 22, 22, 22, 22, + 22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 23, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 9, 10, 9, 0, 11, 0, + 12, 0, 13, 14, 13, 15, 16, 0, + 0, 0, 11, 17, 0, 0, 0, 0, + 28, 29, 29, 29, 29, 29, 19, 20, + 19, 19, 0, 0, 0, 0, 21, 30, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 27, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 9, 10, 9, 0, 11, 0, 12, + 0, 13, 14, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 16, 9, 10, + 9, 0, 11, 0, 12, 0, 13, 14, + 13, 0, 15, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, + 31, 31, 31, 31, 31, 31, 31, 32, + 32, 32, 32, 32, 32, 32, 0, 0, + 0, 33, 33, 33, 33, 33, 33, 33, + 0, 0, 0, 34, 34, 34, 34, 34, + 34, 34, 0, 0, 0, 35, 35, 35, + 35, 35, 35, 35, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 0, + 0, 5, 19, 20, 19, 19, 0, 0, + 0, 0, 0, 0, 21, 0, 21, 37, + 38, 38, 38, 38, 38, 0, 0, 0, + 0, 0, 0, 0, 0, 21, 0, 0, + 21, 37, 38, 38, 38, 38, 38, 38, + 0, 21, 0, 0, 0, 0, 21, 0, + 0, 0, 21, 0, 0, 0, 0, 21, + 0, 0, 0, 0, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 0, 0, 0, 0, + 0, 24, 24, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 25, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 0, 0, 0, 0, + 0, 27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 36, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 19, 20, 19, 19, + 0, 0, 0, 0, 21, 36, 36, 36, + 0, 0, 0, 4, 5, 36, 36, 36, + 36, 36, 36, 0, 0, 19, 20, 19, + 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 24, + 24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 0, + 0, 0, 0, 0, 0, 0, 0, 27, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 25, 0, 0, 0, 0, 0, + 0, 0, 25, 0, 0, 0, 0, 0, + 0, 0, 25, 0, 0, 0, 0, 0, + 0, 0, 25, 0, 0, 0, 0, 0, + 0, 0, 25, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 23, 0, 0, 0, + 0, 0, 0, 0, 0, 24, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 6, 7, 8, 0, + 0, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 0, 0, 5, 19, 20, 19, + 19, 0, 0, 0, 0, 0, 0, 21, + 0, 21, 37, 39, 39, 39, 39, 0, + 0, 0, 21, 37, 39, 39, 0, 0, + 21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 23, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 36, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 19, 20, 19, 19, 0, 0, 0, 0, + 21, 36, 36, 36, 0, 0, 0, 4, + 5, 36, 36, 36, 36, 36, 36, 0, + 0, 19, 20, 19, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 27, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 0, 0, 0, 0, + 0, 24, 24, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 25, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 0, 0, 0, 0, + 0, 27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, + 1, 2, 3, 0, 0, 0, 0, 0, + 0 +}; + +static const int smtp_received_parser_start = 1; +static const int smtp_received_parser_first_final = 1780; +static const int smtp_received_parser_error = 0; + +static const int smtp_received_parser_en_main = 1; + + +#line 204 "../rspamd/src/ragel/smtp_received_parser.rl" + +static int +rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t len, struct received_header *rh) +{ + struct rspamd_email_address for_addr, *addr; + const char *real_domain_start, *real_domain_end, + *real_ip_start, *real_ip_end, + *reported_domain_start, *reported_domain_end, + *reported_ip_start, *reported_ip_end, + *ip_start, *ip_end; + const char *p = data, *pe = data + len, *eof; + int cs; + + memset (rh, 0, sizeof (*rh)); + real_domain_start = NULL; + real_domain_end = NULL; + real_ip_start = NULL; + real_ip_end = NULL; + reported_domain_start = NULL; + reported_domain_end = NULL; + reported_ip_start = NULL; + reported_ip_end = NULL; + ip_start = NULL; + ip_end = NULL; + rh->type = RSPAMD_RECEIVED_UNKNOWN; + + memset (&for_addr, 0, sizeof (for_addr)); + addr = &for_addr; + eof = pe; + + +#line 6219 "../rspamd/src/libmime/parsers/smtp_received_parser.c" + { + cs = smtp_received_parser_start; + } + +#line 235 "../rspamd/src/ragel/smtp_received_parser.rl" + +#line 6226 "../rspamd/src/libmime/parsers/smtp_received_parser.c" + { + int _klen; + const char *_keys; + int _trans; + + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) + goto _out; +_resume: + _keys = _smtp_received_parser_trans_keys + _smtp_received_parser_key_offsets[cs]; + _trans = _smtp_received_parser_index_offsets[cs]; + + _klen = _smtp_received_parser_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + _klen - 1; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( (*p) < *_mid ) + _upper = _mid - 1; + else if ( (*p) > *_mid ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += _klen; + } + + _klen = _smtp_received_parser_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + (_klen<<1) - 2; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( (*p) < _mid[0] ) + _upper = _mid - 2; + else if ( (*p) > _mid[1] ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + goto _match; + } + } + _trans += _klen; + } + +_match: + _trans = _smtp_received_parser_indicies[_trans]; + cs = _smtp_received_parser_trans_targs[_trans]; + + if ( _smtp_received_parser_trans_actions[_trans] == 0 ) + goto _again; + + switch ( _smtp_received_parser_trans_actions[_trans] ) { + case 24: +#line 6 "../rspamd/src/ragel/smtp_received_parser.rl" + { + ip_start = p; + } + break; + case 25: +#line 12 "../rspamd/src/ragel/smtp_received_parser.rl" + { + ip_start = p; + } + break; + case 9: +#line 19 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->user = p; + } + break; + case 11: +#line 23 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->user) { + addr->user_len = p - addr->user; + } + } + break; + case 17: +#line 29 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->domain = p; + } + break; + case 19: +#line 39 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->domain = p; + addr->flags |= RSPAMD_EMAIL_ADDR_IP; + } + break; + case 21: +#line 44 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } + break; + case 13: +#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; + } + break; + case 12: +#line 54 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->flags |= RSPAMD_EMAIL_ADDR_QUOTED; + } + break; + case 16: +#line 73 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->addr = p; + } + break; + case 30: +#line 77 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->addr) { + addr->addr_len = p - addr->addr; + } + } + break; + case 4: +#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_start = p; + } + break; + case 36: +#line 86 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_end = p; + } + break; + case 5: +#line 96 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_start = p; + } + break; + case 37: +#line 99 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_end = p; + } + break; + case 38: +#line 135 "../rspamd/src/ragel/smtp_received_parser.rl" + { + /* Do nothing here for now */ + } + break; + case 39: +#line 139 "../rspamd/src/ragel/smtp_received_parser.rl" + { + guint len; + + if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { + len = real_domain_end - real_domain_start; + rh->real_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->real_hostname, real_domain_start, len + 1); + } + if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { + len = reported_domain_end - reported_domain_start; + rh->from_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->from_hostname, reported_domain_start, len + 1); + } + if (real_ip_end && real_ip_start && real_ip_end > real_ip_start) { + len = real_ip_end - real_ip_start; + rh->real_ip = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->real_ip, real_ip_start, len + 1); + } + if (reported_ip_end && reported_ip_start && reported_ip_end > reported_ip_start) { + len = reported_ip_end - reported_ip_start; + rh->from_ip = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->from_ip, reported_ip_start, len + 1); + } + + if (rh->real_ip && !rh->from_ip) { + rh->from_ip = rh->real_ip; + } + if (rh->real_hostname && !rh->from_hostname) { + rh->from_hostname = rh->real_hostname; + } + + if (rh->real_ip && ip_start && ip_end && ip_end > ip_start) { + if (rspamd_parse_inet_address (&rh->addr, ip_start, ip_end - ip_start)) { + rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t)rspamd_inet_address_destroy, rh->addr); + } + } + } + break; + case 35: +#line 181 "../rspamd/src/ragel/smtp_received_parser.rl" + { + rh->type = RSPAMD_RECEIVED_SMTP; + } + break; + case 32: +#line 184 "../rspamd/src/ragel/smtp_received_parser.rl" + { + rh->type = RSPAMD_RECEIVED_ESMTPS; + } + break; + case 31: +#line 187 "../rspamd/src/ragel/smtp_received_parser.rl" + { + rh->type = RSPAMD_RECEIVED_ESMTP; + } + break; + case 34: +#line 190 "../rspamd/src/ragel/smtp_received_parser.rl" + { + rh->type = RSPAMD_RECEIVED_LMTP; + } + break; + case 33: +#line 193 "../rspamd/src/ragel/smtp_received_parser.rl" + { + rh->type = RSPAMD_RECEIVED_IMAP; + } + break; + case 27: +#line 9 "../rspamd/src/ragel/smtp_received_parser.rl" + { + ip_end = p; + } +#line 44 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } + break; + case 23: +#line 15 "../rspamd/src/ragel/smtp_received_parser.rl" + { + ip_end = p; + } +#line 44 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } + break; + case 10: +#line 19 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->user = p; + } +#line 23 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->user) { + addr->user_len = p - addr->user; + } + } + break; + case 28: +#line 33 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } +#line 77 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->addr) { + addr->addr_len = p - addr->addr; + } + } + break; + case 20: +#line 39 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->domain = p; + addr->flags |= RSPAMD_EMAIL_ADDR_IP; + } +#line 12 "../rspamd/src/ragel/smtp_received_parser.rl" + { + ip_start = p; + } + break; + case 14: +#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; + } +#line 23 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->user) { + addr->user_len = p - addr->user; + } + } + break; + case 29: +#line 69 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->flags |= RSPAMD_EMAIL_ADDR_BRACED; + } +#line 177 "../rspamd/src/ragel/smtp_received_parser.rl" + { + + } + break; + case 15: +#line 73 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->addr = p; + } +#line 19 "../rspamd/src/ragel/smtp_received_parser.rl" + { + addr->user = p; + } + break; + case 22: +#line 77 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->addr) { + addr->addr_len = p - addr->addr; + } + } +#line 177 "../rspamd/src/ragel/smtp_received_parser.rl" + { + + } + break; + case 2: +#line 109 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_start = NULL; + real_domain_end = NULL; + real_ip_start = NULL; + real_ip_end = NULL; + reported_domain_start = NULL; + reported_domain_end = NULL; + reported_ip_start = NULL; + reported_ip_end = NULL; + ip_start = NULL; + ip_end = NULL; + } +#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_start = p; + } + break; + case 7: +#line 122 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_start = NULL; + real_domain_end = NULL; + real_ip_start = NULL; + real_ip_end = NULL; + reported_domain_start = NULL; + reported_domain_end = NULL; + reported_ip_start = NULL; + reported_ip_end = NULL; + ip_start = NULL; + ip_end = NULL; + } +#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_start = p; + } + break; + case 26: +#line 15 "../rspamd/src/ragel/smtp_received_parser.rl" + { + ip_end = p; + } +#line 9 "../rspamd/src/ragel/smtp_received_parser.rl" + { + ip_end = p; + } +#line 44 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } + break; + case 18: +#line 33 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->domain) { + addr->domain_len = p - addr->domain; + } + } +#line 77 "../rspamd/src/ragel/smtp_received_parser.rl" + { + if (addr->addr) { + addr->addr_len = p - addr->addr; + } + } +#line 177 "../rspamd/src/ragel/smtp_received_parser.rl" + { + + } + break; + case 8: +#line 86 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_end = p; + } +#line 92 "../rspamd/src/ragel/smtp_received_parser.rl" + { + reported_domain_end = p; + } +#line 135 "../rspamd/src/ragel/smtp_received_parser.rl" + { + /* Do nothing here for now */ + } + break; + case 3: +#line 86 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_end = p; + } +#line 92 "../rspamd/src/ragel/smtp_received_parser.rl" + { + reported_domain_end = p; + } +#line 139 "../rspamd/src/ragel/smtp_received_parser.rl" + { + guint len; + + if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { + len = real_domain_end - real_domain_start; + rh->real_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->real_hostname, real_domain_start, len + 1); + } + if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { + len = reported_domain_end - reported_domain_start; + rh->from_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->from_hostname, reported_domain_start, len + 1); + } + if (real_ip_end && real_ip_start && real_ip_end > real_ip_start) { + len = real_ip_end - real_ip_start; + rh->real_ip = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->real_ip, real_ip_start, len + 1); + } + if (reported_ip_end && reported_ip_start && reported_ip_end > reported_ip_start) { + len = reported_ip_end - reported_ip_start; + rh->from_ip = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->from_ip, reported_ip_start, len + 1); + } + + if (rh->real_ip && !rh->from_ip) { + rh->from_ip = rh->real_ip; + } + if (rh->real_hostname && !rh->from_hostname) { + rh->from_hostname = rh->real_hostname; + } + + if (rh->real_ip && ip_start && ip_end && ip_end > ip_start) { + if (rspamd_parse_inet_address (&rh->addr, ip_start, ip_end - ip_start)) { + rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t)rspamd_inet_address_destroy, rh->addr); + } + } + } + break; + case 1: +#line 109 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_start = NULL; + real_domain_end = NULL; + real_ip_start = NULL; + real_ip_end = NULL; + reported_domain_start = NULL; + reported_domain_end = NULL; + reported_ip_start = NULL; + reported_ip_end = NULL; + ip_start = NULL; + ip_end = NULL; + } +#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_start = p; + } +#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" + { + reported_domain_start = p; + } + break; + case 6: +#line 122 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_start = NULL; + real_domain_end = NULL; + real_ip_start = NULL; + real_ip_end = NULL; + reported_domain_start = NULL; + reported_domain_end = NULL; + reported_ip_start = NULL; + reported_ip_end = NULL; + ip_start = NULL; + ip_end = NULL; + } +#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" + { + real_domain_start = p; + } +#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" + { + reported_domain_start = p; + } + break; +#line 6751 "../rspamd/src/libmime/parsers/smtp_received_parser.c" + } + +_again: + if ( cs == 0 ) + goto _out; + if ( ++p != pe ) + goto _resume; + _test_eof: {} + _out: {} + } + +#line 236 "../rspamd/src/ragel/smtp_received_parser.rl" + + return cs; +} diff --git a/src/ragel/smtp_received_parser.rl b/src/ragel/smtp_received_parser.rl index 51cb90720..6cc054a4d 100644 --- a/src/ragel/smtp_received_parser.rl +++ b/src/ragel/smtp_received_parser.rl @@ -141,22 +141,22 @@ if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { len = real_domain_end - real_domain_start; - rh->real_hostname = rspamd_mempool_alloc (len + 1); + rh->real_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); rspamd_strlcpy (rh->real_hostname, real_domain_start, len + 1); } if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { len = reported_domain_end - reported_domain_start; - rh->from_hostname = rspamd_mempool_alloc (len + 1); + rh->from_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); rspamd_strlcpy (rh->from_hostname, reported_domain_start, len + 1); } if (real_ip_end && real_ip_start && real_ip_end > real_ip_start) { len = real_ip_end - real_ip_start; - rh->real_ip = rspamd_mempool_alloc (len + 1); + rh->real_ip = rspamd_mempool_alloc (task->task_pool, len + 1); rspamd_strlcpy (rh->real_ip, real_ip_start, len + 1); } if (reported_ip_end && reported_ip_start && reported_ip_end > reported_ip_start) { len = reported_ip_end - reported_ip_start; - rh->from_ip = rspamd_mempool_alloc (len + 1); + rh->from_ip = rspamd_mempool_alloc (task->task_pool, len + 1); rspamd_strlcpy (rh->from_ip, reported_ip_start, len + 1); } @@ -168,7 +168,7 @@ } if (rh->real_ip && ip_start && ip_end && ip_end > ip_start) { - if (rspamd_parse_inet_address (&rh->addr, ip_start, ip_end)) { + if (rspamd_parse_inet_address (&rh->addr, ip_start, ip_end - ip_start)) { rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t)rspamd_inet_address_destroy, rh->addr); } } @@ -206,11 +206,13 @@ static int rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t len, struct received_header *rh) { struct rspamd_email_address for_addr, *addr; - const gchar *real_domain_start, *real_domain_end, + const char *real_domain_start, *real_domain_end, *real_ip_start, *real_ip_end, *reported_domain_start, *reported_domain_end, *reported_ip_start, *reported_ip_end, *ip_start, *ip_end; + const char *p = data, *pe = data + len, *eof; + int cs; memset (rh, 0, sizeof (*rh)); real_domain_start = NULL; @@ -227,9 +229,10 @@ rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t l memset (&for_addr, 0, sizeof (for_addr)); addr = &for_addr; + eof = pe; %% write init; %% write exec; return cs; -} \ No newline at end of file +} -- cgit v1.2.3 From fd70a499d4364d622ab47092703f3bfaa72a149f Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 18:07:27 +0100 Subject: [Feature] Use new received parser instead of old one --- src/libmime/message.c | 354 +---------------------------- src/libmime/parsers/smtp_received_parser.c | 200 +++++++++------- src/lua/lua_task.c | 32 ++- src/ragel/smtp_ip.rl | 2 +- src/ragel/smtp_received_parser.rl | 56 ++++- 5 files changed, 206 insertions(+), 438 deletions(-) diff --git a/src/libmime/message.c b/src/libmime/message.c index e8f5cd96b..6206c9e7f 100644 --- a/src/libmime/message.c +++ b/src/libmime/message.c @@ -51,338 +51,6 @@ rspamd_message_quark (void) return g_quark_from_static_string ("mime-error"); } -static void -parse_qmail_recv (rspamd_mempool_t * pool, - gchar *line, - struct received_header *r) -{ - gchar *s, *p, t; - - /* We are interested only with received from network headers */ - if ((p = strstr (line, "from network")) == NULL) { - r->is_error = 2; - return; - } - - p += sizeof ("from network") - 1; - while (g_ascii_isspace (*p) || *p == '[') { - p++; - } - /* format is ip/host */ - s = p; - if (*p) { - while (g_ascii_isdigit (*++p) || *p == '.') ; - if (*p != '/') { - r->is_error = 1; - return; - } - else { - *p = '\0'; - r->real_ip = rspamd_mempool_strdup (pool, s); - *p = '/'; - /* Now try to parse hostname */ - s = ++p; - while (g_ascii_isalnum (*p) || *p == '.' || *p == '-' || *p == - '_') { - p++; - } - t = *p; - *p = '\0'; - r->real_hostname = rspamd_mempool_strdup (pool, s); - *p = t; - } - } -} - -static void -parse_recv_header (rspamd_mempool_t * pool, - struct raw_header *rh, - struct received_header *r) -{ - gchar *p, *s, t, **res = NULL; - gchar *line; - enum { - RSPAMD_RECV_STATE_INIT = 0, - RSPAMD_RECV_STATE_FROM, - RSPAMD_RECV_STATE_IP_BLOCK, - RSPAMD_RECV_STATE_BRACES_BLOCK, - RSPAMD_RECV_STATE_BY_BLOCK, - RSPAMD_RECV_STATE_PARSE_IP, - RSPAMD_RECV_STATE_PARSE_IP6, - RSPAMD_RECV_STATE_SKIP_SPACES, - RSPAMD_RECV_STATE_ERROR - } state = RSPAMD_RECV_STATE_INIT, next_state = RSPAMD_RECV_STATE_INIT; - gboolean is_exim = FALSE; - - line = rh->decoded; - if (line == NULL) { - return; - } - - g_strstrip (line); - p = line; - s = line; - - while (*p) { - switch (state) { - /* Initial state, search for from */ - case RSPAMD_RECV_STATE_INIT: - if (*p == 'f' || *p == 'F') { - if (g_ascii_tolower (*++p) == 'r' && g_ascii_tolower (*++p) == - 'o' && g_ascii_tolower (*++p) == 'm') { - p++; - state = RSPAMD_RECV_STATE_SKIP_SPACES; - next_state = RSPAMD_RECV_STATE_FROM; - } - } - else if (g_ascii_tolower (*p) == 'b' && - g_ascii_tolower (*(p + 1)) == 'y') { - state = RSPAMD_RECV_STATE_IP_BLOCK; - } - else { - /* This can be qmail header, parse it separately */ - parse_qmail_recv (pool, line, r); - return; - } - break; - /* Read hostname */ - case RSPAMD_RECV_STATE_FROM: - if (*p == '[') { - /* This should be IP address */ - res = &r->from_ip; - state = RSPAMD_RECV_STATE_PARSE_IP; - next_state = RSPAMD_RECV_STATE_IP_BLOCK; - s = ++p; - } - else if (g_ascii_isalnum (*p) || *p == '.' || *p == '-' || *p == - '_') { - p++; - } - else { - t = *p; - *p = '\0'; - r->from_hostname = rspamd_mempool_strdup (pool, s); - *p = t; - state = RSPAMD_RECV_STATE_SKIP_SPACES; - next_state = RSPAMD_RECV_STATE_IP_BLOCK; - } - break; - /* Try to extract additional info */ - case RSPAMD_RECV_STATE_IP_BLOCK: - /* Try to extract ip or () info or by */ - if (g_ascii_tolower (*p) == 'b' && g_ascii_tolower (*(p + 1)) == - 'y') { - p += 2; - /* Skip spaces after by */ - state = RSPAMD_RECV_STATE_SKIP_SPACES; - next_state = RSPAMD_RECV_STATE_BY_BLOCK; - } - else if (*p == '(') { - state = RSPAMD_RECV_STATE_SKIP_SPACES; - next_state = RSPAMD_RECV_STATE_BRACES_BLOCK; - p++; - } - else if (*p == '[') { - /* Got ip before '(' so extract it */ - s = ++p; - res = &r->from_ip; - state = RSPAMD_RECV_STATE_PARSE_IP; - next_state = RSPAMD_RECV_STATE_IP_BLOCK; - } - else { - p++; - } - break; - /* We are in () block. Here can be found real hostname and real ip, this is written by some MTA */ - case RSPAMD_RECV_STATE_BRACES_BLOCK: - /* End of block */ - if (g_ascii_isalnum (*p) || *p == '.' || *p == '-' || - *p == '_' || *p == ':') { - p++; - } - else if (*p == '[') { - s = ++p; - state = RSPAMD_RECV_STATE_PARSE_IP; - res = &r->real_ip; - next_state = RSPAMD_RECV_STATE_BRACES_BLOCK; - } - else { - if (p > s) { - /* Got some real hostname */ - /* check whether it is helo or p is not space symbol */ - if (!g_ascii_isspace (*p) || *(p + 1) != '[') { - /* Exim style ([ip]:port helo=hostname) */ - if (*s == ':' && (g_ascii_isspace (*p) || *p == ')')) { - /* Ip ending */ - is_exim = TRUE; - state = RSPAMD_RECV_STATE_SKIP_SPACES; - next_state = RSPAMD_RECV_STATE_BRACES_BLOCK; - } - else if (p - s == 4 && memcmp (s, "helo=", 5) == 0) { - p++; - is_exim = TRUE; - if (r->real_hostname == NULL && r->from_hostname != - NULL) { - r->real_hostname = r->from_hostname; - } - s = p; - while (*p != ')' && !g_ascii_isspace (*p) && *p != - '\0') { - p++; - } - if (p > s) { - r->from_hostname = rspamd_mempool_alloc (pool, - p - s + 1); - rspamd_strlcpy (r->from_hostname, s, p - s + 1); - } - } - else if (p - s == 4 && memcmp (s, "port=", 5) == 0) { - p++; - is_exim = TRUE; - while (g_ascii_isdigit (*p)) { - p++; - } - state = RSPAMD_RECV_STATE_SKIP_SPACES; - next_state = RSPAMD_RECV_STATE_BRACES_BLOCK; - } - else if (*p == '=' && is_exim) { - /* Just skip unknown pairs */ - p++; - while (!g_ascii_isspace (*p) && *p != ')' && *p != - '\0') { - p++; - } - state = RSPAMD_RECV_STATE_SKIP_SPACES; - next_state = RSPAMD_RECV_STATE_BRACES_BLOCK; - } - else { - /* skip all */ - while (*p++ != ')' && *p != '\0') ; - state = RSPAMD_RECV_STATE_IP_BLOCK; - } - } - else { - /* Postfix style (hostname [ip]) */ - t = *p; - *p = '\0'; - r->real_hostname = rspamd_mempool_strdup (pool, s); - *p = t; - /* Now parse ip */ - p += 2; - s = p; - res = &r->real_ip; - state = RSPAMD_RECV_STATE_PARSE_IP; - next_state = RSPAMD_RECV_STATE_BRACES_BLOCK; - continue; - } - if (*p == ')') { - p++; - state = RSPAMD_RECV_STATE_SKIP_SPACES; - next_state = RSPAMD_RECV_STATE_IP_BLOCK; - } - } - else if (*p == ')') { - p++; - state = RSPAMD_RECV_STATE_SKIP_SPACES; - next_state = RSPAMD_RECV_STATE_IP_BLOCK; - } - else { - r->is_error = 1; - return; - } - } - break; - /* Got by word */ - case RSPAMD_RECV_STATE_BY_BLOCK: - /* Here can be only hostname */ - if ((g_ascii_isalnum (*p) || *p == '.' || *p == '-' - || *p == '_') && p[1] != '\0') { - p++; - } - else { - /* We got something like hostname */ - if (p[1] != '\0') { - t = *p; - *p = '\0'; - r->by_hostname = rspamd_mempool_strdup (pool, s); - *p = t; - } - else { - r->by_hostname = rspamd_mempool_strdup (pool, s); - } - /* Now end of parsing */ - if (is_exim) { - /* Adjust for exim received */ - if (r->real_ip == NULL && r->from_ip != NULL) { - r->real_ip = r->from_ip; - } - else if (r->from_ip == NULL && r->real_ip != NULL) { - r->from_ip = r->real_ip; - if (r->real_hostname == NULL && r->from_hostname != - NULL) { - r->real_hostname = r->from_hostname; - } - } - } - return; - } - break; - - /* Extract ip */ - case RSPAMD_RECV_STATE_PARSE_IP: - if (*p == 'I') { - /* IPv6: */ - state = RSPAMD_RECV_STATE_PARSE_IP6; - } - else { - while (g_ascii_isxdigit (*p) || *p == '.' || *p == ':') { - p++; - } - if (*p != ']') { - /* Not an ip in fact */ - state = RSPAMD_RECV_STATE_SKIP_SPACES; - p++; - } - else { - *p = '\0'; - *res = rspamd_mempool_strdup (pool, s); - *p = ']'; - p++; - state = RSPAMD_RECV_STATE_SKIP_SPACES; - } - } - break; - case RSPAMD_RECV_STATE_PARSE_IP6: - if (g_ascii_strncasecmp (p, "IPv6:", sizeof ("IPv6") - 1) == 0) { - p += sizeof ("IPv6") - 1; - s = p; - state = RSPAMD_RECV_STATE_PARSE_IP; - } - else { - state = RSPAMD_RECV_STATE_SKIP_SPACES; - } - break; - /* Skip spaces */ - case RSPAMD_RECV_STATE_SKIP_SPACES: - if (!g_ascii_isspace (*p)) { - state = next_state; - s = p; - } - else { - p++; - } - break; - default: - r->is_error = 1; - return; - break; - } - } - - r->is_error = 1; - return; -} - static void append_raw_header (struct rspamd_task *task, GHashTable *target, struct raw_header *rh) @@ -1779,15 +1447,13 @@ rspamd_message_parse (struct rspamd_task *task) rspamd_images_process (task); /* Parse received headers */ - first = - rspamd_message_get_header (task, "Received", FALSE); + first = rspamd_message_get_header (task, "Received", FALSE); for (cur = first, i = 0; cur != NULL; cur = g_list_next (cur), i ++) { - recv = - rspamd_mempool_alloc0 (task->task_pool, - sizeof (struct received_header)); - parse_recv_header (task->task_pool, cur->data, recv); - + recv = rspamd_mempool_alloc0 (task->task_pool, + sizeof (struct received_header)); + rh = cur->data; + rspamd_smtp_recieved_parse (task, rh->decoded, strlen (rh->decoded), recv); /* * For the first header we must ensure that * received is consistent with the IP that we obtain through @@ -1795,22 +1461,19 @@ rspamd_message_parse (struct rspamd_task *task) */ if (i == 0) { gboolean need_recv_correction = FALSE; + rspamd_inet_addr_t *raddr = recv->addr; if (recv->real_ip == NULL || (task->cfg && task->cfg->ignore_received)) { need_recv_correction = TRUE; } else if (!(task->flags & RSPAMD_TASK_FLAG_NO_IP) && task->from_addr) { - rspamd_inet_addr_t *raddr = NULL; - - if (!rspamd_parse_inet_address (&raddr, recv->real_ip, 0)) { + if (raddr) { need_recv_correction = TRUE; } else { if (rspamd_inet_address_compare (raddr, task->from_addr) != 0) { need_recv_correction = TRUE; } - - rspamd_inet_address_destroy (raddr); } } @@ -1825,11 +1488,14 @@ rspamd_message_parse (struct rspamd_task *task) trecv->real_ip = rspamd_mempool_strdup (task->task_pool, rspamd_inet_address_to_string (task->from_addr)); trecv->from_ip = trecv->real_ip; + trecv->addr = task->from_addr; if (task->hostname) { trecv->real_hostname = task->hostname; trecv->from_hostname = trecv->real_hostname; } + + g_ptr_array_add (task->received, trecv); } } diff --git a/src/libmime/parsers/smtp_received_parser.c b/src/libmime/parsers/smtp_received_parser.c index ffdfde8b4..c945208fb 100644 --- a/src/libmime/parsers/smtp_received_parser.c +++ b/src/libmime/parsers/smtp_received_parser.c @@ -1,7 +1,7 @@ #line 1 "../rspamd/src/ragel/smtp_received_parser.rl" -#line 201 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 237 "../rspamd/src/ragel/smtp_received_parser.rl" @@ -6183,7 +6183,7 @@ static const int smtp_received_parser_error = 0; static const int smtp_received_parser_en_main = 1; -#line 204 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 240 "../rspamd/src/ragel/smtp_received_parser.rl" static int rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t len, struct received_header *rh) @@ -6195,7 +6195,7 @@ rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t l *reported_ip_start, *reported_ip_end, *ip_start, *ip_end; const char *p = data, *pe = data + len, *eof; - int cs; + int cs, in_v6 = 0; memset (rh, 0, sizeof (*rh)); real_domain_start = NULL; @@ -6220,7 +6220,7 @@ rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t l cs = smtp_received_parser_start; } -#line 235 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 271 "../rspamd/src/ragel/smtp_received_parser.rl" #line 6226 "../rspamd/src/libmime/parsers/smtp_received_parser.c" { @@ -6292,23 +6292,26 @@ _match: case 24: #line 6 "../rspamd/src/ragel/smtp_received_parser.rl" { + in_v6 = 1; ip_start = p; } break; case 25: -#line 12 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 14 "../rspamd/src/ragel/smtp_received_parser.rl" { - ip_start = p; + if (!in_v6) { + ip_start = p; + } } break; case 9: -#line 19 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 25 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->user = p; } break; case 11: -#line 23 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 29 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->user) { addr->user_len = p - addr->user; @@ -6316,20 +6319,20 @@ _match: } break; case 17: -#line 29 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 35 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->domain = p; } break; case 19: -#line 39 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 45 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->domain = p; addr->flags |= RSPAMD_EMAIL_ADDR_IP; } break; case 21: -#line 44 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->domain) { addr->domain_len = p - addr->domain; @@ -6337,25 +6340,25 @@ _match: } break; case 13: -#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 56 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; } break; case 12: -#line 54 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 60 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_QUOTED; } break; case 16: -#line 73 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 79 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->addr = p; } break; case 30: -#line 77 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->addr) { addr->addr_len = p - addr->addr; @@ -6363,37 +6366,57 @@ _match: } break; case 4: -#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_start = p; } break; case 36: -#line 86 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 92 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_end = p; } break; case 5: -#line 96 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 102 "../rspamd/src/ragel/smtp_received_parser.rl" { - real_domain_start = p; + real_ip_start = p; } break; case 37: -#line 99 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 105 "../rspamd/src/ragel/smtp_received_parser.rl" { - real_domain_end = p; + if (ip_start && ip_end && ip_end > ip_start) { + real_ip_start = ip_start; + real_ip_end = ip_end; + } + else { + real_ip_end = p; + } + + ip_start = NULL; + ip_end = NULL; } break; case 38: -#line 135 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 160 "../rspamd/src/ragel/smtp_received_parser.rl" { - /* Do nothing here for now */ + guint len; + + if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { + len = real_domain_end - real_domain_start; + rh->by_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->by_hostname, real_domain_start, len + 1); + } + else if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { + len = reported_domain_end - reported_domain_start; + rh->by_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->by_hostname, reported_domain_start, len + 1); + } } break; case 39: -#line 139 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 175 "../rspamd/src/ragel/smtp_received_parser.rl" { guint len; @@ -6425,49 +6448,50 @@ _match: rh->from_hostname = rh->real_hostname; } - if (rh->real_ip && ip_start && ip_end && ip_end > ip_start) { - if (rspamd_parse_inet_address (&rh->addr, ip_start, ip_end - ip_start)) { + if (rh->real_ip) { + if (rspamd_parse_inet_address (&rh->addr, rh->real_ip, strlen (rh->real_ip))) { rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t)rspamd_inet_address_destroy, rh->addr); } } } break; case 35: -#line 181 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 217 "../rspamd/src/ragel/smtp_received_parser.rl" { rh->type = RSPAMD_RECEIVED_SMTP; } break; case 32: -#line 184 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 220 "../rspamd/src/ragel/smtp_received_parser.rl" { rh->type = RSPAMD_RECEIVED_ESMTPS; } break; case 31: -#line 187 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 223 "../rspamd/src/ragel/smtp_received_parser.rl" { rh->type = RSPAMD_RECEIVED_ESMTP; } break; case 34: -#line 190 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 226 "../rspamd/src/ragel/smtp_received_parser.rl" { rh->type = RSPAMD_RECEIVED_LMTP; } break; case 33: -#line 193 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 229 "../rspamd/src/ragel/smtp_received_parser.rl" { rh->type = RSPAMD_RECEIVED_IMAP; } break; case 27: -#line 9 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 10 "../rspamd/src/ragel/smtp_received_parser.rl" { + in_v6 = 0; ip_end = p; } -#line 44 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->domain) { addr->domain_len = p - addr->domain; @@ -6475,11 +6499,13 @@ _match: } break; case 23: -#line 15 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 19 "../rspamd/src/ragel/smtp_received_parser.rl" { - ip_end = p; + if (!in_v6) { + ip_end = p; + } } -#line 44 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->domain) { addr->domain_len = p - addr->domain; @@ -6487,11 +6513,11 @@ _match: } break; case 10: -#line 19 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 25 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->user = p; } -#line 23 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 29 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->user) { addr->user_len = p - addr->user; @@ -6499,13 +6525,13 @@ _match: } break; case 28: -#line 33 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 39 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->domain) { addr->domain_len = p - addr->domain; } } -#line 77 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->addr) { addr->addr_len = p - addr->addr; @@ -6513,22 +6539,24 @@ _match: } break; case 20: -#line 39 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 45 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->domain = p; addr->flags |= RSPAMD_EMAIL_ADDR_IP; } -#line 12 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 14 "../rspamd/src/ragel/smtp_received_parser.rl" { - ip_start = p; + if (!in_v6) { + ip_start = p; + } } break; case 14: -#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 56 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; } -#line 23 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 29 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->user) { addr->user_len = p - addr->user; @@ -6536,39 +6564,39 @@ _match: } break; case 29: -#line 69 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 75 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->flags |= RSPAMD_EMAIL_ADDR_BRACED; } -#line 177 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 213 "../rspamd/src/ragel/smtp_received_parser.rl" { } break; case 15: -#line 73 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 79 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->addr = p; } -#line 19 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 25 "../rspamd/src/ragel/smtp_received_parser.rl" { addr->user = p; } break; case 22: -#line 77 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->addr) { addr->addr_len = p - addr->addr; } } -#line 177 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 213 "../rspamd/src/ragel/smtp_received_parser.rl" { } break; case 2: -#line 109 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 134 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_start = NULL; real_domain_end = NULL; @@ -6581,13 +6609,13 @@ _match: ip_start = NULL; ip_end = NULL; } -#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_start = p; } break; case 7: -#line 122 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 147 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_start = NULL; real_domain_end = NULL; @@ -6600,21 +6628,24 @@ _match: ip_start = NULL; ip_end = NULL; } -#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_start = p; } break; case 26: -#line 15 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 19 "../rspamd/src/ragel/smtp_received_parser.rl" { - ip_end = p; + if (!in_v6) { + ip_end = p; + } } -#line 9 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 10 "../rspamd/src/ragel/smtp_received_parser.rl" { + in_v6 = 0; ip_end = p; } -#line 44 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->domain) { addr->domain_len = p - addr->domain; @@ -6622,47 +6653,58 @@ _match: } break; case 18: -#line 33 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 39 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->domain) { addr->domain_len = p - addr->domain; } } -#line 77 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" { if (addr->addr) { addr->addr_len = p - addr->addr; } } -#line 177 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 213 "../rspamd/src/ragel/smtp_received_parser.rl" { } break; case 8: -#line 86 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 92 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_end = p; } -#line 92 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 98 "../rspamd/src/ragel/smtp_received_parser.rl" { reported_domain_end = p; } -#line 135 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 160 "../rspamd/src/ragel/smtp_received_parser.rl" { - /* Do nothing here for now */ + guint len; + + if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { + len = real_domain_end - real_domain_start; + rh->by_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->by_hostname, real_domain_start, len + 1); + } + else if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { + len = reported_domain_end - reported_domain_start; + rh->by_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->by_hostname, reported_domain_start, len + 1); + } } break; case 3: -#line 86 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 92 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_end = p; } -#line 92 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 98 "../rspamd/src/ragel/smtp_received_parser.rl" { reported_domain_end = p; } -#line 139 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 175 "../rspamd/src/ragel/smtp_received_parser.rl" { guint len; @@ -6694,15 +6736,15 @@ _match: rh->from_hostname = rh->real_hostname; } - if (rh->real_ip && ip_start && ip_end && ip_end > ip_start) { - if (rspamd_parse_inet_address (&rh->addr, ip_start, ip_end - ip_start)) { + if (rh->real_ip) { + if (rspamd_parse_inet_address (&rh->addr, rh->real_ip, strlen (rh->real_ip))) { rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t)rspamd_inet_address_destroy, rh->addr); } } } break; case 1: -#line 109 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 134 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_start = NULL; real_domain_end = NULL; @@ -6715,17 +6757,17 @@ _match: ip_start = NULL; ip_end = NULL; } -#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_start = p; } -#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 95 "../rspamd/src/ragel/smtp_received_parser.rl" { reported_domain_start = p; } break; case 6: -#line 122 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 147 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_start = NULL; real_domain_end = NULL; @@ -6738,16 +6780,16 @@ _match: ip_start = NULL; ip_end = NULL; } -#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" { real_domain_start = p; } -#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 95 "../rspamd/src/ragel/smtp_received_parser.rl" { reported_domain_start = p; } break; -#line 6751 "../rspamd/src/libmime/parsers/smtp_received_parser.c" +#line 6793 "../rspamd/src/libmime/parsers/smtp_received_parser.c" } _again: @@ -6759,7 +6801,7 @@ _again: _out: {} } -#line 236 "../rspamd/src/ragel/smtp_received_parser.rl" +#line 272 "../rspamd/src/ragel/smtp_received_parser.rl" return cs; } diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index 7a756679b..cbcaf2ed5 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -1427,6 +1427,7 @@ lua_task_get_received_headers (lua_State * L) { struct rspamd_task *task = lua_check_task (L, 1); struct received_header *rh; + const gchar *proto; guint i, k = 1; if (task) { @@ -1445,12 +1446,35 @@ lua_task_get_received_headers (lua_State * L) lua_newtable (L); rspamd_lua_table_set (L, "from_hostname", rh->from_hostname); - lua_pushstring (L, "from_ip"); - rspamd_lua_ip_push_fromstring (L, rh->from_ip); - lua_settable (L, -3); + rspamd_lua_table_set (L, "from_ip", rh->from_ip); rspamd_lua_table_set (L, "real_hostname", rh->real_hostname); lua_pushstring (L, "real_ip"); - rspamd_lua_ip_push_fromstring (L, rh->real_ip); + rspamd_lua_ip_push (L, rh->addr); + lua_settable (L, -3); + lua_pushstring (L, "proto"); + + switch (rh->type) { + case RSPAMD_RECEIVED_SMTP: + proto = "smtp"; + break; + case RSPAMD_RECEIVED_ESMTP: + proto = "esmtp"; + break; + case RSPAMD_RECEIVED_ESMTPS: + proto = "esmtps"; + break; + case RSPAMD_RECEIVED_LMTP: + proto = "lmtp"; + break; + case RSPAMD_RECEIVED_IMAP: + proto = "imap"; + break; + case RSPAMD_RECEIVED_UNKNOWN: + default: + proto = "unknown"; + break; + } + lua_pushstring (L, proto); lua_settable (L, -3); rspamd_lua_table_set (L, "by_hostname", rh->by_hostname); lua_rawseti (L, -2, k ++); diff --git a/src/ragel/smtp_ip.rl b/src/ragel/smtp_ip.rl index b060b750a..dae90a096 100644 --- a/src/ragel/smtp_ip.rl +++ b/src/ragel/smtp_ip.rl @@ -15,5 +15,5 @@ (IPv6_hex (":" IPv6_hex){0,3} ":")? IPv4_address_literal; IPv6_addr = IPv6_full | IPv6_comp | IPv6v4_full | IPv6v4_comp; - IPv6_address_literal = "IPv6:" (IPv6_addr >IP6_start %IP6_end); + IPv6_address_literal = "IPv6:" %IP6_start IPv6_addr %IP6_end; }%% \ No newline at end of file diff --git a/src/ragel/smtp_received_parser.rl b/src/ragel/smtp_received_parser.rl index 6cc054a4d..339326900 100644 --- a/src/ragel/smtp_received_parser.rl +++ b/src/ragel/smtp_received_parser.rl @@ -4,16 +4,22 @@ action IP6_start { + in_v6 = 1; ip_start = p; } action IP6_end { + in_v6 = 0; ip_end = p; } action IP4_start { - ip_start = p; + if (!in_v6) { + ip_start = p; + } } action IP4_end { - ip_end = p; + if (!in_v6) { + ip_end = p; + } } action User_start { @@ -94,16 +100,35 @@ } action Real_IP_Start { - real_domain_start = p; + real_ip_start = p; } action Real_IP_End { - real_domain_end = p; + if (ip_start && ip_end && ip_end > ip_start) { + real_ip_start = ip_start; + real_ip_end = ip_end; + } + else { + real_ip_end = p; + } + + ip_start = NULL; + ip_end = NULL; } action Reported_IP_Start { - reported_domain_start = p; + reported_ip_start = p; } action Reported_IP_End { - reported_domain_end = p; + + if (ip_start && ip_end && ip_end > ip_start) { + reported_ip_start = ip_start; + reported_ip_end = ip_end; + } + else { + reported_ip_end = p; + } + + ip_start = NULL; + ip_end = NULL; } action From_Start { @@ -133,7 +158,18 @@ } action By_End { - /* Do nothing here for now */ + guint len; + + if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { + len = real_domain_end - real_domain_start; + rh->by_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->by_hostname, real_domain_start, len + 1); + } + else if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { + len = reported_domain_end - reported_domain_start; + rh->by_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); + rspamd_strlcpy (rh->by_hostname, reported_domain_start, len + 1); + } } action From_End { @@ -167,8 +203,8 @@ rh->from_hostname = rh->real_hostname; } - if (rh->real_ip && ip_start && ip_end && ip_end > ip_start) { - if (rspamd_parse_inet_address (&rh->addr, ip_start, ip_end - ip_start)) { + if (rh->real_ip) { + if (rspamd_parse_inet_address (&rh->addr, rh->real_ip, strlen (rh->real_ip))) { rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t)rspamd_inet_address_destroy, rh->addr); } } @@ -212,7 +248,7 @@ rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t l *reported_ip_start, *reported_ip_end, *ip_start, *ip_end; const char *p = data, *pe = data + len, *eof; - int cs; + int cs, in_v6 = 0; memset (rh, 0, sizeof (*rh)); real_domain_start = NULL; -- cgit v1.2.3 From 8e86e00a861468ed8b12b1370a04f04548f24343 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 20:17:15 +0100 Subject: [Rework] Compile ragel sources when building rspamd --- CMakeLists.txt | 11 +++++- FindRagel.cmake | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 FindRagel.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 62711ca4f..ebef8a1ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,6 +65,11 @@ OPTION(ENABLE_JEMALLOC "Build rspamd with jemalloc allocator [default: OFF] INCLUDE(FindArch.cmake) TARGET_ARCHITECTURE(ARCH) +INCLUDE(FindRagel.cmake) +IF(NOT RAGEL_FOUND) + MESSAGE(FATAL_ERROR "Ragel is required to build rspamd") +ENDIF() + IF ("${ARCH}" STREQUAL "x86_64") IF (ENABLE_HYPERSCAN MATCHES "ON") ENABLE_LANGUAGE(CXX) @@ -724,10 +729,11 @@ CHECK_C_COMPILER_FLAG(-Wunused-variable SUPPORT_WUNUSED_VAR) CHECK_C_COMPILER_FLAG(-Wno-pointer-sign SUPPORT_WPOINTER_SIGN) CHECK_C_COMPILER_FLAG(-Wstrict-prototypes SUPPORT_WSTRICT_PROTOTYPES) CHECK_C_COMPILER_FLAG(-pedantic SUPPORT_PEDANTIC_FLAG) +CHECK_C_COMPILER_FLAG(-pedantic SUPPORT_PEDANTIC_FLAG) # GCC 6 specific CHECK_C_COMPILER_FLAG(-Wnull-dereference SUPPORT_WNULL_DEREFERENCE) CHECK_C_COMPILER_FLAG(-Wduplicated-cond SUPPORT_WDUPLICATED_COND) -CHECK_C_COMPILER_FLAG(-Wlogical-op SUPPORT_WLOGICAL_OP) +CHECK_C_COMPILER_FLAG(-Wno-unused-const-variable SUPPORT_WNO_UNUSED_CONST) IF(NOT "${CMAKE_C_COMPILER_ID}" MATCHES SunPro) CHECK_C_COMPILER_FLAG("-std=c11" SUPPORT_STD11_FLAG) CHECK_C_COMPILER_FLAG("-std=c99" SUPPORT_STD99_FLAG) @@ -768,6 +774,9 @@ ENDIF() IF(SUPPORT_WLOGICAL_OP) SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wlogical-op") ENDIF() +IF(SUPPORT_WNO_UNUSED_CONST) + SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wunused-const-variable") +ENDIF() IF(SUPPORT_STD11_FLAG) SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -std=c11") ELSE(SUPPORT_STD11_FLAG) diff --git a/FindRagel.cmake b/FindRagel.cmake new file mode 100644 index 000000000..7b4534a80 --- /dev/null +++ b/FindRagel.cmake @@ -0,0 +1,109 @@ +# - Find Ragel executable and provides macros to generate custom build rules +# The module defines the following variables: +# +# RAGEL_EXECUTABLE - path to the ragel program +# RAGEL_VERSION - version of ragel +# RAGEL_FOUND - true if the program was found +# +# If ragel is found, the module defines the macros: +# +# RAGEL_TARGET( +# [COMPILE_FLAGS ]) +# +# which will create a custom rule to generate a state machine. is +# the path to a Ragel file. is the name of the source file +# generated by ragel. If COMPILE_FLAGS option is specified, the next +# parameter is added in the ragel command line. +# +# The macro defines a set of variables: +# RAGEL_${Name}_DEFINED - true is the macro ran successfully +# RAGEL_${Name}_INPUT - The input source file, an alias for +# RAGEL_${Name}_OUTPUT_SOURCE - The source file generated by ragel +# RAGEL_${Name}_OUTPUT_HEADER - The header file generated by ragel +# RAGEL_${Name}_OUTPUTS - The sources files generated by ragel +# RAGEL_${Name}_COMPILE_FLAGS - Options used in the ragel command line +# +# ==================================================================== +# Example: +# +# find_package(RAGEL) # or e.g.: find_package(RAGEL 6.6 REQUIRED) +# RAGEL_TARGET(MyMachine machine.rl ${CMAKE_CURRENT_BINARY_DIR}/machine.cc) +# add_executable(Foo main.cc ${RAGEL_MyMachine_OUTPUTS}) +# ==================================================================== + +# 2014-02-09, Georg Sauthoff +# +# I don't think that these few lines are even copyrightable material, +# but I am fine with using the BSD/MIT/GPL license on it ... +# +# I've used following references: +# http://www.cmake.org/cmake/help/v2.8.12/cmake.html +# /usr/share/cmake/Modules/FindFLEX.cmake +# /usr/share/cmake/Modules/FindBISON.cmake + +# uses some features which are not available in 2.6 +cmake_minimum_required(VERSION 2.8) + +find_program(RAGEL_EXECUTABLE NAMES ragel DOC "path to the ragel executable") +mark_as_advanced(RAGEL_EXECUTABLE) + +if(RAGEL_EXECUTABLE) + + execute_process(COMMAND ${RAGEL_EXECUTABLE} --version + OUTPUT_VARIABLE RAGEL_version_output + ERROR_VARIABLE RAGEL_version_error + RESULT_VARIABLE RAGEL_version_result + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(${RAGEL_version_result} EQUAL 0) + string(REGEX REPLACE "^Ragel State Machine Compiler version ([^ ]+) .*$" + "\\1" + RAGEL_VERSION "${RAGEL_version_output}") + else() + message(SEND_ERROR + "Command \"${RAGEL_EXECUTABLE} --version\" failed with output: +${RAGEL_version_error}") + endif() + + #============================================================ + # RAGEL_TARGET (public macro) + #============================================================ + # + macro(RAGEL_TARGET Name Input Output) + set(RAGEL_TARGET_usage + "RAGEL_TARGET( [COMPILE_FLAGS ]") + if(${ARGC} GREATER 3) + if(${ARGC} EQUAL 5) + if("${ARGV3}" STREQUAL "COMPILE_FLAGS") + set(RAGEL_EXECUTABLE_opts "${ARGV4}") + separate_arguments(RAGEL_EXECUTABLE_opts) + else() + message(SEND_ERROR ${RAGEL_TARGET_usage}) + endif() + else() + message(SEND_ERROR ${RAGEL_TARGET_usage}) + endif() + endif() + + add_custom_command(OUTPUT ${Output} + COMMAND ${RAGEL_EXECUTABLE} + ARGS ${RAGEL_EXECUTABLE_opts} -o${Output} ${Input} + DEPENDS ${Input} + COMMENT + "[RAGEL][${Name}] Compiling state machine with Ragel ${RAGEL_VERSION}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + + set(RAGEL_${Name}_DEFINED TRUE) + set(RAGEL_${Name}_OUTPUTS ${Output}) + set(RAGEL_${Name}_INPUT ${Input}) + set(RAGEL_${Name}_COMPILE_FLAGS ${RAGEL_EXECUTABLE_opts}) + endmacro() + +endif() + +# use this include when module file is located under /usr/share/cmake/Modules +#include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +# use this include when module file is located in build tree +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(RAGEL REQUIRED_VARS RAGEL_EXECUTABLE + VERSION_VAR RAGEL_VERSION) \ No newline at end of file -- cgit v1.2.3 From ef7c969e2073b27e67084ee8885cf858ee9ddb58 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 20:18:15 +0100 Subject: [Rework] Use dynamically generated ragel C sources --- src/CMakeLists.txt | 13 +- src/libmime/email_addr.c | 3 +- src/libmime/message.c | 2 +- src/libmime/parsers/smtp_addr_parser.c | 7428 ---------------------------- src/libmime/parsers/smtp_received_parser.c | 6807 ------------------------- src/libmime/smtp_parsers.h | 29 + src/ragel/smtp_addr_parser.rl | 4 +- src/ragel/smtp_received_parser.rl | 4 +- 8 files changed, 47 insertions(+), 14243 deletions(-) delete mode 100644 src/libmime/parsers/smtp_addr_parser.c delete mode 100644 src/libmime/parsers/smtp_received_parser.c create mode 100644 src/libmime/smtp_parsers.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0c1e31dbe..c9f99a7a5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -101,18 +101,25 @@ ENDIF() AddModules(MODULES_LIST WORKERS_LIST) LIST(LENGTH PLUGINSSRC RSPAMD_MODULES_NUM) + +RAGEL_TARGET(ragel_smtp_addr + ragel/smtp_addr_parser.rl + ${CMAKE_CURRENT_BINARY_DIR}/smtp_addr_parser.rl.c) +RAGEL_TARGET(ragel_smtp_received + ragel/smtp_received_parser.rl + ${CMAKE_CURRENT_BINARY_DIR}/smtp_received_parser.rl.c) ######################### LINK SECTION ############################### ADD_LIBRARY(rspamd-server STATIC ${RSPAMD_CRYPTOBOX} ${RSPAMD_UTIL} ${RSPAMD_LUA} ${RSPAMD_SERVER} ${RSPAMD_STAT} ${RSPAMD_MIME} - ${CMAKE_CURRENT_BINARY_DIR}/modules.c ${PLUGINSSRC}) + ${CMAKE_CURRENT_BINARY_DIR}/modules.c ${PLUGINSSRC} + "${RAGEL_ragel_smtp_addr_OUTPUTS}" + "${RAGEL_ragel_smtp_received_OUTPUTS}") TARGET_LINK_LIBRARIES(rspamd-server rspamd-http-parser) TARGET_LINK_LIBRARIES(rspamd-server rspamd-cdb) TARGET_LINK_LIBRARIES(rspamd-server rspamd-lpeg) TARGET_LINK_LIBRARIES(rspamd-server lcbtrie) -ADD_DEPENDENCIES(rspamd-server rspamd_lua_preprocess) - IF (ENABLE_CLANG_PLUGIN MATCHES "ON") ADD_DEPENDENCIES(rspamd-server rspamd-clang) ENDIF() diff --git a/src/libmime/email_addr.c b/src/libmime/email_addr.c index 9305e4693..2c7964f87 100644 --- a/src/libmime/email_addr.c +++ b/src/libmime/email_addr.c @@ -18,8 +18,7 @@ #include "email_addr.h" #include "message.h" #include "printf.h" - -#include "./parsers/smtp_addr_parser.c" +#include "smtp_parsers.h" static void rspamd_email_addr_dtor (struct rspamd_email_address *addr) diff --git a/src/libmime/message.c b/src/libmime/message.c index 6206c9e7f..978ab566f 100644 --- a/src/libmime/message.c +++ b/src/libmime/message.c @@ -25,7 +25,7 @@ #include "utlist.h" #include "tokenizers/tokenizers.h" #include "cryptobox.h" -#include "./parsers/smtp_received_parser.c" +#include "smtp_parsers.h" #ifdef WITH_SNOWBALL #include "libstemmer.h" diff --git a/src/libmime/parsers/smtp_addr_parser.c b/src/libmime/parsers/smtp_addr_parser.c deleted file mode 100644 index 3a96e0f84..000000000 --- a/src/libmime/parsers/smtp_addr_parser.c +++ /dev/null @@ -1,7428 +0,0 @@ - -#line 1 "../rspamd/src/ragel/smtp_addr_parser.rl" - -#line 77 "../rspamd/src/ragel/smtp_addr_parser.rl" - - - -#line 9 "../rspamd/src/libmime/parsers/smtp_addr_parser.c" -static const char _smtp_addr_parser_eof_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 21, - 22, 23 -}; - -static const int smtp_addr_parser_start = 1; -static const int smtp_addr_parser_first_final = 317; -static const int smtp_addr_parser_error = 0; - -static const int smtp_addr_parser_en_main = 1; - - -#line 80 "../rspamd/src/ragel/smtp_addr_parser.rl" - -static int -rspamd_smtp_addr_parse (const char *data, size_t len, struct rspamd_email_address *addr) -{ - const char *p = data, *pe = data + len, *eof; - int cs; - - g_assert (addr != NULL); - memset (addr, 0, sizeof (*addr)); - addr->raw = data; - addr->raw_len = len; - eof = pe; - - -#line 76 "../rspamd/src/libmime/parsers/smtp_addr_parser.c" - { - cs = smtp_addr_parser_start; - } - -#line 94 "../rspamd/src/ragel/smtp_addr_parser.rl" - -#line 83 "../rspamd/src/libmime/parsers/smtp_addr_parser.c" - { - if ( p == pe ) - goto _test_eof; - if ( cs == 0 ) - goto _out; -_resume: - switch ( cs ) { -case 1: - switch( (*p) ) { - case 32: goto tr0; - case 34: goto tr3; - case 45: goto tr2; - case 60: goto tr4; - case 61: goto tr2; - case 64: goto tr5; - } - if ( (*p) < 42 ) { - if ( (*p) > 13 ) { - if ( 33 <= (*p) && (*p) <= 39 ) - goto tr2; - } else if ( (*p) >= 9 ) - goto tr0; - } else if ( (*p) > 43 ) { - if ( (*p) < 63 ) { - if ( 47 <= (*p) && (*p) <= 57 ) - goto tr2; - } else if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr2; - } else - goto tr2; - } else - goto tr2; - goto tr1; -case 0: - goto _out; -case 2: - switch( (*p) ) { - case 33: goto tr6; - case 46: goto tr7; - case 61: goto tr6; - case 64: goto tr8; - } - if ( (*p) < 45 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr6; - } else if ( (*p) >= 35 ) - goto tr6; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr6; - } else if ( (*p) >= 63 ) - goto tr6; - } else - goto tr6; - goto tr1; -case 3: - switch( (*p) ) { - case 33: goto tr6; - case 45: goto tr6; - case 61: goto tr6; - case 63: goto tr6; - } - if ( (*p) < 47 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr6; - } else if ( (*p) >= 35 ) - goto tr6; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr6; - } else if ( (*p) >= 65 ) - goto tr6; - } else - goto tr6; - goto tr1; -case 4: - if ( (*p) == 91 ) - goto tr10; - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr9; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr9; - } else - goto tr9; - goto tr1; -case 317: - switch( (*p) ) { - case 32: goto tr349; - case 45: goto tr11; - case 46: goto tr350; - case 95: goto tr11; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr349; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr12; - } else if ( (*p) >= 65 ) - goto tr12; - } else - goto tr12; - goto tr1; -case 318: - if ( (*p) == 32 ) - goto tr351; - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr351; - goto tr1; -case 5: - switch( (*p) ) { - case 45: goto tr11; - case 95: goto tr11; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr12; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr12; - } else - goto tr12; - goto tr1; -case 6: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr12; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr12; - } else - goto tr12; - goto tr1; -case 7: - switch( (*p) ) { - case 45: goto tr13; - case 73: goto tr16; - case 95: goto tr13; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr14; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr15; - } else - goto tr15; - goto tr1; -case 8: - switch( (*p) ) { - case 45: goto tr17; - case 95: goto tr17; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr18; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr18; - } else - goto tr18; - goto tr1; -case 9: - switch( (*p) ) { - case 45: goto tr17; - case 58: goto tr19; - case 95: goto tr17; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr18; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr18; - } else - goto tr18; - goto tr1; -case 10: - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 11: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 319: - if ( (*p) == 32 ) - goto tr352; - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr352; - goto tr1; -case 12: - switch( (*p) ) { - case 45: goto tr17; - case 46: goto tr22; - case 58: goto tr19; - case 95: goto tr17; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr23; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr18; - } else - goto tr18; - goto tr1; -case 13: - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr24; - goto tr1; -case 14: - if ( (*p) == 46 ) - goto tr25; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr26; - goto tr1; -case 15: - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr27; - goto tr1; -case 16: - if ( (*p) == 46 ) - goto tr28; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr29; - goto tr1; -case 17: - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr30; - goto tr1; -case 18: - if ( (*p) == 93 ) - goto tr32; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr31; - goto tr1; -case 19: - if ( (*p) == 93 ) - goto tr32; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr33; - goto tr1; -case 20: - if ( (*p) == 93 ) - goto tr32; - goto tr1; -case 21: - if ( (*p) == 46 ) - goto tr28; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr34; - goto tr1; -case 22: - if ( (*p) == 46 ) - goto tr28; - goto tr1; -case 23: - if ( (*p) == 46 ) - goto tr25; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr35; - goto tr1; -case 24: - if ( (*p) == 46 ) - goto tr25; - goto tr1; -case 25: - switch( (*p) ) { - case 45: goto tr17; - case 46: goto tr22; - case 58: goto tr19; - case 95: goto tr17; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr36; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr18; - } else - goto tr18; - goto tr1; -case 26: - switch( (*p) ) { - case 45: goto tr17; - case 46: goto tr22; - case 58: goto tr19; - case 95: goto tr17; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr18; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr18; - } else - goto tr18; - goto tr1; -case 27: - switch( (*p) ) { - case 45: goto tr17; - case 58: goto tr19; - case 80: goto tr37; - case 95: goto tr17; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr18; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr18; - } else - goto tr18; - goto tr1; -case 28: - switch( (*p) ) { - case 45: goto tr17; - case 58: goto tr19; - case 95: goto tr17; - case 118: goto tr38; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr18; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr18; - } else - goto tr18; - goto tr1; -case 29: - switch( (*p) ) { - case 45: goto tr17; - case 54: goto tr39; - case 58: goto tr19; - case 95: goto tr17; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr18; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr18; - } else - goto tr18; - goto tr1; -case 30: - switch( (*p) ) { - case 45: goto tr17; - case 58: goto tr40; - case 95: goto tr17; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr18; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr18; - } else - goto tr18; - goto tr1; -case 31: - if ( (*p) == 58 ) - goto tr42; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr41; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr41; - } else - goto tr20; - } else - goto tr41; - goto tr1; -case 32: - switch( (*p) ) { - case 58: goto tr44; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr43; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr43; - } else - goto tr20; - } else - goto tr43; - goto tr1; -case 33: - switch( (*p) ) { - case 58: goto tr44; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr45; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr45; - } else - goto tr20; - } else - goto tr45; - goto tr1; -case 34: - switch( (*p) ) { - case 58: goto tr44; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr46; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr46; - } else - goto tr20; - } else - goto tr46; - goto tr1; -case 35: - switch( (*p) ) { - case 58: goto tr44; - case 93: goto tr21; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 36: - switch( (*p) ) { - case 58: goto tr48; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr47; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr47; - } else - goto tr20; - } else - goto tr47; - goto tr1; -case 37: - switch( (*p) ) { - case 58: goto tr50; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr49; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr49; - } else - goto tr20; - } else - goto tr49; - goto tr1; -case 38: - switch( (*p) ) { - case 58: goto tr50; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr51; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr51; - } else - goto tr20; - } else - goto tr51; - goto tr1; -case 39: - switch( (*p) ) { - case 58: goto tr50; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr52; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr52; - } else - goto tr20; - } else - goto tr52; - goto tr1; -case 40: - switch( (*p) ) { - case 58: goto tr50; - case 93: goto tr21; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 41: - switch( (*p) ) { - case 58: goto tr48; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr53; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr53; - } else - goto tr20; - } else - goto tr53; - goto tr1; -case 42: - switch( (*p) ) { - case 58: goto tr55; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr54; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr54; - } else - goto tr20; - } else - goto tr54; - goto tr1; -case 43: - switch( (*p) ) { - case 58: goto tr55; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr56; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr56; - } else - goto tr20; - } else - goto tr56; - goto tr1; -case 44: - switch( (*p) ) { - case 58: goto tr55; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr57; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr57; - } else - goto tr20; - } else - goto tr57; - goto tr1; -case 45: - switch( (*p) ) { - case 58: goto tr55; - case 93: goto tr21; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 46: - switch( (*p) ) { - case 58: goto tr48; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr58; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr58; - } else - goto tr20; - } else - goto tr58; - goto tr1; -case 47: - switch( (*p) ) { - case 58: goto tr60; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr59; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr59; - } else - goto tr20; - } else - goto tr59; - goto tr1; -case 48: - switch( (*p) ) { - case 58: goto tr60; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr61; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr61; - } else - goto tr20; - } else - goto tr61; - goto tr1; -case 49: - switch( (*p) ) { - case 58: goto tr60; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr62; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr62; - } else - goto tr20; - } else - goto tr62; - goto tr1; -case 50: - switch( (*p) ) { - case 58: goto tr60; - case 93: goto tr21; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 51: - switch( (*p) ) { - case 58: goto tr48; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr63; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr63; - } else - goto tr20; - } else - goto tr63; - goto tr1; -case 52: - switch( (*p) ) { - case 58: goto tr65; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr64; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr64; - } else - goto tr20; - } else - goto tr64; - goto tr1; -case 53: - switch( (*p) ) { - case 58: goto tr65; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr66; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr66; - } else - goto tr20; - } else - goto tr66; - goto tr1; -case 54: - switch( (*p) ) { - case 58: goto tr65; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr67; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr67; - } else - goto tr20; - } else - goto tr67; - goto tr1; -case 55: - switch( (*p) ) { - case 58: goto tr65; - case 93: goto tr21; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 56: - switch( (*p) ) { - case 58: goto tr69; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr68; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr68; - } else - goto tr20; - } else - goto tr68; - goto tr1; -case 57: - switch( (*p) ) { - case 58: goto tr71; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr70; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr70; - } else - goto tr20; - } else - goto tr70; - goto tr1; -case 58: - switch( (*p) ) { - case 58: goto tr71; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr72; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr72; - } else - goto tr20; - } else - goto tr72; - goto tr1; -case 59: - switch( (*p) ) { - case 58: goto tr71; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr73; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr73; - } else - goto tr20; - } else - goto tr73; - goto tr1; -case 60: - switch( (*p) ) { - case 58: goto tr71; - case 93: goto tr21; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 61: - switch( (*p) ) { - case 58: goto tr69; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr74; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr75; - } else - goto tr20; - } else - goto tr75; - goto tr1; -case 62: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr78; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr77; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr79; - } else - goto tr20; - } else - goto tr79; - goto tr1; -case 63: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 58 ) - goto tr20; - } else - goto tr80; - goto tr1; -case 64: - switch( (*p) ) { - case 46: goto tr81; - case 93: goto tr21; - } - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 58 ) - goto tr20; - } else - goto tr82; - goto tr1; -case 65: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 58 ) - goto tr20; - } else - goto tr83; - goto tr1; -case 66: - switch( (*p) ) { - case 46: goto tr84; - case 93: goto tr21; - } - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 58 ) - goto tr20; - } else - goto tr85; - goto tr1; -case 67: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 58 ) - goto tr20; - } else - goto tr86; - goto tr1; -case 68: - if ( (*p) == 93 ) - goto tr88; - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 58 ) - goto tr20; - } else - goto tr87; - goto tr1; -case 69: - if ( (*p) == 93 ) - goto tr88; - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 58 ) - goto tr20; - } else - goto tr89; - goto tr1; -case 70: - if ( (*p) == 93 ) - goto tr88; - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 71: - switch( (*p) ) { - case 46: goto tr84; - case 93: goto tr21; - } - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 58 ) - goto tr20; - } else - goto tr90; - goto tr1; -case 72: - switch( (*p) ) { - case 46: goto tr84; - case 93: goto tr21; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 73: - switch( (*p) ) { - case 46: goto tr81; - case 93: goto tr21; - } - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 58 ) - goto tr20; - } else - goto tr91; - goto tr1; -case 74: - switch( (*p) ) { - case 46: goto tr81; - case 93: goto tr21; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 75: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr78; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr92; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr93; - } else - goto tr20; - } else - goto tr93; - goto tr1; -case 76: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr78; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr94; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr94; - } else - goto tr20; - } else - goto tr94; - goto tr1; -case 77: - switch( (*p) ) { - case 58: goto tr78; - case 93: goto tr21; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 78: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr95; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr95; - } else - goto tr20; - } else - goto tr95; - goto tr1; -case 79: - if ( (*p) == 93 ) - goto tr97; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr96; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr96; - } else - goto tr20; - } else - goto tr96; - goto tr1; -case 80: - if ( (*p) == 93 ) - goto tr97; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr98; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr98; - } else - goto tr20; - } else - goto tr98; - goto tr1; -case 81: - if ( (*p) == 93 ) - goto tr97; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr99; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr99; - } else - goto tr20; - } else - goto tr99; - goto tr1; -case 82: - if ( (*p) == 93 ) - goto tr97; - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 83: - switch( (*p) ) { - case 58: goto tr78; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr94; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr94; - } else - goto tr20; - } else - goto tr94; - goto tr1; -case 84: - switch( (*p) ) { - case 58: goto tr78; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr93; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr93; - } else - goto tr20; - } else - goto tr93; - goto tr1; -case 85: - if ( (*p) == 93 ) - goto tr97; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr100; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr100; - } else - goto tr20; - } else - goto tr100; - goto tr1; -case 86: - switch( (*p) ) { - case 58: goto tr102; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr101; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr101; - } else - goto tr20; - } else - goto tr101; - goto tr1; -case 87: - switch( (*p) ) { - case 58: goto tr102; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr103; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr103; - } else - goto tr20; - } else - goto tr103; - goto tr1; -case 88: - switch( (*p) ) { - case 58: goto tr102; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr104; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr104; - } else - goto tr20; - } else - goto tr104; - goto tr1; -case 89: - switch( (*p) ) { - case 58: goto tr102; - case 93: goto tr97; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 90: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr105; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr105; - } else - goto tr20; - } else - goto tr105; - goto tr1; -case 91: - switch( (*p) ) { - case 58: goto tr107; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr106; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr106; - } else - goto tr20; - } else - goto tr106; - goto tr1; -case 92: - switch( (*p) ) { - case 58: goto tr107; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr108; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr108; - } else - goto tr20; - } else - goto tr108; - goto tr1; -case 93: - switch( (*p) ) { - case 58: goto tr107; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr109; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr109; - } else - goto tr20; - } else - goto tr109; - goto tr1; -case 94: - switch( (*p) ) { - case 58: goto tr107; - case 93: goto tr97; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 95: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr110; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr110; - } else - goto tr20; - } else - goto tr110; - goto tr1; -case 96: - switch( (*p) ) { - case 58: goto tr112; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr111; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr111; - } else - goto tr20; - } else - goto tr111; - goto tr1; -case 97: - switch( (*p) ) { - case 58: goto tr112; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr113; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr113; - } else - goto tr20; - } else - goto tr113; - goto tr1; -case 98: - switch( (*p) ) { - case 58: goto tr112; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr114; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr114; - } else - goto tr20; - } else - goto tr114; - goto tr1; -case 99: - switch( (*p) ) { - case 58: goto tr112; - case 93: goto tr97; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 100: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr115; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr115; - } else - goto tr20; - } else - goto tr115; - goto tr1; -case 101: - switch( (*p) ) { - case 58: goto tr117; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr116; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr116; - } else - goto tr20; - } else - goto tr116; - goto tr1; -case 102: - switch( (*p) ) { - case 58: goto tr117; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr118; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr118; - } else - goto tr20; - } else - goto tr118; - goto tr1; -case 103: - switch( (*p) ) { - case 58: goto tr117; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr119; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr119; - } else - goto tr20; - } else - goto tr119; - goto tr1; -case 104: - switch( (*p) ) { - case 58: goto tr117; - case 93: goto tr97; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 105: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr120; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr120; - } else - goto tr20; - } else - goto tr120; - goto tr1; -case 106: - switch( (*p) ) { - case 58: goto tr78; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr121; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr121; - } else - goto tr20; - } else - goto tr121; - goto tr1; -case 107: - switch( (*p) ) { - case 58: goto tr78; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr122; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr122; - } else - goto tr20; - } else - goto tr122; - goto tr1; -case 108: - switch( (*p) ) { - case 58: goto tr78; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr123; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr123; - } else - goto tr20; - } else - goto tr123; - goto tr1; -case 109: - switch( (*p) ) { - case 58: goto tr78; - case 93: goto tr97; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 110: - switch( (*p) ) { - case 58: goto tr78; - case 93: goto tr21; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr79; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr79; - } else - goto tr20; - } else - goto tr79; - goto tr1; -case 111: - if ( (*p) == 93 ) - goto tr97; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr124; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr125; - } else - goto tr20; - } else - goto tr125; - goto tr1; -case 112: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr127; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr126; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr128; - } else - goto tr20; - } else - goto tr128; - goto tr1; -case 113: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr127; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr129; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr130; - } else - goto tr20; - } else - goto tr130; - goto tr1; -case 114: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr127; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr131; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr131; - } else - goto tr20; - } else - goto tr131; - goto tr1; -case 115: - switch( (*p) ) { - case 58: goto tr127; - case 93: goto tr97; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 116: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr132; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr133; - } else - goto tr20; - } else - goto tr133; - goto tr1; -case 117: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr135; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr134; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr136; - } else - goto tr20; - } else - goto tr136; - goto tr1; -case 118: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr135; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr137; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr138; - } else - goto tr20; - } else - goto tr138; - goto tr1; -case 119: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr135; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr139; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr139; - } else - goto tr20; - } else - goto tr139; - goto tr1; -case 120: - switch( (*p) ) { - case 58: goto tr135; - case 93: goto tr97; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 121: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr140; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr141; - } else - goto tr20; - } else - goto tr141; - goto tr1; -case 122: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr143; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr142; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr144; - } else - goto tr20; - } else - goto tr144; - goto tr1; -case 123: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr143; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr145; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr146; - } else - goto tr20; - } else - goto tr146; - goto tr1; -case 124: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr143; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr147; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr147; - } else - goto tr20; - } else - goto tr147; - goto tr1; -case 125: - switch( (*p) ) { - case 58: goto tr143; - case 93: goto tr97; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 126: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr148; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr149; - } else - goto tr20; - } else - goto tr149; - goto tr1; -case 127: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr151; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr150; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr152; - } else - goto tr20; - } else - goto tr152; - goto tr1; -case 128: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr151; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr153; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr154; - } else - goto tr20; - } else - goto tr154; - goto tr1; -case 129: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr151; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr155; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr155; - } else - goto tr20; - } else - goto tr155; - goto tr1; -case 130: - switch( (*p) ) { - case 58: goto tr151; - case 93: goto tr97; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 131: - if ( (*p) == 93 ) - goto tr21; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr156; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr120; - } else - goto tr20; - } else - goto tr120; - goto tr1; -case 132: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr78; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr157; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr121; - } else - goto tr20; - } else - goto tr121; - goto tr1; -case 133: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr78; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr158; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr122; - } else - goto tr20; - } else - goto tr122; - goto tr1; -case 134: - switch( (*p) ) { - case 46: goto tr76; - case 58: goto tr78; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr123; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr123; - } else - goto tr20; - } else - goto tr123; - goto tr1; -case 135: - switch( (*p) ) { - case 58: goto tr151; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr155; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr155; - } else - goto tr20; - } else - goto tr155; - goto tr1; -case 136: - switch( (*p) ) { - case 58: goto tr151; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr154; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr154; - } else - goto tr20; - } else - goto tr154; - goto tr1; -case 137: - switch( (*p) ) { - case 58: goto tr151; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr152; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr152; - } else - goto tr20; - } else - goto tr152; - goto tr1; -case 138: - switch( (*p) ) { - case 58: goto tr143; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr147; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr147; - } else - goto tr20; - } else - goto tr147; - goto tr1; -case 139: - switch( (*p) ) { - case 58: goto tr143; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr146; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr146; - } else - goto tr20; - } else - goto tr146; - goto tr1; -case 140: - switch( (*p) ) { - case 58: goto tr143; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr144; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr144; - } else - goto tr20; - } else - goto tr144; - goto tr1; -case 141: - switch( (*p) ) { - case 58: goto tr135; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr139; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr139; - } else - goto tr20; - } else - goto tr139; - goto tr1; -case 142: - switch( (*p) ) { - case 58: goto tr135; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr138; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr138; - } else - goto tr20; - } else - goto tr138; - goto tr1; -case 143: - switch( (*p) ) { - case 58: goto tr135; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr136; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr136; - } else - goto tr20; - } else - goto tr136; - goto tr1; -case 144: - switch( (*p) ) { - case 58: goto tr127; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr131; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr131; - } else - goto tr20; - } else - goto tr131; - goto tr1; -case 145: - switch( (*p) ) { - case 58: goto tr127; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr130; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr130; - } else - goto tr20; - } else - goto tr130; - goto tr1; -case 146: - switch( (*p) ) { - case 58: goto tr127; - case 93: goto tr97; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr20; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr20; - } else - goto tr128; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr20; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 97 ) - goto tr128; - } else - goto tr20; - } else - goto tr128; - goto tr1; -case 147: - switch( (*p) ) { - case 58: goto tr48; - case 93: goto tr21; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr20; - } else if ( (*p) >= 33 ) - goto tr20; - goto tr1; -case 148: - switch( (*p) ) { - case 34: goto tr160; - case 92: goto tr161; - } - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr159; - goto tr1; -case 149: - switch( (*p) ) { - case 34: goto tr163; - case 92: goto tr164; - } - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr162; - goto tr1; -case 150: - if ( (*p) == 64 ) - goto tr165; - goto tr1; -case 151: - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr166; - goto tr1; -case 152: - switch( (*p) ) { - case 34: goto tr168; - case 92: goto tr169; - } - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr167; - goto tr1; -case 153: - switch( (*p) ) { - case 34: goto tr171; - case 45: goto tr170; - case 62: goto tr172; - case 64: goto tr173; - } - if ( (*p) < 47 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr170; - } else if ( (*p) >= 33 ) - goto tr170; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr170; - } else if ( (*p) >= 61 ) - goto tr170; - } else - goto tr170; - goto tr1; -case 154: - switch( (*p) ) { - case 33: goto tr174; - case 46: goto tr175; - case 61: goto tr174; - case 64: goto tr176; - } - if ( (*p) < 45 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr174; - } else if ( (*p) >= 35 ) - goto tr174; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr174; - } else if ( (*p) >= 63 ) - goto tr174; - } else - goto tr174; - goto tr1; -case 155: - switch( (*p) ) { - case 33: goto tr174; - case 45: goto tr174; - case 61: goto tr174; - case 63: goto tr174; - } - if ( (*p) < 47 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr174; - } else if ( (*p) >= 35 ) - goto tr174; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr174; - } else if ( (*p) >= 65 ) - goto tr174; - } else - goto tr174; - goto tr1; -case 156: - if ( (*p) == 91 ) - goto tr178; - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr177; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr177; - } else - goto tr177; - goto tr1; -case 157: - switch( (*p) ) { - case 45: goto tr179; - case 46: goto tr180; - case 62: goto tr182; - case 95: goto tr179; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr181; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr181; - } else - goto tr181; - goto tr1; -case 158: - switch( (*p) ) { - case 45: goto tr179; - case 95: goto tr179; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr181; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr181; - } else - goto tr181; - goto tr1; -case 159: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr181; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr181; - } else - goto tr181; - goto tr1; -case 320: - if ( (*p) == 32 ) - goto tr353; - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr353; - goto tr1; -case 160: - switch( (*p) ) { - case 45: goto tr183; - case 73: goto tr186; - case 95: goto tr183; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr184; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr185; - } else - goto tr185; - goto tr1; -case 161: - switch( (*p) ) { - case 45: goto tr187; - case 95: goto tr187; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr188; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr188; - } else - goto tr188; - goto tr1; -case 162: - switch( (*p) ) { - case 45: goto tr187; - case 58: goto tr189; - case 95: goto tr187; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr188; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr188; - } else - goto tr188; - goto tr1; -case 163: - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 164: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 165: - if ( (*p) == 62 ) - goto tr192; - goto tr1; -case 166: - switch( (*p) ) { - case 45: goto tr187; - case 46: goto tr193; - case 58: goto tr189; - case 95: goto tr187; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr194; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr188; - } else - goto tr188; - goto tr1; -case 167: - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr195; - goto tr1; -case 168: - if ( (*p) == 46 ) - goto tr196; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr197; - goto tr1; -case 169: - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr198; - goto tr1; -case 170: - if ( (*p) == 46 ) - goto tr199; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr200; - goto tr1; -case 171: - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr201; - goto tr1; -case 172: - if ( (*p) == 93 ) - goto tr203; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr202; - goto tr1; -case 173: - if ( (*p) == 93 ) - goto tr203; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr204; - goto tr1; -case 174: - if ( (*p) == 93 ) - goto tr203; - goto tr1; -case 175: - if ( (*p) == 46 ) - goto tr199; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr205; - goto tr1; -case 176: - if ( (*p) == 46 ) - goto tr199; - goto tr1; -case 177: - if ( (*p) == 46 ) - goto tr196; - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr206; - goto tr1; -case 178: - if ( (*p) == 46 ) - goto tr196; - goto tr1; -case 179: - switch( (*p) ) { - case 45: goto tr187; - case 46: goto tr193; - case 58: goto tr189; - case 95: goto tr187; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr207; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr188; - } else - goto tr188; - goto tr1; -case 180: - switch( (*p) ) { - case 45: goto tr187; - case 46: goto tr193; - case 58: goto tr189; - case 95: goto tr187; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr188; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr188; - } else - goto tr188; - goto tr1; -case 181: - switch( (*p) ) { - case 45: goto tr187; - case 58: goto tr189; - case 80: goto tr208; - case 95: goto tr187; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr188; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr188; - } else - goto tr188; - goto tr1; -case 182: - switch( (*p) ) { - case 45: goto tr187; - case 58: goto tr189; - case 95: goto tr187; - case 118: goto tr209; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr188; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr188; - } else - goto tr188; - goto tr1; -case 183: - switch( (*p) ) { - case 45: goto tr187; - case 54: goto tr210; - case 58: goto tr189; - case 95: goto tr187; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr188; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr188; - } else - goto tr188; - goto tr1; -case 184: - switch( (*p) ) { - case 45: goto tr187; - case 58: goto tr211; - case 95: goto tr187; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr188; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr188; - } else - goto tr188; - goto tr1; -case 185: - if ( (*p) == 58 ) - goto tr213; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr212; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr212; - } else - goto tr190; - } else - goto tr212; - goto tr1; -case 186: - switch( (*p) ) { - case 58: goto tr215; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr214; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr214; - } else - goto tr190; - } else - goto tr214; - goto tr1; -case 187: - switch( (*p) ) { - case 58: goto tr215; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr216; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr216; - } else - goto tr190; - } else - goto tr216; - goto tr1; -case 188: - switch( (*p) ) { - case 58: goto tr215; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr217; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr217; - } else - goto tr190; - } else - goto tr217; - goto tr1; -case 189: - switch( (*p) ) { - case 58: goto tr215; - case 93: goto tr191; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 190: - switch( (*p) ) { - case 58: goto tr219; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr218; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr218; - } else - goto tr190; - } else - goto tr218; - goto tr1; -case 191: - switch( (*p) ) { - case 58: goto tr221; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr220; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr220; - } else - goto tr190; - } else - goto tr220; - goto tr1; -case 192: - switch( (*p) ) { - case 58: goto tr221; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr222; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr222; - } else - goto tr190; - } else - goto tr222; - goto tr1; -case 193: - switch( (*p) ) { - case 58: goto tr221; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr223; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr223; - } else - goto tr190; - } else - goto tr223; - goto tr1; -case 194: - switch( (*p) ) { - case 58: goto tr221; - case 93: goto tr191; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 195: - switch( (*p) ) { - case 58: goto tr219; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr224; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr224; - } else - goto tr190; - } else - goto tr224; - goto tr1; -case 196: - switch( (*p) ) { - case 58: goto tr226; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr225; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr225; - } else - goto tr190; - } else - goto tr225; - goto tr1; -case 197: - switch( (*p) ) { - case 58: goto tr226; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr227; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr227; - } else - goto tr190; - } else - goto tr227; - goto tr1; -case 198: - switch( (*p) ) { - case 58: goto tr226; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr228; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr228; - } else - goto tr190; - } else - goto tr228; - goto tr1; -case 199: - switch( (*p) ) { - case 58: goto tr226; - case 93: goto tr191; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 200: - switch( (*p) ) { - case 58: goto tr219; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr229; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr229; - } else - goto tr190; - } else - goto tr229; - goto tr1; -case 201: - switch( (*p) ) { - case 58: goto tr231; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr230; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr230; - } else - goto tr190; - } else - goto tr230; - goto tr1; -case 202: - switch( (*p) ) { - case 58: goto tr231; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr232; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr232; - } else - goto tr190; - } else - goto tr232; - goto tr1; -case 203: - switch( (*p) ) { - case 58: goto tr231; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr233; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr233; - } else - goto tr190; - } else - goto tr233; - goto tr1; -case 204: - switch( (*p) ) { - case 58: goto tr231; - case 93: goto tr191; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 205: - switch( (*p) ) { - case 58: goto tr219; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr234; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr234; - } else - goto tr190; - } else - goto tr234; - goto tr1; -case 206: - switch( (*p) ) { - case 58: goto tr236; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr235; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr235; - } else - goto tr190; - } else - goto tr235; - goto tr1; -case 207: - switch( (*p) ) { - case 58: goto tr236; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr237; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr237; - } else - goto tr190; - } else - goto tr237; - goto tr1; -case 208: - switch( (*p) ) { - case 58: goto tr236; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr238; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr238; - } else - goto tr190; - } else - goto tr238; - goto tr1; -case 209: - switch( (*p) ) { - case 58: goto tr236; - case 93: goto tr191; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 210: - switch( (*p) ) { - case 58: goto tr240; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr239; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr239; - } else - goto tr190; - } else - goto tr239; - goto tr1; -case 211: - switch( (*p) ) { - case 58: goto tr242; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr241; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr241; - } else - goto tr190; - } else - goto tr241; - goto tr1; -case 212: - switch( (*p) ) { - case 58: goto tr242; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr243; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr243; - } else - goto tr190; - } else - goto tr243; - goto tr1; -case 213: - switch( (*p) ) { - case 58: goto tr242; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr244; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr244; - } else - goto tr190; - } else - goto tr244; - goto tr1; -case 214: - switch( (*p) ) { - case 58: goto tr242; - case 93: goto tr191; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 215: - switch( (*p) ) { - case 58: goto tr240; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr245; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr246; - } else - goto tr190; - } else - goto tr246; - goto tr1; -case 216: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr249; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr248; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr250; - } else - goto tr190; - } else - goto tr250; - goto tr1; -case 217: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 58 ) - goto tr190; - } else - goto tr251; - goto tr1; -case 218: - switch( (*p) ) { - case 46: goto tr252; - case 93: goto tr191; - } - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 58 ) - goto tr190; - } else - goto tr253; - goto tr1; -case 219: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 58 ) - goto tr190; - } else - goto tr254; - goto tr1; -case 220: - switch( (*p) ) { - case 46: goto tr255; - case 93: goto tr191; - } - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 58 ) - goto tr190; - } else - goto tr256; - goto tr1; -case 221: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 58 ) - goto tr190; - } else - goto tr257; - goto tr1; -case 222: - if ( (*p) == 93 ) - goto tr259; - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 58 ) - goto tr190; - } else - goto tr258; - goto tr1; -case 223: - if ( (*p) == 93 ) - goto tr259; - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 58 ) - goto tr190; - } else - goto tr260; - goto tr1; -case 224: - if ( (*p) == 93 ) - goto tr259; - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 225: - switch( (*p) ) { - case 46: goto tr255; - case 93: goto tr191; - } - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 58 ) - goto tr190; - } else - goto tr261; - goto tr1; -case 226: - switch( (*p) ) { - case 46: goto tr255; - case 93: goto tr191; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 227: - switch( (*p) ) { - case 46: goto tr252; - case 93: goto tr191; - } - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 58 ) - goto tr190; - } else - goto tr262; - goto tr1; -case 228: - switch( (*p) ) { - case 46: goto tr252; - case 93: goto tr191; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 229: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr249; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr263; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr264; - } else - goto tr190; - } else - goto tr264; - goto tr1; -case 230: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr249; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr265; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr265; - } else - goto tr190; - } else - goto tr265; - goto tr1; -case 231: - switch( (*p) ) { - case 58: goto tr249; - case 93: goto tr191; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 232: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr266; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr266; - } else - goto tr190; - } else - goto tr266; - goto tr1; -case 233: - if ( (*p) == 93 ) - goto tr268; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr267; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr267; - } else - goto tr190; - } else - goto tr267; - goto tr1; -case 234: - if ( (*p) == 93 ) - goto tr268; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr269; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr269; - } else - goto tr190; - } else - goto tr269; - goto tr1; -case 235: - if ( (*p) == 93 ) - goto tr268; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr270; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr270; - } else - goto tr190; - } else - goto tr270; - goto tr1; -case 236: - if ( (*p) == 93 ) - goto tr268; - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 237: - switch( (*p) ) { - case 58: goto tr249; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr265; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr265; - } else - goto tr190; - } else - goto tr265; - goto tr1; -case 238: - switch( (*p) ) { - case 58: goto tr249; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr264; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr264; - } else - goto tr190; - } else - goto tr264; - goto tr1; -case 239: - if ( (*p) == 93 ) - goto tr268; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr271; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr271; - } else - goto tr190; - } else - goto tr271; - goto tr1; -case 240: - switch( (*p) ) { - case 58: goto tr273; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr272; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr272; - } else - goto tr190; - } else - goto tr272; - goto tr1; -case 241: - switch( (*p) ) { - case 58: goto tr273; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr274; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr274; - } else - goto tr190; - } else - goto tr274; - goto tr1; -case 242: - switch( (*p) ) { - case 58: goto tr273; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr275; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr275; - } else - goto tr190; - } else - goto tr275; - goto tr1; -case 243: - switch( (*p) ) { - case 58: goto tr273; - case 93: goto tr268; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 244: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr276; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr276; - } else - goto tr190; - } else - goto tr276; - goto tr1; -case 245: - switch( (*p) ) { - case 58: goto tr278; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr277; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr277; - } else - goto tr190; - } else - goto tr277; - goto tr1; -case 246: - switch( (*p) ) { - case 58: goto tr278; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr279; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr279; - } else - goto tr190; - } else - goto tr279; - goto tr1; -case 247: - switch( (*p) ) { - case 58: goto tr278; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr280; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr280; - } else - goto tr190; - } else - goto tr280; - goto tr1; -case 248: - switch( (*p) ) { - case 58: goto tr278; - case 93: goto tr268; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 249: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr281; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr281; - } else - goto tr190; - } else - goto tr281; - goto tr1; -case 250: - switch( (*p) ) { - case 58: goto tr283; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr282; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr282; - } else - goto tr190; - } else - goto tr282; - goto tr1; -case 251: - switch( (*p) ) { - case 58: goto tr283; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr284; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr284; - } else - goto tr190; - } else - goto tr284; - goto tr1; -case 252: - switch( (*p) ) { - case 58: goto tr283; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr285; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr285; - } else - goto tr190; - } else - goto tr285; - goto tr1; -case 253: - switch( (*p) ) { - case 58: goto tr283; - case 93: goto tr268; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 254: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr286; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr286; - } else - goto tr190; - } else - goto tr286; - goto tr1; -case 255: - switch( (*p) ) { - case 58: goto tr288; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr287; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr287; - } else - goto tr190; - } else - goto tr287; - goto tr1; -case 256: - switch( (*p) ) { - case 58: goto tr288; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr289; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr289; - } else - goto tr190; - } else - goto tr289; - goto tr1; -case 257: - switch( (*p) ) { - case 58: goto tr288; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr290; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr290; - } else - goto tr190; - } else - goto tr290; - goto tr1; -case 258: - switch( (*p) ) { - case 58: goto tr288; - case 93: goto tr268; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 259: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr291; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr291; - } else - goto tr190; - } else - goto tr291; - goto tr1; -case 260: - switch( (*p) ) { - case 58: goto tr249; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr292; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr292; - } else - goto tr190; - } else - goto tr292; - goto tr1; -case 261: - switch( (*p) ) { - case 58: goto tr249; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr293; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr293; - } else - goto tr190; - } else - goto tr293; - goto tr1; -case 262: - switch( (*p) ) { - case 58: goto tr249; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr294; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr294; - } else - goto tr190; - } else - goto tr294; - goto tr1; -case 263: - switch( (*p) ) { - case 58: goto tr249; - case 93: goto tr268; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 264: - switch( (*p) ) { - case 58: goto tr249; - case 93: goto tr191; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr250; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr250; - } else - goto tr190; - } else - goto tr250; - goto tr1; -case 265: - if ( (*p) == 93 ) - goto tr268; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr295; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr296; - } else - goto tr190; - } else - goto tr296; - goto tr1; -case 266: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr298; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr297; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr299; - } else - goto tr190; - } else - goto tr299; - goto tr1; -case 267: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr298; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr300; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr301; - } else - goto tr190; - } else - goto tr301; - goto tr1; -case 268: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr298; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr302; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr302; - } else - goto tr190; - } else - goto tr302; - goto tr1; -case 269: - switch( (*p) ) { - case 58: goto tr298; - case 93: goto tr268; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 270: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr303; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr304; - } else - goto tr190; - } else - goto tr304; - goto tr1; -case 271: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr306; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr305; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr307; - } else - goto tr190; - } else - goto tr307; - goto tr1; -case 272: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr306; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr308; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr309; - } else - goto tr190; - } else - goto tr309; - goto tr1; -case 273: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr306; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr310; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr310; - } else - goto tr190; - } else - goto tr310; - goto tr1; -case 274: - switch( (*p) ) { - case 58: goto tr306; - case 93: goto tr268; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 275: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr311; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr312; - } else - goto tr190; - } else - goto tr312; - goto tr1; -case 276: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr314; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr313; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr315; - } else - goto tr190; - } else - goto tr315; - goto tr1; -case 277: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr314; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr316; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr317; - } else - goto tr190; - } else - goto tr317; - goto tr1; -case 278: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr314; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr318; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr318; - } else - goto tr190; - } else - goto tr318; - goto tr1; -case 279: - switch( (*p) ) { - case 58: goto tr314; - case 93: goto tr268; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 280: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr319; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr320; - } else - goto tr190; - } else - goto tr320; - goto tr1; -case 281: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr322; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr321; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr323; - } else - goto tr190; - } else - goto tr323; - goto tr1; -case 282: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr322; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr324; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr325; - } else - goto tr190; - } else - goto tr325; - goto tr1; -case 283: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr322; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr326; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr326; - } else - goto tr190; - } else - goto tr326; - goto tr1; -case 284: - switch( (*p) ) { - case 58: goto tr322; - case 93: goto tr268; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 285: - if ( (*p) == 93 ) - goto tr191; - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 58 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr327; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr291; - } else - goto tr190; - } else - goto tr291; - goto tr1; -case 286: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr249; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr328; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr292; - } else - goto tr190; - } else - goto tr292; - goto tr1; -case 287: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr249; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr329; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr293; - } else - goto tr190; - } else - goto tr293; - goto tr1; -case 288: - switch( (*p) ) { - case 46: goto tr247; - case 58: goto tr249; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr294; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr294; - } else - goto tr190; - } else - goto tr294; - goto tr1; -case 289: - switch( (*p) ) { - case 58: goto tr322; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr326; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr326; - } else - goto tr190; - } else - goto tr326; - goto tr1; -case 290: - switch( (*p) ) { - case 58: goto tr322; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr325; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr325; - } else - goto tr190; - } else - goto tr325; - goto tr1; -case 291: - switch( (*p) ) { - case 58: goto tr322; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr323; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr323; - } else - goto tr190; - } else - goto tr323; - goto tr1; -case 292: - switch( (*p) ) { - case 58: goto tr314; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr318; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr318; - } else - goto tr190; - } else - goto tr318; - goto tr1; -case 293: - switch( (*p) ) { - case 58: goto tr314; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr317; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr317; - } else - goto tr190; - } else - goto tr317; - goto tr1; -case 294: - switch( (*p) ) { - case 58: goto tr314; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr315; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr315; - } else - goto tr190; - } else - goto tr315; - goto tr1; -case 295: - switch( (*p) ) { - case 58: goto tr306; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr310; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr310; - } else - goto tr190; - } else - goto tr310; - goto tr1; -case 296: - switch( (*p) ) { - case 58: goto tr306; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr309; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr309; - } else - goto tr190; - } else - goto tr309; - goto tr1; -case 297: - switch( (*p) ) { - case 58: goto tr306; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr307; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr307; - } else - goto tr190; - } else - goto tr307; - goto tr1; -case 298: - switch( (*p) ) { - case 58: goto tr298; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr302; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr302; - } else - goto tr190; - } else - goto tr302; - goto tr1; -case 299: - switch( (*p) ) { - case 58: goto tr298; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr301; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr301; - } else - goto tr190; - } else - goto tr301; - goto tr1; -case 300: - switch( (*p) ) { - case 58: goto tr298; - case 93: goto tr268; - } - if ( (*p) < 65 ) { - if ( (*p) < 48 ) { - if ( 33 <= (*p) && (*p) <= 47 ) - goto tr190; - } else if ( (*p) > 57 ) { - if ( 59 <= (*p) && (*p) <= 64 ) - goto tr190; - } else - goto tr299; - } else if ( (*p) > 70 ) { - if ( (*p) < 94 ) { - if ( 71 <= (*p) && (*p) <= 90 ) - goto tr190; - } else if ( (*p) > 96 ) { - if ( (*p) > 102 ) { - if ( 103 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 97 ) - goto tr299; - } else - goto tr190; - } else - goto tr299; - goto tr1; -case 301: - switch( (*p) ) { - case 58: goto tr219; - case 93: goto tr191; - } - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr190; - } else if ( (*p) >= 33 ) - goto tr190; - goto tr1; -case 302: - switch( (*p) ) { - case 34: goto tr331; - case 92: goto tr332; - } - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr330; - goto tr1; -case 303: - switch( (*p) ) { - case 34: goto tr334; - case 92: goto tr335; - } - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr333; - goto tr1; -case 304: - if ( (*p) == 64 ) - goto tr336; - goto tr1; -case 305: - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr337; - goto tr1; -case 306: - switch( (*p) ) { - case 34: goto tr339; - case 92: goto tr340; - } - if ( 32 <= (*p) && (*p) <= 126 ) - goto tr338; - goto tr1; -case 321: - if ( (*p) == 32 ) - goto tr354; - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr354; - goto tr1; -case 307: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr341; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr341; - } else - goto tr341; - goto tr1; -case 308: - switch( (*p) ) { - case 44: goto tr342; - case 45: goto tr343; - case 46: goto tr173; - case 58: goto tr344; - case 95: goto tr343; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr341; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr341; - } else - goto tr341; - goto tr1; -case 309: - if ( (*p) == 64 ) - goto tr173; - goto tr1; -case 310: - switch( (*p) ) { - case 45: goto tr343; - case 95: goto tr343; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr341; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr341; - } else - goto tr341; - goto tr1; -case 311: - switch( (*p) ) { - case 34: goto tr171; - case 45: goto tr170; - case 61: goto tr170; - case 63: goto tr170; - } - if ( (*p) < 47 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr170; - } else if ( (*p) >= 33 ) - goto tr170; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr170; - } else if ( (*p) >= 65 ) - goto tr170; - } else - goto tr170; - goto tr1; -case 312: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr345; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr345; - } else - goto tr345; - goto tr1; -case 313: - switch( (*p) ) { - case 44: goto tr346; - case 45: goto tr347; - case 46: goto tr5; - case 58: goto tr348; - case 95: goto tr347; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr345; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr345; - } else - goto tr345; - goto tr1; -case 314: - if ( (*p) == 64 ) - goto tr5; - goto tr1; -case 315: - switch( (*p) ) { - case 45: goto tr347; - case 95: goto tr347; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr345; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr345; - } else - goto tr345; - goto tr1; -case 316: - switch( (*p) ) { - case 34: goto tr3; - case 45: goto tr2; - case 61: goto tr2; - case 63: goto tr2; - } - if ( (*p) < 47 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr2; - } else if ( (*p) >= 33 ) - goto tr2; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 126 ) - goto tr2; - } else if ( (*p) >= 65 ) - goto tr2; - } else - goto tr2; - goto tr1; - } - - tr1: cs = 0; goto _again; - tr0: cs = 1; goto _again; - tr6: cs = 2; goto _again; - tr2: cs = 2; goto f0; - tr7: cs = 3; goto _again; - tr8: cs = 4; goto f2; - tr165: cs = 4; goto f14; - tr11: cs = 5; goto _again; - tr350: cs = 6; goto _again; - tr10: cs = 7; goto _again; - tr17: cs = 8; goto _again; - tr13: cs = 8; goto f4; - tr18: cs = 9; goto _again; - tr15: cs = 9; goto f4; - tr19: cs = 10; goto _again; - tr20: cs = 11; goto _again; - tr14: cs = 12; goto f5; - tr22: cs = 13; goto _again; - tr24: cs = 14; goto _again; - tr25: cs = 15; goto _again; - tr27: cs = 16; goto _again; - tr28: cs = 17; goto _again; - tr30: cs = 18; goto _again; - tr31: cs = 19; goto _again; - tr33: cs = 20; goto _again; - tr29: cs = 21; goto _again; - tr34: cs = 22; goto _again; - tr26: cs = 23; goto _again; - tr35: cs = 24; goto _again; - tr23: cs = 25; goto _again; - tr36: cs = 26; goto _again; - tr16: cs = 27; goto f4; - tr37: cs = 28; goto _again; - tr38: cs = 29; goto _again; - tr39: cs = 30; goto _again; - tr40: cs = 31; goto _again; - tr41: cs = 32; goto f8; - tr43: cs = 33; goto _again; - tr45: cs = 34; goto _again; - tr46: cs = 35; goto _again; - tr44: cs = 36; goto _again; - tr47: cs = 37; goto _again; - tr49: cs = 38; goto _again; - tr51: cs = 39; goto _again; - tr52: cs = 40; goto _again; - tr50: cs = 41; goto _again; - tr53: cs = 42; goto _again; - tr54: cs = 43; goto _again; - tr56: cs = 44; goto _again; - tr57: cs = 45; goto _again; - tr55: cs = 46; goto _again; - tr58: cs = 47; goto _again; - tr59: cs = 48; goto _again; - tr61: cs = 49; goto _again; - tr62: cs = 50; goto _again; - tr60: cs = 51; goto _again; - tr63: cs = 52; goto _again; - tr64: cs = 53; goto _again; - tr66: cs = 54; goto _again; - tr67: cs = 55; goto _again; - tr65: cs = 56; goto _again; - tr68: cs = 57; goto _again; - tr70: cs = 58; goto _again; - tr72: cs = 59; goto _again; - tr73: cs = 60; goto _again; - tr71: cs = 61; goto _again; - tr74: cs = 62; goto f9; - tr76: cs = 63; goto _again; - tr80: cs = 64; goto _again; - tr81: cs = 65; goto _again; - tr83: cs = 66; goto _again; - tr84: cs = 67; goto _again; - tr86: cs = 68; goto _again; - tr87: cs = 69; goto _again; - tr89: cs = 70; goto _again; - tr85: cs = 71; goto _again; - tr90: cs = 72; goto _again; - tr82: cs = 73; goto _again; - tr91: cs = 74; goto _again; - tr77: cs = 75; goto _again; - tr92: cs = 76; goto _again; - tr94: cs = 77; goto _again; - tr78: cs = 78; goto _again; - tr95: cs = 79; goto _again; - tr96: cs = 80; goto _again; - tr98: cs = 81; goto _again; - tr99: cs = 82; goto _again; - tr93: cs = 83; goto _again; - tr79: cs = 84; goto _again; - tr69: cs = 85; goto _again; - tr100: cs = 86; goto _again; - tr101: cs = 87; goto _again; - tr103: cs = 88; goto _again; - tr104: cs = 89; goto _again; - tr102: cs = 90; goto _again; - tr105: cs = 91; goto _again; - tr106: cs = 92; goto _again; - tr108: cs = 93; goto _again; - tr109: cs = 94; goto _again; - tr107: cs = 95; goto _again; - tr110: cs = 96; goto _again; - tr111: cs = 97; goto _again; - tr113: cs = 98; goto _again; - tr114: cs = 99; goto _again; - tr112: cs = 100; goto _again; - tr115: cs = 101; goto _again; - tr116: cs = 102; goto _again; - tr118: cs = 103; goto _again; - tr119: cs = 104; goto _again; - tr117: cs = 105; goto _again; - tr120: cs = 106; goto _again; - tr121: cs = 107; goto _again; - tr122: cs = 108; goto _again; - tr123: cs = 109; goto _again; - tr75: cs = 110; goto _again; - tr48: cs = 111; goto _again; - tr124: cs = 112; goto f9; - tr126: cs = 113; goto _again; - tr129: cs = 114; goto _again; - tr131: cs = 115; goto _again; - tr127: cs = 116; goto _again; - tr132: cs = 117; goto f9; - tr134: cs = 118; goto _again; - tr137: cs = 119; goto _again; - tr139: cs = 120; goto _again; - tr135: cs = 121; goto _again; - tr140: cs = 122; goto f9; - tr142: cs = 123; goto _again; - tr145: cs = 124; goto _again; - tr147: cs = 125; goto _again; - tr143: cs = 126; goto _again; - tr148: cs = 127; goto f9; - tr150: cs = 128; goto _again; - tr153: cs = 129; goto _again; - tr155: cs = 130; goto _again; - tr151: cs = 131; goto _again; - tr156: cs = 132; goto f9; - tr157: cs = 133; goto _again; - tr158: cs = 134; goto _again; - tr154: cs = 135; goto _again; - tr152: cs = 136; goto _again; - tr149: cs = 137; goto _again; - tr146: cs = 138; goto _again; - tr144: cs = 139; goto _again; - tr141: cs = 140; goto _again; - tr138: cs = 141; goto _again; - tr136: cs = 142; goto _again; - tr133: cs = 143; goto _again; - tr130: cs = 144; goto _again; - tr128: cs = 145; goto _again; - tr125: cs = 146; goto _again; - tr42: cs = 147; goto f8; - tr3: cs = 148; goto f1; - tr162: cs = 149; goto _again; - tr159: cs = 149; goto f12; - tr167: cs = 149; goto f15; - tr163: cs = 150; goto f2; - tr160: cs = 150; goto f13; - tr168: cs = 150; goto f16; - tr164: cs = 151; goto _again; - tr161: cs = 151; goto f12; - tr169: cs = 151; goto f15; - tr166: cs = 152; goto _again; - tr4: cs = 153; goto _again; - tr174: cs = 154; goto _again; - tr170: cs = 154; goto f0; - tr175: cs = 155; goto _again; - tr176: cs = 156; goto f2; - tr336: cs = 156; goto f14; - tr181: cs = 157; goto _again; - tr177: cs = 157; goto f3; - tr179: cs = 158; goto _again; - tr180: cs = 159; goto _again; - tr178: cs = 160; goto _again; - tr187: cs = 161; goto _again; - tr183: cs = 161; goto f4; - tr188: cs = 162; goto _again; - tr185: cs = 162; goto f4; - tr189: cs = 163; goto _again; - tr190: cs = 164; goto _again; - tr191: cs = 165; goto f6; - tr203: cs = 165; goto f7; - tr259: cs = 165; goto f10; - tr268: cs = 165; goto f11; - tr184: cs = 166; goto f5; - tr193: cs = 167; goto _again; - tr195: cs = 168; goto _again; - tr196: cs = 169; goto _again; - tr198: cs = 170; goto _again; - tr199: cs = 171; goto _again; - tr201: cs = 172; goto _again; - tr202: cs = 173; goto _again; - tr204: cs = 174; goto _again; - tr200: cs = 175; goto _again; - tr205: cs = 176; goto _again; - tr197: cs = 177; goto _again; - tr206: cs = 178; goto _again; - tr194: cs = 179; goto _again; - tr207: cs = 180; goto _again; - tr186: cs = 181; goto f4; - tr208: cs = 182; goto _again; - tr209: cs = 183; goto _again; - tr210: cs = 184; goto _again; - tr211: cs = 185; goto _again; - tr212: cs = 186; goto f8; - tr214: cs = 187; goto _again; - tr216: cs = 188; goto _again; - tr217: cs = 189; goto _again; - tr215: cs = 190; goto _again; - tr218: cs = 191; goto _again; - tr220: cs = 192; goto _again; - tr222: cs = 193; goto _again; - tr223: cs = 194; goto _again; - tr221: cs = 195; goto _again; - tr224: cs = 196; goto _again; - tr225: cs = 197; goto _again; - tr227: cs = 198; goto _again; - tr228: cs = 199; goto _again; - tr226: cs = 200; goto _again; - tr229: cs = 201; goto _again; - tr230: cs = 202; goto _again; - tr232: cs = 203; goto _again; - tr233: cs = 204; goto _again; - tr231: cs = 205; goto _again; - tr234: cs = 206; goto _again; - tr235: cs = 207; goto _again; - tr237: cs = 208; goto _again; - tr238: cs = 209; goto _again; - tr236: cs = 210; goto _again; - tr239: cs = 211; goto _again; - tr241: cs = 212; goto _again; - tr243: cs = 213; goto _again; - tr244: cs = 214; goto _again; - tr242: cs = 215; goto _again; - tr245: cs = 216; goto f9; - tr247: cs = 217; goto _again; - tr251: cs = 218; goto _again; - tr252: cs = 219; goto _again; - tr254: cs = 220; goto _again; - tr255: cs = 221; goto _again; - tr257: cs = 222; goto _again; - tr258: cs = 223; goto _again; - tr260: cs = 224; goto _again; - tr256: cs = 225; goto _again; - tr261: cs = 226; goto _again; - tr253: cs = 227; goto _again; - tr262: cs = 228; goto _again; - tr248: cs = 229; goto _again; - tr263: cs = 230; goto _again; - tr265: cs = 231; goto _again; - tr249: cs = 232; goto _again; - tr266: cs = 233; goto _again; - tr267: cs = 234; goto _again; - tr269: cs = 235; goto _again; - tr270: cs = 236; goto _again; - tr264: cs = 237; goto _again; - tr250: cs = 238; goto _again; - tr240: cs = 239; goto _again; - tr271: cs = 240; goto _again; - tr272: cs = 241; goto _again; - tr274: cs = 242; goto _again; - tr275: cs = 243; goto _again; - tr273: cs = 244; goto _again; - tr276: cs = 245; goto _again; - tr277: cs = 246; goto _again; - tr279: cs = 247; goto _again; - tr280: cs = 248; goto _again; - tr278: cs = 249; goto _again; - tr281: cs = 250; goto _again; - tr282: cs = 251; goto _again; - tr284: cs = 252; goto _again; - tr285: cs = 253; goto _again; - tr283: cs = 254; goto _again; - tr286: cs = 255; goto _again; - tr287: cs = 256; goto _again; - tr289: cs = 257; goto _again; - tr290: cs = 258; goto _again; - tr288: cs = 259; goto _again; - tr291: cs = 260; goto _again; - tr292: cs = 261; goto _again; - tr293: cs = 262; goto _again; - tr294: cs = 263; goto _again; - tr246: cs = 264; goto _again; - tr219: cs = 265; goto _again; - tr295: cs = 266; goto f9; - tr297: cs = 267; goto _again; - tr300: cs = 268; goto _again; - tr302: cs = 269; goto _again; - tr298: cs = 270; goto _again; - tr303: cs = 271; goto f9; - tr305: cs = 272; goto _again; - tr308: cs = 273; goto _again; - tr310: cs = 274; goto _again; - tr306: cs = 275; goto _again; - tr311: cs = 276; goto f9; - tr313: cs = 277; goto _again; - tr316: cs = 278; goto _again; - tr318: cs = 279; goto _again; - tr314: cs = 280; goto _again; - tr319: cs = 281; goto f9; - tr321: cs = 282; goto _again; - tr324: cs = 283; goto _again; - tr326: cs = 284; goto _again; - tr322: cs = 285; goto _again; - tr327: cs = 286; goto f9; - tr328: cs = 287; goto _again; - tr329: cs = 288; goto _again; - tr325: cs = 289; goto _again; - tr323: cs = 290; goto _again; - tr320: cs = 291; goto _again; - tr317: cs = 292; goto _again; - tr315: cs = 293; goto _again; - tr312: cs = 294; goto _again; - tr309: cs = 295; goto _again; - tr307: cs = 296; goto _again; - tr304: cs = 297; goto _again; - tr301: cs = 298; goto _again; - tr299: cs = 299; goto _again; - tr296: cs = 300; goto _again; - tr213: cs = 301; goto f8; - tr171: cs = 302; goto f1; - tr333: cs = 303; goto _again; - tr330: cs = 303; goto f12; - tr338: cs = 303; goto f15; - tr334: cs = 304; goto f2; - tr331: cs = 304; goto f13; - tr339: cs = 304; goto f16; - tr335: cs = 305; goto _again; - tr332: cs = 305; goto f12; - tr340: cs = 305; goto f15; - tr337: cs = 306; goto _again; - tr173: cs = 307; goto _again; - tr341: cs = 308; goto _again; - tr342: cs = 309; goto _again; - tr343: cs = 310; goto _again; - tr344: cs = 311; goto _again; - tr5: cs = 312; goto _again; - tr345: cs = 313; goto _again; - tr346: cs = 314; goto _again; - tr347: cs = 315; goto _again; - tr348: cs = 316; goto _again; - tr12: cs = 317; goto _again; - tr9: cs = 317; goto f3; - tr351: cs = 318; goto _again; - tr349: cs = 318; goto f19; - tr352: cs = 318; goto f20; - tr353: cs = 318; goto f21; - tr354: cs = 318; goto f22; - tr21: cs = 319; goto f6; - tr32: cs = 319; goto f7; - tr88: cs = 319; goto f10; - tr97: cs = 319; goto f11; - tr182: cs = 320; goto f17; - tr192: cs = 320; goto f18; - tr172: cs = 321; goto _again; - -f8: -#line 5 "../rspamd/src/ragel/smtp_addr_parser.rl" - {} - goto _again; -f9: -#line 7 "../rspamd/src/ragel/smtp_addr_parser.rl" - {} - goto _again; -f12: -#line 10 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->user = p; - } - goto _again; -f2: -#line 14 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->user) { - addr->user_len = p - addr->user; - } - } - goto _again; -f3: -#line 20 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->domain = p; - } - goto _again; -f4: -#line 30 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->domain = p; - addr->flags |= RSPAMD_EMAIL_ADDR_IP; - } - goto _again; -f6: -#line 35 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } - goto _again; -f15: -#line 41 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; - } - goto _again; -f14: -#line 45 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_QUOTED; - } - goto _again; -f1: -#line 64 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->addr = p; - } - goto _again; -f18: -#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->addr) { - addr->addr_len = p - addr->addr; - } - } - goto _again; -f11: -#line 6 "../rspamd/src/ragel/smtp_addr_parser.rl" - {} -#line 35 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } - goto _again; -f7: -#line 8 "../rspamd/src/ragel/smtp_addr_parser.rl" - {} -#line 35 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } - goto _again; -f13: -#line 10 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->user = p; - } -#line 14 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->user) { - addr->user_len = p - addr->user; - } - } - goto _again; -f17: -#line 24 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } -#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->addr) { - addr->addr_len = p - addr->addr; - } - } - goto _again; -f5: -#line 30 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->domain = p; - addr->flags |= RSPAMD_EMAIL_ADDR_IP; - } -#line 7 "../rspamd/src/ragel/smtp_addr_parser.rl" - {} - goto _again; -f16: -#line 41 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; - } -#line 14 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->user) { - addr->user_len = p - addr->user; - } - } - goto _again; -f22: -#line 49 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_EMPTY; - addr->addr = ""; - addr->user = addr->addr; - addr->domain = addr->addr; - } -#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_VALID; - } - goto _again; -f21: -#line 60 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_BRACED; - } -#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_VALID; - } - goto _again; -f0: -#line 64 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->addr = p; - } -#line 10 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->user = p; - } - goto _again; -f20: -#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->addr) { - addr->addr_len = p - addr->addr; - } - } -#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_VALID; - } - goto _again; -f10: -#line 8 "../rspamd/src/ragel/smtp_addr_parser.rl" - {} -#line 6 "../rspamd/src/ragel/smtp_addr_parser.rl" - {} -#line 35 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } - goto _again; -f19: -#line 24 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } -#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->addr) { - addr->addr_len = p - addr->addr; - } - } -#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_VALID; - } - goto _again; - -_again: - if ( cs == 0 ) - goto _out; - if ( ++p != pe ) - goto _resume; - _test_eof: {} - if ( p == eof ) - { - switch ( _smtp_addr_parser_eof_actions[cs] ) { - case 23: -#line 49 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_EMPTY; - addr->addr = ""; - addr->user = addr->addr; - addr->domain = addr->addr; - } -#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_VALID; - } - break; - case 22: -#line 60 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_BRACED; - } -#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_VALID; - } - break; - case 21: -#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->addr) { - addr->addr_len = p - addr->addr; - } - } -#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_VALID; - } - break; - case 20: -#line 24 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } -#line 68 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - if (addr->addr) { - addr->addr_len = p - addr->addr; - } - } -#line 56 "../rspamd/src/ragel/smtp_addr_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_VALID; - } - break; -#line 7419 "../rspamd/src/libmime/parsers/smtp_addr_parser.c" - } - } - - _out: {} - } - -#line 95 "../rspamd/src/ragel/smtp_addr_parser.rl" - - return cs; -} diff --git a/src/libmime/parsers/smtp_received_parser.c b/src/libmime/parsers/smtp_received_parser.c deleted file mode 100644 index c945208fb..000000000 --- a/src/libmime/parsers/smtp_received_parser.c +++ /dev/null @@ -1,6807 +0,0 @@ - -#line 1 "../rspamd/src/ragel/smtp_received_parser.rl" - -#line 237 "../rspamd/src/ragel/smtp_received_parser.rl" - - - -#line 9 "../rspamd/src/libmime/parsers/smtp_received_parser.c" -static const short _smtp_received_parser_key_offsets[] = { - 0, 0, 2, 4, 6, 8, 10, 11, - 12, 20, 32, 33, 34, 38, 57, 58, - 59, 67, 75, 75, 84, 86, 92, 93, - 94, 98, 100, 102, 103, 104, 112, 125, - 126, 127, 152, 168, 169, 170, 185, 203, - 204, 205, 208, 216, 217, 218, 226, 230, - 230, 235, 237, 246, 248, 248, 257, 259, - 264, 266, 269, 270, 271, 280, 281, 282, - 290, 292, 296, 297, 298, 307, 309, 310, - 312, 313, 314, 317, 319, 321, 323, 327, - 328, 329, 332, 334, 335, 337, 339, 340, - 342, 344, 346, 347, 348, 351, 353, 355, - 357, 359, 360, 361, 369, 370, 371, 379, - 379, 388, 390, 392, 392, 394, 403, 405, - 405, 410, 412, 415, 415, 420, 422, 425, - 430, 430, 435, 437, 440, 441, 442, 443, - 444, 445, 447, 448, 450, 451, 453, 454, - 455, 456, 457, 458, 459, 459, 470, 472, - 475, 477, 479, 482, 484, 486, 488, 490, - 493, 494, 495, 496, 500, 501, 502, 505, - 505, 510, 512, 515, 516, 517, 519, 520, - 522, 523, 524, 525, 526, 526, 536, 538, - 541, 543, 545, 548, 551, 553, 555, 555, - 565, 567, 570, 572, 574, 577, 580, 582, - 584, 603, 607, 611, 615, 617, 621, 621, - 638, 640, 659, 661, 666, 683, 702, 703, - 704, 712, 720, 720, 729, 731, 758, 759, - 760, 785, 803, 822, 839, 840, 841, 857, - 875, 894, 909, 923, 937, 944, 957, 958, - 959, 976, 984, 985, 986, 994, 1012, 1012, - 1031, 1033, 1050, 1052, 1061, 1063, 1063, 1072, - 1074, 1093, 1095, 1098, 1100, 1109, 1117, 1124, - 1138, 1147, 1155, 1164, 1168, 1173, 1177, 1187, - 1189, 1192, 1194, 1197, 1199, 1202, 1205, 1206, - 1209, 1210, 1213, 1214, 1224, 1234, 1244, 1254, - 1264, 1273, 1290, 1308, 1326, 1344, 1350, 1368, - 1386, 1404, 1422, 1428, 1446, 1464, 1482, 1500, - 1506, 1524, 1542, 1560, 1578, 1584, 1602, 1620, - 1638, 1656, 1662, 1680, 1698, 1716, 1734, 1740, - 1758, 1777, 1786, 1796, 1805, 1815, 1824, 1833, - 1842, 1847, 1857, 1863, 1873, 1879, 1898, 1917, - 1923, 1940, 1957, 1974, 1991, 1996, 2014, 2032, - 2049, 2067, 2085, 2103, 2109, 2126, 2144, 2162, - 2180, 2186, 2203, 2221, 2239, 2257, 2263, 2280, - 2298, 2316, 2334, 2340, 2357, 2375, 2393, 2411, - 2417, 2435, 2452, 2471, 2490, 2509, 2515, 2532, - 2551, 2570, 2589, 2595, 2612, 2631, 2650, 2669, - 2675, 2692, 2711, 2730, 2749, 2755, 2772, 2791, - 2810, 2829, 2847, 2865, 2883, 2901, 2919, 2937, - 2955, 2973, 2991, 3009, 3027, 3045, 3051, 3059, - 3063, 3067, 3072, 3074, 3078, 3092, 3106, 3120, - 3127, 3137, 3145, 3151, 3155, 3164, 3172, 3181, - 3185, 3190, 3191, 3201, 3203, 3206, 3208, 3211, - 3213, 3216, 3219, 3220, 3223, 3224, 3227, 3228, - 3238, 3248, 3258, 3268, 3278, 3287, 3304, 3322, - 3340, 3358, 3364, 3382, 3400, 3418, 3436, 3442, - 3460, 3478, 3496, 3514, 3520, 3538, 3556, 3574, - 3592, 3598, 3616, 3634, 3652, 3670, 3676, 3694, - 3712, 3730, 3748, 3754, 3772, 3791, 3800, 3810, - 3819, 3829, 3838, 3847, 3856, 3861, 3871, 3877, - 3887, 3893, 3912, 3931, 3937, 3954, 3971, 3988, - 4005, 4010, 4028, 4046, 4063, 4081, 4099, 4117, - 4123, 4140, 4158, 4176, 4194, 4200, 4217, 4235, - 4253, 4271, 4277, 4294, 4312, 4330, 4348, 4354, - 4371, 4389, 4407, 4425, 4431, 4449, 4466, 4485, - 4504, 4523, 4529, 4546, 4565, 4584, 4603, 4609, - 4626, 4645, 4664, 4683, 4689, 4706, 4725, 4744, - 4763, 4769, 4786, 4805, 4824, 4843, 4861, 4879, - 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, - 5041, 5059, 5065, 5069, 5073, 5074, 5076, 5080, - 5086, 5097, 5098, 5106, 5120, 5126, 5137, 5138, - 5146, 5160, 5164, 5168, 5169, 5171, 5175, 5177, - 5177, 5195, 5197, 5216, 5218, 5223, 5238, 5245, - 5262, 5264, 5282, 5299, 5300, 5301, 5317, 5335, - 5336, 5337, 5356, 5364, 5365, 5366, 5374, 5394, - 5394, 5415, 5417, 5434, 5436, 5445, 5447, 5447, - 5456, 5458, 5479, 5481, 5484, 5486, 5505, 5524, - 5538, 5552, 5567, 5582, 5596, 5600, 5605, 5606, - 5608, 5608, 5626, 5628, 5647, 5649, 5654, 5669, - 5686, 5688, 5706, 5725, 5742, 5743, 5744, 5759, - 5777, 5778, 5779, 5802, 5810, 5811, 5812, 5820, - 5844, 5844, 5869, 5871, 5888, 5890, 5899, 5901, - 5901, 5910, 5912, 5937, 5939, 5942, 5944, 5963, - 5982, 6001, 6020, 6039, 6056, 6057, 6058, 6077, - 6095, 6096, 6097, 6118, 6126, 6127, 6128, 6136, - 6158, 6158, 6181, 6183, 6200, 6202, 6211, 6213, - 6213, 6222, 6224, 6247, 6249, 6252, 6254, 6273, - 6292, 6311, 6330, 6350, 6370, 6390, 6410, 6429, - 6448, 6468, 6488, 6507, 6526, 6546, 6566, 6585, - 6604, 6624, 6644, 6663, 6665, 6665, 6686, 6688, - 6707, 6709, 6714, 6734, 6754, 6774, 6794, 6811, - 6813, 6831, 6850, 6852, 6852, 6869, 6871, 6890, - 6892, 6897, 6914, 6916, 6918, 6918, 6945, 6947, - 6964, 6966, 6975, 6977, 6980, 6982, 7001, 7020, - 7039, 7058, 7084, 7108, 7109, 7110, 7119, 7141, - 7163, 7186, 7197, 7208, 7214, 7219, 7220, 7224, - 7250, 7271, 7292, 7298, 7300, 7306, 7317, 7326, - 7353, 7361, 7367, 7369, 7392, 7415, 7436, 7457, - 7463, 7465, 7488, 7509, 7530, 7536, 7538, 7561, - 7584, 7605, 7626, 7632, 7634, 7657, 7680, 7703, - 7724, 7745, 7751, 7753, 7755, 7779, 7792, 7806, - 7819, 7833, 7846, 7860, 7874, 7884, 7898, 7908, - 7922, 7932, 7956, 7980, 8004, 8028, 8052, 8075, - 8099, 8123, 8147, 8171, 8183, 8207, 8231, 8255, - 8279, 8291, 8315, 8339, 8363, 8387, 8399, 8423, - 8447, 8471, 8495, 8507, 8531, 8555, 8579, 8603, - 8615, 8639, 8663, 8687, 8711, 8723, 8747, 8772, - 8787, 8803, 8818, 8834, 8849, 8864, 8879, 8890, - 8906, 8918, 8934, 8946, 8971, 8996, 9008, 9031, - 9054, 9077, 9100, 9111, 9135, 9159, 9182, 9206, - 9230, 9254, 9266, 9289, 9313, 9337, 9361, 9373, - 9396, 9420, 9444, 9468, 9480, 9503, 9527, 9551, - 9575, 9587, 9610, 9634, 9658, 9682, 9694, 9718, - 9741, 9766, 9791, 9816, 9828, 9851, 9876, 9901, - 9926, 9938, 9961, 9986, 10011, 10036, 10048, 10071, - 10096, 10121, 10146, 10158, 10181, 10206, 10231, 10256, - 10280, 10304, 10328, 10352, 10376, 10400, 10424, 10448, - 10472, 10496, 10520, 10544, 10556, 10558, 10558, 10569, - 10571, 10580, 10582, 10609, 10611, 10634, 10656, 10678, - 10698, 10722, 10745, 10745, 10772, 10774, 10791, 10793, - 10813, 10815, 10818, 10820, 10839, 10858, 10877, 10896, - 10905, 10914, 10922, 10929, 10943, 10952, 10960, 10969, - 10973, 10978, 10980, 10981, 10982, 10984, 10991, 11002, - 11003, 11004, 11006, 11015, 11023, 11032, 11036, 11046, - 11048, 11051, 11053, 11056, 11058, 11061, 11064, 11065, - 11068, 11069, 11072, 11073, 11083, 11093, 11103, 11113, - 11123, 11132, 11149, 11167, 11185, 11203, 11209, 11227, - 11245, 11263, 11281, 11287, 11305, 11323, 11341, 11359, - 11365, 11383, 11401, 11419, 11437, 11443, 11461, 11479, - 11497, 11515, 11521, 11539, 11557, 11575, 11593, 11599, - 11617, 11636, 11645, 11655, 11664, 11674, 11683, 11692, - 11701, 11706, 11716, 11722, 11732, 11738, 11757, 11776, - 11782, 11799, 11816, 11833, 11850, 11855, 11873, 11891, - 11908, 11926, 11944, 11962, 11968, 11985, 12003, 12021, - 12039, 12045, 12062, 12080, 12098, 12116, 12122, 12139, - 12157, 12175, 12193, 12199, 12216, 12234, 12252, 12270, - 12276, 12294, 12311, 12330, 12349, 12368, 12374, 12391, - 12410, 12429, 12448, 12454, 12471, 12490, 12509, 12528, - 12534, 12551, 12570, 12589, 12608, 12614, 12631, 12650, - 12669, 12688, 12706, 12724, 12742, 12760, 12778, 12796, - 12814, 12832, 12850, 12868, 12886, 12904, 12910, 12910, - 12914, 12916, 12926, 12935, 12943, 12950, 12962, 12962, - 12966, 12968, 12976, 12986, 12988, 12991, 12993, 12996, - 12998, 13001, 13004, 13005, 13008, 13009, 13012, 13013, - 13023, 13033, 13043, 13053, 13063, 13072, 13089, 13107, - 13125, 13143, 13149, 13167, 13185, 13203, 13221, 13227, - 13245, 13263, 13281, 13299, 13305, 13323, 13341, 13359, - 13377, 13383, 13401, 13419, 13437, 13455, 13461, 13479, - 13497, 13515, 13533, 13539, 13557, 13576, 13585, 13595, - 13604, 13614, 13623, 13632, 13641, 13646, 13656, 13662, - 13672, 13678, 13697, 13716, 13722, 13739, 13756, 13773, - 13790, 13795, 13813, 13831, 13848, 13866, 13884, 13902, - 13908, 13925, 13943, 13961, 13979, 13985, 14002, 14020, - 14038, 14056, 14062, 14079, 14097, 14115, 14133, 14139, - 14156, 14174, 14192, 14210, 14216, 14234, 14251, 14270, - 14289, 14308, 14314, 14331, 14350, 14369, 14388, 14394, - 14411, 14430, 14449, 14468, 14474, 14491, 14510, 14529, - 14548, 14554, 14571, 14590, 14609, 14628, 14646, 14664, - 14682, 14700, 14718, 14736, 14754, 14772, 14790, 14808, - 14826, 14844, 14850, 14850, 14860, 14862, 14876, 14878, - 14888, 14890, 14890, 14896, 14898, 14907, 14909, 14912, - 14917, 14941, 14942, 14943, 14952, 14974, 14996, 15019, - 15030, 15041, 15047, 15052, 15053, 15056, 15067, 15073, - 15084, 15093, 15099, 15107, 15114, 15120, 15122, 15124, - 15148, 15161, 15175, 15188, 15202, 15215, 15229, 15243, - 15253, 15267, 15277, 15291, 15301, 15325, 15349, 15373, - 15397, 15421, 15444, 15468, 15492, 15516, 15540, 15552, - 15576, 15600, 15624, 15648, 15660, 15684, 15708, 15732, - 15756, 15768, 15792, 15816, 15840, 15864, 15876, 15900, - 15924, 15948, 15972, 15984, 16008, 16032, 16056, 16080, - 16092, 16116, 16141, 16156, 16172, 16187, 16203, 16218, - 16233, 16248, 16259, 16275, 16287, 16303, 16315, 16340, - 16365, 16377, 16400, 16423, 16446, 16469, 16480, 16504, - 16528, 16551, 16575, 16599, 16623, 16635, 16658, 16682, - 16706, 16730, 16742, 16765, 16789, 16813, 16837, 16849, - 16872, 16896, 16920, 16944, 16956, 16979, 17003, 17027, - 17051, 17063, 17087, 17110, 17135, 17160, 17185, 17197, - 17220, 17245, 17270, 17295, 17307, 17330, 17355, 17380, - 17405, 17417, 17440, 17465, 17490, 17515, 17527, 17550, - 17575, 17600, 17625, 17649, 17673, 17697, 17721, 17745, - 17769, 17793, 17817, 17841, 17865, 17889, 17913, 17925, - 17927, 17927, 17938, 17940, 17949, 17951, 17957, 17959, - 17982, 18004, 18026, 18046, 18070, 18093, 18093, 18099, - 18101, 18121, 18123, 18126, 18135, 18144, 18152, 18159, - 18172, 18181, 18189, 18198, 18202, 18207, 18209, 18210, - 18211, 18213, 18220, 18231, 18232, 18233, 18235, 18244, - 18252, 18261, 18265, 18275, 18277, 18280, 18282, 18285, - 18287, 18290, 18293, 18294, 18297, 18298, 18301, 18302, - 18312, 18322, 18332, 18342, 18352, 18361, 18378, 18396, - 18414, 18432, 18438, 18456, 18474, 18492, 18510, 18516, - 18534, 18552, 18570, 18588, 18594, 18612, 18630, 18648, - 18666, 18672, 18690, 18708, 18726, 18744, 18750, 18768, - 18786, 18804, 18822, 18828, 18846, 18865, 18874, 18884, - 18893, 18903, 18912, 18921, 18930, 18935, 18945, 18951, - 18961, 18967, 18986, 19005, 19011, 19028, 19045, 19062, - 19079, 19084, 19102, 19120, 19137, 19155, 19173, 19191, - 19197, 19214, 19232, 19250, 19268, 19274, 19291, 19309, - 19327, 19345, 19351, 19368, 19386, 19404, 19422, 19428, - 19445, 19463, 19481, 19499, 19505, 19523, 19540, 19559, - 19578, 19597, 19603, 19620, 19639, 19658, 19677, 19683, - 19700, 19719, 19738, 19757, 19763, 19780, 19799, 19818, - 19837, 19843, 19860, 19879, 19898, 19917, 19935, 19953, - 19971, 19989, 20007, 20025, 20043, 20061, 20079, 20097, - 20115, 20133, 20139, 20139, 20143, 20145, 20155, 20164, - 20172, 20179, 20191, 20191, 20195, 20197, 20205, 20215, - 20217, 20220, 20222, 20225, 20227, 20230, 20233, 20234, - 20237, 20238, 20241, 20242, 20252, 20262, 20272, 20282, - 20292, 20301, 20318, 20336, 20354, 20372, 20378, 20396, - 20414, 20432, 20450, 20456, 20474, 20492, 20510, 20528, - 20534, 20552, 20570, 20588, 20606, 20612, 20630, 20648, - 20666, 20684, 20690, 20708, 20726, 20744, 20762, 20768, - 20786, 20805, 20814, 20824, 20833, 20843, 20852, 20861, - 20870, 20875, 20885, 20891, 20901, 20907, 20926, 20945, - 20951, 20968, 20985, 21002, 21019, 21024, 21042, 21060, - 21077, 21095, 21113, 21131, 21137, 21154, 21172, 21190, - 21208, 21214, 21231, 21249, 21267, 21285, 21291, 21308, - 21326, 21344, 21362, 21368, 21385, 21403, 21421, 21439, - 21445, 21463, 21480, 21499, 21518, 21537, 21543, 21560, - 21579, 21598, 21617, 21623, 21640, 21659, 21678, 21697, - 21703, 21720, 21739, 21758, 21777, 21783, 21800, 21819, - 21838, 21857, 21875, 21893, 21911, 21929, 21947, 21965, - 21983, 22001, 22019, 22037, 22055, 22073, 22079, 22079, - 22089, 22091, 22104, 22106, 22116, 22119, 22121, 22125 -}; - -static const char _smtp_received_parser_trans_keys[] = { - 70, 102, 82, 114, 79, 111, 77, 109, - 13, 32, 10, 32, 32, 91, 48, 57, - 65, 90, 97, 122, 13, 32, 40, 45, - 46, 95, 48, 57, 65, 90, 97, 122, - 10, 32, 32, 40, 66, 98, 13, 41, - 91, 32, 39, 42, 47, 48, 57, 58, - 64, 65, 90, 93, 96, 97, 122, 123, - 126, 10, 32, 32, 41, 33, 39, 42, - 91, 93, 126, 13, 41, 32, 39, 42, - 91, 93, 126, 10, 13, 41, 32, 39, - 42, 91, 93, 126, 10, 32, 10, 13, - 32, 40, 66, 98, 10, 32, 32, 40, - 66, 98, 89, 121, 13, 32, 10, 32, - 32, 91, 48, 57, 65, 90, 97, 122, - 13, 32, 40, 45, 46, 59, 95, 48, - 57, 65, 90, 97, 122, 10, 32, 32, - 33, 40, 45, 59, 61, 63, 70, 73, - 86, 87, 102, 105, 118, 119, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 13, 32, 33, 45, 61, 63, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 10, 32, 32, 34, 45, 61, 63, 33, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 13, 32, 33, 40, 45, 59, 61, - 63, 35, 39, 42, 43, 47, 57, 65, - 90, 94, 126, 10, 32, 32, 40, 59, - 13, 41, 32, 39, 42, 91, 93, 126, - 10, 32, 32, 41, 33, 39, 42, 91, - 93, 126, 13, 32, 40, 59, 10, 13, - 32, 40, 59, 10, 32, 10, 13, 41, - 32, 39, 42, 91, 93, 126, 10, 32, - 10, 13, 41, 32, 39, 42, 91, 93, - 126, 10, 32, 10, 13, 32, 40, 59, - 10, 32, 10, 13, 32, 10, 32, 13, - 32, 70, 77, 83, 84, 87, 48, 57, - 10, 32, 32, 70, 77, 83, 84, 87, - 48, 57, 48, 57, 13, 32, 48, 57, - 10, 32, 32, 65, 68, 70, 74, 77, - 78, 79, 83, 112, 117, 114, 13, 32, - 10, 32, 32, 48, 57, 48, 57, 48, - 57, 48, 57, 13, 32, 48, 57, 10, - 32, 32, 48, 57, 48, 57, 58, 48, - 57, 48, 57, 58, 48, 57, 48, 57, - 13, 32, 10, 32, 32, 43, 95, 48, - 57, 48, 57, 48, 57, 48, 57, 10, - 32, 13, 41, 32, 39, 42, 91, 93, - 126, 10, 32, 32, 41, 33, 39, 42, - 91, 93, 126, 10, 13, 41, 32, 39, - 42, 91, 93, 126, 10, 32, 10, 32, - 10, 32, 10, 13, 41, 32, 39, 42, - 91, 93, 126, 10, 32, 10, 13, 32, - 43, 95, 10, 32, 10, 48, 57, 10, - 13, 32, 48, 57, 10, 32, 10, 48, - 57, 10, 13, 32, 48, 57, 10, 13, - 32, 48, 57, 10, 32, 10, 48, 57, - 103, 101, 99, 101, 98, 97, 117, 110, - 108, 110, 97, 114, 121, 111, 118, 99, - 116, 101, 112, 10, 13, 32, 65, 68, - 70, 74, 77, 78, 79, 83, 10, 32, - 10, 112, 117, 10, 101, 10, 101, 10, - 97, 117, 10, 97, 10, 111, 10, 99, - 10, 101, 10, 48, 57, 114, 105, 44, - 13, 32, 48, 57, 10, 32, 32, 48, - 57, 10, 13, 32, 48, 57, 10, 32, - 10, 48, 57, 111, 110, 97, 117, 116, - 104, 117, 117, 101, 101, 100, 10, 13, - 32, 70, 77, 83, 84, 87, 48, 57, - 10, 32, 10, 48, 57, 10, 114, 10, - 111, 10, 97, 117, 10, 104, 117, 10, - 101, 10, 32, 10, 13, 32, 70, 77, - 83, 84, 87, 48, 57, 10, 32, 10, - 48, 57, 10, 114, 10, 111, 10, 97, - 117, 10, 104, 117, 10, 101, 13, 32, - 10, 13, 32, 33, 40, 45, 59, 61, - 63, 35, 39, 42, 43, 47, 57, 65, - 90, 94, 126, 34, 92, 32, 126, 34, - 92, 32, 126, 13, 32, 40, 59, 32, - 126, 34, 92, 32, 126, 10, 13, 32, - 34, 45, 61, 63, 33, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 32, - 10, 13, 32, 33, 40, 45, 59, 61, - 63, 35, 39, 42, 43, 47, 57, 65, - 90, 94, 126, 10, 32, 10, 34, 92, - 32, 126, 10, 13, 32, 33, 45, 61, - 63, 35, 39, 42, 43, 47, 57, 65, - 90, 94, 126, 13, 41, 91, 32, 39, - 42, 47, 48, 57, 58, 64, 65, 90, - 93, 96, 97, 122, 123, 126, 10, 32, - 32, 41, 33, 39, 42, 91, 93, 126, - 13, 41, 32, 39, 42, 91, 93, 126, - 10, 13, 41, 32, 39, 42, 91, 93, - 126, 10, 32, 10, 13, 32, 33, 40, - 45, 59, 61, 63, 70, 73, 86, 87, - 102, 105, 118, 119, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 32, - 32, 33, 40, 45, 59, 61, 63, 70, - 73, 86, 87, 102, 105, 118, 119, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 13, 32, 33, 45, 61, 63, 79, - 111, 35, 39, 42, 43, 47, 57, 65, - 90, 94, 126, 10, 13, 32, 33, 45, - 61, 63, 82, 114, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 13, - 32, 33, 45, 61, 63, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 32, 32, 34, 45, 60, 61, 64, 33, - 39, 42, 43, 47, 57, 63, 90, 94, - 126, 13, 32, 33, 40, 46, 59, 61, - 64, 35, 39, 42, 43, 45, 57, 63, - 90, 94, 126, 10, 13, 32, 33, 40, - 46, 59, 61, 64, 35, 39, 42, 43, - 45, 57, 63, 90, 94, 126, 10, 33, - 45, 61, 63, 35, 39, 42, 43, 47, - 57, 65, 90, 94, 126, 33, 46, 61, - 64, 35, 39, 42, 43, 45, 57, 63, - 90, 94, 126, 33, 45, 61, 63, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 91, 48, 57, 65, 90, 97, 122, - 13, 32, 40, 45, 46, 59, 95, 48, - 57, 65, 90, 97, 122, 10, 32, 32, - 33, 40, 45, 59, 61, 63, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 13, 41, 32, 39, 42, 91, 93, 126, - 10, 32, 32, 41, 33, 39, 42, 91, - 93, 126, 13, 32, 33, 40, 45, 59, - 61, 63, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 10, 13, 32, 33, - 40, 45, 59, 61, 63, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 32, 10, 13, 32, 33, 45, 61, 63, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 32, 10, 13, 41, 32, - 39, 42, 91, 93, 126, 10, 32, 10, - 13, 41, 32, 39, 42, 91, 93, 126, - 10, 32, 10, 13, 32, 33, 40, 45, - 59, 61, 63, 35, 39, 42, 43, 47, - 57, 65, 90, 94, 126, 10, 32, 10, - 13, 32, 10, 32, 10, 45, 95, 48, - 57, 65, 90, 97, 122, 45, 95, 48, - 57, 65, 90, 97, 122, 10, 48, 57, - 65, 90, 97, 122, 10, 13, 32, 40, - 45, 46, 59, 95, 48, 57, 65, 90, - 97, 122, 45, 73, 95, 48, 57, 65, - 90, 97, 122, 45, 95, 48, 57, 65, - 90, 97, 122, 45, 58, 95, 48, 57, - 65, 90, 97, 122, 33, 90, 94, 126, - 93, 33, 90, 94, 126, 13, 32, 40, - 59, 45, 46, 58, 95, 48, 57, 65, - 90, 97, 122, 48, 57, 46, 48, 57, - 48, 57, 46, 48, 57, 48, 57, 93, - 48, 57, 93, 48, 57, 93, 46, 48, - 57, 46, 46, 48, 57, 46, 45, 46, - 58, 95, 48, 57, 65, 90, 97, 122, - 45, 46, 58, 95, 48, 57, 65, 90, - 97, 122, 45, 58, 80, 95, 48, 57, - 65, 90, 97, 122, 45, 58, 95, 118, - 48, 57, 65, 90, 97, 122, 45, 54, - 58, 95, 48, 57, 65, 90, 97, 122, - 45, 58, 95, 48, 57, 65, 90, 97, - 122, 58, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 90, 94, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 93, 33, 47, 48, 57, 58, 90, - 94, 126, 46, 93, 33, 47, 48, 57, - 58, 90, 94, 126, 93, 33, 47, 48, - 57, 58, 90, 94, 126, 46, 93, 33, - 47, 48, 57, 58, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 93, 33, 47, 48, 57, 58, 90, - 94, 126, 93, 33, 90, 94, 126, 46, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 46, 93, 33, 90, 94, 126, 46, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 46, 93, 33, 90, 94, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 93, - 33, 90, 94, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 93, 33, 47, 48, 57, 58, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 90, 94, 126, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 10, 91, 48, 57, 65, - 90, 97, 122, 34, 92, 32, 126, 34, - 92, 32, 126, 13, 32, 40, 59, 64, - 32, 126, 34, 92, 32, 126, 34, 45, - 61, 64, 33, 39, 42, 43, 47, 57, - 63, 90, 94, 126, 33, 46, 61, 64, - 35, 39, 42, 43, 45, 57, 63, 90, - 94, 126, 33, 45, 61, 63, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 91, 48, 57, 65, 90, 97, 122, 45, - 46, 62, 95, 48, 57, 65, 90, 97, - 122, 45, 95, 48, 57, 65, 90, 97, - 122, 48, 57, 65, 90, 97, 122, 13, - 32, 40, 59, 45, 73, 95, 48, 57, - 65, 90, 97, 122, 45, 95, 48, 57, - 65, 90, 97, 122, 45, 58, 95, 48, - 57, 65, 90, 97, 122, 33, 90, 94, - 126, 93, 33, 90, 94, 126, 62, 45, - 46, 58, 95, 48, 57, 65, 90, 97, - 122, 48, 57, 46, 48, 57, 48, 57, - 46, 48, 57, 48, 57, 93, 48, 57, - 93, 48, 57, 93, 46, 48, 57, 46, - 46, 48, 57, 46, 45, 46, 58, 95, - 48, 57, 65, 90, 97, 122, 45, 46, - 58, 95, 48, 57, 65, 90, 97, 122, - 45, 58, 80, 95, 48, 57, 65, 90, - 97, 122, 45, 58, 95, 118, 48, 57, - 65, 90, 97, 122, 45, 54, 58, 95, - 48, 57, 65, 90, 97, 122, 45, 58, - 95, 48, 57, 65, 90, 97, 122, 58, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 90, 94, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 46, 93, 33, 47, 48, 57, 58, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 90, 94, 126, 46, 93, 33, 47, 48, - 57, 58, 90, 94, 126, 93, 33, 47, - 48, 57, 58, 90, 94, 126, 93, 33, - 47, 48, 57, 58, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 93, 33, 90, 94, 126, 46, 93, 33, - 47, 48, 57, 58, 90, 94, 126, 46, - 93, 33, 90, 94, 126, 46, 93, 33, - 47, 48, 57, 58, 90, 94, 126, 46, - 93, 33, 90, 94, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 93, 33, 90, - 94, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 90, 94, 126, - 93, 33, 47, 48, 57, 58, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 90, 94, 126, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 34, 92, 32, 126, 34, 92, 32, - 126, 64, 32, 126, 34, 92, 32, 126, - 48, 57, 65, 90, 97, 122, 44, 45, - 46, 58, 95, 48, 57, 65, 90, 97, - 122, 64, 45, 95, 48, 57, 65, 90, - 97, 122, 34, 45, 61, 63, 33, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 48, 57, 65, 90, 97, 122, 44, 45, - 46, 58, 95, 48, 57, 65, 90, 97, - 122, 64, 45, 95, 48, 57, 65, 90, - 97, 122, 34, 45, 61, 63, 33, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 34, 92, 32, 126, 34, 92, 32, 126, - 64, 32, 126, 34, 92, 32, 126, 10, - 32, 10, 13, 32, 34, 45, 60, 61, - 64, 33, 39, 42, 43, 47, 57, 63, - 90, 94, 126, 10, 32, 10, 13, 32, - 33, 40, 46, 59, 61, 64, 35, 39, - 42, 43, 45, 57, 63, 90, 94, 126, - 10, 32, 10, 34, 92, 32, 126, 10, - 34, 45, 61, 64, 33, 39, 42, 43, - 47, 57, 63, 90, 94, 126, 10, 48, - 57, 65, 90, 97, 122, 10, 13, 32, - 33, 45, 61, 63, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 32, - 13, 32, 33, 45, 61, 63, 68, 100, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 13, 32, 33, 45, 61, - 63, 35, 39, 42, 43, 47, 57, 65, - 90, 94, 126, 10, 32, 32, 34, 45, - 60, 61, 63, 33, 39, 42, 43, 47, - 57, 65, 90, 94, 126, 13, 32, 33, - 40, 45, 59, 61, 63, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 32, 32, 33, 40, 45, 59, 61, 63, - 70, 102, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 13, 41, 32, 39, - 42, 91, 93, 126, 10, 32, 32, 41, - 33, 39, 42, 91, 93, 126, 13, 32, - 33, 40, 45, 59, 61, 63, 70, 102, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 13, 32, 33, 40, 45, - 59, 61, 63, 70, 102, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 32, 10, 13, 32, 33, 45, 61, 63, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 32, 10, 13, 41, 32, - 39, 42, 91, 93, 126, 10, 32, 10, - 13, 41, 32, 39, 42, 91, 93, 126, - 10, 32, 10, 13, 32, 33, 40, 45, - 59, 61, 63, 70, 102, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 32, 10, 13, 32, 10, 32, 10, 13, - 32, 33, 45, 61, 63, 79, 111, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 10, 13, 32, 33, 40, 45, 59, - 61, 63, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 33, 45, 61, 63, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 33, 46, 61, 64, 35, 39, - 42, 43, 45, 57, 63, 90, 94, 126, - 33, 45, 61, 63, 91, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 33, - 46, 62, 35, 39, 42, 43, 45, 57, - 61, 63, 65, 90, 94, 126, 33, 45, - 61, 63, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 13, 32, 40, 59, - 93, 33, 90, 94, 126, 62, 10, 32, - 10, 13, 32, 34, 45, 60, 61, 63, - 33, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 32, 10, 13, 32, 33, - 40, 45, 59, 61, 63, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 32, 10, 34, 92, 32, 126, 10, 33, - 45, 61, 63, 35, 39, 42, 43, 47, - 57, 65, 90, 94, 126, 10, 13, 32, - 33, 45, 61, 63, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 32, - 13, 32, 33, 45, 61, 63, 73, 105, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 13, 32, 33, 45, 61, - 63, 65, 97, 35, 39, 42, 43, 47, - 57, 66, 90, 94, 126, 10, 13, 32, - 33, 45, 61, 63, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 32, - 32, 34, 45, 61, 63, 33, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 13, - 32, 33, 40, 45, 59, 61, 63, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 10, 32, 32, 33, 40, 45, 59, - 61, 63, 70, 73, 87, 102, 105, 119, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 13, 41, 32, 39, 42, 91, - 93, 126, 10, 32, 32, 41, 33, 39, - 42, 91, 93, 126, 13, 32, 33, 40, - 45, 59, 61, 63, 70, 73, 87, 102, - 105, 119, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 10, 13, 32, 33, - 40, 45, 59, 61, 63, 70, 73, 87, - 102, 105, 119, 35, 39, 42, 43, 47, - 57, 65, 90, 94, 126, 10, 32, 10, - 13, 32, 33, 45, 61, 63, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 10, 32, 10, 13, 41, 32, 39, 42, - 91, 93, 126, 10, 32, 10, 13, 41, - 32, 39, 42, 91, 93, 126, 10, 32, - 10, 13, 32, 33, 40, 45, 59, 61, - 63, 70, 73, 87, 102, 105, 119, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 10, 32, 10, 13, 32, 10, 32, - 10, 13, 32, 33, 45, 61, 63, 79, - 111, 35, 39, 42, 43, 47, 57, 65, - 90, 94, 126, 10, 13, 32, 33, 45, - 61, 63, 68, 100, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 13, - 32, 33, 45, 61, 63, 73, 105, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 10, 13, 32, 33, 45, 61, 63, - 84, 116, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 10, 13, 32, 33, - 45, 61, 63, 72, 104, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 13, 32, 33, 45, 61, 63, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 10, 32, 32, 34, 45, 61, 63, 69, - 73, 76, 83, 33, 39, 42, 43, 47, - 57, 65, 90, 94, 126, 13, 32, 33, - 40, 45, 59, 61, 63, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 32, 32, 33, 40, 45, 59, 61, 63, - 70, 73, 102, 105, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 13, 41, - 32, 39, 42, 91, 93, 126, 10, 32, - 32, 41, 33, 39, 42, 91, 93, 126, - 13, 32, 33, 40, 45, 59, 61, 63, - 70, 73, 102, 105, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 13, - 32, 33, 40, 45, 59, 61, 63, 70, - 73, 102, 105, 35, 39, 42, 43, 47, - 57, 65, 90, 94, 126, 10, 32, 10, - 13, 32, 33, 45, 61, 63, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 10, 32, 10, 13, 41, 32, 39, 42, - 91, 93, 126, 10, 32, 10, 13, 41, - 32, 39, 42, 91, 93, 126, 10, 32, - 10, 13, 32, 33, 40, 45, 59, 61, - 63, 70, 73, 102, 105, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 32, 10, 13, 32, 10, 32, 10, 13, - 32, 33, 45, 61, 63, 79, 111, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 10, 13, 32, 33, 45, 61, 63, - 68, 100, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 10, 13, 32, 33, - 40, 45, 59, 61, 63, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 13, - 32, 33, 40, 45, 59, 61, 63, 83, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 13, 32, 33, 40, 45, - 59, 61, 63, 77, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 13, - 32, 33, 40, 45, 59, 61, 63, 84, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 13, 32, 33, 40, 45, - 59, 61, 63, 80, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 13, - 32, 33, 40, 45, 59, 61, 63, 83, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 13, 32, 33, 40, 45, - 59, 61, 63, 35, 39, 42, 43, 47, - 57, 65, 90, 94, 126, 13, 32, 33, - 40, 45, 59, 61, 63, 77, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 10, 13, 32, 33, 40, 45, 59, 61, - 63, 65, 35, 39, 42, 43, 47, 57, - 66, 90, 94, 126, 10, 13, 32, 33, - 40, 45, 59, 61, 63, 80, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 10, 13, 32, 33, 40, 45, 59, 61, - 63, 35, 39, 42, 43, 47, 57, 65, - 90, 94, 126, 13, 32, 33, 40, 45, - 59, 61, 63, 77, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 13, - 32, 33, 40, 45, 59, 61, 63, 84, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 13, 32, 33, 40, 45, - 59, 61, 63, 80, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 13, - 32, 33, 40, 45, 59, 61, 63, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 13, 32, 33, 40, 45, 59, 61, - 63, 77, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 10, 13, 32, 33, - 40, 45, 59, 61, 63, 84, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 10, 13, 32, 33, 40, 45, 59, 61, - 63, 80, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 10, 13, 32, 33, - 40, 45, 59, 61, 63, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 32, 10, 13, 32, 34, 45, 61, 63, - 69, 73, 76, 83, 33, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 32, - 10, 13, 32, 33, 40, 45, 59, 61, - 63, 35, 39, 42, 43, 47, 57, 65, - 90, 94, 126, 10, 32, 10, 34, 92, - 32, 126, 10, 13, 32, 33, 40, 45, - 59, 61, 63, 83, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 13, - 32, 33, 40, 45, 59, 61, 63, 77, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 13, 32, 33, 40, 45, - 59, 61, 63, 77, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, 10, 13, - 32, 33, 40, 45, 59, 61, 63, 77, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 13, 32, 33, 45, 61, - 63, 35, 39, 42, 43, 47, 57, 65, - 90, 94, 126, 10, 32, 13, 32, 33, - 45, 61, 63, 73, 105, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 13, 32, 33, 40, 45, 59, 61, 63, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 32, 10, 13, 32, 34, - 45, 61, 63, 33, 39, 42, 43, 47, - 57, 65, 90, 94, 126, 10, 32, 10, - 13, 32, 33, 40, 45, 59, 61, 63, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 32, 10, 34, 92, 32, - 126, 10, 13, 32, 33, 45, 61, 63, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 32, 10, 32, 10, 13, - 32, 33, 40, 45, 59, 61, 63, 70, - 73, 86, 87, 102, 105, 118, 119, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 10, 32, 10, 13, 32, 33, 45, - 61, 63, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 10, 32, 10, 13, - 41, 32, 39, 42, 91, 93, 126, 10, - 32, 10, 13, 32, 10, 32, 10, 13, - 32, 33, 45, 61, 63, 79, 111, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 10, 13, 32, 33, 45, 61, 63, - 68, 100, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 10, 13, 32, 33, - 45, 61, 63, 73, 105, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 13, 32, 33, 45, 61, 63, 73, 105, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 13, 32, 33, 40, 45, 59, - 61, 63, 70, 73, 86, 87, 102, 105, - 118, 119, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 10, 13, 32, 41, - 45, 46, 91, 95, 33, 39, 42, 47, - 48, 57, 58, 64, 65, 90, 93, 96, - 97, 122, 123, 126, 10, 32, 32, 41, - 91, 33, 39, 42, 90, 93, 126, 13, - 41, 45, 73, 91, 95, 32, 39, 42, - 47, 48, 57, 58, 64, 65, 90, 93, - 96, 97, 122, 123, 126, 10, 13, 41, - 45, 91, 95, 32, 39, 42, 47, 48, - 57, 58, 64, 65, 90, 93, 96, 97, - 122, 123, 126, 10, 13, 41, 45, 58, - 91, 95, 32, 39, 42, 47, 48, 57, - 59, 64, 65, 90, 93, 96, 97, 122, - 123, 126, 10, 13, 32, 40, 41, 91, - 93, 33, 90, 94, 126, 10, 13, 32, - 40, 41, 91, 93, 33, 90, 94, 126, - 10, 93, 33, 90, 94, 126, 93, 33, - 90, 94, 126, 41, 13, 32, 40, 59, - 10, 13, 32, 34, 40, 41, 44, 46, - 58, 59, 60, 62, 64, 70, 73, 86, - 87, 93, 102, 105, 118, 119, 33, 90, - 94, 126, 10, 13, 32, 34, 44, 46, - 61, 63, 93, 33, 39, 40, 41, 42, - 57, 58, 64, 65, 90, 94, 126, 10, - 13, 32, 34, 44, 46, 61, 63, 93, - 33, 39, 40, 41, 42, 57, 58, 64, - 65, 90, 94, 126, 10, 93, 33, 90, - 94, 126, 10, 41, 10, 93, 33, 90, - 94, 126, 10, 13, 32, 40, 41, 91, - 93, 33, 90, 94, 126, 10, 13, 41, - 32, 39, 42, 91, 93, 126, 10, 13, - 32, 33, 40, 45, 59, 61, 63, 70, - 73, 86, 87, 102, 105, 118, 119, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 10, 13, 32, 93, 33, 90, 94, - 126, 10, 93, 33, 90, 94, 126, 10, - 41, 10, 13, 32, 34, 44, 46, 61, - 63, 79, 93, 111, 33, 39, 40, 41, - 42, 57, 58, 64, 65, 90, 94, 126, - 10, 13, 32, 34, 44, 46, 61, 63, - 82, 93, 114, 33, 39, 40, 41, 42, - 57, 58, 64, 65, 90, 94, 126, 10, - 13, 32, 34, 44, 46, 61, 63, 93, - 33, 39, 40, 41, 42, 57, 58, 64, - 65, 90, 94, 126, 10, 13, 32, 34, - 44, 46, 61, 63, 93, 33, 39, 40, - 41, 42, 57, 58, 64, 65, 90, 94, - 126, 10, 93, 33, 90, 94, 126, 10, - 41, 10, 13, 32, 34, 44, 46, 61, - 63, 68, 93, 100, 33, 39, 40, 41, - 42, 57, 58, 64, 65, 90, 94, 126, - 10, 13, 32, 34, 44, 46, 61, 63, - 93, 33, 39, 40, 41, 42, 57, 58, - 64, 65, 90, 94, 126, 10, 13, 32, - 34, 44, 46, 61, 63, 93, 33, 39, - 40, 41, 42, 57, 58, 64, 65, 90, - 94, 126, 10, 93, 33, 90, 94, 126, - 10, 41, 10, 13, 32, 34, 44, 46, - 61, 63, 73, 93, 105, 33, 39, 40, - 41, 42, 57, 58, 64, 65, 90, 94, - 126, 10, 13, 32, 34, 44, 46, 61, - 63, 65, 93, 97, 33, 39, 40, 41, - 42, 57, 58, 64, 66, 90, 94, 126, - 10, 13, 32, 34, 44, 46, 61, 63, - 93, 33, 39, 40, 41, 42, 57, 58, - 64, 65, 90, 94, 126, 10, 13, 32, - 34, 44, 46, 61, 63, 93, 33, 39, - 40, 41, 42, 57, 58, 64, 65, 90, - 94, 126, 10, 93, 33, 90, 94, 126, - 10, 41, 10, 13, 32, 34, 44, 46, - 61, 63, 73, 93, 105, 33, 39, 40, - 41, 42, 57, 58, 64, 65, 90, 94, - 126, 10, 13, 32, 34, 44, 46, 61, - 63, 84, 93, 116, 33, 39, 40, 41, - 42, 57, 58, 64, 65, 90, 94, 126, - 10, 13, 32, 34, 44, 46, 61, 63, - 72, 93, 104, 33, 39, 40, 41, 42, - 57, 58, 64, 65, 90, 94, 126, 10, - 13, 32, 34, 44, 46, 61, 63, 93, - 33, 39, 40, 41, 42, 57, 58, 64, - 65, 90, 94, 126, 10, 13, 32, 34, - 44, 46, 61, 63, 93, 33, 39, 40, - 41, 42, 57, 58, 64, 65, 90, 94, - 126, 10, 93, 33, 90, 94, 126, 10, - 41, 10, 41, 10, 13, 41, 45, 46, - 58, 91, 95, 32, 39, 42, 47, 48, - 57, 59, 64, 65, 90, 93, 96, 97, - 122, 123, 126, 10, 13, 41, 32, 39, - 42, 47, 48, 57, 58, 91, 93, 126, - 10, 13, 41, 46, 32, 39, 42, 47, - 48, 57, 58, 91, 93, 126, 10, 13, - 41, 32, 39, 42, 47, 48, 57, 58, - 91, 93, 126, 10, 13, 41, 46, 32, - 39, 42, 47, 48, 57, 58, 91, 93, - 126, 10, 13, 41, 32, 39, 42, 47, - 48, 57, 58, 91, 93, 126, 10, 13, - 41, 93, 32, 39, 42, 47, 48, 57, - 58, 91, 94, 126, 10, 13, 41, 93, - 32, 39, 42, 47, 48, 57, 58, 91, - 94, 126, 10, 13, 41, 93, 32, 39, - 42, 91, 94, 126, 10, 13, 41, 46, - 32, 39, 42, 47, 48, 57, 58, 91, - 93, 126, 10, 13, 41, 46, 32, 39, - 42, 91, 93, 126, 10, 13, 41, 46, - 32, 39, 42, 47, 48, 57, 58, 91, - 93, 126, 10, 13, 41, 46, 32, 39, - 42, 91, 93, 126, 10, 13, 41, 45, - 46, 58, 91, 95, 32, 39, 42, 47, - 48, 57, 59, 64, 65, 90, 93, 96, - 97, 122, 123, 126, 10, 13, 41, 45, - 46, 58, 91, 95, 32, 39, 42, 47, - 48, 57, 59, 64, 65, 90, 93, 96, - 97, 122, 123, 126, 10, 13, 41, 45, - 58, 80, 91, 95, 32, 39, 42, 47, - 48, 57, 59, 64, 65, 90, 93, 96, - 97, 122, 123, 126, 10, 13, 41, 45, - 58, 91, 95, 118, 32, 39, 42, 47, - 48, 57, 59, 64, 65, 90, 93, 96, - 97, 122, 123, 126, 10, 13, 41, 45, - 54, 58, 91, 95, 32, 39, 42, 47, - 48, 57, 59, 64, 65, 90, 93, 96, - 97, 122, 123, 126, 10, 13, 41, 45, - 58, 91, 95, 32, 39, 42, 47, 48, - 57, 59, 64, 65, 90, 93, 96, 97, - 122, 123, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 90, 94, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 90, 94, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 90, 94, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 90, 94, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 90, 94, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 90, 94, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 46, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 91, 93, 33, 47, 48, 57, 58, - 90, 94, 126, 10, 13, 32, 40, 41, - 46, 91, 93, 33, 47, 48, 57, 58, - 90, 94, 126, 10, 13, 32, 40, 41, - 91, 93, 33, 47, 48, 57, 58, 90, - 94, 126, 10, 13, 32, 40, 41, 46, - 91, 93, 33, 47, 48, 57, 58, 90, - 94, 126, 10, 13, 32, 40, 41, 91, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 10, 13, 32, 40, 41, 91, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 10, 13, 32, 40, 41, 91, 93, 33, - 47, 48, 57, 58, 90, 94, 126, 10, - 13, 32, 40, 41, 91, 93, 33, 90, - 94, 126, 10, 13, 32, 40, 41, 46, - 91, 93, 33, 47, 48, 57, 58, 90, - 94, 126, 10, 13, 32, 40, 41, 46, - 91, 93, 33, 90, 94, 126, 10, 13, - 32, 40, 41, 46, 91, 93, 33, 47, - 48, 57, 58, 90, 94, 126, 10, 13, - 32, 40, 41, 46, 91, 93, 33, 90, - 94, 126, 10, 13, 32, 40, 41, 46, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 46, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 90, 94, 126, - 10, 13, 32, 40, 41, 91, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 91, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 91, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 91, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 91, 93, 33, 90, 94, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 91, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 58, 91, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 58, 91, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 58, 91, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 58, 91, 93, 33, 90, - 94, 126, 10, 13, 32, 40, 41, 91, - 93, 33, 47, 48, 57, 58, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 90, 94, 126, 10, 13, 32, - 40, 41, 91, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 90, 94, 126, - 10, 13, 32, 40, 41, 91, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 90, 94, 126, 10, 13, 32, 40, 41, - 91, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 58, - 91, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 58, - 91, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 58, - 91, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 58, - 91, 93, 33, 90, 94, 126, 10, 13, - 32, 40, 41, 58, 91, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 91, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 46, 58, 91, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 46, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 46, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 90, 94, 126, 10, 13, 32, 40, - 41, 91, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 46, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 46, 58, 91, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 46, 58, 91, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 58, 91, 93, 33, 90, - 94, 126, 10, 13, 32, 40, 41, 91, - 93, 33, 47, 48, 57, 58, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 46, 58, - 91, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 46, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 46, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 90, 94, 126, - 10, 13, 32, 40, 41, 91, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 46, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 46, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 46, 58, - 91, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 58, - 91, 93, 33, 90, 94, 126, 10, 13, - 32, 40, 41, 91, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 46, 58, 91, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 46, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 46, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 90, 94, 126, 10, 32, 10, 13, - 32, 41, 91, 33, 39, 42, 90, 93, - 126, 10, 32, 10, 13, 41, 32, 39, - 42, 91, 93, 126, 10, 32, 10, 13, - 32, 33, 40, 45, 59, 61, 63, 70, - 73, 86, 87, 102, 105, 118, 119, 35, - 39, 42, 43, 47, 57, 65, 90, 94, - 126, 10, 32, 10, 13, 41, 45, 73, - 91, 95, 32, 39, 42, 47, 48, 57, - 58, 64, 65, 90, 93, 96, 97, 122, - 123, 126, 10, 13, 41, 45, 91, 95, - 32, 39, 42, 47, 48, 57, 58, 64, - 65, 90, 93, 96, 97, 122, 123, 126, - 10, 13, 41, 45, 91, 95, 32, 39, - 42, 47, 48, 57, 58, 64, 65, 90, - 93, 96, 97, 122, 123, 126, 10, 13, - 41, 91, 32, 39, 42, 47, 48, 57, - 58, 64, 65, 90, 93, 96, 97, 122, - 123, 126, 10, 13, 32, 41, 45, 46, - 91, 95, 33, 39, 42, 47, 48, 57, - 58, 64, 65, 90, 93, 96, 97, 122, - 123, 126, 10, 13, 41, 45, 73, 91, - 95, 32, 39, 42, 47, 48, 57, 58, - 64, 65, 90, 93, 96, 97, 122, 123, - 126, 10, 13, 32, 33, 40, 45, 59, - 61, 63, 70, 73, 86, 87, 102, 105, - 118, 119, 35, 39, 42, 43, 47, 57, - 65, 90, 94, 126, 10, 32, 10, 13, - 32, 33, 45, 61, 63, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 32, 10, 13, 41, 91, 32, 39, 42, - 47, 48, 57, 58, 64, 65, 90, 93, - 96, 97, 122, 123, 126, 10, 32, 10, - 13, 32, 10, 32, 10, 13, 32, 33, - 45, 61, 63, 79, 111, 35, 39, 42, - 43, 47, 57, 65, 90, 94, 126, 10, - 13, 32, 33, 45, 61, 63, 68, 100, - 35, 39, 42, 43, 47, 57, 65, 90, - 94, 126, 10, 13, 32, 33, 45, 61, - 63, 73, 105, 35, 39, 42, 43, 47, - 57, 65, 90, 94, 126, 10, 13, 32, - 33, 45, 61, 63, 73, 105, 35, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - 10, 13, 41, 32, 39, 42, 91, 93, - 126, 10, 45, 95, 48, 57, 65, 90, - 97, 122, 45, 95, 48, 57, 65, 90, - 97, 122, 10, 48, 57, 65, 90, 97, - 122, 10, 13, 32, 40, 45, 46, 59, - 95, 48, 57, 65, 90, 97, 122, 45, - 73, 95, 48, 57, 65, 90, 97, 122, - 45, 95, 48, 57, 65, 90, 97, 122, - 45, 58, 95, 48, 57, 65, 90, 97, - 122, 33, 90, 94, 126, 93, 33, 90, - 94, 126, 13, 32, 10, 32, 32, 40, - 91, 48, 57, 65, 90, 97, 122, 13, - 32, 45, 46, 95, 48, 57, 65, 90, - 97, 122, 10, 32, 32, 91, 45, 73, - 95, 48, 57, 65, 90, 97, 122, 45, - 95, 48, 57, 65, 90, 97, 122, 45, - 58, 95, 48, 57, 65, 90, 97, 122, - 33, 90, 94, 126, 45, 46, 58, 95, - 48, 57, 65, 90, 97, 122, 48, 57, - 46, 48, 57, 48, 57, 46, 48, 57, - 48, 57, 93, 48, 57, 93, 48, 57, - 93, 46, 48, 57, 46, 46, 48, 57, - 46, 45, 46, 58, 95, 48, 57, 65, - 90, 97, 122, 45, 46, 58, 95, 48, - 57, 65, 90, 97, 122, 45, 58, 80, - 95, 48, 57, 65, 90, 97, 122, 45, - 58, 95, 118, 48, 57, 65, 90, 97, - 122, 45, 54, 58, 95, 48, 57, 65, - 90, 97, 122, 45, 58, 95, 48, 57, - 65, 90, 97, 122, 58, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 90, 94, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 46, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 93, 33, 47, 48, - 57, 58, 90, 94, 126, 46, 93, 33, - 47, 48, 57, 58, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 46, 93, 33, 47, 48, 57, 58, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 90, 94, 126, 93, 33, 47, 48, - 57, 58, 90, 94, 126, 93, 33, 90, - 94, 126, 46, 93, 33, 47, 48, 57, - 58, 90, 94, 126, 46, 93, 33, 90, - 94, 126, 46, 93, 33, 47, 48, 57, - 58, 90, 94, 126, 46, 93, 33, 90, - 94, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 93, 33, 47, 48, 57, 58, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 93, 33, 90, 94, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 90, 94, 126, - 93, 33, 47, 48, 57, 58, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 90, 94, 126, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 10, 13, - 32, 91, 10, 32, 10, 45, 73, 95, - 48, 57, 65, 90, 97, 122, 10, 45, - 95, 48, 57, 65, 90, 97, 122, 45, - 95, 48, 57, 65, 90, 97, 122, 10, - 48, 57, 65, 90, 97, 122, 10, 13, - 32, 45, 46, 95, 48, 57, 65, 90, - 97, 122, 10, 13, 32, 40, 10, 32, - 10, 91, 48, 57, 65, 90, 97, 122, - 45, 46, 58, 95, 48, 57, 65, 90, - 97, 122, 48, 57, 46, 48, 57, 48, - 57, 46, 48, 57, 48, 57, 93, 48, - 57, 93, 48, 57, 93, 46, 48, 57, - 46, 46, 48, 57, 46, 45, 46, 58, - 95, 48, 57, 65, 90, 97, 122, 45, - 46, 58, 95, 48, 57, 65, 90, 97, - 122, 45, 58, 80, 95, 48, 57, 65, - 90, 97, 122, 45, 58, 95, 118, 48, - 57, 65, 90, 97, 122, 45, 54, 58, - 95, 48, 57, 65, 90, 97, 122, 45, - 58, 95, 48, 57, 65, 90, 97, 122, - 58, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 90, 94, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 90, 94, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 46, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 46, 93, 33, 47, 48, 57, 58, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 90, 94, 126, 46, 93, 33, 47, - 48, 57, 58, 90, 94, 126, 93, 33, - 47, 48, 57, 58, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 93, 33, 90, 94, 126, 46, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 46, 93, 33, 90, 94, 126, 46, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 46, 93, 33, 90, 94, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 46, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 93, 33, - 90, 94, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 90, 94, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 46, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 46, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 46, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 46, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 46, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 10, 13, 32, 91, 48, 57, - 65, 90, 97, 122, 10, 32, 10, 13, - 32, 40, 45, 46, 59, 95, 48, 57, - 65, 90, 97, 122, 10, 32, 10, 45, - 73, 95, 48, 57, 65, 90, 97, 122, - 10, 32, 10, 13, 32, 40, 66, 98, - 10, 32, 10, 13, 41, 32, 39, 42, - 91, 93, 126, 10, 32, 10, 89, 121, - 13, 32, 40, 66, 98, 10, 13, 32, - 41, 45, 46, 91, 95, 33, 39, 42, - 47, 48, 57, 58, 64, 65, 90, 93, - 96, 97, 122, 123, 126, 10, 32, 32, - 41, 91, 33, 39, 42, 90, 93, 126, - 13, 41, 45, 73, 91, 95, 32, 39, - 42, 47, 48, 57, 58, 64, 65, 90, - 93, 96, 97, 122, 123, 126, 10, 13, - 41, 45, 91, 95, 32, 39, 42, 47, - 48, 57, 58, 64, 65, 90, 93, 96, - 97, 122, 123, 126, 10, 13, 41, 45, - 58, 91, 95, 32, 39, 42, 47, 48, - 57, 59, 64, 65, 90, 93, 96, 97, - 122, 123, 126, 10, 13, 32, 40, 41, - 91, 93, 33, 90, 94, 126, 10, 13, - 32, 40, 41, 91, 93, 33, 90, 94, - 126, 10, 93, 33, 90, 94, 126, 93, - 33, 90, 94, 126, 41, 13, 32, 40, - 10, 13, 32, 40, 66, 93, 98, 33, - 90, 94, 126, 10, 93, 33, 90, 94, - 126, 10, 13, 32, 40, 41, 91, 93, - 33, 90, 94, 126, 10, 13, 41, 32, - 39, 42, 91, 93, 126, 10, 13, 32, - 40, 66, 98, 10, 89, 93, 121, 33, - 90, 94, 126, 13, 32, 93, 33, 90, - 94, 126, 10, 93, 33, 90, 94, 126, - 10, 41, 10, 41, 10, 13, 41, 45, - 46, 58, 91, 95, 32, 39, 42, 47, - 48, 57, 59, 64, 65, 90, 93, 96, - 97, 122, 123, 126, 10, 13, 41, 32, - 39, 42, 47, 48, 57, 58, 91, 93, - 126, 10, 13, 41, 46, 32, 39, 42, - 47, 48, 57, 58, 91, 93, 126, 10, - 13, 41, 32, 39, 42, 47, 48, 57, - 58, 91, 93, 126, 10, 13, 41, 46, - 32, 39, 42, 47, 48, 57, 58, 91, - 93, 126, 10, 13, 41, 32, 39, 42, - 47, 48, 57, 58, 91, 93, 126, 10, - 13, 41, 93, 32, 39, 42, 47, 48, - 57, 58, 91, 94, 126, 10, 13, 41, - 93, 32, 39, 42, 47, 48, 57, 58, - 91, 94, 126, 10, 13, 41, 93, 32, - 39, 42, 91, 94, 126, 10, 13, 41, - 46, 32, 39, 42, 47, 48, 57, 58, - 91, 93, 126, 10, 13, 41, 46, 32, - 39, 42, 91, 93, 126, 10, 13, 41, - 46, 32, 39, 42, 47, 48, 57, 58, - 91, 93, 126, 10, 13, 41, 46, 32, - 39, 42, 91, 93, 126, 10, 13, 41, - 45, 46, 58, 91, 95, 32, 39, 42, - 47, 48, 57, 59, 64, 65, 90, 93, - 96, 97, 122, 123, 126, 10, 13, 41, - 45, 46, 58, 91, 95, 32, 39, 42, - 47, 48, 57, 59, 64, 65, 90, 93, - 96, 97, 122, 123, 126, 10, 13, 41, - 45, 58, 80, 91, 95, 32, 39, 42, - 47, 48, 57, 59, 64, 65, 90, 93, - 96, 97, 122, 123, 126, 10, 13, 41, - 45, 58, 91, 95, 118, 32, 39, 42, - 47, 48, 57, 59, 64, 65, 90, 93, - 96, 97, 122, 123, 126, 10, 13, 41, - 45, 54, 58, 91, 95, 32, 39, 42, - 47, 48, 57, 59, 64, 65, 90, 93, - 96, 97, 122, 123, 126, 10, 13, 41, - 45, 58, 91, 95, 32, 39, 42, 47, - 48, 57, 59, 64, 65, 90, 93, 96, - 97, 122, 123, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 90, 94, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 90, 94, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 90, 94, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 90, 94, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 90, 94, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 90, 94, 126, 10, 13, 32, 40, - 41, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 46, 58, 91, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 91, 93, 33, 47, 48, 57, - 58, 90, 94, 126, 10, 13, 32, 40, - 41, 46, 91, 93, 33, 47, 48, 57, - 58, 90, 94, 126, 10, 13, 32, 40, - 41, 91, 93, 33, 47, 48, 57, 58, - 90, 94, 126, 10, 13, 32, 40, 41, - 46, 91, 93, 33, 47, 48, 57, 58, - 90, 94, 126, 10, 13, 32, 40, 41, - 91, 93, 33, 47, 48, 57, 58, 90, - 94, 126, 10, 13, 32, 40, 41, 91, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 10, 13, 32, 40, 41, 91, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 10, 13, 32, 40, 41, 91, 93, 33, - 90, 94, 126, 10, 13, 32, 40, 41, - 46, 91, 93, 33, 47, 48, 57, 58, - 90, 94, 126, 10, 13, 32, 40, 41, - 46, 91, 93, 33, 90, 94, 126, 10, - 13, 32, 40, 41, 46, 91, 93, 33, - 47, 48, 57, 58, 90, 94, 126, 10, - 13, 32, 40, 41, 46, 91, 93, 33, - 90, 94, 126, 10, 13, 32, 40, 41, - 46, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 46, 58, 91, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 58, 91, 93, 33, 90, 94, - 126, 10, 13, 32, 40, 41, 91, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 91, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 91, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 91, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 91, 93, 33, 90, 94, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 91, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 90, 94, 126, 10, 13, 32, 40, 41, - 91, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 58, - 91, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 58, - 91, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 58, - 91, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 58, - 91, 93, 33, 90, 94, 126, 10, 13, - 32, 40, 41, 91, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 58, 91, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 58, 91, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 58, 91, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 58, 91, 93, 33, 90, 94, - 126, 10, 13, 32, 40, 41, 91, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 58, 91, 93, - 33, 90, 94, 126, 10, 13, 32, 40, - 41, 91, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 90, 94, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 91, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 46, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 46, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 46, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 90, 94, 126, 10, 13, 32, - 40, 41, 91, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 46, 58, 91, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 46, 58, 91, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 46, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 58, 91, 93, 33, - 90, 94, 126, 10, 13, 32, 40, 41, - 91, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 46, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 46, 58, 91, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 10, 13, 32, 40, - 41, 46, 58, 91, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 10, 13, 32, - 40, 41, 58, 91, 93, 33, 90, 94, - 126, 10, 13, 32, 40, 41, 91, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 46, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 46, 58, - 91, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 10, 13, 32, 40, 41, 46, - 58, 91, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 10, 13, 32, 40, 41, - 58, 91, 93, 33, 90, 94, 126, 10, - 13, 32, 40, 41, 91, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 10, 13, - 32, 40, 41, 46, 58, 91, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 10, - 13, 32, 40, 41, 46, 58, 91, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 10, 13, 32, 40, 41, 46, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 10, 13, 32, 40, 41, 58, 91, - 93, 33, 90, 94, 126, 10, 32, 10, - 13, 32, 41, 91, 33, 39, 42, 90, - 93, 126, 10, 32, 10, 13, 41, 32, - 39, 42, 91, 93, 126, 10, 32, 10, - 13, 32, 40, 66, 98, 10, 32, 10, - 13, 41, 45, 73, 91, 95, 32, 39, - 42, 47, 48, 57, 58, 64, 65, 90, - 93, 96, 97, 122, 123, 126, 10, 13, - 41, 45, 91, 95, 32, 39, 42, 47, - 48, 57, 58, 64, 65, 90, 93, 96, - 97, 122, 123, 126, 10, 13, 41, 45, - 91, 95, 32, 39, 42, 47, 48, 57, - 58, 64, 65, 90, 93, 96, 97, 122, - 123, 126, 10, 13, 41, 91, 32, 39, - 42, 47, 48, 57, 58, 64, 65, 90, - 93, 96, 97, 122, 123, 126, 10, 13, - 32, 41, 45, 46, 91, 95, 33, 39, - 42, 47, 48, 57, 58, 64, 65, 90, - 93, 96, 97, 122, 123, 126, 10, 13, - 41, 45, 73, 91, 95, 32, 39, 42, - 47, 48, 57, 58, 64, 65, 90, 93, - 96, 97, 122, 123, 126, 10, 13, 32, - 40, 66, 98, 10, 32, 10, 13, 41, - 91, 32, 39, 42, 47, 48, 57, 58, - 64, 65, 90, 93, 96, 97, 122, 123, - 126, 10, 32, 10, 89, 121, 10, 13, - 41, 32, 39, 42, 91, 93, 126, 10, - 45, 95, 48, 57, 65, 90, 97, 122, - 45, 95, 48, 57, 65, 90, 97, 122, - 10, 48, 57, 65, 90, 97, 122, 10, - 13, 32, 40, 45, 46, 95, 48, 57, - 65, 90, 97, 122, 45, 73, 95, 48, - 57, 65, 90, 97, 122, 45, 95, 48, - 57, 65, 90, 97, 122, 45, 58, 95, - 48, 57, 65, 90, 97, 122, 33, 90, - 94, 126, 93, 33, 90, 94, 126, 13, - 32, 10, 32, 32, 40, 91, 48, 57, - 65, 90, 97, 122, 13, 32, 45, 46, - 95, 48, 57, 65, 90, 97, 122, 10, - 32, 32, 91, 45, 73, 95, 48, 57, - 65, 90, 97, 122, 45, 95, 48, 57, - 65, 90, 97, 122, 45, 58, 95, 48, - 57, 65, 90, 97, 122, 33, 90, 94, - 126, 45, 46, 58, 95, 48, 57, 65, - 90, 97, 122, 48, 57, 46, 48, 57, - 48, 57, 46, 48, 57, 48, 57, 93, - 48, 57, 93, 48, 57, 93, 46, 48, - 57, 46, 46, 48, 57, 46, 45, 46, - 58, 95, 48, 57, 65, 90, 97, 122, - 45, 46, 58, 95, 48, 57, 65, 90, - 97, 122, 45, 58, 80, 95, 48, 57, - 65, 90, 97, 122, 45, 58, 95, 118, - 48, 57, 65, 90, 97, 122, 45, 54, - 58, 95, 48, 57, 65, 90, 97, 122, - 45, 58, 95, 48, 57, 65, 90, 97, - 122, 58, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 90, 94, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 93, 33, 47, 48, 57, 58, 90, - 94, 126, 46, 93, 33, 47, 48, 57, - 58, 90, 94, 126, 93, 33, 47, 48, - 57, 58, 90, 94, 126, 46, 93, 33, - 47, 48, 57, 58, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 93, 33, 47, 48, 57, 58, 90, - 94, 126, 93, 33, 90, 94, 126, 46, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 46, 93, 33, 90, 94, 126, 46, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 46, 93, 33, 90, 94, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 93, - 33, 90, 94, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 93, 33, 47, 48, 57, 58, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 90, 94, 126, 93, 33, 47, - 48, 57, 58, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 46, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 46, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 10, 13, 32, 91, 10, - 32, 10, 45, 73, 95, 48, 57, 65, - 90, 97, 122, 10, 45, 95, 48, 57, - 65, 90, 97, 122, 45, 95, 48, 57, - 65, 90, 97, 122, 10, 48, 57, 65, - 90, 97, 122, 10, 13, 32, 45, 46, - 95, 48, 57, 65, 90, 97, 122, 10, - 13, 32, 40, 10, 32, 10, 91, 48, - 57, 65, 90, 97, 122, 45, 46, 58, - 95, 48, 57, 65, 90, 97, 122, 48, - 57, 46, 48, 57, 48, 57, 46, 48, - 57, 48, 57, 93, 48, 57, 93, 48, - 57, 93, 46, 48, 57, 46, 46, 48, - 57, 46, 45, 46, 58, 95, 48, 57, - 65, 90, 97, 122, 45, 46, 58, 95, - 48, 57, 65, 90, 97, 122, 45, 58, - 80, 95, 48, 57, 65, 90, 97, 122, - 45, 58, 95, 118, 48, 57, 65, 90, - 97, 122, 45, 54, 58, 95, 48, 57, - 65, 90, 97, 122, 45, 58, 95, 48, - 57, 65, 90, 97, 122, 58, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 90, 94, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 90, 94, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 90, - 94, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 90, 94, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 46, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 93, 33, 47, - 48, 57, 58, 90, 94, 126, 46, 93, - 33, 47, 48, 57, 58, 90, 94, 126, - 93, 33, 47, 48, 57, 58, 90, 94, - 126, 46, 93, 33, 47, 48, 57, 58, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 90, 94, 126, 93, 33, 47, 48, - 57, 58, 90, 94, 126, 93, 33, 47, - 48, 57, 58, 90, 94, 126, 93, 33, - 90, 94, 126, 46, 93, 33, 47, 48, - 57, 58, 90, 94, 126, 46, 93, 33, - 90, 94, 126, 46, 93, 33, 47, 48, - 57, 58, 90, 94, 126, 46, 93, 33, - 90, 94, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 93, 33, 47, 48, 57, 58, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 93, 33, 47, 48, 57, 58, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 93, 33, 90, 94, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 93, 33, 47, 48, - 57, 58, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 90, 94, - 126, 93, 33, 47, 48, 57, 58, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 47, 48, 57, - 59, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 90, 94, 126, 93, 33, - 47, 48, 57, 58, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 90, 94, 126, 93, 33, 47, 48, 57, - 58, 64, 65, 70, 71, 90, 94, 96, - 97, 102, 103, 126, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 58, 93, - 33, 47, 48, 57, 59, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 58, 93, 33, 47, 48, 57, 59, 64, - 65, 70, 71, 90, 94, 96, 97, 102, - 103, 126, 58, 93, 33, 90, 94, 126, - 93, 33, 47, 48, 57, 58, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 90, 94, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 93, - 33, 47, 48, 57, 58, 64, 65, 70, - 71, 90, 94, 96, 97, 102, 103, 126, - 46, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 46, 58, 93, 33, 47, - 48, 57, 59, 64, 65, 70, 71, 90, - 94, 96, 97, 102, 103, 126, 46, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 47, 48, 57, 59, - 64, 65, 70, 71, 90, 94, 96, 97, - 102, 103, 126, 58, 93, 33, 47, 48, - 57, 59, 64, 65, 70, 71, 90, 94, - 96, 97, 102, 103, 126, 58, 93, 33, - 47, 48, 57, 59, 64, 65, 70, 71, - 90, 94, 96, 97, 102, 103, 126, 58, - 93, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 33, 90, 94, 126, 10, - 13, 32, 91, 48, 57, 65, 90, 97, - 122, 10, 32, 10, 13, 32, 40, 45, - 46, 95, 48, 57, 65, 90, 97, 122, - 10, 32, 10, 45, 73, 95, 48, 57, - 65, 90, 97, 122, 13, 32, 40, 32, - 40, 10, 13, 32, 40, 10, 13, 32, - 40, 0 -}; - -static const char _smtp_received_parser_single_lengths[] = { - 0, 2, 2, 2, 2, 2, 1, 1, - 2, 6, 1, 1, 4, 3, 1, 1, - 2, 2, 0, 3, 2, 6, 1, 1, - 4, 2, 2, 1, 1, 2, 7, 1, - 1, 15, 6, 1, 1, 5, 8, 1, - 1, 3, 2, 1, 1, 2, 4, 0, - 5, 2, 3, 2, 0, 3, 2, 5, - 2, 3, 1, 1, 7, 1, 1, 6, - 0, 2, 1, 1, 9, 2, 1, 2, - 1, 1, 1, 0, 0, 0, 2, 1, - 1, 1, 0, 1, 0, 0, 1, 0, - 0, 2, 1, 1, 3, 0, 0, 0, - 0, 1, 1, 2, 1, 1, 2, 0, - 3, 2, 2, 0, 2, 3, 2, 0, - 5, 2, 1, 0, 3, 2, 1, 3, - 0, 3, 2, 1, 1, 1, 1, 1, - 1, 2, 1, 2, 1, 2, 1, 1, - 1, 1, 1, 1, 0, 11, 2, 3, - 2, 2, 3, 2, 2, 2, 2, 1, - 1, 1, 1, 2, 1, 1, 1, 0, - 3, 2, 1, 1, 1, 2, 1, 2, - 1, 1, 1, 1, 0, 8, 2, 1, - 2, 2, 3, 3, 2, 2, 0, 8, - 2, 1, 2, 2, 3, 3, 2, 2, - 9, 2, 2, 4, 0, 2, 0, 7, - 2, 9, 2, 3, 7, 3, 1, 1, - 2, 2, 0, 3, 2, 17, 1, 1, - 15, 8, 9, 7, 1, 1, 6, 8, - 9, 5, 4, 4, 1, 7, 1, 1, - 7, 2, 1, 1, 2, 8, 0, 9, - 2, 7, 2, 3, 2, 0, 3, 2, - 9, 2, 3, 2, 3, 2, 1, 8, - 3, 2, 3, 0, 1, 4, 4, 0, - 1, 0, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 4, 4, 4, 4, 4, - 3, 1, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 3, 1, 2, 1, 2, 1, 1, 1, - 1, 2, 2, 2, 2, 3, 3, 2, - 1, 1, 1, 1, 1, 2, 2, 1, - 2, 2, 2, 2, 1, 2, 2, 2, - 2, 1, 2, 2, 2, 2, 1, 2, - 2, 2, 2, 1, 2, 2, 2, 2, - 2, 1, 3, 3, 3, 2, 1, 3, - 3, 3, 2, 1, 3, 3, 3, 2, - 1, 3, 3, 3, 2, 1, 3, 3, - 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 5, 0, 2, 4, 4, 4, 1, - 4, 2, 0, 4, 3, 2, 3, 0, - 1, 1, 4, 0, 1, 0, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 4, - 4, 4, 4, 4, 3, 1, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 1, 2, 1, - 2, 1, 1, 1, 1, 2, 2, 2, - 2, 3, 3, 2, 1, 1, 1, 1, - 1, 2, 2, 1, 2, 2, 2, 2, - 1, 2, 2, 2, 2, 1, 2, 2, - 2, 2, 1, 2, 2, 2, 2, 1, - 2, 2, 2, 2, 2, 1, 3, 3, - 3, 2, 1, 3, 3, 3, 2, 1, - 3, 3, 3, 2, 1, 3, 3, 3, - 2, 1, 3, 3, 3, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 1, 0, 2, 0, - 5, 1, 2, 4, 0, 5, 1, 2, - 4, 2, 2, 1, 0, 2, 2, 0, - 8, 2, 9, 2, 3, 5, 1, 7, - 2, 8, 7, 1, 1, 6, 8, 1, - 1, 9, 2, 1, 1, 2, 10, 0, - 11, 2, 7, 2, 3, 2, 0, 3, - 2, 11, 2, 3, 2, 9, 9, 4, - 4, 5, 3, 4, 4, 1, 1, 2, - 0, 8, 2, 9, 2, 3, 5, 7, - 2, 8, 9, 7, 1, 1, 5, 8, - 1, 1, 13, 2, 1, 1, 2, 14, - 0, 15, 2, 7, 2, 3, 2, 0, - 3, 2, 15, 2, 3, 2, 9, 9, - 9, 9, 9, 7, 1, 1, 9, 8, - 1, 1, 11, 2, 1, 1, 2, 12, - 0, 13, 2, 7, 2, 3, 2, 0, - 3, 2, 13, 2, 3, 2, 9, 9, - 9, 9, 10, 10, 10, 10, 9, 9, - 10, 10, 9, 9, 10, 10, 9, 9, - 10, 10, 9, 2, 0, 11, 2, 9, - 2, 3, 10, 10, 10, 10, 7, 2, - 8, 9, 2, 0, 7, 2, 9, 2, - 3, 7, 2, 2, 0, 17, 2, 7, - 2, 3, 2, 3, 2, 9, 9, 9, - 9, 16, 8, 1, 1, 3, 6, 6, - 7, 7, 7, 2, 1, 1, 4, 22, - 9, 9, 2, 2, 2, 7, 3, 17, - 4, 2, 2, 11, 11, 9, 9, 2, - 2, 11, 9, 9, 2, 2, 11, 11, - 9, 9, 2, 2, 11, 11, 11, 9, - 9, 2, 2, 2, 8, 3, 4, 3, - 4, 3, 4, 4, 4, 4, 4, 4, - 4, 8, 8, 8, 8, 8, 7, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 9, 7, - 8, 7, 8, 7, 7, 7, 7, 8, - 8, 8, 8, 9, 9, 8, 7, 7, - 7, 7, 7, 8, 8, 7, 8, 8, - 8, 8, 7, 8, 8, 8, 8, 7, - 8, 8, 8, 8, 7, 8, 8, 8, - 8, 7, 8, 8, 8, 8, 8, 7, - 9, 9, 9, 8, 7, 9, 9, 9, - 8, 7, 9, 9, 9, 8, 7, 9, - 9, 9, 8, 7, 9, 9, 9, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 2, 0, 5, 2, - 3, 2, 17, 2, 7, 6, 6, 4, - 8, 7, 0, 17, 2, 7, 2, 4, - 2, 3, 2, 9, 9, 9, 9, 3, - 3, 2, 1, 8, 3, 2, 3, 0, - 1, 2, 1, 1, 2, 1, 5, 1, - 1, 2, 3, 2, 3, 0, 4, 0, - 1, 0, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 4, 4, 4, 4, 4, - 3, 1, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 3, 1, 2, 1, 2, 1, 1, 1, - 1, 2, 2, 2, 2, 3, 3, 2, - 1, 1, 1, 1, 1, 2, 2, 1, - 2, 2, 2, 2, 1, 2, 2, 2, - 2, 1, 2, 2, 2, 2, 1, 2, - 2, 2, 2, 1, 2, 2, 2, 2, - 2, 1, 3, 3, 3, 2, 1, 3, - 3, 3, 2, 1, 3, 3, 3, 2, - 1, 3, 3, 3, 2, 1, 3, 3, - 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 4, - 2, 4, 3, 2, 1, 6, 0, 4, - 2, 2, 4, 0, 1, 0, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 4, - 4, 4, 4, 4, 3, 1, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 1, 2, 1, - 2, 1, 1, 1, 1, 2, 2, 2, - 2, 3, 3, 2, 1, 1, 1, 1, - 1, 2, 2, 1, 2, 2, 2, 2, - 1, 2, 2, 2, 2, 1, 2, 2, - 2, 2, 1, 2, 2, 2, 2, 1, - 2, 2, 2, 2, 2, 1, 3, 3, - 3, 2, 1, 3, 3, 3, 2, 1, - 3, 3, 3, 2, 1, 3, 3, 3, - 2, 1, 3, 3, 3, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 0, 4, 2, 8, 2, 4, - 2, 0, 6, 2, 3, 2, 3, 5, - 8, 1, 1, 3, 6, 6, 7, 7, - 7, 2, 1, 1, 3, 7, 2, 7, - 3, 6, 4, 3, 2, 2, 2, 8, - 3, 4, 3, 4, 3, 4, 4, 4, - 4, 4, 4, 4, 8, 8, 8, 8, - 8, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 9, 7, 8, 7, 8, 7, 7, - 7, 7, 8, 8, 8, 8, 9, 9, - 8, 7, 7, 7, 7, 7, 8, 8, - 7, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 7, 8, 8, 8, 8, 7, - 8, 8, 8, 8, 7, 8, 8, 8, - 8, 8, 7, 9, 9, 9, 8, 7, - 9, 9, 9, 8, 7, 9, 9, 9, - 8, 7, 9, 9, 9, 8, 7, 9, - 9, 9, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 2, - 0, 5, 2, 3, 2, 6, 2, 7, - 6, 6, 4, 8, 7, 0, 6, 2, - 4, 2, 3, 3, 3, 2, 1, 7, - 3, 2, 3, 0, 1, 2, 1, 1, - 2, 1, 5, 1, 1, 2, 3, 2, - 3, 0, 4, 0, 1, 0, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 4, - 4, 4, 4, 4, 3, 1, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 1, 2, 1, - 2, 1, 1, 1, 1, 2, 2, 2, - 2, 3, 3, 2, 1, 1, 1, 1, - 1, 2, 2, 1, 2, 2, 2, 2, - 1, 2, 2, 2, 2, 1, 2, 2, - 2, 2, 1, 2, 2, 2, 2, 1, - 2, 2, 2, 2, 2, 1, 3, 3, - 3, 2, 1, 3, 3, 3, 2, 1, - 3, 3, 3, 2, 1, 3, 3, 3, - 2, 1, 3, 3, 3, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 0, 4, 2, 4, 3, 2, - 1, 6, 0, 4, 2, 2, 4, 0, - 1, 0, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 4, 4, 4, 4, 4, - 3, 1, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 3, 1, 2, 1, 2, 1, 1, 1, - 1, 2, 2, 2, 2, 3, 3, 2, - 1, 1, 1, 1, 1, 2, 2, 1, - 2, 2, 2, 2, 1, 2, 2, 2, - 2, 1, 2, 2, 2, 2, 1, 2, - 2, 2, 2, 1, 2, 2, 2, 2, - 2, 1, 3, 3, 3, 2, 1, 3, - 3, 3, 2, 1, 3, 3, 3, 2, - 1, 3, 3, 3, 2, 1, 3, 3, - 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 4, - 2, 7, 2, 4, 3, 2, 4, 4 -}; - -static const char _smtp_received_parser_range_lengths[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 0, 0, 0, 8, 0, 0, - 3, 3, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 3, 0, - 0, 5, 5, 0, 0, 5, 5, 0, - 0, 0, 3, 0, 0, 3, 0, 0, - 0, 0, 3, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 1, - 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 1, 1, 0, - 0, 1, 1, 0, 1, 1, 0, 1, - 1, 0, 0, 0, 0, 1, 1, 1, - 1, 0, 0, 3, 0, 0, 3, 0, - 3, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 1, 0, 1, 0, 1, 1, - 0, 1, 0, 1, 0, 0, 0, 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, 1, 0, 0, 1, 0, - 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 1, - 0, 1, 0, 0, 0, 0, 0, 0, - 5, 1, 1, 0, 1, 1, 0, 5, - 0, 5, 0, 1, 5, 8, 0, 0, - 3, 3, 0, 3, 0, 5, 0, 0, - 5, 5, 5, 5, 0, 0, 5, 5, - 5, 5, 5, 5, 3, 3, 0, 0, - 5, 3, 0, 0, 3, 5, 0, 5, - 0, 5, 0, 3, 0, 0, 3, 0, - 5, 0, 0, 0, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 0, 3, 1, - 1, 1, 1, 1, 1, 1, 0, 1, - 0, 1, 0, 3, 3, 3, 3, 3, - 3, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 4, 4, 4, 4, 4, 4, 4, - 2, 4, 2, 4, 2, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 2, 3, 1, - 1, 0, 1, 1, 5, 5, 5, 3, - 3, 3, 3, 0, 3, 3, 3, 2, - 2, 0, 3, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 0, 1, 0, 3, - 3, 3, 3, 3, 3, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 4, 4, 4, - 4, 4, 4, 4, 2, 4, 2, 4, - 2, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 2, 1, 1, 0, 1, 1, 3, - 3, 0, 3, 5, 3, 3, 0, 3, - 5, 1, 1, 0, 1, 1, 0, 0, - 5, 0, 5, 0, 1, 5, 3, 5, - 0, 5, 5, 0, 0, 5, 5, 0, - 0, 5, 3, 0, 0, 3, 5, 0, - 5, 0, 5, 0, 3, 0, 0, 3, - 0, 5, 0, 0, 0, 5, 5, 5, - 5, 5, 6, 5, 0, 2, 0, 0, - 0, 5, 0, 5, 0, 1, 5, 5, - 0, 5, 5, 5, 0, 0, 5, 5, - 0, 0, 5, 3, 0, 0, 3, 5, - 0, 5, 0, 5, 0, 3, 0, 0, - 3, 0, 5, 0, 0, 0, 5, 5, - 5, 5, 5, 5, 0, 0, 5, 5, - 0, 0, 5, 3, 0, 0, 3, 5, - 0, 5, 0, 5, 0, 3, 0, 0, - 3, 0, 5, 0, 0, 0, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 5, 0, 5, - 0, 1, 5, 5, 5, 5, 5, 0, - 5, 5, 0, 0, 5, 0, 5, 0, - 1, 5, 0, 0, 0, 5, 0, 5, - 0, 3, 0, 0, 0, 5, 5, 5, - 5, 5, 8, 0, 0, 3, 8, 8, - 8, 2, 2, 2, 2, 0, 0, 2, - 6, 6, 2, 0, 2, 2, 3, 5, - 2, 2, 0, 6, 6, 6, 6, 2, - 0, 6, 6, 6, 2, 0, 6, 6, - 6, 6, 2, 0, 6, 6, 6, 6, - 6, 2, 0, 0, 8, 5, 5, 5, - 5, 5, 5, 5, 3, 5, 3, 5, - 3, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 4, - 4, 4, 4, 4, 4, 4, 2, 4, - 2, 4, 2, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 2, 0, 0, 3, 0, - 3, 0, 5, 0, 8, 8, 8, 8, - 8, 8, 0, 5, 0, 5, 0, 8, - 0, 0, 0, 5, 5, 5, 5, 3, - 3, 3, 3, 3, 3, 3, 3, 2, - 2, 0, 0, 0, 0, 3, 3, 0, - 0, 0, 3, 3, 3, 2, 3, 1, - 1, 1, 1, 1, 1, 1, 0, 1, - 0, 1, 0, 3, 3, 3, 3, 3, - 3, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 4, 4, 4, 4, 4, 4, 4, - 2, 4, 2, 4, 2, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 2, 0, 0, - 0, 3, 3, 3, 3, 3, 0, 0, - 0, 3, 3, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 0, 1, 0, 3, - 3, 3, 3, 3, 3, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 4, 4, 4, - 4, 4, 4, 4, 2, 4, 2, 4, - 2, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 2, 0, 3, 0, 3, 0, 3, - 0, 0, 0, 0, 3, 0, 0, 0, - 8, 0, 0, 3, 8, 8, 8, 2, - 2, 2, 2, 0, 0, 2, 2, 2, - 3, 0, 2, 2, 2, 0, 0, 8, - 5, 5, 5, 5, 5, 5, 5, 3, - 5, 3, 5, 3, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 4, 4, 4, 4, 4, 4, - 4, 2, 4, 2, 4, 2, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 2, 0, - 0, 3, 0, 3, 0, 0, 0, 8, - 8, 8, 8, 8, 8, 0, 0, 0, - 8, 0, 0, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 0, 0, 0, - 0, 3, 3, 0, 0, 0, 3, 3, - 3, 2, 3, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 0, 1, 0, 3, - 3, 3, 3, 3, 3, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 4, 4, 4, - 4, 4, 4, 4, 2, 4, 2, 4, - 2, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 2, 0, 0, 0, 3, 3, 3, - 3, 3, 0, 0, 0, 3, 3, 1, - 1, 1, 1, 1, 1, 1, 0, 1, - 0, 1, 0, 3, 3, 3, 3, 3, - 3, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 2, 8, 8, 8, 8, 2, 8, - 8, 4, 4, 4, 4, 4, 4, 4, - 2, 4, 2, 4, 2, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 8, 8, 2, 8, 8, 8, 8, - 2, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 2, 8, 8, 8, 8, 2, - 8, 8, 8, 8, 2, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 2, 0, 3, - 0, 3, 0, 3, 0, 0, 0, 0 -}; - -static const short _smtp_received_parser_index_offsets[] = { - 0, 0, 3, 6, 9, 12, 15, 17, - 19, 25, 35, 37, 39, 44, 56, 58, - 60, 66, 72, 73, 80, 83, 90, 92, - 94, 99, 102, 105, 107, 109, 115, 126, - 128, 130, 151, 163, 165, 167, 178, 192, - 194, 196, 200, 206, 208, 210, 216, 221, - 222, 228, 231, 238, 241, 242, 249, 252, - 258, 261, 265, 267, 269, 278, 280, 282, - 290, 292, 296, 298, 300, 310, 313, 315, - 318, 320, 322, 325, 327, 329, 331, 335, - 337, 339, 342, 344, 346, 348, 350, 352, - 354, 356, 359, 361, 363, 367, 369, 371, - 373, 375, 377, 379, 385, 387, 389, 395, - 396, 403, 406, 409, 410, 413, 420, 423, - 424, 430, 433, 436, 437, 442, 445, 448, - 453, 454, 459, 462, 465, 467, 469, 471, - 473, 475, 478, 480, 483, 485, 488, 490, - 492, 494, 496, 498, 500, 501, 513, 516, - 520, 523, 526, 530, 533, 536, 539, 542, - 545, 547, 549, 551, 555, 557, 559, 562, - 563, 568, 571, 574, 576, 578, 581, 583, - 586, 588, 590, 592, 594, 595, 605, 608, - 611, 614, 617, 621, 625, 628, 631, 632, - 642, 645, 648, 651, 654, 658, 662, 665, - 668, 683, 687, 691, 696, 698, 702, 703, - 716, 719, 734, 737, 742, 755, 767, 769, - 771, 777, 783, 784, 791, 794, 817, 819, - 821, 842, 856, 871, 884, 886, 888, 900, - 914, 929, 940, 950, 960, 965, 976, 978, - 980, 993, 999, 1001, 1003, 1009, 1023, 1024, - 1039, 1042, 1055, 1058, 1065, 1068, 1069, 1076, - 1079, 1094, 1097, 1101, 1104, 1111, 1117, 1122, - 1134, 1141, 1147, 1154, 1157, 1161, 1166, 1174, - 1176, 1179, 1181, 1184, 1186, 1189, 1192, 1194, - 1197, 1199, 1202, 1204, 1212, 1220, 1228, 1236, - 1244, 1251, 1261, 1272, 1283, 1294, 1299, 1310, - 1321, 1332, 1343, 1348, 1359, 1370, 1381, 1392, - 1397, 1408, 1419, 1430, 1441, 1446, 1457, 1468, - 1479, 1490, 1495, 1506, 1517, 1528, 1539, 1544, - 1555, 1567, 1573, 1580, 1586, 1593, 1599, 1605, - 1611, 1615, 1622, 1627, 1634, 1639, 1651, 1663, - 1668, 1678, 1688, 1698, 1708, 1712, 1723, 1734, - 1744, 1755, 1766, 1777, 1782, 1792, 1803, 1814, - 1825, 1830, 1840, 1851, 1862, 1873, 1878, 1888, - 1899, 1910, 1921, 1926, 1936, 1947, 1958, 1969, - 1974, 1985, 1995, 2007, 2019, 2031, 2036, 2046, - 2058, 2070, 2082, 2087, 2097, 2109, 2121, 2133, - 2138, 2148, 2160, 2172, 2184, 2189, 2199, 2211, - 2223, 2235, 2246, 2257, 2268, 2279, 2290, 2301, - 2312, 2323, 2334, 2345, 2356, 2367, 2372, 2378, - 2382, 2386, 2392, 2394, 2398, 2408, 2418, 2428, - 2433, 2441, 2447, 2451, 2456, 2463, 2469, 2476, - 2479, 2483, 2485, 2493, 2495, 2498, 2500, 2503, - 2505, 2508, 2511, 2513, 2516, 2518, 2521, 2523, - 2531, 2539, 2547, 2555, 2563, 2570, 2580, 2591, - 2602, 2613, 2618, 2629, 2640, 2651, 2662, 2667, - 2678, 2689, 2700, 2711, 2716, 2727, 2738, 2749, - 2760, 2765, 2776, 2787, 2798, 2809, 2814, 2825, - 2836, 2847, 2858, 2863, 2874, 2886, 2892, 2899, - 2905, 2912, 2918, 2924, 2930, 2934, 2941, 2946, - 2953, 2958, 2970, 2982, 2987, 2997, 3007, 3017, - 3027, 3031, 3042, 3053, 3063, 3074, 3085, 3096, - 3101, 3111, 3122, 3133, 3144, 3149, 3159, 3170, - 3181, 3192, 3197, 3207, 3218, 3229, 3240, 3245, - 3255, 3266, 3277, 3288, 3293, 3304, 3314, 3326, - 3338, 3350, 3355, 3365, 3377, 3389, 3401, 3406, - 3416, 3428, 3440, 3452, 3457, 3467, 3479, 3491, - 3503, 3508, 3518, 3530, 3542, 3554, 3565, 3576, - 3587, 3598, 3609, 3620, 3631, 3642, 3653, 3664, - 3675, 3686, 3691, 3695, 3699, 3701, 3703, 3707, - 3711, 3720, 3722, 3728, 3738, 3742, 3751, 3753, - 3759, 3769, 3773, 3777, 3779, 3781, 3785, 3788, - 3789, 3803, 3806, 3821, 3824, 3829, 3840, 3845, - 3858, 3861, 3875, 3888, 3890, 3892, 3904, 3918, - 3920, 3922, 3937, 3943, 3945, 3947, 3953, 3969, - 3970, 3987, 3990, 4003, 4006, 4013, 4016, 4017, - 4024, 4027, 4044, 4047, 4051, 4054, 4069, 4084, - 4094, 4104, 4115, 4125, 4135, 4140, 4144, 4146, - 4149, 4150, 4164, 4167, 4182, 4185, 4190, 4201, - 4214, 4217, 4231, 4246, 4259, 4261, 4263, 4274, - 4288, 4290, 4292, 4311, 4317, 4319, 4321, 4327, - 4347, 4348, 4369, 4372, 4385, 4388, 4395, 4398, - 4399, 4406, 4409, 4430, 4433, 4437, 4440, 4455, - 4470, 4485, 4500, 4515, 4528, 4530, 4532, 4547, - 4561, 4563, 4565, 4582, 4588, 4590, 4592, 4598, - 4616, 4617, 4636, 4639, 4652, 4655, 4662, 4665, - 4666, 4673, 4676, 4695, 4698, 4702, 4705, 4720, - 4735, 4750, 4765, 4781, 4797, 4813, 4829, 4844, - 4859, 4875, 4891, 4906, 4921, 4937, 4953, 4968, - 4983, 4999, 5015, 5030, 5033, 5034, 5051, 5054, - 5069, 5072, 5077, 5093, 5109, 5125, 5141, 5154, - 5157, 5171, 5186, 5189, 5190, 5203, 5206, 5221, - 5224, 5229, 5242, 5245, 5248, 5249, 5272, 5275, - 5288, 5291, 5298, 5301, 5305, 5308, 5323, 5338, - 5353, 5368, 5390, 5407, 5409, 5411, 5418, 5433, - 5448, 5464, 5474, 5484, 5489, 5493, 5495, 5500, - 5525, 5541, 5557, 5562, 5565, 5570, 5580, 5587, - 5610, 5617, 5622, 5625, 5643, 5661, 5677, 5693, - 5698, 5701, 5719, 5735, 5751, 5756, 5759, 5777, - 5795, 5811, 5827, 5832, 5835, 5853, 5871, 5889, - 5905, 5921, 5926, 5929, 5932, 5949, 5958, 5968, - 5977, 5987, 5996, 6006, 6016, 6024, 6034, 6042, - 6052, 6060, 6077, 6094, 6111, 6128, 6145, 6161, - 6178, 6195, 6212, 6229, 6240, 6257, 6274, 6291, - 6308, 6319, 6336, 6353, 6370, 6387, 6398, 6415, - 6432, 6449, 6466, 6477, 6494, 6511, 6528, 6545, - 6556, 6573, 6590, 6607, 6624, 6635, 6652, 6670, - 6682, 6695, 6707, 6720, 6732, 6744, 6756, 6766, - 6779, 6790, 6803, 6814, 6832, 6850, 6861, 6877, - 6893, 6909, 6925, 6935, 6952, 6969, 6985, 7002, - 7019, 7036, 7047, 7063, 7080, 7097, 7114, 7125, - 7141, 7158, 7175, 7192, 7203, 7219, 7236, 7253, - 7270, 7281, 7297, 7314, 7331, 7348, 7359, 7376, - 7392, 7410, 7428, 7446, 7457, 7473, 7491, 7509, - 7527, 7538, 7554, 7572, 7590, 7608, 7619, 7635, - 7653, 7671, 7689, 7700, 7716, 7734, 7752, 7770, - 7787, 7804, 7821, 7838, 7855, 7872, 7889, 7906, - 7923, 7940, 7957, 7974, 7985, 7988, 7989, 7998, - 8001, 8008, 8011, 8034, 8037, 8053, 8068, 8083, - 8096, 8113, 8129, 8130, 8153, 8156, 8169, 8172, - 8185, 8188, 8192, 8195, 8210, 8225, 8240, 8255, - 8262, 8269, 8275, 8280, 8292, 8299, 8305, 8312, - 8315, 8319, 8322, 8324, 8326, 8329, 8334, 8343, - 8345, 8347, 8350, 8357, 8363, 8370, 8373, 8381, - 8383, 8386, 8388, 8391, 8393, 8396, 8399, 8401, - 8404, 8406, 8409, 8411, 8419, 8427, 8435, 8443, - 8451, 8458, 8468, 8479, 8490, 8501, 8506, 8517, - 8528, 8539, 8550, 8555, 8566, 8577, 8588, 8599, - 8604, 8615, 8626, 8637, 8648, 8653, 8664, 8675, - 8686, 8697, 8702, 8713, 8724, 8735, 8746, 8751, - 8762, 8774, 8780, 8787, 8793, 8800, 8806, 8812, - 8818, 8822, 8829, 8834, 8841, 8846, 8858, 8870, - 8875, 8885, 8895, 8905, 8915, 8919, 8930, 8941, - 8951, 8962, 8973, 8984, 8989, 8999, 9010, 9021, - 9032, 9037, 9047, 9058, 9069, 9080, 9085, 9095, - 9106, 9117, 9128, 9133, 9143, 9154, 9165, 9176, - 9181, 9192, 9202, 9214, 9226, 9238, 9243, 9253, - 9265, 9277, 9289, 9294, 9304, 9316, 9328, 9340, - 9345, 9355, 9367, 9379, 9391, 9396, 9406, 9418, - 9430, 9442, 9453, 9464, 9475, 9486, 9497, 9508, - 9519, 9530, 9541, 9552, 9563, 9574, 9579, 9580, - 9585, 9588, 9596, 9603, 9609, 9614, 9624, 9625, - 9630, 9633, 9639, 9647, 9649, 9652, 9654, 9657, - 9659, 9662, 9665, 9667, 9670, 9672, 9675, 9677, - 9685, 9693, 9701, 9709, 9717, 9724, 9734, 9745, - 9756, 9767, 9772, 9783, 9794, 9805, 9816, 9821, - 9832, 9843, 9854, 9865, 9870, 9881, 9892, 9903, - 9914, 9919, 9930, 9941, 9952, 9963, 9968, 9979, - 9990, 10001, 10012, 10017, 10028, 10040, 10046, 10053, - 10059, 10066, 10072, 10078, 10084, 10088, 10095, 10100, - 10107, 10112, 10124, 10136, 10141, 10151, 10161, 10171, - 10181, 10185, 10196, 10207, 10217, 10228, 10239, 10250, - 10255, 10265, 10276, 10287, 10298, 10303, 10313, 10324, - 10335, 10346, 10351, 10361, 10372, 10383, 10394, 10399, - 10409, 10420, 10431, 10442, 10447, 10458, 10468, 10480, - 10492, 10504, 10509, 10519, 10531, 10543, 10555, 10560, - 10570, 10582, 10594, 10606, 10611, 10621, 10633, 10645, - 10657, 10662, 10672, 10684, 10696, 10708, 10719, 10730, - 10741, 10752, 10763, 10774, 10785, 10796, 10807, 10818, - 10829, 10840, 10845, 10846, 10854, 10857, 10869, 10872, - 10880, 10883, 10884, 10891, 10894, 10901, 10904, 10908, - 10914, 10931, 10933, 10935, 10942, 10957, 10972, 10988, - 10998, 11008, 11013, 11017, 11019, 11023, 11033, 11038, - 11048, 11055, 11062, 11069, 11075, 11080, 11083, 11086, - 11103, 11112, 11122, 11131, 11141, 11150, 11160, 11170, - 11178, 11188, 11196, 11206, 11214, 11231, 11248, 11265, - 11282, 11299, 11315, 11332, 11349, 11366, 11383, 11394, - 11411, 11428, 11445, 11462, 11473, 11490, 11507, 11524, - 11541, 11552, 11569, 11586, 11603, 11620, 11631, 11648, - 11665, 11682, 11699, 11710, 11727, 11744, 11761, 11778, - 11789, 11806, 11824, 11836, 11849, 11861, 11874, 11886, - 11898, 11910, 11920, 11933, 11944, 11957, 11968, 11986, - 12004, 12015, 12031, 12047, 12063, 12079, 12089, 12106, - 12123, 12139, 12156, 12173, 12190, 12201, 12217, 12234, - 12251, 12268, 12279, 12295, 12312, 12329, 12346, 12357, - 12373, 12390, 12407, 12424, 12435, 12451, 12468, 12485, - 12502, 12513, 12530, 12546, 12564, 12582, 12600, 12611, - 12627, 12645, 12663, 12681, 12692, 12708, 12726, 12744, - 12762, 12773, 12789, 12807, 12825, 12843, 12854, 12870, - 12888, 12906, 12924, 12941, 12958, 12975, 12992, 13009, - 13026, 13043, 13060, 13077, 13094, 13111, 13128, 13139, - 13142, 13143, 13152, 13155, 13162, 13165, 13172, 13175, - 13191, 13206, 13221, 13234, 13251, 13267, 13268, 13275, - 13278, 13291, 13294, 13298, 13305, 13312, 13318, 13323, - 13334, 13341, 13347, 13354, 13357, 13361, 13364, 13366, - 13368, 13371, 13376, 13385, 13387, 13389, 13392, 13399, - 13405, 13412, 13415, 13423, 13425, 13428, 13430, 13433, - 13435, 13438, 13441, 13443, 13446, 13448, 13451, 13453, - 13461, 13469, 13477, 13485, 13493, 13500, 13510, 13521, - 13532, 13543, 13548, 13559, 13570, 13581, 13592, 13597, - 13608, 13619, 13630, 13641, 13646, 13657, 13668, 13679, - 13690, 13695, 13706, 13717, 13728, 13739, 13744, 13755, - 13766, 13777, 13788, 13793, 13804, 13816, 13822, 13829, - 13835, 13842, 13848, 13854, 13860, 13864, 13871, 13876, - 13883, 13888, 13900, 13912, 13917, 13927, 13937, 13947, - 13957, 13961, 13972, 13983, 13993, 14004, 14015, 14026, - 14031, 14041, 14052, 14063, 14074, 14079, 14089, 14100, - 14111, 14122, 14127, 14137, 14148, 14159, 14170, 14175, - 14185, 14196, 14207, 14218, 14223, 14234, 14244, 14256, - 14268, 14280, 14285, 14295, 14307, 14319, 14331, 14336, - 14346, 14358, 14370, 14382, 14387, 14397, 14409, 14421, - 14433, 14438, 14448, 14460, 14472, 14484, 14495, 14506, - 14517, 14528, 14539, 14550, 14561, 14572, 14583, 14594, - 14605, 14616, 14621, 14622, 14627, 14630, 14638, 14645, - 14651, 14656, 14666, 14667, 14672, 14675, 14681, 14689, - 14691, 14694, 14696, 14699, 14701, 14704, 14707, 14709, - 14712, 14714, 14717, 14719, 14727, 14735, 14743, 14751, - 14759, 14766, 14776, 14787, 14798, 14809, 14814, 14825, - 14836, 14847, 14858, 14863, 14874, 14885, 14896, 14907, - 14912, 14923, 14934, 14945, 14956, 14961, 14972, 14983, - 14994, 15005, 15010, 15021, 15032, 15043, 15054, 15059, - 15070, 15082, 15088, 15095, 15101, 15108, 15114, 15120, - 15126, 15130, 15137, 15142, 15149, 15154, 15166, 15178, - 15183, 15193, 15203, 15213, 15223, 15227, 15238, 15249, - 15259, 15270, 15281, 15292, 15297, 15307, 15318, 15329, - 15340, 15345, 15355, 15366, 15377, 15388, 15393, 15403, - 15414, 15425, 15436, 15441, 15451, 15462, 15473, 15484, - 15489, 15500, 15510, 15522, 15534, 15546, 15551, 15561, - 15573, 15585, 15597, 15602, 15612, 15624, 15636, 15648, - 15653, 15663, 15675, 15687, 15699, 15704, 15714, 15726, - 15738, 15750, 15761, 15772, 15783, 15794, 15805, 15816, - 15827, 15838, 15849, 15860, 15871, 15882, 15887, 15888, - 15896, 15899, 15910, 15913, 15921, 15925, 15928, 15933 -}; - -static const short _smtp_received_parser_indicies[] = { - 0, 0, 1, 2, 2, 1, 3, 3, - 1, 4, 4, 1, 6, 7, 5, 8, - 1, 9, 1, 9, 11, 10, 10, 10, - 1, 13, 14, 15, 16, 17, 16, 18, - 18, 18, 12, 19, 1, 20, 1, 20, - 21, 22, 22, 1, 24, 26, 28, 25, - 25, 27, 25, 27, 25, 27, 25, 23, - 29, 1, 30, 1, 30, 32, 31, 31, - 31, 1, 24, 26, 25, 25, 25, 23, - 29, 33, 24, 26, 25, 25, 25, 23, - 29, 30, 1, 35, 36, 37, 38, 39, - 39, 34, 40, 1, 41, 1, 41, 31, - 22, 22, 1, 42, 42, 1, 44, 45, - 43, 46, 1, 47, 1, 47, 49, 48, - 48, 48, 1, 51, 52, 53, 54, 55, - 57, 54, 56, 56, 56, 50, 58, 1, - 59, 1, 59, 60, 61, 60, 62, 60, - 60, 63, 64, 65, 66, 63, 64, 65, - 66, 60, 60, 60, 60, 60, 1, 68, - 69, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 67, 71, 1, 72, 1, 72, - 74, 73, 73, 73, 73, 73, 73, 73, - 73, 1, 76, 77, 78, 79, 78, 80, - 78, 78, 78, 78, 78, 78, 78, 75, - 81, 1, 82, 1, 82, 83, 62, 1, - 85, 87, 86, 86, 86, 84, 88, 1, - 89, 1, 89, 90, 83, 83, 83, 1, - 76, 77, 79, 80, 75, 81, 91, 76, - 77, 79, 80, 75, 81, 82, 1, 92, - 85, 87, 86, 86, 86, 84, 88, 82, - 1, 88, 93, 85, 87, 86, 86, 86, - 84, 88, 89, 1, 94, 76, 77, 79, - 80, 75, 81, 89, 1, 96, 97, 98, - 95, 99, 1, 100, 1, 102, 103, 105, - 106, 107, 108, 109, 104, 101, 110, 1, - 111, 1, 111, 113, 114, 115, 116, 117, - 112, 1, 118, 1, 120, 121, 122, 119, - 123, 1, 124, 1, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 1, 133, 134, - 1, 135, 1, 137, 138, 136, 139, 1, - 140, 1, 140, 141, 1, 142, 1, 143, - 1, 144, 1, 146, 147, 148, 145, 149, - 1, 150, 1, 150, 151, 1, 152, 1, - 153, 1, 154, 1, 155, 1, 156, 1, - 157, 1, 158, 1, 160, 161, 159, 162, - 1, 163, 1, 163, 164, 164, 1, 165, - 1, 166, 1, 167, 1, 168, 1, 169, - 1, 170, 1, 172, 174, 173, 173, 173, - 171, 175, 1, 176, 1, 176, 168, 177, - 177, 177, 1, 175, 178, 172, 174, 173, - 173, 173, 171, 175, 176, 1, 169, 176, - 1, 169, 169, 170, 1, 179, 172, 174, - 173, 173, 173, 171, 175, 170, 1, 162, - 180, 160, 161, 181, 181, 159, 162, 163, - 1, 162, 165, 1, 149, 182, 146, 147, - 183, 145, 149, 150, 1, 149, 152, 1, - 182, 146, 147, 148, 145, 139, 184, 137, - 138, 185, 136, 139, 140, 1, 139, 142, - 1, 135, 1, 186, 1, 135, 1, 187, - 1, 135, 1, 188, 189, 1, 135, 1, - 135, 135, 1, 190, 1, 135, 135, 1, - 191, 1, 135, 1, 192, 1, 135, 1, - 193, 1, 135, 1, 123, 194, 120, 121, - 195, 196, 197, 198, 199, 200, 201, 202, - 119, 123, 124, 1, 123, 133, 134, 1, - 123, 186, 1, 123, 187, 1, 123, 188, - 189, 1, 123, 190, 1, 123, 191, 1, - 123, 192, 1, 123, 193, 1, 123, 118, - 1, 203, 1, 204, 1, 205, 1, 207, - 208, 209, 206, 210, 1, 211, 1, 211, - 112, 1, 210, 212, 207, 208, 209, 206, - 210, 211, 1, 210, 118, 1, 213, 1, - 204, 1, 214, 213, 1, 204, 1, 215, - 216, 1, 204, 1, 204, 1, 217, 1, - 204, 1, 110, 218, 102, 103, 105, 106, - 107, 108, 109, 104, 101, 110, 111, 1, - 110, 118, 1, 110, 203, 1, 110, 213, - 1, 110, 214, 213, 1, 110, 215, 216, - 1, 110, 217, 1, 99, 82, 1, 99, - 219, 97, 98, 221, 222, 223, 224, 225, - 220, 95, 99, 100, 1, 99, 118, 1, - 99, 203, 1, 99, 213, 1, 99, 214, - 213, 1, 99, 215, 216, 1, 99, 217, - 1, 97, 98, 95, 91, 76, 77, 78, - 79, 78, 80, 78, 78, 78, 78, 78, - 78, 78, 75, 227, 228, 226, 1, 230, - 231, 229, 1, 233, 234, 235, 236, 232, - 237, 1, 239, 240, 238, 1, 71, 241, - 68, 69, 243, 242, 242, 242, 242, 242, - 242, 242, 242, 67, 71, 72, 1, 244, - 76, 77, 78, 79, 78, 80, 78, 78, - 78, 78, 78, 78, 78, 75, 81, 72, - 1, 71, 227, 228, 226, 1, 241, 68, - 69, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 67, 246, 248, 250, 247, 247, - 249, 247, 249, 247, 249, 247, 245, 251, - 1, 252, 1, 252, 254, 253, 253, 253, - 1, 246, 248, 247, 247, 247, 245, 251, - 255, 246, 248, 247, 247, 247, 245, 251, - 252, 1, 257, 258, 259, 260, 261, 260, - 262, 260, 260, 263, 264, 265, 266, 263, - 264, 265, 266, 260, 260, 260, 260, 260, - 256, 267, 1, 268, 1, 268, 60, 253, - 60, 62, 60, 60, 63, 64, 65, 66, - 63, 64, 65, 66, 60, 60, 60, 60, - 60, 1, 68, 69, 70, 70, 70, 70, - 269, 269, 70, 70, 70, 70, 70, 67, - 241, 68, 69, 70, 70, 70, 70, 270, - 270, 70, 70, 70, 70, 70, 67, 272, - 273, 274, 275, 275, 275, 275, 275, 275, - 275, 275, 275, 271, 276, 1, 277, 1, - 277, 279, 278, 280, 278, 281, 278, 278, - 278, 278, 278, 1, 76, 77, 282, 79, - 283, 80, 282, 284, 282, 282, 282, 282, - 282, 75, 91, 76, 77, 282, 79, 283, - 80, 282, 284, 282, 282, 282, 282, 282, - 75, 81, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 1, 285, 286, 285, 287, - 285, 285, 285, 285, 285, 1, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 1, - 289, 288, 288, 288, 1, 291, 292, 293, - 294, 295, 297, 294, 296, 296, 296, 290, - 298, 1, 299, 1, 299, 60, 300, 60, - 62, 60, 60, 60, 60, 60, 60, 60, - 1, 302, 304, 303, 303, 303, 301, 305, - 1, 306, 1, 306, 307, 300, 300, 300, - 1, 309, 310, 311, 312, 311, 313, 311, - 311, 311, 311, 311, 311, 311, 308, 298, - 314, 309, 310, 311, 312, 311, 313, 311, - 311, 311, 311, 311, 311, 311, 308, 298, - 299, 1, 315, 68, 69, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 67, 71, - 299, 1, 316, 302, 304, 303, 303, 303, - 301, 305, 299, 1, 305, 317, 302, 304, - 303, 303, 303, 301, 305, 306, 1, 318, - 309, 310, 311, 312, 311, 313, 311, 311, - 311, 311, 311, 311, 311, 308, 298, 306, - 1, 319, 97, 98, 95, 99, 299, 1, - 298, 320, 320, 321, 321, 321, 1, 320, - 320, 321, 321, 321, 1, 298, 321, 321, - 321, 1, 322, 291, 292, 293, 294, 295, - 297, 294, 296, 296, 296, 290, 323, 326, - 323, 324, 325, 325, 1, 327, 327, 328, - 328, 328, 1, 327, 329, 327, 328, 328, - 328, 1, 330, 330, 1, 331, 330, 330, - 1, 333, 334, 335, 336, 332, 327, 337, - 329, 327, 338, 328, 328, 1, 339, 1, - 340, 341, 1, 342, 1, 343, 344, 1, - 345, 1, 347, 346, 1, 347, 348, 1, - 347, 1, 343, 349, 1, 343, 1, 340, - 350, 1, 340, 1, 327, 337, 329, 327, - 351, 328, 328, 1, 327, 337, 329, 327, - 328, 328, 328, 1, 327, 329, 352, 327, - 328, 328, 328, 1, 327, 329, 327, 353, - 328, 328, 328, 1, 327, 354, 329, 327, - 328, 328, 328, 1, 327, 355, 327, 328, - 328, 328, 1, 357, 330, 356, 330, 356, - 330, 330, 356, 330, 1, 359, 331, 330, - 358, 330, 358, 330, 330, 358, 330, 1, - 359, 331, 330, 360, 330, 360, 330, 330, - 360, 330, 1, 359, 331, 330, 361, 330, - 361, 330, 330, 361, 330, 1, 359, 331, - 330, 330, 1, 363, 331, 330, 362, 330, - 362, 330, 330, 362, 330, 1, 365, 331, - 330, 364, 330, 364, 330, 330, 364, 330, - 1, 365, 331, 330, 366, 330, 366, 330, - 330, 366, 330, 1, 365, 331, 330, 367, - 330, 367, 330, 330, 367, 330, 1, 365, - 331, 330, 330, 1, 363, 331, 330, 368, - 330, 368, 330, 330, 368, 330, 1, 370, - 331, 330, 369, 330, 369, 330, 330, 369, - 330, 1, 370, 331, 330, 371, 330, 371, - 330, 330, 371, 330, 1, 370, 331, 330, - 372, 330, 372, 330, 330, 372, 330, 1, - 370, 331, 330, 330, 1, 363, 331, 330, - 373, 330, 373, 330, 330, 373, 330, 1, - 375, 331, 330, 374, 330, 374, 330, 330, - 374, 330, 1, 375, 331, 330, 376, 330, - 376, 330, 330, 376, 330, 1, 375, 331, - 330, 377, 330, 377, 330, 330, 377, 330, - 1, 375, 331, 330, 330, 1, 363, 331, - 330, 378, 330, 378, 330, 330, 378, 330, - 1, 380, 331, 330, 379, 330, 379, 330, - 330, 379, 330, 1, 380, 331, 330, 381, - 330, 381, 330, 330, 381, 330, 1, 380, - 331, 330, 382, 330, 382, 330, 330, 382, - 330, 1, 380, 331, 330, 330, 1, 384, - 331, 330, 383, 330, 383, 330, 330, 383, - 330, 1, 386, 331, 330, 385, 330, 385, - 330, 330, 385, 330, 1, 386, 331, 330, - 387, 330, 387, 330, 330, 387, 330, 1, - 386, 331, 330, 388, 330, 388, 330, 330, - 388, 330, 1, 386, 331, 330, 330, 1, - 384, 331, 330, 389, 330, 390, 330, 330, - 390, 330, 1, 391, 393, 331, 330, 392, - 330, 394, 330, 330, 394, 330, 1, 331, - 330, 395, 330, 330, 1, 396, 331, 330, - 397, 330, 330, 1, 331, 330, 398, 330, - 330, 1, 399, 331, 330, 400, 330, 330, - 1, 331, 330, 401, 330, 330, 1, 403, - 330, 402, 330, 330, 1, 403, 330, 404, - 330, 330, 1, 403, 330, 330, 1, 399, - 331, 330, 405, 330, 330, 1, 399, 331, - 330, 330, 1, 396, 331, 330, 406, 330, - 330, 1, 396, 331, 330, 330, 1, 391, - 393, 331, 330, 407, 330, 408, 330, 330, - 408, 330, 1, 391, 393, 331, 330, 409, - 330, 409, 330, 330, 409, 330, 1, 393, - 331, 330, 330, 1, 331, 330, 410, 330, - 410, 330, 330, 410, 330, 1, 412, 330, - 411, 330, 411, 330, 330, 411, 330, 1, - 412, 330, 413, 330, 413, 330, 330, 413, - 330, 1, 412, 330, 414, 330, 414, 330, - 330, 414, 330, 1, 412, 330, 330, 1, - 393, 331, 330, 409, 330, 409, 330, 330, - 409, 330, 1, 393, 331, 330, 408, 330, - 408, 330, 330, 408, 330, 1, 412, 330, - 415, 330, 415, 330, 330, 415, 330, 1, - 417, 412, 330, 416, 330, 416, 330, 330, - 416, 330, 1, 417, 412, 330, 418, 330, - 418, 330, 330, 418, 330, 1, 417, 412, - 330, 419, 330, 419, 330, 330, 419, 330, - 1, 417, 412, 330, 330, 1, 331, 330, - 420, 330, 420, 330, 330, 420, 330, 1, - 422, 412, 330, 421, 330, 421, 330, 330, - 421, 330, 1, 422, 412, 330, 423, 330, - 423, 330, 330, 423, 330, 1, 422, 412, - 330, 424, 330, 424, 330, 330, 424, 330, - 1, 422, 412, 330, 330, 1, 331, 330, - 425, 330, 425, 330, 330, 425, 330, 1, - 427, 412, 330, 426, 330, 426, 330, 330, - 426, 330, 1, 427, 412, 330, 428, 330, - 428, 330, 330, 428, 330, 1, 427, 412, - 330, 429, 330, 429, 330, 330, 429, 330, - 1, 427, 412, 330, 330, 1, 331, 330, - 430, 330, 430, 330, 330, 430, 330, 1, - 432, 412, 330, 431, 330, 431, 330, 330, - 431, 330, 1, 432, 412, 330, 433, 330, - 433, 330, 330, 433, 330, 1, 432, 412, - 330, 434, 330, 434, 330, 330, 434, 330, - 1, 432, 412, 330, 330, 1, 331, 330, - 435, 330, 435, 330, 330, 435, 330, 1, - 393, 412, 330, 436, 330, 436, 330, 330, - 436, 330, 1, 393, 412, 330, 437, 330, - 437, 330, 330, 437, 330, 1, 393, 412, - 330, 438, 330, 438, 330, 330, 438, 330, - 1, 393, 412, 330, 330, 1, 393, 331, - 330, 394, 330, 394, 330, 330, 394, 330, - 1, 412, 330, 439, 330, 440, 330, 330, - 440, 330, 1, 391, 442, 412, 330, 441, - 330, 443, 330, 330, 443, 330, 1, 391, - 442, 412, 330, 444, 330, 445, 330, 330, - 445, 330, 1, 391, 442, 412, 330, 446, - 330, 446, 330, 330, 446, 330, 1, 442, - 412, 330, 330, 1, 331, 330, 447, 330, - 448, 330, 330, 448, 330, 1, 391, 450, - 412, 330, 449, 330, 451, 330, 330, 451, - 330, 1, 391, 450, 412, 330, 452, 330, - 453, 330, 330, 453, 330, 1, 391, 450, - 412, 330, 454, 330, 454, 330, 330, 454, - 330, 1, 450, 412, 330, 330, 1, 331, - 330, 455, 330, 456, 330, 330, 456, 330, - 1, 391, 458, 412, 330, 457, 330, 459, - 330, 330, 459, 330, 1, 391, 458, 412, - 330, 460, 330, 461, 330, 330, 461, 330, - 1, 391, 458, 412, 330, 462, 330, 462, - 330, 330, 462, 330, 1, 458, 412, 330, - 330, 1, 331, 330, 463, 330, 464, 330, - 330, 464, 330, 1, 391, 466, 412, 330, - 465, 330, 467, 330, 330, 467, 330, 1, - 391, 466, 412, 330, 468, 330, 469, 330, - 330, 469, 330, 1, 391, 466, 412, 330, - 470, 330, 470, 330, 330, 470, 330, 1, - 466, 412, 330, 330, 1, 331, 330, 471, - 330, 435, 330, 330, 435, 330, 1, 391, - 393, 412, 330, 472, 330, 436, 330, 330, - 436, 330, 1, 391, 393, 412, 330, 473, - 330, 437, 330, 330, 437, 330, 1, 391, - 393, 412, 330, 438, 330, 438, 330, 330, - 438, 330, 1, 466, 412, 330, 470, 330, - 470, 330, 330, 470, 330, 1, 466, 412, - 330, 469, 330, 469, 330, 330, 469, 330, - 1, 466, 412, 330, 467, 330, 467, 330, - 330, 467, 330, 1, 458, 412, 330, 462, - 330, 462, 330, 330, 462, 330, 1, 458, - 412, 330, 461, 330, 461, 330, 330, 461, - 330, 1, 458, 412, 330, 459, 330, 459, - 330, 330, 459, 330, 1, 450, 412, 330, - 454, 330, 454, 330, 330, 454, 330, 1, - 450, 412, 330, 453, 330, 453, 330, 330, - 453, 330, 1, 450, 412, 330, 451, 330, - 451, 330, 330, 451, 330, 1, 442, 412, - 330, 446, 330, 446, 330, 330, 446, 330, - 1, 442, 412, 330, 445, 330, 445, 330, - 330, 445, 330, 1, 442, 412, 330, 443, - 330, 443, 330, 330, 443, 330, 1, 363, - 331, 330, 330, 1, 81, 289, 288, 288, - 288, 1, 475, 476, 474, 1, 478, 479, - 477, 1, 233, 234, 235, 236, 480, 232, - 481, 1, 483, 484, 482, 1, 486, 485, - 485, 487, 485, 485, 485, 485, 485, 1, - 488, 489, 488, 490, 488, 488, 488, 488, - 488, 1, 488, 488, 488, 488, 488, 488, - 488, 488, 488, 1, 492, 491, 491, 491, - 1, 493, 494, 496, 493, 495, 495, 495, - 1, 493, 493, 495, 495, 495, 1, 495, - 495, 495, 1, 498, 499, 500, 501, 497, - 502, 505, 502, 503, 504, 504, 1, 506, - 506, 507, 507, 507, 1, 506, 508, 506, - 507, 507, 507, 1, 509, 509, 1, 510, - 509, 509, 1, 511, 1, 506, 512, 508, - 506, 513, 507, 507, 1, 514, 1, 515, - 516, 1, 517, 1, 518, 519, 1, 520, - 1, 522, 521, 1, 522, 523, 1, 522, - 1, 518, 524, 1, 518, 1, 515, 525, - 1, 515, 1, 506, 512, 508, 506, 526, - 507, 507, 1, 506, 512, 508, 506, 507, - 507, 507, 1, 506, 508, 527, 506, 507, - 507, 507, 1, 506, 508, 506, 528, 507, - 507, 507, 1, 506, 529, 508, 506, 507, - 507, 507, 1, 506, 530, 506, 507, 507, - 507, 1, 532, 509, 531, 509, 531, 509, - 509, 531, 509, 1, 534, 510, 509, 533, - 509, 533, 509, 509, 533, 509, 1, 534, - 510, 509, 535, 509, 535, 509, 509, 535, - 509, 1, 534, 510, 509, 536, 509, 536, - 509, 509, 536, 509, 1, 534, 510, 509, - 509, 1, 538, 510, 509, 537, 509, 537, - 509, 509, 537, 509, 1, 540, 510, 509, - 539, 509, 539, 509, 509, 539, 509, 1, - 540, 510, 509, 541, 509, 541, 509, 509, - 541, 509, 1, 540, 510, 509, 542, 509, - 542, 509, 509, 542, 509, 1, 540, 510, - 509, 509, 1, 538, 510, 509, 543, 509, - 543, 509, 509, 543, 509, 1, 545, 510, - 509, 544, 509, 544, 509, 509, 544, 509, - 1, 545, 510, 509, 546, 509, 546, 509, - 509, 546, 509, 1, 545, 510, 509, 547, - 509, 547, 509, 509, 547, 509, 1, 545, - 510, 509, 509, 1, 538, 510, 509, 548, - 509, 548, 509, 509, 548, 509, 1, 550, - 510, 509, 549, 509, 549, 509, 509, 549, - 509, 1, 550, 510, 509, 551, 509, 551, - 509, 509, 551, 509, 1, 550, 510, 509, - 552, 509, 552, 509, 509, 552, 509, 1, - 550, 510, 509, 509, 1, 538, 510, 509, - 553, 509, 553, 509, 509, 553, 509, 1, - 555, 510, 509, 554, 509, 554, 509, 509, - 554, 509, 1, 555, 510, 509, 556, 509, - 556, 509, 509, 556, 509, 1, 555, 510, - 509, 557, 509, 557, 509, 509, 557, 509, - 1, 555, 510, 509, 509, 1, 559, 510, - 509, 558, 509, 558, 509, 509, 558, 509, - 1, 561, 510, 509, 560, 509, 560, 509, - 509, 560, 509, 1, 561, 510, 509, 562, - 509, 562, 509, 509, 562, 509, 1, 561, - 510, 509, 563, 509, 563, 509, 509, 563, - 509, 1, 561, 510, 509, 509, 1, 559, - 510, 509, 564, 509, 565, 509, 509, 565, - 509, 1, 566, 568, 510, 509, 567, 509, - 569, 509, 509, 569, 509, 1, 510, 509, - 570, 509, 509, 1, 571, 510, 509, 572, - 509, 509, 1, 510, 509, 573, 509, 509, - 1, 574, 510, 509, 575, 509, 509, 1, - 510, 509, 576, 509, 509, 1, 578, 509, - 577, 509, 509, 1, 578, 509, 579, 509, - 509, 1, 578, 509, 509, 1, 574, 510, - 509, 580, 509, 509, 1, 574, 510, 509, - 509, 1, 571, 510, 509, 581, 509, 509, - 1, 571, 510, 509, 509, 1, 566, 568, - 510, 509, 582, 509, 583, 509, 509, 583, - 509, 1, 566, 568, 510, 509, 584, 509, - 584, 509, 509, 584, 509, 1, 568, 510, - 509, 509, 1, 510, 509, 585, 509, 585, - 509, 509, 585, 509, 1, 587, 509, 586, - 509, 586, 509, 509, 586, 509, 1, 587, - 509, 588, 509, 588, 509, 509, 588, 509, - 1, 587, 509, 589, 509, 589, 509, 509, - 589, 509, 1, 587, 509, 509, 1, 568, - 510, 509, 584, 509, 584, 509, 509, 584, - 509, 1, 568, 510, 509, 583, 509, 583, - 509, 509, 583, 509, 1, 587, 509, 590, - 509, 590, 509, 509, 590, 509, 1, 592, - 587, 509, 591, 509, 591, 509, 509, 591, - 509, 1, 592, 587, 509, 593, 509, 593, - 509, 509, 593, 509, 1, 592, 587, 509, - 594, 509, 594, 509, 509, 594, 509, 1, - 592, 587, 509, 509, 1, 510, 509, 595, - 509, 595, 509, 509, 595, 509, 1, 597, - 587, 509, 596, 509, 596, 509, 509, 596, - 509, 1, 597, 587, 509, 598, 509, 598, - 509, 509, 598, 509, 1, 597, 587, 509, - 599, 509, 599, 509, 509, 599, 509, 1, - 597, 587, 509, 509, 1, 510, 509, 600, - 509, 600, 509, 509, 600, 509, 1, 602, - 587, 509, 601, 509, 601, 509, 509, 601, - 509, 1, 602, 587, 509, 603, 509, 603, - 509, 509, 603, 509, 1, 602, 587, 509, - 604, 509, 604, 509, 509, 604, 509, 1, - 602, 587, 509, 509, 1, 510, 509, 605, - 509, 605, 509, 509, 605, 509, 1, 607, - 587, 509, 606, 509, 606, 509, 509, 606, - 509, 1, 607, 587, 509, 608, 509, 608, - 509, 509, 608, 509, 1, 607, 587, 509, - 609, 509, 609, 509, 509, 609, 509, 1, - 607, 587, 509, 509, 1, 510, 509, 610, - 509, 610, 509, 509, 610, 509, 1, 568, - 587, 509, 611, 509, 611, 509, 509, 611, - 509, 1, 568, 587, 509, 612, 509, 612, - 509, 509, 612, 509, 1, 568, 587, 509, - 613, 509, 613, 509, 509, 613, 509, 1, - 568, 587, 509, 509, 1, 568, 510, 509, - 569, 509, 569, 509, 509, 569, 509, 1, - 587, 509, 614, 509, 615, 509, 509, 615, - 509, 1, 566, 617, 587, 509, 616, 509, - 618, 509, 509, 618, 509, 1, 566, 617, - 587, 509, 619, 509, 620, 509, 509, 620, - 509, 1, 566, 617, 587, 509, 621, 509, - 621, 509, 509, 621, 509, 1, 617, 587, - 509, 509, 1, 510, 509, 622, 509, 623, - 509, 509, 623, 509, 1, 566, 625, 587, - 509, 624, 509, 626, 509, 509, 626, 509, - 1, 566, 625, 587, 509, 627, 509, 628, - 509, 509, 628, 509, 1, 566, 625, 587, - 509, 629, 509, 629, 509, 509, 629, 509, - 1, 625, 587, 509, 509, 1, 510, 509, - 630, 509, 631, 509, 509, 631, 509, 1, - 566, 633, 587, 509, 632, 509, 634, 509, - 509, 634, 509, 1, 566, 633, 587, 509, - 635, 509, 636, 509, 509, 636, 509, 1, - 566, 633, 587, 509, 637, 509, 637, 509, - 509, 637, 509, 1, 633, 587, 509, 509, - 1, 510, 509, 638, 509, 639, 509, 509, - 639, 509, 1, 566, 641, 587, 509, 640, - 509, 642, 509, 509, 642, 509, 1, 566, - 641, 587, 509, 643, 509, 644, 509, 509, - 644, 509, 1, 566, 641, 587, 509, 645, - 509, 645, 509, 509, 645, 509, 1, 641, - 587, 509, 509, 1, 510, 509, 646, 509, - 610, 509, 509, 610, 509, 1, 566, 568, - 587, 509, 647, 509, 611, 509, 509, 611, - 509, 1, 566, 568, 587, 509, 648, 509, - 612, 509, 509, 612, 509, 1, 566, 568, - 587, 509, 613, 509, 613, 509, 509, 613, - 509, 1, 641, 587, 509, 645, 509, 645, - 509, 509, 645, 509, 1, 641, 587, 509, - 644, 509, 644, 509, 509, 644, 509, 1, - 641, 587, 509, 642, 509, 642, 509, 509, - 642, 509, 1, 633, 587, 509, 637, 509, - 637, 509, 509, 637, 509, 1, 633, 587, - 509, 636, 509, 636, 509, 509, 636, 509, - 1, 633, 587, 509, 634, 509, 634, 509, - 509, 634, 509, 1, 625, 587, 509, 629, - 509, 629, 509, 509, 629, 509, 1, 625, - 587, 509, 628, 509, 628, 509, 509, 628, - 509, 1, 625, 587, 509, 626, 509, 626, - 509, 509, 626, 509, 1, 617, 587, 509, - 621, 509, 621, 509, 509, 621, 509, 1, - 617, 587, 509, 620, 509, 620, 509, 509, - 620, 509, 1, 617, 587, 509, 618, 509, - 618, 509, 509, 618, 509, 1, 538, 510, - 509, 509, 1, 650, 651, 649, 1, 653, - 654, 652, 1, 655, 1, 656, 1, 658, - 659, 657, 1, 660, 660, 660, 1, 661, - 662, 487, 663, 662, 660, 660, 660, 1, - 487, 1, 662, 662, 660, 660, 660, 1, - 486, 485, 485, 485, 485, 485, 485, 485, - 485, 1, 664, 664, 664, 1, 665, 666, - 281, 667, 666, 664, 664, 664, 1, 281, - 1, 666, 666, 664, 664, 664, 1, 669, - 668, 668, 668, 668, 668, 668, 668, 668, - 1, 671, 672, 670, 1, 674, 675, 673, - 1, 676, 1, 677, 1, 679, 680, 678, - 1, 276, 72, 1, 276, 681, 273, 274, - 683, 682, 684, 682, 685, 682, 682, 682, - 682, 682, 271, 276, 277, 1, 686, 76, - 77, 282, 79, 283, 80, 282, 284, 282, - 282, 282, 282, 282, 75, 81, 277, 1, - 276, 475, 476, 474, 1, 276, 486, 485, - 485, 487, 485, 485, 485, 485, 485, 1, - 276, 664, 664, 664, 1, 687, 68, 69, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 67, 71, 277, 1, 68, 69, 70, - 70, 70, 70, 688, 688, 70, 70, 70, - 70, 70, 67, 690, 691, 692, 693, 693, - 693, 693, 693, 693, 693, 693, 693, 689, - 694, 1, 695, 1, 695, 74, 696, 697, - 696, 696, 696, 696, 696, 696, 696, 1, - 699, 700, 701, 702, 701, 703, 701, 701, - 701, 701, 701, 701, 701, 698, 704, 1, - 705, 1, 705, 60, 706, 60, 62, 60, - 60, 63, 63, 60, 60, 60, 60, 60, - 1, 708, 710, 709, 709, 709, 707, 711, - 1, 712, 1, 712, 713, 706, 706, 706, - 1, 699, 700, 714, 702, 714, 703, 714, - 714, 715, 715, 714, 714, 714, 714, 714, - 698, 704, 716, 699, 700, 714, 702, 714, - 703, 714, 714, 715, 715, 714, 714, 714, - 714, 714, 698, 704, 705, 1, 717, 68, - 69, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 67, 71, 705, 1, 718, 708, - 710, 709, 709, 709, 707, 711, 705, 1, - 711, 719, 708, 710, 709, 709, 709, 707, - 711, 712, 1, 720, 699, 700, 714, 702, - 714, 703, 714, 714, 715, 715, 714, 714, - 714, 714, 714, 698, 704, 712, 1, 721, - 97, 98, 95, 99, 705, 1, 717, 68, - 69, 70, 70, 70, 70, 269, 269, 70, - 70, 70, 70, 70, 67, 716, 699, 700, - 701, 702, 701, 703, 701, 701, 701, 701, - 701, 701, 701, 698, 722, 722, 722, 722, - 722, 722, 722, 722, 722, 1, 722, 697, - 722, 723, 722, 722, 722, 722, 722, 1, - 724, 724, 724, 724, 725, 724, 724, 724, - 724, 724, 1, 724, 726, 727, 724, 724, - 724, 724, 724, 724, 1, 724, 724, 724, - 724, 724, 724, 724, 724, 724, 1, 699, - 700, 702, 703, 698, 728, 725, 725, 1, - 727, 1, 694, 72, 1, 694, 729, 691, - 692, 731, 730, 732, 730, 730, 730, 730, - 730, 730, 730, 689, 694, 695, 1, 733, - 699, 700, 701, 702, 701, 703, 701, 701, - 701, 701, 701, 701, 701, 698, 704, 695, - 1, 694, 227, 228, 226, 1, 694, 722, - 722, 722, 722, 722, 722, 722, 722, 722, - 1, 734, 68, 69, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 67, 71, 695, - 1, 68, 69, 70, 70, 70, 70, 735, - 735, 70, 70, 70, 70, 70, 67, 241, - 68, 69, 70, 70, 70, 70, 736, 736, - 70, 70, 70, 70, 70, 67, 738, 739, - 740, 741, 741, 741, 741, 741, 741, 741, - 741, 741, 737, 742, 1, 743, 1, 743, - 74, 744, 744, 744, 744, 744, 744, 744, - 744, 1, 746, 747, 748, 749, 748, 750, - 748, 748, 748, 748, 748, 748, 748, 745, - 751, 1, 752, 1, 752, 60, 753, 60, - 62, 60, 60, 63, 64, 66, 63, 64, - 66, 60, 60, 60, 60, 60, 1, 755, - 757, 756, 756, 756, 754, 758, 1, 759, - 1, 759, 760, 753, 753, 753, 1, 746, - 747, 761, 749, 761, 750, 761, 761, 762, - 763, 764, 762, 763, 764, 761, 761, 761, - 761, 761, 745, 751, 765, 746, 747, 761, - 749, 761, 750, 761, 761, 762, 763, 764, - 762, 763, 764, 761, 761, 761, 761, 761, - 745, 751, 752, 1, 766, 68, 69, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 67, 71, 752, 1, 767, 755, 757, 756, - 756, 756, 754, 758, 752, 1, 758, 768, - 755, 757, 756, 756, 756, 754, 758, 759, - 1, 769, 746, 747, 761, 749, 761, 750, - 761, 761, 762, 763, 764, 762, 763, 764, - 761, 761, 761, 761, 761, 745, 751, 759, - 1, 770, 97, 98, 95, 99, 752, 1, - 766, 68, 69, 70, 70, 70, 70, 269, - 269, 70, 70, 70, 70, 70, 67, 766, - 68, 69, 70, 70, 70, 70, 688, 688, - 70, 70, 70, 70, 70, 67, 766, 68, - 69, 70, 70, 70, 70, 771, 771, 70, - 70, 70, 70, 70, 67, 241, 68, 69, - 70, 70, 70, 70, 772, 772, 70, 70, - 70, 70, 70, 67, 241, 68, 69, 70, - 70, 70, 70, 773, 773, 70, 70, 70, - 70, 70, 67, 775, 776, 777, 778, 778, - 778, 778, 778, 778, 778, 778, 778, 774, - 779, 1, 780, 1, 780, 74, 781, 781, - 781, 782, 783, 784, 785, 781, 781, 781, - 781, 781, 1, 787, 788, 789, 790, 789, - 791, 789, 789, 789, 789, 789, 789, 789, - 786, 792, 1, 793, 1, 793, 60, 794, - 60, 62, 60, 60, 63, 64, 63, 64, - 60, 60, 60, 60, 60, 1, 796, 798, - 797, 797, 797, 795, 799, 1, 800, 1, - 800, 801, 794, 794, 794, 1, 787, 788, - 802, 790, 802, 791, 802, 802, 803, 804, - 803, 804, 802, 802, 802, 802, 802, 786, - 792, 805, 787, 788, 802, 790, 802, 791, - 802, 802, 803, 804, 803, 804, 802, 802, - 802, 802, 802, 786, 792, 793, 1, 806, - 68, 69, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 67, 71, 793, 1, 807, - 796, 798, 797, 797, 797, 795, 799, 793, - 1, 799, 808, 796, 798, 797, 797, 797, - 795, 799, 800, 1, 809, 787, 788, 802, - 790, 802, 791, 802, 802, 803, 804, 803, - 804, 802, 802, 802, 802, 802, 786, 792, - 800, 1, 810, 97, 98, 95, 99, 793, - 1, 806, 68, 69, 70, 70, 70, 70, - 269, 269, 70, 70, 70, 70, 70, 67, - 806, 68, 69, 70, 70, 70, 70, 688, - 688, 70, 70, 70, 70, 70, 67, 805, - 787, 788, 789, 790, 789, 791, 789, 789, - 789, 789, 789, 789, 789, 786, 787, 788, - 789, 790, 789, 791, 789, 789, 811, 789, - 789, 789, 789, 789, 786, 805, 787, 788, - 789, 790, 789, 791, 789, 789, 812, 789, - 789, 789, 789, 789, 786, 805, 787, 788, - 789, 790, 789, 791, 789, 789, 813, 789, - 789, 789, 789, 789, 786, 805, 787, 788, - 789, 790, 789, 791, 789, 789, 814, 789, - 789, 789, 789, 789, 786, 816, 817, 818, - 819, 820, 819, 821, 819, 819, 822, 819, - 819, 819, 819, 819, 815, 824, 825, 826, - 827, 828, 827, 829, 827, 827, 827, 827, - 827, 827, 827, 823, 787, 788, 789, 790, - 789, 791, 789, 789, 830, 789, 789, 789, - 789, 789, 786, 805, 787, 788, 789, 790, - 789, 791, 789, 789, 831, 789, 789, 789, - 789, 789, 786, 805, 787, 788, 789, 790, - 789, 791, 789, 789, 832, 789, 789, 789, - 789, 789, 786, 834, 835, 836, 837, 838, - 837, 839, 837, 837, 837, 837, 837, 837, - 837, 833, 787, 788, 789, 790, 789, 791, - 789, 789, 840, 789, 789, 789, 789, 789, - 786, 805, 787, 788, 789, 790, 789, 791, - 789, 789, 841, 789, 789, 789, 789, 789, - 786, 805, 787, 788, 789, 790, 789, 791, - 789, 789, 842, 789, 789, 789, 789, 789, - 786, 844, 845, 846, 847, 848, 847, 849, - 847, 847, 847, 847, 847, 847, 847, 843, - 787, 788, 789, 790, 789, 791, 789, 789, - 850, 789, 789, 789, 789, 789, 786, 805, - 787, 788, 789, 790, 789, 791, 789, 789, - 851, 789, 789, 789, 789, 789, 786, 805, - 787, 788, 789, 790, 789, 791, 789, 789, - 852, 789, 789, 789, 789, 789, 786, 854, - 855, 856, 857, 858, 857, 859, 857, 857, - 857, 857, 857, 857, 857, 853, 779, 72, - 1, 779, 860, 776, 777, 862, 861, 861, - 861, 863, 864, 865, 866, 861, 861, 861, - 861, 861, 774, 779, 780, 1, 867, 787, - 788, 789, 790, 789, 791, 789, 789, 789, - 789, 789, 789, 789, 786, 792, 780, 1, - 779, 227, 228, 226, 1, 867, 787, 788, - 789, 790, 789, 791, 789, 789, 811, 789, - 789, 789, 789, 789, 786, 867, 787, 788, - 789, 790, 789, 791, 789, 789, 830, 789, - 789, 789, 789, 789, 786, 867, 787, 788, - 789, 790, 789, 791, 789, 789, 840, 789, - 789, 789, 789, 789, 786, 867, 787, 788, - 789, 790, 789, 791, 789, 789, 850, 789, - 789, 789, 789, 789, 786, 868, 68, 69, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 67, 71, 780, 1, 68, 69, 70, - 70, 70, 70, 771, 771, 70, 70, 70, - 70, 70, 67, 765, 746, 747, 748, 749, - 748, 750, 748, 748, 748, 748, 748, 748, - 748, 745, 742, 72, 1, 742, 869, 739, - 740, 871, 870, 870, 870, 870, 870, 870, - 870, 870, 737, 742, 743, 1, 872, 746, - 747, 748, 749, 748, 750, 748, 748, 748, - 748, 748, 748, 748, 745, 751, 743, 1, - 742, 227, 228, 226, 1, 873, 68, 69, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 67, 71, 743, 1, 267, 252, 1, - 267, 874, 258, 259, 260, 261, 260, 262, - 260, 260, 263, 264, 265, 266, 263, 264, - 265, 266, 260, 260, 260, 260, 260, 256, - 267, 268, 1, 875, 68, 69, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 67, - 71, 268, 1, 876, 246, 248, 247, 247, - 247, 245, 251, 268, 1, 877, 97, 98, - 95, 99, 268, 1, 875, 68, 69, 70, - 70, 70, 70, 269, 269, 70, 70, 70, - 70, 70, 67, 875, 68, 69, 70, 70, - 70, 70, 688, 688, 70, 70, 70, 70, - 70, 67, 875, 68, 69, 70, 70, 70, - 70, 735, 735, 70, 70, 70, 70, 70, - 67, 875, 68, 69, 70, 70, 70, 70, - 771, 771, 70, 70, 70, 70, 70, 67, - 258, 259, 260, 261, 260, 262, 260, 260, - 263, 264, 265, 266, 263, 264, 265, 266, - 260, 260, 260, 260, 260, 256, 879, 880, - 881, 883, 884, 885, 882, 884, 882, 882, - 886, 882, 886, 882, 886, 882, 878, 887, - 1, 888, 1, 888, 254, 889, 253, 253, - 253, 1, 246, 248, 890, 893, 247, 890, - 247, 247, 891, 247, 892, 247, 892, 247, - 245, 255, 246, 248, 894, 247, 894, 247, - 247, 895, 247, 895, 247, 895, 247, 245, - 255, 246, 248, 894, 896, 247, 894, 247, - 247, 895, 247, 895, 247, 895, 247, 245, - 255, 246, 247, 898, 899, 247, 247, 897, - 897, 245, 255, 246, 247, 898, 899, 247, - 900, 897, 897, 245, 251, 902, 901, 901, - 1, 902, 901, 901, 1, 903, 1, 905, - 906, 907, 908, 904, 257, 258, 259, 910, - 911, 910, 910, 910, 910, 912, 910, 910, - 910, 913, 914, 915, 916, 917, 913, 914, - 915, 916, 909, 909, 256, 875, 68, 69, - 919, 919, 919, 918, 918, 920, 918, 919, - 918, 919, 918, 918, 67, 241, 68, 69, - 919, 919, 919, 918, 918, 920, 918, 919, - 918, 919, 918, 918, 67, 71, 902, 901, - 901, 1, 71, 903, 1, 267, 902, 901, - 901, 1, 876, 246, 247, 898, 899, 247, - 900, 897, 897, 245, 255, 246, 921, 247, - 247, 247, 245, 922, 905, 906, 923, 907, - 923, 908, 923, 923, 924, 925, 926, 927, - 924, 925, 926, 927, 923, 923, 923, 923, - 923, 904, 877, 97, 98, 929, 928, 928, - 95, 99, 902, 901, 901, 1, 99, 903, - 1, 875, 68, 69, 919, 919, 919, 918, - 918, 930, 920, 930, 918, 919, 918, 919, - 918, 918, 67, 241, 68, 69, 919, 919, - 919, 918, 918, 931, 920, 931, 918, 919, - 918, 919, 918, 918, 67, 272, 273, 274, - 933, 933, 933, 932, 932, 934, 932, 933, - 932, 933, 932, 932, 271, 687, 68, 69, - 919, 919, 919, 918, 918, 920, 918, 919, - 918, 919, 918, 918, 67, 276, 902, 901, - 901, 1, 276, 903, 1, 875, 68, 69, - 919, 919, 919, 918, 918, 935, 920, 935, - 918, 919, 918, 919, 918, 918, 67, 690, - 691, 692, 937, 937, 937, 936, 936, 938, - 936, 937, 936, 937, 936, 936, 689, 734, - 68, 69, 919, 919, 919, 918, 918, 920, - 918, 919, 918, 919, 918, 918, 67, 694, - 902, 901, 901, 1, 694, 903, 1, 875, - 68, 69, 919, 919, 919, 918, 918, 939, - 920, 939, 918, 919, 918, 919, 918, 918, - 67, 241, 68, 69, 919, 919, 919, 918, - 918, 940, 920, 940, 918, 919, 918, 919, - 918, 918, 67, 738, 739, 740, 942, 942, - 942, 941, 941, 943, 941, 942, 941, 942, - 941, 941, 737, 873, 68, 69, 919, 919, - 919, 918, 918, 920, 918, 919, 918, 919, - 918, 918, 67, 742, 902, 901, 901, 1, - 742, 903, 1, 875, 68, 69, 919, 919, - 919, 918, 918, 944, 920, 944, 918, 919, - 918, 919, 918, 918, 67, 241, 68, 69, - 919, 919, 919, 918, 918, 945, 920, 945, - 918, 919, 918, 919, 918, 918, 67, 241, - 68, 69, 919, 919, 919, 918, 918, 946, - 920, 946, 918, 919, 918, 919, 918, 918, - 67, 775, 776, 777, 948, 948, 948, 947, - 947, 949, 947, 948, 947, 948, 947, 947, - 774, 868, 68, 69, 919, 919, 919, 918, - 918, 920, 918, 919, 918, 919, 918, 918, - 67, 779, 902, 901, 901, 1, 779, 903, - 1, 267, 903, 1, 255, 246, 248, 894, - 950, 896, 247, 894, 247, 247, 951, 247, - 895, 247, 895, 247, 245, 255, 246, 248, - 247, 247, 952, 247, 247, 245, 255, 246, - 248, 953, 247, 247, 954, 247, 247, 245, - 255, 246, 248, 247, 247, 955, 247, 247, - 245, 255, 246, 248, 956, 247, 247, 957, - 247, 247, 245, 255, 246, 248, 247, 247, - 958, 247, 247, 245, 255, 246, 248, 960, - 247, 247, 959, 247, 247, 245, 255, 246, - 248, 960, 247, 247, 961, 247, 247, 245, - 255, 246, 248, 960, 247, 247, 247, 245, - 255, 246, 248, 956, 247, 247, 962, 247, - 247, 245, 255, 246, 248, 956, 247, 247, - 247, 245, 255, 246, 248, 953, 247, 247, - 963, 247, 247, 245, 255, 246, 248, 953, - 247, 247, 247, 245, 255, 246, 248, 894, - 950, 896, 247, 894, 247, 247, 964, 247, - 895, 247, 895, 247, 245, 255, 246, 248, - 894, 950, 896, 247, 894, 247, 247, 895, - 247, 895, 247, 895, 247, 245, 255, 246, - 248, 894, 896, 965, 247, 894, 247, 247, - 895, 247, 895, 247, 895, 247, 245, 255, - 246, 248, 894, 896, 247, 894, 966, 247, - 247, 895, 247, 895, 247, 895, 247, 245, - 255, 246, 248, 894, 967, 896, 247, 894, - 247, 247, 895, 247, 895, 247, 895, 247, - 245, 255, 246, 248, 894, 968, 247, 894, - 247, 247, 895, 247, 895, 247, 895, 247, - 245, 255, 246, 247, 898, 899, 970, 247, - 247, 897, 969, 897, 969, 897, 897, 969, - 897, 245, 255, 246, 247, 898, 899, 972, - 247, 900, 897, 971, 897, 971, 897, 897, - 971, 897, 245, 255, 246, 247, 898, 899, - 972, 247, 900, 897, 973, 897, 973, 897, - 897, 973, 897, 245, 255, 246, 247, 898, - 899, 972, 247, 900, 897, 974, 897, 974, - 897, 897, 974, 897, 245, 255, 246, 247, - 898, 899, 972, 247, 900, 897, 897, 245, - 255, 246, 247, 898, 899, 976, 247, 900, - 897, 975, 897, 975, 897, 897, 975, 897, - 245, 255, 246, 247, 898, 899, 978, 247, - 900, 897, 977, 897, 977, 897, 897, 977, - 897, 245, 255, 246, 247, 898, 899, 978, - 247, 900, 897, 979, 897, 979, 897, 897, - 979, 897, 245, 255, 246, 247, 898, 899, - 978, 247, 900, 897, 980, 897, 980, 897, - 897, 980, 897, 245, 255, 246, 247, 898, - 899, 978, 247, 900, 897, 897, 245, 255, - 246, 247, 898, 899, 976, 247, 900, 897, - 981, 897, 981, 897, 897, 981, 897, 245, - 255, 246, 247, 898, 899, 983, 247, 900, - 897, 982, 897, 982, 897, 897, 982, 897, - 245, 255, 246, 247, 898, 899, 983, 247, - 900, 897, 984, 897, 984, 897, 897, 984, - 897, 245, 255, 246, 247, 898, 899, 983, - 247, 900, 897, 985, 897, 985, 897, 897, - 985, 897, 245, 255, 246, 247, 898, 899, - 983, 247, 900, 897, 897, 245, 255, 246, - 247, 898, 899, 976, 247, 900, 897, 986, - 897, 986, 897, 897, 986, 897, 245, 255, - 246, 247, 898, 899, 988, 247, 900, 897, - 987, 897, 987, 897, 897, 987, 897, 245, - 255, 246, 247, 898, 899, 988, 247, 900, - 897, 989, 897, 989, 897, 897, 989, 897, - 245, 255, 246, 247, 898, 899, 988, 247, - 900, 897, 990, 897, 990, 897, 897, 990, - 897, 245, 255, 246, 247, 898, 899, 988, - 247, 900, 897, 897, 245, 255, 246, 247, - 898, 899, 976, 247, 900, 897, 991, 897, - 991, 897, 897, 991, 897, 245, 255, 246, - 247, 898, 899, 993, 247, 900, 897, 992, - 897, 992, 897, 897, 992, 897, 245, 255, - 246, 247, 898, 899, 993, 247, 900, 897, - 994, 897, 994, 897, 897, 994, 897, 245, - 255, 246, 247, 898, 899, 993, 247, 900, - 897, 995, 897, 995, 897, 897, 995, 897, - 245, 255, 246, 247, 898, 899, 993, 247, - 900, 897, 897, 245, 255, 246, 247, 898, - 899, 997, 247, 900, 897, 996, 897, 996, - 897, 897, 996, 897, 245, 255, 246, 247, - 898, 899, 999, 247, 900, 897, 998, 897, - 998, 897, 897, 998, 897, 245, 255, 246, - 247, 898, 899, 999, 247, 900, 897, 1000, - 897, 1000, 897, 897, 1000, 897, 245, 255, - 246, 247, 898, 899, 999, 247, 900, 897, - 1001, 897, 1001, 897, 897, 1001, 897, 245, - 255, 246, 247, 898, 899, 999, 247, 900, - 897, 897, 245, 255, 246, 247, 898, 899, - 997, 247, 900, 897, 1002, 897, 1003, 897, - 897, 1003, 897, 245, 255, 246, 247, 898, - 899, 1004, 1006, 247, 900, 897, 1005, 897, - 1007, 897, 897, 1007, 897, 245, 255, 246, - 247, 898, 899, 247, 900, 897, 1008, 897, - 897, 245, 255, 246, 247, 898, 899, 1009, - 247, 900, 897, 1010, 897, 897, 245, 255, - 246, 247, 898, 899, 247, 900, 897, 1011, - 897, 897, 245, 255, 246, 247, 898, 899, - 1012, 247, 900, 897, 1013, 897, 897, 245, - 255, 246, 247, 898, 899, 247, 900, 897, - 1014, 897, 897, 245, 255, 246, 247, 898, - 899, 247, 1016, 897, 1015, 897, 897, 245, - 255, 246, 247, 898, 899, 247, 1016, 897, - 1017, 897, 897, 245, 255, 246, 247, 898, - 899, 247, 1016, 897, 897, 245, 255, 246, - 247, 898, 899, 1012, 247, 900, 897, 1018, - 897, 897, 245, 255, 246, 247, 898, 899, - 1012, 247, 900, 897, 897, 245, 255, 246, - 247, 898, 899, 1009, 247, 900, 897, 1019, - 897, 897, 245, 255, 246, 247, 898, 899, - 1009, 247, 900, 897, 897, 245, 255, 246, - 247, 898, 899, 1004, 1006, 247, 900, 897, - 1020, 897, 1021, 897, 897, 1021, 897, 245, - 255, 246, 247, 898, 899, 1004, 1006, 247, - 900, 897, 1022, 897, 1022, 897, 897, 1022, - 897, 245, 255, 246, 247, 898, 899, 1006, - 247, 900, 897, 897, 245, 255, 246, 247, - 898, 899, 247, 900, 897, 1023, 897, 1023, - 897, 897, 1023, 897, 245, 255, 246, 247, - 898, 899, 247, 1025, 897, 1024, 897, 1024, - 897, 897, 1024, 897, 245, 255, 246, 247, - 898, 899, 247, 1025, 897, 1026, 897, 1026, - 897, 897, 1026, 897, 245, 255, 246, 247, - 898, 899, 247, 1025, 897, 1027, 897, 1027, - 897, 897, 1027, 897, 245, 255, 246, 247, - 898, 899, 247, 1025, 897, 897, 245, 255, - 246, 247, 898, 899, 1006, 247, 900, 897, - 1022, 897, 1022, 897, 897, 1022, 897, 245, - 255, 246, 247, 898, 899, 1006, 247, 900, - 897, 1021, 897, 1021, 897, 897, 1021, 897, - 245, 255, 246, 247, 898, 899, 247, 1025, - 897, 1028, 897, 1028, 897, 897, 1028, 897, - 245, 255, 246, 247, 898, 899, 1030, 247, - 1025, 897, 1029, 897, 1029, 897, 897, 1029, - 897, 245, 255, 246, 247, 898, 899, 1030, - 247, 1025, 897, 1031, 897, 1031, 897, 897, - 1031, 897, 245, 255, 246, 247, 898, 899, - 1030, 247, 1025, 897, 1032, 897, 1032, 897, - 897, 1032, 897, 245, 255, 246, 247, 898, - 899, 1030, 247, 1025, 897, 897, 245, 255, - 246, 247, 898, 899, 247, 900, 897, 1033, - 897, 1033, 897, 897, 1033, 897, 245, 255, - 246, 247, 898, 899, 1035, 247, 1025, 897, - 1034, 897, 1034, 897, 897, 1034, 897, 245, - 255, 246, 247, 898, 899, 1035, 247, 1025, - 897, 1036, 897, 1036, 897, 897, 1036, 897, - 245, 255, 246, 247, 898, 899, 1035, 247, - 1025, 897, 1037, 897, 1037, 897, 897, 1037, - 897, 245, 255, 246, 247, 898, 899, 1035, - 247, 1025, 897, 897, 245, 255, 246, 247, - 898, 899, 247, 900, 897, 1038, 897, 1038, - 897, 897, 1038, 897, 245, 255, 246, 247, - 898, 899, 1040, 247, 1025, 897, 1039, 897, - 1039, 897, 897, 1039, 897, 245, 255, 246, - 247, 898, 899, 1040, 247, 1025, 897, 1041, - 897, 1041, 897, 897, 1041, 897, 245, 255, - 246, 247, 898, 899, 1040, 247, 1025, 897, - 1042, 897, 1042, 897, 897, 1042, 897, 245, - 255, 246, 247, 898, 899, 1040, 247, 1025, - 897, 897, 245, 255, 246, 247, 898, 899, - 247, 900, 897, 1043, 897, 1043, 897, 897, - 1043, 897, 245, 255, 246, 247, 898, 899, - 1045, 247, 1025, 897, 1044, 897, 1044, 897, - 897, 1044, 897, 245, 255, 246, 247, 898, - 899, 1045, 247, 1025, 897, 1046, 897, 1046, - 897, 897, 1046, 897, 245, 255, 246, 247, - 898, 899, 1045, 247, 1025, 897, 1047, 897, - 1047, 897, 897, 1047, 897, 245, 255, 246, - 247, 898, 899, 1045, 247, 1025, 897, 897, - 245, 255, 246, 247, 898, 899, 247, 900, - 897, 1048, 897, 1048, 897, 897, 1048, 897, - 245, 255, 246, 247, 898, 899, 1006, 247, - 1025, 897, 1049, 897, 1049, 897, 897, 1049, - 897, 245, 255, 246, 247, 898, 899, 1006, - 247, 1025, 897, 1050, 897, 1050, 897, 897, - 1050, 897, 245, 255, 246, 247, 898, 899, - 1006, 247, 1025, 897, 1051, 897, 1051, 897, - 897, 1051, 897, 245, 255, 246, 247, 898, - 899, 1006, 247, 1025, 897, 897, 245, 255, - 246, 247, 898, 899, 1006, 247, 900, 897, - 1007, 897, 1007, 897, 897, 1007, 897, 245, - 255, 246, 247, 898, 899, 247, 1025, 897, - 1052, 897, 1053, 897, 897, 1053, 897, 245, - 255, 246, 247, 898, 899, 1004, 1055, 247, - 1025, 897, 1054, 897, 1056, 897, 897, 1056, - 897, 245, 255, 246, 247, 898, 899, 1004, - 1055, 247, 1025, 897, 1057, 897, 1058, 897, - 897, 1058, 897, 245, 255, 246, 247, 898, - 899, 1004, 1055, 247, 1025, 897, 1059, 897, - 1059, 897, 897, 1059, 897, 245, 255, 246, - 247, 898, 899, 1055, 247, 1025, 897, 897, - 245, 255, 246, 247, 898, 899, 247, 900, - 897, 1060, 897, 1061, 897, 897, 1061, 897, - 245, 255, 246, 247, 898, 899, 1004, 1063, - 247, 1025, 897, 1062, 897, 1064, 897, 897, - 1064, 897, 245, 255, 246, 247, 898, 899, - 1004, 1063, 247, 1025, 897, 1065, 897, 1066, - 897, 897, 1066, 897, 245, 255, 246, 247, - 898, 899, 1004, 1063, 247, 1025, 897, 1067, - 897, 1067, 897, 897, 1067, 897, 245, 255, - 246, 247, 898, 899, 1063, 247, 1025, 897, - 897, 245, 255, 246, 247, 898, 899, 247, - 900, 897, 1068, 897, 1069, 897, 897, 1069, - 897, 245, 255, 246, 247, 898, 899, 1004, - 1071, 247, 1025, 897, 1070, 897, 1072, 897, - 897, 1072, 897, 245, 255, 246, 247, 898, - 899, 1004, 1071, 247, 1025, 897, 1073, 897, - 1074, 897, 897, 1074, 897, 245, 255, 246, - 247, 898, 899, 1004, 1071, 247, 1025, 897, - 1075, 897, 1075, 897, 897, 1075, 897, 245, - 255, 246, 247, 898, 899, 1071, 247, 1025, - 897, 897, 245, 255, 246, 247, 898, 899, - 247, 900, 897, 1076, 897, 1077, 897, 897, - 1077, 897, 245, 255, 246, 247, 898, 899, - 1004, 1079, 247, 1025, 897, 1078, 897, 1080, - 897, 897, 1080, 897, 245, 255, 246, 247, - 898, 899, 1004, 1079, 247, 1025, 897, 1081, - 897, 1082, 897, 897, 1082, 897, 245, 255, - 246, 247, 898, 899, 1004, 1079, 247, 1025, - 897, 1083, 897, 1083, 897, 897, 1083, 897, - 245, 255, 246, 247, 898, 899, 1079, 247, - 1025, 897, 897, 245, 255, 246, 247, 898, - 899, 247, 900, 897, 1084, 897, 1048, 897, - 897, 1048, 897, 245, 255, 246, 247, 898, - 899, 1004, 1006, 247, 1025, 897, 1085, 897, - 1049, 897, 897, 1049, 897, 245, 255, 246, - 247, 898, 899, 1004, 1006, 247, 1025, 897, - 1086, 897, 1050, 897, 897, 1050, 897, 245, - 255, 246, 247, 898, 899, 1004, 1006, 247, - 1025, 897, 1051, 897, 1051, 897, 897, 1051, - 897, 245, 255, 246, 247, 898, 899, 1079, - 247, 1025, 897, 1083, 897, 1083, 897, 897, - 1083, 897, 245, 255, 246, 247, 898, 899, - 1079, 247, 1025, 897, 1082, 897, 1082, 897, - 897, 1082, 897, 245, 255, 246, 247, 898, - 899, 1079, 247, 1025, 897, 1080, 897, 1080, - 897, 897, 1080, 897, 245, 255, 246, 247, - 898, 899, 1071, 247, 1025, 897, 1075, 897, - 1075, 897, 897, 1075, 897, 245, 255, 246, - 247, 898, 899, 1071, 247, 1025, 897, 1074, - 897, 1074, 897, 897, 1074, 897, 245, 255, - 246, 247, 898, 899, 1071, 247, 1025, 897, - 1072, 897, 1072, 897, 897, 1072, 897, 245, - 255, 246, 247, 898, 899, 1063, 247, 1025, - 897, 1067, 897, 1067, 897, 897, 1067, 897, - 245, 255, 246, 247, 898, 899, 1063, 247, - 1025, 897, 1066, 897, 1066, 897, 897, 1066, - 897, 245, 255, 246, 247, 898, 899, 1063, - 247, 1025, 897, 1064, 897, 1064, 897, 897, - 1064, 897, 245, 255, 246, 247, 898, 899, - 1055, 247, 1025, 897, 1059, 897, 1059, 897, - 897, 1059, 897, 245, 255, 246, 247, 898, - 899, 1055, 247, 1025, 897, 1058, 897, 1058, - 897, 897, 1058, 897, 245, 255, 246, 247, - 898, 899, 1055, 247, 1025, 897, 1056, 897, - 1056, 897, 897, 1056, 897, 245, 255, 246, - 247, 898, 899, 976, 247, 900, 897, 897, - 245, 887, 252, 1, 887, 1088, 1089, 1090, - 1092, 1093, 1091, 1091, 1091, 1087, 887, 888, - 1, 1094, 246, 248, 247, 247, 247, 245, - 251, 888, 1, 1095, 258, 259, 260, 261, - 260, 262, 260, 260, 263, 264, 265, 266, - 263, 264, 265, 266, 260, 260, 260, 260, - 260, 256, 267, 888, 1, 1094, 246, 248, - 890, 893, 247, 890, 247, 247, 891, 247, - 892, 247, 892, 247, 245, 1094, 246, 248, - 1096, 247, 1096, 247, 247, 1097, 247, 1097, - 247, 1097, 247, 245, 255, 246, 248, 1096, - 247, 1096, 247, 247, 1097, 247, 1097, 247, - 1097, 247, 245, 1094, 246, 248, 247, 247, - 247, 1097, 247, 1097, 247, 1097, 247, 245, - 1098, 880, 881, 883, 884, 885, 882, 884, - 882, 882, 886, 882, 886, 882, 886, 882, - 878, 255, 246, 248, 890, 893, 247, 890, - 247, 247, 891, 247, 892, 247, 892, 247, - 245, 58, 1100, 1101, 1102, 1103, 1104, 1103, - 1105, 1103, 1103, 1106, 1107, 1108, 1109, 1106, - 1107, 1108, 1109, 1103, 1103, 1103, 1103, 1103, - 1099, 58, 59, 1, 1110, 68, 69, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 67, 71, 59, 1, 1111, 246, 248, 250, - 247, 247, 249, 247, 249, 247, 249, 247, - 245, 251, 59, 1, 1112, 97, 98, 95, - 99, 59, 1, 1110, 68, 69, 70, 70, - 70, 70, 269, 269, 70, 70, 70, 70, - 70, 67, 1110, 68, 69, 70, 70, 70, - 70, 688, 688, 70, 70, 70, 70, 70, - 67, 1110, 68, 69, 70, 70, 70, 70, - 735, 735, 70, 70, 70, 70, 70, 67, - 1110, 68, 69, 70, 70, 70, 70, 771, - 771, 70, 70, 70, 70, 70, 67, 1111, - 246, 248, 247, 247, 247, 245, 58, 1113, - 1113, 1114, 1114, 1114, 1, 1113, 1113, 1114, - 1114, 1114, 1, 58, 1114, 1114, 1114, 1, - 1115, 51, 52, 53, 54, 55, 57, 54, - 56, 56, 56, 50, 1116, 1119, 1116, 1117, - 1118, 1118, 1, 1120, 1120, 1121, 1121, 1121, - 1, 1120, 1122, 1120, 1121, 1121, 1121, 1, - 1123, 1123, 1, 1124, 1123, 1123, 1, 1126, - 1127, 1125, 1128, 1, 1129, 1, 1129, 1130, - 1, 1132, 1131, 1131, 1131, 1, 1134, 1135, - 1136, 1137, 1136, 1138, 1138, 1138, 1133, 1139, - 1, 1140, 1, 1140, 1132, 1, 1141, 1144, - 1141, 1142, 1143, 1143, 1, 1145, 1145, 1146, - 1146, 1146, 1, 1145, 1147, 1145, 1146, 1146, - 1146, 1, 901, 901, 1, 1145, 1148, 1147, - 1145, 1149, 1146, 1146, 1, 1150, 1, 1151, - 1152, 1, 1153, 1, 1154, 1155, 1, 1156, - 1, 1158, 1157, 1, 1158, 1159, 1, 1158, - 1, 1154, 1160, 1, 1154, 1, 1151, 1161, - 1, 1151, 1, 1145, 1148, 1147, 1145, 1162, - 1146, 1146, 1, 1145, 1148, 1147, 1145, 1146, - 1146, 1146, 1, 1145, 1147, 1163, 1145, 1146, - 1146, 1146, 1, 1145, 1147, 1145, 1164, 1146, - 1146, 1146, 1, 1145, 1165, 1147, 1145, 1146, - 1146, 1146, 1, 1145, 1166, 1145, 1146, 1146, - 1146, 1, 1168, 901, 1167, 901, 1167, 901, - 901, 1167, 901, 1, 1170, 902, 901, 1169, - 901, 1169, 901, 901, 1169, 901, 1, 1170, - 902, 901, 1171, 901, 1171, 901, 901, 1171, - 901, 1, 1170, 902, 901, 1172, 901, 1172, - 901, 901, 1172, 901, 1, 1170, 902, 901, - 901, 1, 1174, 902, 901, 1173, 901, 1173, - 901, 901, 1173, 901, 1, 1176, 902, 901, - 1175, 901, 1175, 901, 901, 1175, 901, 1, - 1176, 902, 901, 1177, 901, 1177, 901, 901, - 1177, 901, 1, 1176, 902, 901, 1178, 901, - 1178, 901, 901, 1178, 901, 1, 1176, 902, - 901, 901, 1, 1174, 902, 901, 1179, 901, - 1179, 901, 901, 1179, 901, 1, 1181, 902, - 901, 1180, 901, 1180, 901, 901, 1180, 901, - 1, 1181, 902, 901, 1182, 901, 1182, 901, - 901, 1182, 901, 1, 1181, 902, 901, 1183, - 901, 1183, 901, 901, 1183, 901, 1, 1181, - 902, 901, 901, 1, 1174, 902, 901, 1184, - 901, 1184, 901, 901, 1184, 901, 1, 1186, - 902, 901, 1185, 901, 1185, 901, 901, 1185, - 901, 1, 1186, 902, 901, 1187, 901, 1187, - 901, 901, 1187, 901, 1, 1186, 902, 901, - 1188, 901, 1188, 901, 901, 1188, 901, 1, - 1186, 902, 901, 901, 1, 1174, 902, 901, - 1189, 901, 1189, 901, 901, 1189, 901, 1, - 1191, 902, 901, 1190, 901, 1190, 901, 901, - 1190, 901, 1, 1191, 902, 901, 1192, 901, - 1192, 901, 901, 1192, 901, 1, 1191, 902, - 901, 1193, 901, 1193, 901, 901, 1193, 901, - 1, 1191, 902, 901, 901, 1, 1195, 902, - 901, 1194, 901, 1194, 901, 901, 1194, 901, - 1, 1197, 902, 901, 1196, 901, 1196, 901, - 901, 1196, 901, 1, 1197, 902, 901, 1198, - 901, 1198, 901, 901, 1198, 901, 1, 1197, - 902, 901, 1199, 901, 1199, 901, 901, 1199, - 901, 1, 1197, 902, 901, 901, 1, 1195, - 902, 901, 1200, 901, 1201, 901, 901, 1201, - 901, 1, 1202, 1204, 902, 901, 1203, 901, - 1205, 901, 901, 1205, 901, 1, 902, 901, - 1206, 901, 901, 1, 1207, 902, 901, 1208, - 901, 901, 1, 902, 901, 1209, 901, 901, - 1, 1210, 902, 901, 1211, 901, 901, 1, - 902, 901, 1212, 901, 901, 1, 1214, 901, - 1213, 901, 901, 1, 1214, 901, 1215, 901, - 901, 1, 1214, 901, 901, 1, 1210, 902, - 901, 1216, 901, 901, 1, 1210, 902, 901, - 901, 1, 1207, 902, 901, 1217, 901, 901, - 1, 1207, 902, 901, 901, 1, 1202, 1204, - 902, 901, 1218, 901, 1219, 901, 901, 1219, - 901, 1, 1202, 1204, 902, 901, 1220, 901, - 1220, 901, 901, 1220, 901, 1, 1204, 902, - 901, 901, 1, 902, 901, 1221, 901, 1221, - 901, 901, 1221, 901, 1, 1223, 901, 1222, - 901, 1222, 901, 901, 1222, 901, 1, 1223, - 901, 1224, 901, 1224, 901, 901, 1224, 901, - 1, 1223, 901, 1225, 901, 1225, 901, 901, - 1225, 901, 1, 1223, 901, 901, 1, 1204, - 902, 901, 1220, 901, 1220, 901, 901, 1220, - 901, 1, 1204, 902, 901, 1219, 901, 1219, - 901, 901, 1219, 901, 1, 1223, 901, 1226, - 901, 1226, 901, 901, 1226, 901, 1, 1228, - 1223, 901, 1227, 901, 1227, 901, 901, 1227, - 901, 1, 1228, 1223, 901, 1229, 901, 1229, - 901, 901, 1229, 901, 1, 1228, 1223, 901, - 1230, 901, 1230, 901, 901, 1230, 901, 1, - 1228, 1223, 901, 901, 1, 902, 901, 1231, - 901, 1231, 901, 901, 1231, 901, 1, 1233, - 1223, 901, 1232, 901, 1232, 901, 901, 1232, - 901, 1, 1233, 1223, 901, 1234, 901, 1234, - 901, 901, 1234, 901, 1, 1233, 1223, 901, - 1235, 901, 1235, 901, 901, 1235, 901, 1, - 1233, 1223, 901, 901, 1, 902, 901, 1236, - 901, 1236, 901, 901, 1236, 901, 1, 1238, - 1223, 901, 1237, 901, 1237, 901, 901, 1237, - 901, 1, 1238, 1223, 901, 1239, 901, 1239, - 901, 901, 1239, 901, 1, 1238, 1223, 901, - 1240, 901, 1240, 901, 901, 1240, 901, 1, - 1238, 1223, 901, 901, 1, 902, 901, 1241, - 901, 1241, 901, 901, 1241, 901, 1, 1243, - 1223, 901, 1242, 901, 1242, 901, 901, 1242, - 901, 1, 1243, 1223, 901, 1244, 901, 1244, - 901, 901, 1244, 901, 1, 1243, 1223, 901, - 1245, 901, 1245, 901, 901, 1245, 901, 1, - 1243, 1223, 901, 901, 1, 902, 901, 1246, - 901, 1246, 901, 901, 1246, 901, 1, 1204, - 1223, 901, 1247, 901, 1247, 901, 901, 1247, - 901, 1, 1204, 1223, 901, 1248, 901, 1248, - 901, 901, 1248, 901, 1, 1204, 1223, 901, - 1249, 901, 1249, 901, 901, 1249, 901, 1, - 1204, 1223, 901, 901, 1, 1204, 902, 901, - 1205, 901, 1205, 901, 901, 1205, 901, 1, - 1223, 901, 1250, 901, 1251, 901, 901, 1251, - 901, 1, 1202, 1253, 1223, 901, 1252, 901, - 1254, 901, 901, 1254, 901, 1, 1202, 1253, - 1223, 901, 1255, 901, 1256, 901, 901, 1256, - 901, 1, 1202, 1253, 1223, 901, 1257, 901, - 1257, 901, 901, 1257, 901, 1, 1253, 1223, - 901, 901, 1, 902, 901, 1258, 901, 1259, - 901, 901, 1259, 901, 1, 1202, 1261, 1223, - 901, 1260, 901, 1262, 901, 901, 1262, 901, - 1, 1202, 1261, 1223, 901, 1263, 901, 1264, - 901, 901, 1264, 901, 1, 1202, 1261, 1223, - 901, 1265, 901, 1265, 901, 901, 1265, 901, - 1, 1261, 1223, 901, 901, 1, 902, 901, - 1266, 901, 1267, 901, 901, 1267, 901, 1, - 1202, 1269, 1223, 901, 1268, 901, 1270, 901, - 901, 1270, 901, 1, 1202, 1269, 1223, 901, - 1271, 901, 1272, 901, 901, 1272, 901, 1, - 1202, 1269, 1223, 901, 1273, 901, 1273, 901, - 901, 1273, 901, 1, 1269, 1223, 901, 901, - 1, 902, 901, 1274, 901, 1275, 901, 901, - 1275, 901, 1, 1202, 1277, 1223, 901, 1276, - 901, 1278, 901, 901, 1278, 901, 1, 1202, - 1277, 1223, 901, 1279, 901, 1280, 901, 901, - 1280, 901, 1, 1202, 1277, 1223, 901, 1281, - 901, 1281, 901, 901, 1281, 901, 1, 1277, - 1223, 901, 901, 1, 902, 901, 1282, 901, - 1246, 901, 901, 1246, 901, 1, 1202, 1204, - 1223, 901, 1283, 901, 1247, 901, 901, 1247, - 901, 1, 1202, 1204, 1223, 901, 1284, 901, - 1248, 901, 901, 1248, 901, 1, 1202, 1204, - 1223, 901, 1249, 901, 1249, 901, 901, 1249, - 901, 1, 1277, 1223, 901, 1281, 901, 1281, - 901, 901, 1281, 901, 1, 1277, 1223, 901, - 1280, 901, 1280, 901, 901, 1280, 901, 1, - 1277, 1223, 901, 1278, 901, 1278, 901, 901, - 1278, 901, 1, 1269, 1223, 901, 1273, 901, - 1273, 901, 901, 1273, 901, 1, 1269, 1223, - 901, 1272, 901, 1272, 901, 901, 1272, 901, - 1, 1269, 1223, 901, 1270, 901, 1270, 901, - 901, 1270, 901, 1, 1261, 1223, 901, 1265, - 901, 1265, 901, 901, 1265, 901, 1, 1261, - 1223, 901, 1264, 901, 1264, 901, 901, 1264, - 901, 1, 1261, 1223, 901, 1262, 901, 1262, - 901, 901, 1262, 901, 1, 1253, 1223, 901, - 1257, 901, 1257, 901, 901, 1257, 901, 1, - 1253, 1223, 901, 1256, 901, 1256, 901, 901, - 1256, 901, 1, 1253, 1223, 901, 1254, 901, - 1254, 901, 901, 1254, 901, 1, 1174, 902, - 901, 901, 1, 1139, 1286, 1287, 1288, 1289, - 1285, 1139, 1140, 1, 1139, 1141, 1144, 1141, - 1142, 1143, 1143, 1, 1139, 1290, 1290, 1291, - 1291, 1291, 1, 1290, 1290, 1291, 1291, 1291, - 1, 1139, 1291, 1291, 1291, 1, 1292, 1134, - 1135, 1136, 1137, 1136, 1138, 1138, 1138, 1133, - 1128, 1294, 1295, 1296, 1297, 1293, 1128, 1129, - 1, 1128, 1132, 1131, 1131, 1131, 1, 1120, - 1298, 1122, 1120, 1299, 1121, 1121, 1, 1300, - 1, 1301, 1302, 1, 1303, 1, 1304, 1305, - 1, 1306, 1, 1308, 1307, 1, 1308, 1309, - 1, 1308, 1, 1304, 1310, 1, 1304, 1, - 1301, 1311, 1, 1301, 1, 1120, 1298, 1122, - 1120, 1312, 1121, 1121, 1, 1120, 1298, 1122, - 1120, 1121, 1121, 1121, 1, 1120, 1122, 1313, - 1120, 1121, 1121, 1121, 1, 1120, 1122, 1120, - 1314, 1121, 1121, 1121, 1, 1120, 1315, 1122, - 1120, 1121, 1121, 1121, 1, 1120, 1316, 1120, - 1121, 1121, 1121, 1, 1318, 1123, 1317, 1123, - 1317, 1123, 1123, 1317, 1123, 1, 1320, 1124, - 1123, 1319, 1123, 1319, 1123, 1123, 1319, 1123, - 1, 1320, 1124, 1123, 1321, 1123, 1321, 1123, - 1123, 1321, 1123, 1, 1320, 1124, 1123, 1322, - 1123, 1322, 1123, 1123, 1322, 1123, 1, 1320, - 1124, 1123, 1123, 1, 1324, 1124, 1123, 1323, - 1123, 1323, 1123, 1123, 1323, 1123, 1, 1326, - 1124, 1123, 1325, 1123, 1325, 1123, 1123, 1325, - 1123, 1, 1326, 1124, 1123, 1327, 1123, 1327, - 1123, 1123, 1327, 1123, 1, 1326, 1124, 1123, - 1328, 1123, 1328, 1123, 1123, 1328, 1123, 1, - 1326, 1124, 1123, 1123, 1, 1324, 1124, 1123, - 1329, 1123, 1329, 1123, 1123, 1329, 1123, 1, - 1331, 1124, 1123, 1330, 1123, 1330, 1123, 1123, - 1330, 1123, 1, 1331, 1124, 1123, 1332, 1123, - 1332, 1123, 1123, 1332, 1123, 1, 1331, 1124, - 1123, 1333, 1123, 1333, 1123, 1123, 1333, 1123, - 1, 1331, 1124, 1123, 1123, 1, 1324, 1124, - 1123, 1334, 1123, 1334, 1123, 1123, 1334, 1123, - 1, 1336, 1124, 1123, 1335, 1123, 1335, 1123, - 1123, 1335, 1123, 1, 1336, 1124, 1123, 1337, - 1123, 1337, 1123, 1123, 1337, 1123, 1, 1336, - 1124, 1123, 1338, 1123, 1338, 1123, 1123, 1338, - 1123, 1, 1336, 1124, 1123, 1123, 1, 1324, - 1124, 1123, 1339, 1123, 1339, 1123, 1123, 1339, - 1123, 1, 1341, 1124, 1123, 1340, 1123, 1340, - 1123, 1123, 1340, 1123, 1, 1341, 1124, 1123, - 1342, 1123, 1342, 1123, 1123, 1342, 1123, 1, - 1341, 1124, 1123, 1343, 1123, 1343, 1123, 1123, - 1343, 1123, 1, 1341, 1124, 1123, 1123, 1, - 1345, 1124, 1123, 1344, 1123, 1344, 1123, 1123, - 1344, 1123, 1, 1347, 1124, 1123, 1346, 1123, - 1346, 1123, 1123, 1346, 1123, 1, 1347, 1124, - 1123, 1348, 1123, 1348, 1123, 1123, 1348, 1123, - 1, 1347, 1124, 1123, 1349, 1123, 1349, 1123, - 1123, 1349, 1123, 1, 1347, 1124, 1123, 1123, - 1, 1345, 1124, 1123, 1350, 1123, 1351, 1123, - 1123, 1351, 1123, 1, 1352, 1354, 1124, 1123, - 1353, 1123, 1355, 1123, 1123, 1355, 1123, 1, - 1124, 1123, 1356, 1123, 1123, 1, 1357, 1124, - 1123, 1358, 1123, 1123, 1, 1124, 1123, 1359, - 1123, 1123, 1, 1360, 1124, 1123, 1361, 1123, - 1123, 1, 1124, 1123, 1362, 1123, 1123, 1, - 1364, 1123, 1363, 1123, 1123, 1, 1364, 1123, - 1365, 1123, 1123, 1, 1364, 1123, 1123, 1, - 1360, 1124, 1123, 1366, 1123, 1123, 1, 1360, - 1124, 1123, 1123, 1, 1357, 1124, 1123, 1367, - 1123, 1123, 1, 1357, 1124, 1123, 1123, 1, - 1352, 1354, 1124, 1123, 1368, 1123, 1369, 1123, - 1123, 1369, 1123, 1, 1352, 1354, 1124, 1123, - 1370, 1123, 1370, 1123, 1123, 1370, 1123, 1, - 1354, 1124, 1123, 1123, 1, 1124, 1123, 1371, - 1123, 1371, 1123, 1123, 1371, 1123, 1, 1373, - 1123, 1372, 1123, 1372, 1123, 1123, 1372, 1123, - 1, 1373, 1123, 1374, 1123, 1374, 1123, 1123, - 1374, 1123, 1, 1373, 1123, 1375, 1123, 1375, - 1123, 1123, 1375, 1123, 1, 1373, 1123, 1123, - 1, 1354, 1124, 1123, 1370, 1123, 1370, 1123, - 1123, 1370, 1123, 1, 1354, 1124, 1123, 1369, - 1123, 1369, 1123, 1123, 1369, 1123, 1, 1373, - 1123, 1376, 1123, 1376, 1123, 1123, 1376, 1123, - 1, 1378, 1373, 1123, 1377, 1123, 1377, 1123, - 1123, 1377, 1123, 1, 1378, 1373, 1123, 1379, - 1123, 1379, 1123, 1123, 1379, 1123, 1, 1378, - 1373, 1123, 1380, 1123, 1380, 1123, 1123, 1380, - 1123, 1, 1378, 1373, 1123, 1123, 1, 1124, - 1123, 1381, 1123, 1381, 1123, 1123, 1381, 1123, - 1, 1383, 1373, 1123, 1382, 1123, 1382, 1123, - 1123, 1382, 1123, 1, 1383, 1373, 1123, 1384, - 1123, 1384, 1123, 1123, 1384, 1123, 1, 1383, - 1373, 1123, 1385, 1123, 1385, 1123, 1123, 1385, - 1123, 1, 1383, 1373, 1123, 1123, 1, 1124, - 1123, 1386, 1123, 1386, 1123, 1123, 1386, 1123, - 1, 1388, 1373, 1123, 1387, 1123, 1387, 1123, - 1123, 1387, 1123, 1, 1388, 1373, 1123, 1389, - 1123, 1389, 1123, 1123, 1389, 1123, 1, 1388, - 1373, 1123, 1390, 1123, 1390, 1123, 1123, 1390, - 1123, 1, 1388, 1373, 1123, 1123, 1, 1124, - 1123, 1391, 1123, 1391, 1123, 1123, 1391, 1123, - 1, 1393, 1373, 1123, 1392, 1123, 1392, 1123, - 1123, 1392, 1123, 1, 1393, 1373, 1123, 1394, - 1123, 1394, 1123, 1123, 1394, 1123, 1, 1393, - 1373, 1123, 1395, 1123, 1395, 1123, 1123, 1395, - 1123, 1, 1393, 1373, 1123, 1123, 1, 1124, - 1123, 1396, 1123, 1396, 1123, 1123, 1396, 1123, - 1, 1354, 1373, 1123, 1397, 1123, 1397, 1123, - 1123, 1397, 1123, 1, 1354, 1373, 1123, 1398, - 1123, 1398, 1123, 1123, 1398, 1123, 1, 1354, - 1373, 1123, 1399, 1123, 1399, 1123, 1123, 1399, - 1123, 1, 1354, 1373, 1123, 1123, 1, 1354, - 1124, 1123, 1355, 1123, 1355, 1123, 1123, 1355, - 1123, 1, 1373, 1123, 1400, 1123, 1401, 1123, - 1123, 1401, 1123, 1, 1352, 1403, 1373, 1123, - 1402, 1123, 1404, 1123, 1123, 1404, 1123, 1, - 1352, 1403, 1373, 1123, 1405, 1123, 1406, 1123, - 1123, 1406, 1123, 1, 1352, 1403, 1373, 1123, - 1407, 1123, 1407, 1123, 1123, 1407, 1123, 1, - 1403, 1373, 1123, 1123, 1, 1124, 1123, 1408, - 1123, 1409, 1123, 1123, 1409, 1123, 1, 1352, - 1411, 1373, 1123, 1410, 1123, 1412, 1123, 1123, - 1412, 1123, 1, 1352, 1411, 1373, 1123, 1413, - 1123, 1414, 1123, 1123, 1414, 1123, 1, 1352, - 1411, 1373, 1123, 1415, 1123, 1415, 1123, 1123, - 1415, 1123, 1, 1411, 1373, 1123, 1123, 1, - 1124, 1123, 1416, 1123, 1417, 1123, 1123, 1417, - 1123, 1, 1352, 1419, 1373, 1123, 1418, 1123, - 1420, 1123, 1123, 1420, 1123, 1, 1352, 1419, - 1373, 1123, 1421, 1123, 1422, 1123, 1123, 1422, - 1123, 1, 1352, 1419, 1373, 1123, 1423, 1123, - 1423, 1123, 1123, 1423, 1123, 1, 1419, 1373, - 1123, 1123, 1, 1124, 1123, 1424, 1123, 1425, - 1123, 1123, 1425, 1123, 1, 1352, 1427, 1373, - 1123, 1426, 1123, 1428, 1123, 1123, 1428, 1123, - 1, 1352, 1427, 1373, 1123, 1429, 1123, 1430, - 1123, 1123, 1430, 1123, 1, 1352, 1427, 1373, - 1123, 1431, 1123, 1431, 1123, 1123, 1431, 1123, - 1, 1427, 1373, 1123, 1123, 1, 1124, 1123, - 1432, 1123, 1396, 1123, 1123, 1396, 1123, 1, - 1352, 1354, 1373, 1123, 1433, 1123, 1397, 1123, - 1123, 1397, 1123, 1, 1352, 1354, 1373, 1123, - 1434, 1123, 1398, 1123, 1123, 1398, 1123, 1, - 1352, 1354, 1373, 1123, 1399, 1123, 1399, 1123, - 1123, 1399, 1123, 1, 1427, 1373, 1123, 1431, - 1123, 1431, 1123, 1123, 1431, 1123, 1, 1427, - 1373, 1123, 1430, 1123, 1430, 1123, 1123, 1430, - 1123, 1, 1427, 1373, 1123, 1428, 1123, 1428, - 1123, 1123, 1428, 1123, 1, 1419, 1373, 1123, - 1423, 1123, 1423, 1123, 1123, 1423, 1123, 1, - 1419, 1373, 1123, 1422, 1123, 1422, 1123, 1123, - 1422, 1123, 1, 1419, 1373, 1123, 1420, 1123, - 1420, 1123, 1123, 1420, 1123, 1, 1411, 1373, - 1123, 1415, 1123, 1415, 1123, 1123, 1415, 1123, - 1, 1411, 1373, 1123, 1414, 1123, 1414, 1123, - 1123, 1414, 1123, 1, 1411, 1373, 1123, 1412, - 1123, 1412, 1123, 1123, 1412, 1123, 1, 1403, - 1373, 1123, 1407, 1123, 1407, 1123, 1123, 1407, - 1123, 1, 1403, 1373, 1123, 1406, 1123, 1406, - 1123, 1123, 1406, 1123, 1, 1403, 1373, 1123, - 1404, 1123, 1404, 1123, 1123, 1404, 1123, 1, - 1324, 1124, 1123, 1123, 1, 46, 1435, 44, - 45, 1437, 1436, 1436, 1436, 43, 46, 47, - 1, 1438, 51, 52, 53, 54, 55, 57, - 54, 56, 56, 56, 50, 58, 47, 1, - 46, 1116, 1119, 1116, 1117, 1118, 1118, 1, - 40, 30, 1, 40, 1439, 36, 37, 38, - 39, 39, 34, 40, 41, 1, 1440, 24, - 26, 25, 25, 25, 23, 29, 41, 1, - 40, 42, 42, 1, 36, 37, 38, 39, - 39, 34, 1442, 1443, 1444, 1446, 1447, 1448, - 1445, 1447, 1445, 1445, 1449, 1445, 1449, 1445, - 1449, 1445, 1441, 1450, 1, 1451, 1, 1451, - 32, 1452, 31, 31, 31, 1, 24, 26, - 1453, 1456, 25, 1453, 25, 25, 1454, 25, - 1455, 25, 1455, 25, 23, 33, 24, 26, - 1457, 25, 1457, 25, 25, 1458, 25, 1458, - 25, 1458, 25, 23, 33, 24, 26, 1457, - 1459, 25, 1457, 25, 25, 1458, 25, 1458, - 25, 1458, 25, 23, 33, 24, 25, 1461, - 1462, 25, 25, 1460, 1460, 23, 33, 24, - 25, 1461, 1462, 25, 1463, 1460, 1460, 23, - 29, 1465, 1464, 1464, 1, 1465, 1464, 1464, - 1, 1466, 1, 1468, 1469, 1470, 1467, 35, - 36, 37, 1472, 1473, 1474, 1473, 1471, 1471, - 34, 40, 1465, 1464, 1464, 1, 1440, 24, - 25, 1461, 1462, 25, 1463, 1460, 1460, 23, - 33, 24, 1475, 25, 25, 25, 23, 1476, - 1468, 1469, 1470, 1477, 1477, 1467, 40, 1478, - 1465, 1478, 1464, 1464, 1, 44, 45, 1480, - 1479, 1479, 43, 46, 1465, 1464, 1464, 1, - 46, 1466, 1, 40, 1466, 1, 33, 24, - 26, 1457, 1481, 1459, 25, 1457, 25, 25, - 1482, 25, 1458, 25, 1458, 25, 23, 33, - 24, 26, 25, 25, 1483, 25, 25, 23, - 33, 24, 26, 1484, 25, 25, 1485, 25, - 25, 23, 33, 24, 26, 25, 25, 1486, - 25, 25, 23, 33, 24, 26, 1487, 25, - 25, 1488, 25, 25, 23, 33, 24, 26, - 25, 25, 1489, 25, 25, 23, 33, 24, - 26, 1491, 25, 25, 1490, 25, 25, 23, - 33, 24, 26, 1491, 25, 25, 1492, 25, - 25, 23, 33, 24, 26, 1491, 25, 25, - 25, 23, 33, 24, 26, 1487, 25, 25, - 1493, 25, 25, 23, 33, 24, 26, 1487, - 25, 25, 25, 23, 33, 24, 26, 1484, - 25, 25, 1494, 25, 25, 23, 33, 24, - 26, 1484, 25, 25, 25, 23, 33, 24, - 26, 1457, 1481, 1459, 25, 1457, 25, 25, - 1495, 25, 1458, 25, 1458, 25, 23, 33, - 24, 26, 1457, 1481, 1459, 25, 1457, 25, - 25, 1458, 25, 1458, 25, 1458, 25, 23, - 33, 24, 26, 1457, 1459, 1496, 25, 1457, - 25, 25, 1458, 25, 1458, 25, 1458, 25, - 23, 33, 24, 26, 1457, 1459, 25, 1457, - 1497, 25, 25, 1458, 25, 1458, 25, 1458, - 25, 23, 33, 24, 26, 1457, 1498, 1459, - 25, 1457, 25, 25, 1458, 25, 1458, 25, - 1458, 25, 23, 33, 24, 26, 1457, 1499, - 25, 1457, 25, 25, 1458, 25, 1458, 25, - 1458, 25, 23, 33, 24, 25, 1461, 1462, - 1501, 25, 25, 1460, 1500, 1460, 1500, 1460, - 1460, 1500, 1460, 23, 33, 24, 25, 1461, - 1462, 1503, 25, 1463, 1460, 1502, 1460, 1502, - 1460, 1460, 1502, 1460, 23, 33, 24, 25, - 1461, 1462, 1503, 25, 1463, 1460, 1504, 1460, - 1504, 1460, 1460, 1504, 1460, 23, 33, 24, - 25, 1461, 1462, 1503, 25, 1463, 1460, 1505, - 1460, 1505, 1460, 1460, 1505, 1460, 23, 33, - 24, 25, 1461, 1462, 1503, 25, 1463, 1460, - 1460, 23, 33, 24, 25, 1461, 1462, 1507, - 25, 1463, 1460, 1506, 1460, 1506, 1460, 1460, - 1506, 1460, 23, 33, 24, 25, 1461, 1462, - 1509, 25, 1463, 1460, 1508, 1460, 1508, 1460, - 1460, 1508, 1460, 23, 33, 24, 25, 1461, - 1462, 1509, 25, 1463, 1460, 1510, 1460, 1510, - 1460, 1460, 1510, 1460, 23, 33, 24, 25, - 1461, 1462, 1509, 25, 1463, 1460, 1511, 1460, - 1511, 1460, 1460, 1511, 1460, 23, 33, 24, - 25, 1461, 1462, 1509, 25, 1463, 1460, 1460, - 23, 33, 24, 25, 1461, 1462, 1507, 25, - 1463, 1460, 1512, 1460, 1512, 1460, 1460, 1512, - 1460, 23, 33, 24, 25, 1461, 1462, 1514, - 25, 1463, 1460, 1513, 1460, 1513, 1460, 1460, - 1513, 1460, 23, 33, 24, 25, 1461, 1462, - 1514, 25, 1463, 1460, 1515, 1460, 1515, 1460, - 1460, 1515, 1460, 23, 33, 24, 25, 1461, - 1462, 1514, 25, 1463, 1460, 1516, 1460, 1516, - 1460, 1460, 1516, 1460, 23, 33, 24, 25, - 1461, 1462, 1514, 25, 1463, 1460, 1460, 23, - 33, 24, 25, 1461, 1462, 1507, 25, 1463, - 1460, 1517, 1460, 1517, 1460, 1460, 1517, 1460, - 23, 33, 24, 25, 1461, 1462, 1519, 25, - 1463, 1460, 1518, 1460, 1518, 1460, 1460, 1518, - 1460, 23, 33, 24, 25, 1461, 1462, 1519, - 25, 1463, 1460, 1520, 1460, 1520, 1460, 1460, - 1520, 1460, 23, 33, 24, 25, 1461, 1462, - 1519, 25, 1463, 1460, 1521, 1460, 1521, 1460, - 1460, 1521, 1460, 23, 33, 24, 25, 1461, - 1462, 1519, 25, 1463, 1460, 1460, 23, 33, - 24, 25, 1461, 1462, 1507, 25, 1463, 1460, - 1522, 1460, 1522, 1460, 1460, 1522, 1460, 23, - 33, 24, 25, 1461, 1462, 1524, 25, 1463, - 1460, 1523, 1460, 1523, 1460, 1460, 1523, 1460, - 23, 33, 24, 25, 1461, 1462, 1524, 25, - 1463, 1460, 1525, 1460, 1525, 1460, 1460, 1525, - 1460, 23, 33, 24, 25, 1461, 1462, 1524, - 25, 1463, 1460, 1526, 1460, 1526, 1460, 1460, - 1526, 1460, 23, 33, 24, 25, 1461, 1462, - 1524, 25, 1463, 1460, 1460, 23, 33, 24, - 25, 1461, 1462, 1528, 25, 1463, 1460, 1527, - 1460, 1527, 1460, 1460, 1527, 1460, 23, 33, - 24, 25, 1461, 1462, 1530, 25, 1463, 1460, - 1529, 1460, 1529, 1460, 1460, 1529, 1460, 23, - 33, 24, 25, 1461, 1462, 1530, 25, 1463, - 1460, 1531, 1460, 1531, 1460, 1460, 1531, 1460, - 23, 33, 24, 25, 1461, 1462, 1530, 25, - 1463, 1460, 1532, 1460, 1532, 1460, 1460, 1532, - 1460, 23, 33, 24, 25, 1461, 1462, 1530, - 25, 1463, 1460, 1460, 23, 33, 24, 25, - 1461, 1462, 1528, 25, 1463, 1460, 1533, 1460, - 1534, 1460, 1460, 1534, 1460, 23, 33, 24, - 25, 1461, 1462, 1535, 1537, 25, 1463, 1460, - 1536, 1460, 1538, 1460, 1460, 1538, 1460, 23, - 33, 24, 25, 1461, 1462, 25, 1463, 1460, - 1539, 1460, 1460, 23, 33, 24, 25, 1461, - 1462, 1540, 25, 1463, 1460, 1541, 1460, 1460, - 23, 33, 24, 25, 1461, 1462, 25, 1463, - 1460, 1542, 1460, 1460, 23, 33, 24, 25, - 1461, 1462, 1543, 25, 1463, 1460, 1544, 1460, - 1460, 23, 33, 24, 25, 1461, 1462, 25, - 1463, 1460, 1545, 1460, 1460, 23, 33, 24, - 25, 1461, 1462, 25, 1547, 1460, 1546, 1460, - 1460, 23, 33, 24, 25, 1461, 1462, 25, - 1547, 1460, 1548, 1460, 1460, 23, 33, 24, - 25, 1461, 1462, 25, 1547, 1460, 1460, 23, - 33, 24, 25, 1461, 1462, 1543, 25, 1463, - 1460, 1549, 1460, 1460, 23, 33, 24, 25, - 1461, 1462, 1543, 25, 1463, 1460, 1460, 23, - 33, 24, 25, 1461, 1462, 1540, 25, 1463, - 1460, 1550, 1460, 1460, 23, 33, 24, 25, - 1461, 1462, 1540, 25, 1463, 1460, 1460, 23, - 33, 24, 25, 1461, 1462, 1535, 1537, 25, - 1463, 1460, 1551, 1460, 1552, 1460, 1460, 1552, - 1460, 23, 33, 24, 25, 1461, 1462, 1535, - 1537, 25, 1463, 1460, 1553, 1460, 1553, 1460, - 1460, 1553, 1460, 23, 33, 24, 25, 1461, - 1462, 1537, 25, 1463, 1460, 1460, 23, 33, - 24, 25, 1461, 1462, 25, 1463, 1460, 1554, - 1460, 1554, 1460, 1460, 1554, 1460, 23, 33, - 24, 25, 1461, 1462, 25, 1556, 1460, 1555, - 1460, 1555, 1460, 1460, 1555, 1460, 23, 33, - 24, 25, 1461, 1462, 25, 1556, 1460, 1557, - 1460, 1557, 1460, 1460, 1557, 1460, 23, 33, - 24, 25, 1461, 1462, 25, 1556, 1460, 1558, - 1460, 1558, 1460, 1460, 1558, 1460, 23, 33, - 24, 25, 1461, 1462, 25, 1556, 1460, 1460, - 23, 33, 24, 25, 1461, 1462, 1537, 25, - 1463, 1460, 1553, 1460, 1553, 1460, 1460, 1553, - 1460, 23, 33, 24, 25, 1461, 1462, 1537, - 25, 1463, 1460, 1552, 1460, 1552, 1460, 1460, - 1552, 1460, 23, 33, 24, 25, 1461, 1462, - 25, 1556, 1460, 1559, 1460, 1559, 1460, 1460, - 1559, 1460, 23, 33, 24, 25, 1461, 1462, - 1561, 25, 1556, 1460, 1560, 1460, 1560, 1460, - 1460, 1560, 1460, 23, 33, 24, 25, 1461, - 1462, 1561, 25, 1556, 1460, 1562, 1460, 1562, - 1460, 1460, 1562, 1460, 23, 33, 24, 25, - 1461, 1462, 1561, 25, 1556, 1460, 1563, 1460, - 1563, 1460, 1460, 1563, 1460, 23, 33, 24, - 25, 1461, 1462, 1561, 25, 1556, 1460, 1460, - 23, 33, 24, 25, 1461, 1462, 25, 1463, - 1460, 1564, 1460, 1564, 1460, 1460, 1564, 1460, - 23, 33, 24, 25, 1461, 1462, 1566, 25, - 1556, 1460, 1565, 1460, 1565, 1460, 1460, 1565, - 1460, 23, 33, 24, 25, 1461, 1462, 1566, - 25, 1556, 1460, 1567, 1460, 1567, 1460, 1460, - 1567, 1460, 23, 33, 24, 25, 1461, 1462, - 1566, 25, 1556, 1460, 1568, 1460, 1568, 1460, - 1460, 1568, 1460, 23, 33, 24, 25, 1461, - 1462, 1566, 25, 1556, 1460, 1460, 23, 33, - 24, 25, 1461, 1462, 25, 1463, 1460, 1569, - 1460, 1569, 1460, 1460, 1569, 1460, 23, 33, - 24, 25, 1461, 1462, 1571, 25, 1556, 1460, - 1570, 1460, 1570, 1460, 1460, 1570, 1460, 23, - 33, 24, 25, 1461, 1462, 1571, 25, 1556, - 1460, 1572, 1460, 1572, 1460, 1460, 1572, 1460, - 23, 33, 24, 25, 1461, 1462, 1571, 25, - 1556, 1460, 1573, 1460, 1573, 1460, 1460, 1573, - 1460, 23, 33, 24, 25, 1461, 1462, 1571, - 25, 1556, 1460, 1460, 23, 33, 24, 25, - 1461, 1462, 25, 1463, 1460, 1574, 1460, 1574, - 1460, 1460, 1574, 1460, 23, 33, 24, 25, - 1461, 1462, 1576, 25, 1556, 1460, 1575, 1460, - 1575, 1460, 1460, 1575, 1460, 23, 33, 24, - 25, 1461, 1462, 1576, 25, 1556, 1460, 1577, - 1460, 1577, 1460, 1460, 1577, 1460, 23, 33, - 24, 25, 1461, 1462, 1576, 25, 1556, 1460, - 1578, 1460, 1578, 1460, 1460, 1578, 1460, 23, - 33, 24, 25, 1461, 1462, 1576, 25, 1556, - 1460, 1460, 23, 33, 24, 25, 1461, 1462, - 25, 1463, 1460, 1579, 1460, 1579, 1460, 1460, - 1579, 1460, 23, 33, 24, 25, 1461, 1462, - 1537, 25, 1556, 1460, 1580, 1460, 1580, 1460, - 1460, 1580, 1460, 23, 33, 24, 25, 1461, - 1462, 1537, 25, 1556, 1460, 1581, 1460, 1581, - 1460, 1460, 1581, 1460, 23, 33, 24, 25, - 1461, 1462, 1537, 25, 1556, 1460, 1582, 1460, - 1582, 1460, 1460, 1582, 1460, 23, 33, 24, - 25, 1461, 1462, 1537, 25, 1556, 1460, 1460, - 23, 33, 24, 25, 1461, 1462, 1537, 25, - 1463, 1460, 1538, 1460, 1538, 1460, 1460, 1538, - 1460, 23, 33, 24, 25, 1461, 1462, 25, - 1556, 1460, 1583, 1460, 1584, 1460, 1460, 1584, - 1460, 23, 33, 24, 25, 1461, 1462, 1535, - 1586, 25, 1556, 1460, 1585, 1460, 1587, 1460, - 1460, 1587, 1460, 23, 33, 24, 25, 1461, - 1462, 1535, 1586, 25, 1556, 1460, 1588, 1460, - 1589, 1460, 1460, 1589, 1460, 23, 33, 24, - 25, 1461, 1462, 1535, 1586, 25, 1556, 1460, - 1590, 1460, 1590, 1460, 1460, 1590, 1460, 23, - 33, 24, 25, 1461, 1462, 1586, 25, 1556, - 1460, 1460, 23, 33, 24, 25, 1461, 1462, - 25, 1463, 1460, 1591, 1460, 1592, 1460, 1460, - 1592, 1460, 23, 33, 24, 25, 1461, 1462, - 1535, 1594, 25, 1556, 1460, 1593, 1460, 1595, - 1460, 1460, 1595, 1460, 23, 33, 24, 25, - 1461, 1462, 1535, 1594, 25, 1556, 1460, 1596, - 1460, 1597, 1460, 1460, 1597, 1460, 23, 33, - 24, 25, 1461, 1462, 1535, 1594, 25, 1556, - 1460, 1598, 1460, 1598, 1460, 1460, 1598, 1460, - 23, 33, 24, 25, 1461, 1462, 1594, 25, - 1556, 1460, 1460, 23, 33, 24, 25, 1461, - 1462, 25, 1463, 1460, 1599, 1460, 1600, 1460, - 1460, 1600, 1460, 23, 33, 24, 25, 1461, - 1462, 1535, 1602, 25, 1556, 1460, 1601, 1460, - 1603, 1460, 1460, 1603, 1460, 23, 33, 24, - 25, 1461, 1462, 1535, 1602, 25, 1556, 1460, - 1604, 1460, 1605, 1460, 1460, 1605, 1460, 23, - 33, 24, 25, 1461, 1462, 1535, 1602, 25, - 1556, 1460, 1606, 1460, 1606, 1460, 1460, 1606, - 1460, 23, 33, 24, 25, 1461, 1462, 1602, - 25, 1556, 1460, 1460, 23, 33, 24, 25, - 1461, 1462, 25, 1463, 1460, 1607, 1460, 1608, - 1460, 1460, 1608, 1460, 23, 33, 24, 25, - 1461, 1462, 1535, 1610, 25, 1556, 1460, 1609, - 1460, 1611, 1460, 1460, 1611, 1460, 23, 33, - 24, 25, 1461, 1462, 1535, 1610, 25, 1556, - 1460, 1612, 1460, 1613, 1460, 1460, 1613, 1460, - 23, 33, 24, 25, 1461, 1462, 1535, 1610, - 25, 1556, 1460, 1614, 1460, 1614, 1460, 1460, - 1614, 1460, 23, 33, 24, 25, 1461, 1462, - 1610, 25, 1556, 1460, 1460, 23, 33, 24, - 25, 1461, 1462, 25, 1463, 1460, 1615, 1460, - 1579, 1460, 1460, 1579, 1460, 23, 33, 24, - 25, 1461, 1462, 1535, 1537, 25, 1556, 1460, - 1616, 1460, 1580, 1460, 1460, 1580, 1460, 23, - 33, 24, 25, 1461, 1462, 1535, 1537, 25, - 1556, 1460, 1617, 1460, 1581, 1460, 1460, 1581, - 1460, 23, 33, 24, 25, 1461, 1462, 1535, - 1537, 25, 1556, 1460, 1582, 1460, 1582, 1460, - 1460, 1582, 1460, 23, 33, 24, 25, 1461, - 1462, 1610, 25, 1556, 1460, 1614, 1460, 1614, - 1460, 1460, 1614, 1460, 23, 33, 24, 25, - 1461, 1462, 1610, 25, 1556, 1460, 1613, 1460, - 1613, 1460, 1460, 1613, 1460, 23, 33, 24, - 25, 1461, 1462, 1610, 25, 1556, 1460, 1611, - 1460, 1611, 1460, 1460, 1611, 1460, 23, 33, - 24, 25, 1461, 1462, 1602, 25, 1556, 1460, - 1606, 1460, 1606, 1460, 1460, 1606, 1460, 23, - 33, 24, 25, 1461, 1462, 1602, 25, 1556, - 1460, 1605, 1460, 1605, 1460, 1460, 1605, 1460, - 23, 33, 24, 25, 1461, 1462, 1602, 25, - 1556, 1460, 1603, 1460, 1603, 1460, 1460, 1603, - 1460, 23, 33, 24, 25, 1461, 1462, 1594, - 25, 1556, 1460, 1598, 1460, 1598, 1460, 1460, - 1598, 1460, 23, 33, 24, 25, 1461, 1462, - 1594, 25, 1556, 1460, 1597, 1460, 1597, 1460, - 1460, 1597, 1460, 23, 33, 24, 25, 1461, - 1462, 1594, 25, 1556, 1460, 1595, 1460, 1595, - 1460, 1460, 1595, 1460, 23, 33, 24, 25, - 1461, 1462, 1586, 25, 1556, 1460, 1590, 1460, - 1590, 1460, 1460, 1590, 1460, 23, 33, 24, - 25, 1461, 1462, 1586, 25, 1556, 1460, 1589, - 1460, 1589, 1460, 1460, 1589, 1460, 23, 33, - 24, 25, 1461, 1462, 1586, 25, 1556, 1460, - 1587, 1460, 1587, 1460, 1460, 1587, 1460, 23, - 33, 24, 25, 1461, 1462, 1507, 25, 1463, - 1460, 1460, 23, 1450, 30, 1, 1450, 1619, - 1620, 1621, 1623, 1624, 1622, 1622, 1622, 1618, - 1450, 1451, 1, 1625, 24, 26, 25, 25, - 25, 23, 29, 1451, 1, 1626, 36, 37, - 38, 39, 39, 34, 40, 1451, 1, 1625, - 24, 26, 1453, 1456, 25, 1453, 25, 25, - 1454, 25, 1455, 25, 1455, 25, 23, 1625, - 24, 26, 1627, 25, 1627, 25, 25, 1628, - 25, 1628, 25, 1628, 25, 23, 33, 24, - 26, 1627, 25, 1627, 25, 25, 1628, 25, - 1628, 25, 1628, 25, 23, 1625, 24, 26, - 25, 25, 25, 1628, 25, 1628, 25, 1628, - 25, 23, 1629, 1443, 1444, 1446, 1447, 1448, - 1445, 1447, 1445, 1445, 1449, 1445, 1449, 1445, - 1449, 1445, 1441, 33, 24, 26, 1453, 1456, - 25, 1453, 25, 25, 1454, 25, 1455, 25, - 1455, 25, 23, 19, 1631, 1632, 1633, 1634, - 1635, 1635, 1630, 19, 20, 1, 1636, 24, - 26, 28, 25, 25, 27, 25, 27, 25, - 27, 25, 23, 29, 20, 1, 19, 42, - 42, 1, 1636, 24, 26, 25, 25, 25, - 23, 19, 1637, 1637, 1638, 1638, 1638, 1, - 1637, 1637, 1638, 1638, 1638, 1, 19, 1638, - 1638, 1638, 1, 1639, 13, 14, 15, 16, - 17, 16, 18, 18, 18, 12, 1640, 1643, - 1640, 1641, 1642, 1642, 1, 1644, 1644, 1645, - 1645, 1645, 1, 1644, 1646, 1644, 1645, 1645, - 1645, 1, 1647, 1647, 1, 1648, 1647, 1647, - 1, 1650, 1651, 1649, 1652, 1, 1653, 1, - 1653, 1654, 1, 1656, 1655, 1655, 1655, 1, - 1658, 1659, 1660, 1661, 1660, 1662, 1662, 1662, - 1657, 1663, 1, 1664, 1, 1664, 1656, 1, - 1665, 1668, 1665, 1666, 1667, 1667, 1, 1669, - 1669, 1670, 1670, 1670, 1, 1669, 1671, 1669, - 1670, 1670, 1670, 1, 1464, 1464, 1, 1669, - 1672, 1671, 1669, 1673, 1670, 1670, 1, 1674, - 1, 1675, 1676, 1, 1677, 1, 1678, 1679, - 1, 1680, 1, 1682, 1681, 1, 1682, 1683, - 1, 1682, 1, 1678, 1684, 1, 1678, 1, - 1675, 1685, 1, 1675, 1, 1669, 1672, 1671, - 1669, 1686, 1670, 1670, 1, 1669, 1672, 1671, - 1669, 1670, 1670, 1670, 1, 1669, 1671, 1687, - 1669, 1670, 1670, 1670, 1, 1669, 1671, 1669, - 1688, 1670, 1670, 1670, 1, 1669, 1689, 1671, - 1669, 1670, 1670, 1670, 1, 1669, 1690, 1669, - 1670, 1670, 1670, 1, 1692, 1464, 1691, 1464, - 1691, 1464, 1464, 1691, 1464, 1, 1694, 1465, - 1464, 1693, 1464, 1693, 1464, 1464, 1693, 1464, - 1, 1694, 1465, 1464, 1695, 1464, 1695, 1464, - 1464, 1695, 1464, 1, 1694, 1465, 1464, 1696, - 1464, 1696, 1464, 1464, 1696, 1464, 1, 1694, - 1465, 1464, 1464, 1, 1698, 1465, 1464, 1697, - 1464, 1697, 1464, 1464, 1697, 1464, 1, 1700, - 1465, 1464, 1699, 1464, 1699, 1464, 1464, 1699, - 1464, 1, 1700, 1465, 1464, 1701, 1464, 1701, - 1464, 1464, 1701, 1464, 1, 1700, 1465, 1464, - 1702, 1464, 1702, 1464, 1464, 1702, 1464, 1, - 1700, 1465, 1464, 1464, 1, 1698, 1465, 1464, - 1703, 1464, 1703, 1464, 1464, 1703, 1464, 1, - 1705, 1465, 1464, 1704, 1464, 1704, 1464, 1464, - 1704, 1464, 1, 1705, 1465, 1464, 1706, 1464, - 1706, 1464, 1464, 1706, 1464, 1, 1705, 1465, - 1464, 1707, 1464, 1707, 1464, 1464, 1707, 1464, - 1, 1705, 1465, 1464, 1464, 1, 1698, 1465, - 1464, 1708, 1464, 1708, 1464, 1464, 1708, 1464, - 1, 1710, 1465, 1464, 1709, 1464, 1709, 1464, - 1464, 1709, 1464, 1, 1710, 1465, 1464, 1711, - 1464, 1711, 1464, 1464, 1711, 1464, 1, 1710, - 1465, 1464, 1712, 1464, 1712, 1464, 1464, 1712, - 1464, 1, 1710, 1465, 1464, 1464, 1, 1698, - 1465, 1464, 1713, 1464, 1713, 1464, 1464, 1713, - 1464, 1, 1715, 1465, 1464, 1714, 1464, 1714, - 1464, 1464, 1714, 1464, 1, 1715, 1465, 1464, - 1716, 1464, 1716, 1464, 1464, 1716, 1464, 1, - 1715, 1465, 1464, 1717, 1464, 1717, 1464, 1464, - 1717, 1464, 1, 1715, 1465, 1464, 1464, 1, - 1719, 1465, 1464, 1718, 1464, 1718, 1464, 1464, - 1718, 1464, 1, 1721, 1465, 1464, 1720, 1464, - 1720, 1464, 1464, 1720, 1464, 1, 1721, 1465, - 1464, 1722, 1464, 1722, 1464, 1464, 1722, 1464, - 1, 1721, 1465, 1464, 1723, 1464, 1723, 1464, - 1464, 1723, 1464, 1, 1721, 1465, 1464, 1464, - 1, 1719, 1465, 1464, 1724, 1464, 1725, 1464, - 1464, 1725, 1464, 1, 1726, 1728, 1465, 1464, - 1727, 1464, 1729, 1464, 1464, 1729, 1464, 1, - 1465, 1464, 1730, 1464, 1464, 1, 1731, 1465, - 1464, 1732, 1464, 1464, 1, 1465, 1464, 1733, - 1464, 1464, 1, 1734, 1465, 1464, 1735, 1464, - 1464, 1, 1465, 1464, 1736, 1464, 1464, 1, - 1738, 1464, 1737, 1464, 1464, 1, 1738, 1464, - 1739, 1464, 1464, 1, 1738, 1464, 1464, 1, - 1734, 1465, 1464, 1740, 1464, 1464, 1, 1734, - 1465, 1464, 1464, 1, 1731, 1465, 1464, 1741, - 1464, 1464, 1, 1731, 1465, 1464, 1464, 1, - 1726, 1728, 1465, 1464, 1742, 1464, 1743, 1464, - 1464, 1743, 1464, 1, 1726, 1728, 1465, 1464, - 1744, 1464, 1744, 1464, 1464, 1744, 1464, 1, - 1728, 1465, 1464, 1464, 1, 1465, 1464, 1745, - 1464, 1745, 1464, 1464, 1745, 1464, 1, 1747, - 1464, 1746, 1464, 1746, 1464, 1464, 1746, 1464, - 1, 1747, 1464, 1748, 1464, 1748, 1464, 1464, - 1748, 1464, 1, 1747, 1464, 1749, 1464, 1749, - 1464, 1464, 1749, 1464, 1, 1747, 1464, 1464, - 1, 1728, 1465, 1464, 1744, 1464, 1744, 1464, - 1464, 1744, 1464, 1, 1728, 1465, 1464, 1743, - 1464, 1743, 1464, 1464, 1743, 1464, 1, 1747, - 1464, 1750, 1464, 1750, 1464, 1464, 1750, 1464, - 1, 1752, 1747, 1464, 1751, 1464, 1751, 1464, - 1464, 1751, 1464, 1, 1752, 1747, 1464, 1753, - 1464, 1753, 1464, 1464, 1753, 1464, 1, 1752, - 1747, 1464, 1754, 1464, 1754, 1464, 1464, 1754, - 1464, 1, 1752, 1747, 1464, 1464, 1, 1465, - 1464, 1755, 1464, 1755, 1464, 1464, 1755, 1464, - 1, 1757, 1747, 1464, 1756, 1464, 1756, 1464, - 1464, 1756, 1464, 1, 1757, 1747, 1464, 1758, - 1464, 1758, 1464, 1464, 1758, 1464, 1, 1757, - 1747, 1464, 1759, 1464, 1759, 1464, 1464, 1759, - 1464, 1, 1757, 1747, 1464, 1464, 1, 1465, - 1464, 1760, 1464, 1760, 1464, 1464, 1760, 1464, - 1, 1762, 1747, 1464, 1761, 1464, 1761, 1464, - 1464, 1761, 1464, 1, 1762, 1747, 1464, 1763, - 1464, 1763, 1464, 1464, 1763, 1464, 1, 1762, - 1747, 1464, 1764, 1464, 1764, 1464, 1464, 1764, - 1464, 1, 1762, 1747, 1464, 1464, 1, 1465, - 1464, 1765, 1464, 1765, 1464, 1464, 1765, 1464, - 1, 1767, 1747, 1464, 1766, 1464, 1766, 1464, - 1464, 1766, 1464, 1, 1767, 1747, 1464, 1768, - 1464, 1768, 1464, 1464, 1768, 1464, 1, 1767, - 1747, 1464, 1769, 1464, 1769, 1464, 1464, 1769, - 1464, 1, 1767, 1747, 1464, 1464, 1, 1465, - 1464, 1770, 1464, 1770, 1464, 1464, 1770, 1464, - 1, 1728, 1747, 1464, 1771, 1464, 1771, 1464, - 1464, 1771, 1464, 1, 1728, 1747, 1464, 1772, - 1464, 1772, 1464, 1464, 1772, 1464, 1, 1728, - 1747, 1464, 1773, 1464, 1773, 1464, 1464, 1773, - 1464, 1, 1728, 1747, 1464, 1464, 1, 1728, - 1465, 1464, 1729, 1464, 1729, 1464, 1464, 1729, - 1464, 1, 1747, 1464, 1774, 1464, 1775, 1464, - 1464, 1775, 1464, 1, 1726, 1777, 1747, 1464, - 1776, 1464, 1778, 1464, 1464, 1778, 1464, 1, - 1726, 1777, 1747, 1464, 1779, 1464, 1780, 1464, - 1464, 1780, 1464, 1, 1726, 1777, 1747, 1464, - 1781, 1464, 1781, 1464, 1464, 1781, 1464, 1, - 1777, 1747, 1464, 1464, 1, 1465, 1464, 1782, - 1464, 1783, 1464, 1464, 1783, 1464, 1, 1726, - 1785, 1747, 1464, 1784, 1464, 1786, 1464, 1464, - 1786, 1464, 1, 1726, 1785, 1747, 1464, 1787, - 1464, 1788, 1464, 1464, 1788, 1464, 1, 1726, - 1785, 1747, 1464, 1789, 1464, 1789, 1464, 1464, - 1789, 1464, 1, 1785, 1747, 1464, 1464, 1, - 1465, 1464, 1790, 1464, 1791, 1464, 1464, 1791, - 1464, 1, 1726, 1793, 1747, 1464, 1792, 1464, - 1794, 1464, 1464, 1794, 1464, 1, 1726, 1793, - 1747, 1464, 1795, 1464, 1796, 1464, 1464, 1796, - 1464, 1, 1726, 1793, 1747, 1464, 1797, 1464, - 1797, 1464, 1464, 1797, 1464, 1, 1793, 1747, - 1464, 1464, 1, 1465, 1464, 1798, 1464, 1799, - 1464, 1464, 1799, 1464, 1, 1726, 1801, 1747, - 1464, 1800, 1464, 1802, 1464, 1464, 1802, 1464, - 1, 1726, 1801, 1747, 1464, 1803, 1464, 1804, - 1464, 1464, 1804, 1464, 1, 1726, 1801, 1747, - 1464, 1805, 1464, 1805, 1464, 1464, 1805, 1464, - 1, 1801, 1747, 1464, 1464, 1, 1465, 1464, - 1806, 1464, 1770, 1464, 1464, 1770, 1464, 1, - 1726, 1728, 1747, 1464, 1807, 1464, 1771, 1464, - 1464, 1771, 1464, 1, 1726, 1728, 1747, 1464, - 1808, 1464, 1772, 1464, 1464, 1772, 1464, 1, - 1726, 1728, 1747, 1464, 1773, 1464, 1773, 1464, - 1464, 1773, 1464, 1, 1801, 1747, 1464, 1805, - 1464, 1805, 1464, 1464, 1805, 1464, 1, 1801, - 1747, 1464, 1804, 1464, 1804, 1464, 1464, 1804, - 1464, 1, 1801, 1747, 1464, 1802, 1464, 1802, - 1464, 1464, 1802, 1464, 1, 1793, 1747, 1464, - 1797, 1464, 1797, 1464, 1464, 1797, 1464, 1, - 1793, 1747, 1464, 1796, 1464, 1796, 1464, 1464, - 1796, 1464, 1, 1793, 1747, 1464, 1794, 1464, - 1794, 1464, 1464, 1794, 1464, 1, 1785, 1747, - 1464, 1789, 1464, 1789, 1464, 1464, 1789, 1464, - 1, 1785, 1747, 1464, 1788, 1464, 1788, 1464, - 1464, 1788, 1464, 1, 1785, 1747, 1464, 1786, - 1464, 1786, 1464, 1464, 1786, 1464, 1, 1777, - 1747, 1464, 1781, 1464, 1781, 1464, 1464, 1781, - 1464, 1, 1777, 1747, 1464, 1780, 1464, 1780, - 1464, 1464, 1780, 1464, 1, 1777, 1747, 1464, - 1778, 1464, 1778, 1464, 1464, 1778, 1464, 1, - 1698, 1465, 1464, 1464, 1, 1663, 1810, 1811, - 1812, 1813, 1809, 1663, 1664, 1, 1663, 1665, - 1668, 1665, 1666, 1667, 1667, 1, 1663, 1814, - 1814, 1815, 1815, 1815, 1, 1814, 1814, 1815, - 1815, 1815, 1, 1663, 1815, 1815, 1815, 1, - 1816, 1658, 1659, 1660, 1661, 1660, 1662, 1662, - 1662, 1657, 1652, 1818, 1819, 1820, 1821, 1817, - 1652, 1653, 1, 1652, 1656, 1655, 1655, 1655, - 1, 1644, 1822, 1646, 1644, 1823, 1645, 1645, - 1, 1824, 1, 1825, 1826, 1, 1827, 1, - 1828, 1829, 1, 1830, 1, 1832, 1831, 1, - 1832, 1833, 1, 1832, 1, 1828, 1834, 1, - 1828, 1, 1825, 1835, 1, 1825, 1, 1644, - 1822, 1646, 1644, 1836, 1645, 1645, 1, 1644, - 1822, 1646, 1644, 1645, 1645, 1645, 1, 1644, - 1646, 1837, 1644, 1645, 1645, 1645, 1, 1644, - 1646, 1644, 1838, 1645, 1645, 1645, 1, 1644, - 1839, 1646, 1644, 1645, 1645, 1645, 1, 1644, - 1840, 1644, 1645, 1645, 1645, 1, 1842, 1647, - 1841, 1647, 1841, 1647, 1647, 1841, 1647, 1, - 1844, 1648, 1647, 1843, 1647, 1843, 1647, 1647, - 1843, 1647, 1, 1844, 1648, 1647, 1845, 1647, - 1845, 1647, 1647, 1845, 1647, 1, 1844, 1648, - 1647, 1846, 1647, 1846, 1647, 1647, 1846, 1647, - 1, 1844, 1648, 1647, 1647, 1, 1848, 1648, - 1647, 1847, 1647, 1847, 1647, 1647, 1847, 1647, - 1, 1850, 1648, 1647, 1849, 1647, 1849, 1647, - 1647, 1849, 1647, 1, 1850, 1648, 1647, 1851, - 1647, 1851, 1647, 1647, 1851, 1647, 1, 1850, - 1648, 1647, 1852, 1647, 1852, 1647, 1647, 1852, - 1647, 1, 1850, 1648, 1647, 1647, 1, 1848, - 1648, 1647, 1853, 1647, 1853, 1647, 1647, 1853, - 1647, 1, 1855, 1648, 1647, 1854, 1647, 1854, - 1647, 1647, 1854, 1647, 1, 1855, 1648, 1647, - 1856, 1647, 1856, 1647, 1647, 1856, 1647, 1, - 1855, 1648, 1647, 1857, 1647, 1857, 1647, 1647, - 1857, 1647, 1, 1855, 1648, 1647, 1647, 1, - 1848, 1648, 1647, 1858, 1647, 1858, 1647, 1647, - 1858, 1647, 1, 1860, 1648, 1647, 1859, 1647, - 1859, 1647, 1647, 1859, 1647, 1, 1860, 1648, - 1647, 1861, 1647, 1861, 1647, 1647, 1861, 1647, - 1, 1860, 1648, 1647, 1862, 1647, 1862, 1647, - 1647, 1862, 1647, 1, 1860, 1648, 1647, 1647, - 1, 1848, 1648, 1647, 1863, 1647, 1863, 1647, - 1647, 1863, 1647, 1, 1865, 1648, 1647, 1864, - 1647, 1864, 1647, 1647, 1864, 1647, 1, 1865, - 1648, 1647, 1866, 1647, 1866, 1647, 1647, 1866, - 1647, 1, 1865, 1648, 1647, 1867, 1647, 1867, - 1647, 1647, 1867, 1647, 1, 1865, 1648, 1647, - 1647, 1, 1869, 1648, 1647, 1868, 1647, 1868, - 1647, 1647, 1868, 1647, 1, 1871, 1648, 1647, - 1870, 1647, 1870, 1647, 1647, 1870, 1647, 1, - 1871, 1648, 1647, 1872, 1647, 1872, 1647, 1647, - 1872, 1647, 1, 1871, 1648, 1647, 1873, 1647, - 1873, 1647, 1647, 1873, 1647, 1, 1871, 1648, - 1647, 1647, 1, 1869, 1648, 1647, 1874, 1647, - 1875, 1647, 1647, 1875, 1647, 1, 1876, 1878, - 1648, 1647, 1877, 1647, 1879, 1647, 1647, 1879, - 1647, 1, 1648, 1647, 1880, 1647, 1647, 1, - 1881, 1648, 1647, 1882, 1647, 1647, 1, 1648, - 1647, 1883, 1647, 1647, 1, 1884, 1648, 1647, - 1885, 1647, 1647, 1, 1648, 1647, 1886, 1647, - 1647, 1, 1888, 1647, 1887, 1647, 1647, 1, - 1888, 1647, 1889, 1647, 1647, 1, 1888, 1647, - 1647, 1, 1884, 1648, 1647, 1890, 1647, 1647, - 1, 1884, 1648, 1647, 1647, 1, 1881, 1648, - 1647, 1891, 1647, 1647, 1, 1881, 1648, 1647, - 1647, 1, 1876, 1878, 1648, 1647, 1892, 1647, - 1893, 1647, 1647, 1893, 1647, 1, 1876, 1878, - 1648, 1647, 1894, 1647, 1894, 1647, 1647, 1894, - 1647, 1, 1878, 1648, 1647, 1647, 1, 1648, - 1647, 1895, 1647, 1895, 1647, 1647, 1895, 1647, - 1, 1897, 1647, 1896, 1647, 1896, 1647, 1647, - 1896, 1647, 1, 1897, 1647, 1898, 1647, 1898, - 1647, 1647, 1898, 1647, 1, 1897, 1647, 1899, - 1647, 1899, 1647, 1647, 1899, 1647, 1, 1897, - 1647, 1647, 1, 1878, 1648, 1647, 1894, 1647, - 1894, 1647, 1647, 1894, 1647, 1, 1878, 1648, - 1647, 1893, 1647, 1893, 1647, 1647, 1893, 1647, - 1, 1897, 1647, 1900, 1647, 1900, 1647, 1647, - 1900, 1647, 1, 1902, 1897, 1647, 1901, 1647, - 1901, 1647, 1647, 1901, 1647, 1, 1902, 1897, - 1647, 1903, 1647, 1903, 1647, 1647, 1903, 1647, - 1, 1902, 1897, 1647, 1904, 1647, 1904, 1647, - 1647, 1904, 1647, 1, 1902, 1897, 1647, 1647, - 1, 1648, 1647, 1905, 1647, 1905, 1647, 1647, - 1905, 1647, 1, 1907, 1897, 1647, 1906, 1647, - 1906, 1647, 1647, 1906, 1647, 1, 1907, 1897, - 1647, 1908, 1647, 1908, 1647, 1647, 1908, 1647, - 1, 1907, 1897, 1647, 1909, 1647, 1909, 1647, - 1647, 1909, 1647, 1, 1907, 1897, 1647, 1647, - 1, 1648, 1647, 1910, 1647, 1910, 1647, 1647, - 1910, 1647, 1, 1912, 1897, 1647, 1911, 1647, - 1911, 1647, 1647, 1911, 1647, 1, 1912, 1897, - 1647, 1913, 1647, 1913, 1647, 1647, 1913, 1647, - 1, 1912, 1897, 1647, 1914, 1647, 1914, 1647, - 1647, 1914, 1647, 1, 1912, 1897, 1647, 1647, - 1, 1648, 1647, 1915, 1647, 1915, 1647, 1647, - 1915, 1647, 1, 1917, 1897, 1647, 1916, 1647, - 1916, 1647, 1647, 1916, 1647, 1, 1917, 1897, - 1647, 1918, 1647, 1918, 1647, 1647, 1918, 1647, - 1, 1917, 1897, 1647, 1919, 1647, 1919, 1647, - 1647, 1919, 1647, 1, 1917, 1897, 1647, 1647, - 1, 1648, 1647, 1920, 1647, 1920, 1647, 1647, - 1920, 1647, 1, 1878, 1897, 1647, 1921, 1647, - 1921, 1647, 1647, 1921, 1647, 1, 1878, 1897, - 1647, 1922, 1647, 1922, 1647, 1647, 1922, 1647, - 1, 1878, 1897, 1647, 1923, 1647, 1923, 1647, - 1647, 1923, 1647, 1, 1878, 1897, 1647, 1647, - 1, 1878, 1648, 1647, 1879, 1647, 1879, 1647, - 1647, 1879, 1647, 1, 1897, 1647, 1924, 1647, - 1925, 1647, 1647, 1925, 1647, 1, 1876, 1927, - 1897, 1647, 1926, 1647, 1928, 1647, 1647, 1928, - 1647, 1, 1876, 1927, 1897, 1647, 1929, 1647, - 1930, 1647, 1647, 1930, 1647, 1, 1876, 1927, - 1897, 1647, 1931, 1647, 1931, 1647, 1647, 1931, - 1647, 1, 1927, 1897, 1647, 1647, 1, 1648, - 1647, 1932, 1647, 1933, 1647, 1647, 1933, 1647, - 1, 1876, 1935, 1897, 1647, 1934, 1647, 1936, - 1647, 1647, 1936, 1647, 1, 1876, 1935, 1897, - 1647, 1937, 1647, 1938, 1647, 1647, 1938, 1647, - 1, 1876, 1935, 1897, 1647, 1939, 1647, 1939, - 1647, 1647, 1939, 1647, 1, 1935, 1897, 1647, - 1647, 1, 1648, 1647, 1940, 1647, 1941, 1647, - 1647, 1941, 1647, 1, 1876, 1943, 1897, 1647, - 1942, 1647, 1944, 1647, 1647, 1944, 1647, 1, - 1876, 1943, 1897, 1647, 1945, 1647, 1946, 1647, - 1647, 1946, 1647, 1, 1876, 1943, 1897, 1647, - 1947, 1647, 1947, 1647, 1647, 1947, 1647, 1, - 1943, 1897, 1647, 1647, 1, 1648, 1647, 1948, - 1647, 1949, 1647, 1647, 1949, 1647, 1, 1876, - 1951, 1897, 1647, 1950, 1647, 1952, 1647, 1647, - 1952, 1647, 1, 1876, 1951, 1897, 1647, 1953, - 1647, 1954, 1647, 1647, 1954, 1647, 1, 1876, - 1951, 1897, 1647, 1955, 1647, 1955, 1647, 1647, - 1955, 1647, 1, 1951, 1897, 1647, 1647, 1, - 1648, 1647, 1956, 1647, 1920, 1647, 1647, 1920, - 1647, 1, 1876, 1878, 1897, 1647, 1957, 1647, - 1921, 1647, 1647, 1921, 1647, 1, 1876, 1878, - 1897, 1647, 1958, 1647, 1922, 1647, 1647, 1922, - 1647, 1, 1876, 1878, 1897, 1647, 1923, 1647, - 1923, 1647, 1647, 1923, 1647, 1, 1951, 1897, - 1647, 1955, 1647, 1955, 1647, 1647, 1955, 1647, - 1, 1951, 1897, 1647, 1954, 1647, 1954, 1647, - 1647, 1954, 1647, 1, 1951, 1897, 1647, 1952, - 1647, 1952, 1647, 1647, 1952, 1647, 1, 1943, - 1897, 1647, 1947, 1647, 1947, 1647, 1647, 1947, - 1647, 1, 1943, 1897, 1647, 1946, 1647, 1946, - 1647, 1647, 1946, 1647, 1, 1943, 1897, 1647, - 1944, 1647, 1944, 1647, 1647, 1944, 1647, 1, - 1935, 1897, 1647, 1939, 1647, 1939, 1647, 1647, - 1939, 1647, 1, 1935, 1897, 1647, 1938, 1647, - 1938, 1647, 1647, 1938, 1647, 1, 1935, 1897, - 1647, 1936, 1647, 1936, 1647, 1647, 1936, 1647, - 1, 1927, 1897, 1647, 1931, 1647, 1931, 1647, - 1647, 1931, 1647, 1, 1927, 1897, 1647, 1930, - 1647, 1930, 1647, 1647, 1930, 1647, 1, 1927, - 1897, 1647, 1928, 1647, 1928, 1647, 1647, 1928, - 1647, 1, 1848, 1648, 1647, 1647, 1, 8, - 1959, 6, 7, 1961, 1960, 1960, 1960, 5, - 8, 9, 1, 1962, 13, 14, 15, 16, - 17, 16, 18, 18, 18, 12, 19, 9, - 1, 8, 1640, 1643, 1640, 1641, 1642, 1642, - 1, 1964, 1965, 1966, 1963, 170, 177, 1, - 1967, 1964, 1965, 1966, 1963, 1968, 1964, 1965, - 1966, 1963, 0 -}; - -static const short _smtp_received_parser_trans_targs[] = { - 2, 0, 3, 4, 5, 6, 1774, 1775, - 7, 8, 9, 1472, 10, 1461, 1462, 1467, - 1468, 1470, 1471, 11, 12, 13, 25, 14, - 18, 19, 21, 1288, 1460, 15, 16, 17, - 1287, 20, 22, 1280, 1281, 1282, 1284, 1286, - 23, 24, 26, 27, 1274, 1275, 28, 29, - 30, 972, 31, 954, 955, 967, 968, 970, - 971, 961, 32, 33, 34, 205, 191, 217, - 585, 633, 728, 35, 198, 199, 204, 36, - 37, 38, 193, 39, 47, 48, 192, 50, - 57, 40, 41, 42, 43, 52, 53, 55, - 44, 45, 46, 49, 51, 54, 56, 58, - 181, 182, 183, 59, 60, 61, 172, 173, - 175, 176, 177, 178, 179, 180, 62, 63, - 64, 152, 163, 165, 167, 170, 65, 66, - 140, 141, 151, 67, 68, 69, 125, 127, - 129, 132, 134, 136, 138, 70, 124, 71, - 72, 120, 121, 73, 74, 75, 76, 77, - 78, 79, 115, 116, 119, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, - 111, 112, 91, 92, 93, 94, 95, 96, - 1780, 98, 1781, 100, 103, 104, 1782, 101, - 102, 99, 105, 110, 113, 114, 117, 118, - 122, 123, 126, 128, 130, 131, 133, 135, - 137, 139, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 153, 154, 155, 156, 159, - 160, 162, 157, 158, 161, 164, 166, 168, - 169, 171, 174, 184, 185, 186, 187, 188, - 189, 190, 194, 195, 196, 194, 195, 196, - 39, 47, 48, 50, 57, 197, 194, 195, - 196, 200, 201, 203, 202, 206, 210, 211, - 213, 754, 953, 207, 208, 209, 753, 212, - 214, 739, 740, 741, 743, 745, 747, 749, - 750, 751, 752, 215, 216, 218, 219, 220, - 574, 575, 576, 583, 221, 222, 223, 399, - 404, 564, 224, 225, 398, 226, 227, 228, - 229, 256, 230, 238, 239, 243, 252, 254, - 255, 250, 231, 232, 233, 234, 245, 246, - 248, 235, 236, 237, 230, 238, 239, 241, - 243, 250, 240, 242, 244, 247, 249, 251, - 253, 229, 240, 257, 262, 258, 277, 257, - 258, 259, 260, 261, 230, 238, 239, 243, - 250, 263, 275, 264, 265, 273, 266, 267, - 271, 268, 269, 261, 270, 272, 274, 276, - 278, 279, 280, 281, 282, 397, 283, 286, - 284, 285, 287, 361, 288, 291, 289, 290, - 292, 293, 296, 294, 295, 297, 298, 301, - 299, 300, 302, 303, 306, 304, 305, 307, - 335, 308, 311, 309, 310, 312, 360, 313, - 325, 328, 334, 314, 315, 323, 316, 317, - 321, 318, 319, 261, 320, 322, 324, 326, - 333, 327, 329, 330, 261, 331, 332, 336, - 337, 340, 338, 339, 341, 342, 345, 343, - 344, 346, 347, 350, 348, 349, 351, 352, - 355, 353, 354, 356, 357, 358, 359, 362, - 396, 363, 366, 395, 364, 394, 365, 367, - 393, 368, 371, 392, 369, 391, 370, 372, - 390, 373, 376, 389, 374, 388, 375, 377, - 387, 378, 381, 386, 379, 385, 380, 382, - 383, 384, 400, 401, 402, 400, 401, 402, - 398, 403, 400, 401, 402, 405, 554, 559, - 405, 406, 407, 408, 412, 409, 410, 408, - 411, 230, 238, 239, 243, 250, 413, 418, - 414, 433, 413, 414, 415, 416, 417, 411, - 419, 431, 420, 421, 429, 422, 423, 427, - 424, 425, 417, 426, 428, 430, 432, 434, - 435, 436, 437, 438, 553, 439, 442, 440, - 441, 443, 517, 444, 447, 445, 446, 448, - 449, 452, 450, 451, 453, 454, 457, 455, - 456, 458, 459, 462, 460, 461, 463, 491, - 464, 467, 465, 466, 468, 516, 469, 481, - 484, 490, 470, 471, 479, 472, 473, 477, - 474, 475, 417, 476, 478, 480, 482, 489, - 483, 485, 486, 417, 487, 488, 492, 493, - 496, 494, 495, 497, 498, 501, 499, 500, - 502, 503, 506, 504, 505, 507, 508, 511, - 509, 510, 512, 513, 514, 515, 518, 552, - 519, 522, 551, 520, 550, 521, 523, 549, - 524, 527, 548, 525, 547, 526, 528, 546, - 529, 532, 545, 530, 544, 531, 533, 543, - 534, 537, 542, 535, 541, 536, 538, 539, - 540, 555, 556, 557, 555, 556, 557, 407, - 558, 555, 556, 557, 560, 561, 562, 563, - 565, 566, 567, 568, 226, 569, 570, 571, - 572, 570, 571, 572, 228, 573, 570, 571, - 572, 577, 578, 580, 581, 582, 579, 584, - 586, 587, 623, 624, 625, 631, 588, 589, - 590, 615, 591, 599, 600, 614, 604, 611, - 592, 593, 594, 595, 606, 607, 609, 596, - 597, 598, 602, 613, 601, 603, 605, 608, - 610, 612, 616, 617, 618, 621, 619, 620, - 622, 626, 627, 629, 630, 628, 632, 634, - 635, 636, 730, 731, 732, 737, 637, 638, - 639, 640, 648, 649, 729, 653, 660, 641, - 642, 643, 644, 655, 656, 658, 645, 646, - 647, 651, 662, 663, 664, 650, 652, 654, - 657, 659, 661, 665, 666, 667, 668, 715, - 716, 717, 726, 669, 670, 671, 697, 703, - 707, 711, 672, 680, 681, 696, 685, 692, - 673, 674, 675, 676, 687, 688, 690, 677, - 678, 679, 683, 694, 695, 682, 684, 686, - 689, 691, 693, 698, 699, 700, 701, 672, - 682, 680, 681, 696, 685, 692, 702, 672, - 682, 680, 681, 696, 685, 692, 704, 705, - 706, 672, 682, 680, 681, 696, 685, 692, - 708, 709, 710, 672, 682, 680, 681, 696, - 685, 692, 712, 713, 714, 672, 682, 680, - 681, 696, 685, 692, 718, 719, 721, 722, - 723, 724, 725, 720, 727, 733, 734, 736, - 735, 738, 742, 744, 746, 748, 755, 940, - 941, 942, 944, 946, 949, 951, 952, 756, - 757, 758, 759, 804, 760, 819, 759, 760, - 761, 762, 763, 767, 774, 764, 765, 766, - 214, 740, 741, 745, 747, 768, 772, 773, - 776, 779, 785, 790, 796, 803, 769, 770, - 771, 775, 739, 743, 749, 750, 751, 752, - 777, 778, 780, 781, 782, 783, 784, 786, - 787, 788, 789, 791, 792, 793, 794, 795, - 797, 798, 799, 800, 801, 802, 805, 817, - 806, 807, 815, 808, 809, 813, 810, 811, - 774, 812, 814, 816, 818, 820, 821, 822, - 823, 824, 939, 825, 828, 826, 827, 829, - 903, 830, 833, 831, 832, 834, 835, 838, - 836, 837, 839, 840, 843, 841, 842, 844, - 845, 848, 846, 847, 849, 877, 850, 853, - 851, 852, 854, 902, 855, 867, 870, 876, - 856, 857, 865, 858, 859, 863, 860, 861, - 774, 862, 864, 866, 868, 875, 869, 871, - 872, 774, 873, 874, 878, 879, 882, 880, - 881, 883, 884, 887, 885, 886, 888, 889, - 892, 890, 891, 893, 894, 897, 895, 896, - 898, 899, 900, 901, 904, 938, 905, 908, - 937, 906, 936, 907, 909, 935, 910, 913, - 934, 911, 933, 912, 914, 932, 915, 918, - 931, 916, 930, 917, 919, 929, 920, 923, - 928, 921, 927, 922, 924, 925, 926, 755, - 943, 941, 942, 944, 946, 948, 945, 947, - 950, 754, 943, 31, 956, 954, 955, 957, - 959, 961, 963, 964, 965, 966, 958, 960, - 962, 969, 30, 956, 973, 1138, 974, 1153, - 973, 974, 975, 976, 977, 978, 1134, 1135, - 979, 980, 981, 982, 986, 983, 1126, 1127, - 1130, 1132, 1133, 984, 985, 987, 990, 988, - 1005, 987, 988, 989, 991, 1003, 992, 993, - 1001, 994, 995, 999, 996, 997, 765, 998, - 1000, 1002, 1004, 1006, 1007, 1008, 1009, 1010, - 1125, 1011, 1014, 1012, 1013, 1015, 1089, 1016, - 1019, 1017, 1018, 1020, 1021, 1024, 1022, 1023, - 1025, 1026, 1029, 1027, 1028, 1030, 1031, 1034, - 1032, 1033, 1035, 1063, 1036, 1039, 1037, 1038, - 1040, 1088, 1041, 1053, 1056, 1062, 1042, 1043, - 1051, 1044, 1045, 1049, 1046, 1047, 765, 1048, - 1050, 1052, 1054, 1061, 1055, 1057, 1058, 765, - 1059, 1060, 1064, 1065, 1068, 1066, 1067, 1069, - 1070, 1073, 1071, 1072, 1074, 1075, 1078, 1076, - 1077, 1079, 1080, 1083, 1081, 1082, 1084, 1085, - 1086, 1087, 1090, 1124, 1091, 1094, 1123, 1092, - 1122, 1093, 1095, 1121, 1096, 1099, 1120, 1097, - 1119, 1098, 1100, 1118, 1101, 1104, 1117, 1102, - 1116, 1103, 1105, 1115, 1106, 1109, 1114, 1107, - 1113, 1108, 1110, 1111, 1112, 983, 1128, 1126, - 1127, 1129, 1131, 982, 1128, 978, 1136, 1134, - 1135, 1137, 1139, 1151, 1140, 1141, 1149, 1142, - 1143, 1147, 1144, 1145, 977, 1146, 1148, 1150, - 1152, 1154, 1155, 1156, 1157, 1158, 1273, 1159, - 1162, 1160, 1161, 1163, 1237, 1164, 1167, 1165, - 1166, 1168, 1169, 1172, 1170, 1171, 1173, 1174, - 1177, 1175, 1176, 1178, 1179, 1182, 1180, 1181, - 1183, 1211, 1184, 1187, 1185, 1186, 1188, 1236, - 1189, 1201, 1204, 1210, 1190, 1191, 1199, 1192, - 1193, 1197, 1194, 1195, 977, 1196, 1198, 1200, - 1202, 1209, 1203, 1205, 1206, 977, 1207, 1208, - 1212, 1213, 1216, 1214, 1215, 1217, 1218, 1221, - 1219, 1220, 1222, 1223, 1226, 1224, 1225, 1227, - 1228, 1231, 1229, 1230, 1232, 1233, 1234, 1235, - 1238, 1272, 1239, 1242, 1271, 1240, 1270, 1241, - 1243, 1269, 1244, 1247, 1268, 1245, 1267, 1246, - 1248, 1266, 1249, 1252, 1265, 1250, 1264, 1251, - 1253, 1263, 1254, 1257, 1262, 1255, 1261, 1256, - 1258, 1259, 1260, 1276, 1277, 1279, 1278, 1283, - 1285, 1289, 1447, 1448, 1449, 1451, 1453, 1456, - 1458, 1459, 1290, 1291, 1292, 1293, 1311, 1294, - 1326, 1293, 1294, 1295, 1296, 1297, 1301, 1304, - 1298, 1299, 1300, 22, 1281, 1282, 1284, 1302, - 1303, 1306, 1310, 1305, 1280, 1286, 1307, 1308, - 1309, 1312, 1324, 1313, 1314, 1322, 1315, 1316, - 1320, 1317, 1318, 1304, 1319, 1321, 1323, 1325, - 1327, 1328, 1329, 1330, 1331, 1446, 1332, 1335, - 1333, 1334, 1336, 1410, 1337, 1340, 1338, 1339, - 1341, 1342, 1345, 1343, 1344, 1346, 1347, 1350, - 1348, 1349, 1351, 1352, 1355, 1353, 1354, 1356, - 1384, 1357, 1360, 1358, 1359, 1361, 1409, 1362, - 1374, 1377, 1383, 1363, 1364, 1372, 1365, 1366, - 1370, 1367, 1368, 1304, 1369, 1371, 1373, 1375, - 1382, 1376, 1378, 1379, 1304, 1380, 1381, 1385, - 1386, 1389, 1387, 1388, 1390, 1391, 1394, 1392, - 1393, 1395, 1396, 1399, 1397, 1398, 1400, 1401, - 1404, 1402, 1403, 1405, 1406, 1407, 1408, 1411, - 1445, 1412, 1415, 1444, 1413, 1443, 1414, 1416, - 1442, 1417, 1420, 1441, 1418, 1440, 1419, 1421, - 1439, 1422, 1425, 1438, 1423, 1437, 1424, 1426, - 1436, 1427, 1430, 1435, 1428, 1434, 1429, 1431, - 1432, 1433, 1289, 1450, 1448, 1449, 1451, 1453, - 1455, 1452, 1454, 1457, 1288, 1450, 10, 1463, - 1461, 1462, 1464, 1466, 1465, 1469, 9, 1463, - 1473, 1638, 1474, 1653, 1473, 1474, 1475, 1476, - 1477, 1478, 1634, 1635, 1479, 1480, 1481, 1482, - 1486, 1483, 1626, 1627, 1630, 1632, 1633, 1484, - 1485, 1487, 1490, 1488, 1505, 1487, 1488, 1489, - 1491, 1503, 1492, 1493, 1501, 1494, 1495, 1499, - 1496, 1497, 1299, 1498, 1500, 1502, 1504, 1506, - 1507, 1508, 1509, 1510, 1625, 1511, 1514, 1512, - 1513, 1515, 1589, 1516, 1519, 1517, 1518, 1520, - 1521, 1524, 1522, 1523, 1525, 1526, 1529, 1527, - 1528, 1530, 1531, 1534, 1532, 1533, 1535, 1563, - 1536, 1539, 1537, 1538, 1540, 1588, 1541, 1553, - 1556, 1562, 1542, 1543, 1551, 1544, 1545, 1549, - 1546, 1547, 1299, 1548, 1550, 1552, 1554, 1561, - 1555, 1557, 1558, 1299, 1559, 1560, 1564, 1565, - 1568, 1566, 1567, 1569, 1570, 1573, 1571, 1572, - 1574, 1575, 1578, 1576, 1577, 1579, 1580, 1583, - 1581, 1582, 1584, 1585, 1586, 1587, 1590, 1624, - 1591, 1594, 1623, 1592, 1622, 1593, 1595, 1621, - 1596, 1599, 1620, 1597, 1619, 1598, 1600, 1618, - 1601, 1604, 1617, 1602, 1616, 1603, 1605, 1615, - 1606, 1609, 1614, 1607, 1613, 1608, 1610, 1611, - 1612, 1483, 1628, 1626, 1627, 1629, 1631, 1482, - 1628, 1478, 1636, 1634, 1635, 1637, 1639, 1651, - 1640, 1641, 1649, 1642, 1643, 1647, 1644, 1645, - 1477, 1646, 1648, 1650, 1652, 1654, 1655, 1656, - 1657, 1658, 1773, 1659, 1662, 1660, 1661, 1663, - 1737, 1664, 1667, 1665, 1666, 1668, 1669, 1672, - 1670, 1671, 1673, 1674, 1677, 1675, 1676, 1678, - 1679, 1682, 1680, 1681, 1683, 1711, 1684, 1687, - 1685, 1686, 1688, 1736, 1689, 1701, 1704, 1710, - 1690, 1691, 1699, 1692, 1693, 1697, 1694, 1695, - 1477, 1696, 1698, 1700, 1702, 1709, 1703, 1705, - 1706, 1477, 1707, 1708, 1712, 1713, 1716, 1714, - 1715, 1717, 1718, 1721, 1719, 1720, 1722, 1723, - 1726, 1724, 1725, 1727, 1728, 1731, 1729, 1730, - 1732, 1733, 1734, 1735, 1738, 1772, 1739, 1742, - 1771, 1740, 1770, 1741, 1743, 1769, 1744, 1747, - 1768, 1745, 1767, 1746, 1748, 1766, 1749, 1752, - 1765, 1750, 1764, 1751, 1753, 1763, 1754, 1757, - 1762, 1755, 1761, 1756, 1758, 1759, 1760, 1776, - 1777, 1779, 1778, 97, 107, 1783, 109, 106, - 108 -}; - -static const char _smtp_received_parser_trans_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 3, 3, 3, - 3, 3, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 6, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 10, 9, 0, 11, 0, - 12, 12, 12, 12, 12, 0, 13, 14, - 13, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 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, 15, 16, - 0, 0, 0, 0, 11, 0, 0, 11, - 17, 0, 18, 18, 18, 18, 18, 18, - 18, 18, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 19, 20, 19, 19, 0, - 0, 0, 0, 21, 22, 22, 22, 22, - 22, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 23, 0, 0, 0, 0, - 0, 0, 0, 0, 24, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 26, 0, 0, 0, 0, - 0, 0, 0, 0, 27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 0, 9, 10, 9, 0, 11, 0, - 12, 0, 13, 14, 13, 15, 16, 0, - 0, 0, 11, 17, 0, 0, 0, 0, - 28, 29, 29, 29, 29, 29, 19, 20, - 19, 19, 0, 0, 0, 0, 21, 30, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 9, 10, 9, 0, 11, 0, 12, - 0, 13, 14, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 15, 16, 9, 10, - 9, 0, 11, 0, 12, 0, 13, 14, - 13, 0, 15, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 31, - 31, 31, 31, 31, 31, 31, 31, 32, - 32, 32, 32, 32, 32, 32, 0, 0, - 0, 33, 33, 33, 33, 33, 33, 33, - 0, 0, 0, 34, 34, 34, 34, 34, - 34, 34, 0, 0, 0, 35, 35, 35, - 35, 35, 35, 35, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 0, - 0, 5, 19, 20, 19, 19, 0, 0, - 0, 0, 0, 0, 21, 0, 21, 37, - 38, 38, 38, 38, 38, 0, 0, 0, - 0, 0, 0, 0, 0, 21, 0, 0, - 21, 37, 38, 38, 38, 38, 38, 38, - 0, 21, 0, 0, 0, 0, 21, 0, - 0, 0, 21, 0, 0, 0, 0, 21, - 0, 0, 0, 0, 0, 21, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 23, 0, 0, 0, 0, 0, 0, 0, - 0, 24, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 26, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, - 0, 0, 36, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 19, 20, 19, 19, - 0, 0, 0, 0, 21, 36, 36, 36, - 0, 0, 0, 4, 5, 36, 36, 36, - 36, 36, 36, 0, 0, 19, 20, 19, - 19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 0, - 0, 0, 0, 0, 0, 0, 0, 24, - 24, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 0, - 0, 0, 0, 0, 0, 0, 0, 27, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, - 0, 5, 0, 0, 36, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 23, 0, 0, 0, - 0, 0, 0, 0, 0, 24, 24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 27, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 6, 7, 8, 0, - 0, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 0, 0, 5, 19, 20, 19, - 19, 0, 0, 0, 0, 0, 0, 21, - 0, 21, 37, 39, 39, 39, 39, 0, - 0, 0, 21, 37, 39, 39, 0, 0, - 21, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 23, 0, 0, 0, 0, - 0, 0, 0, 0, 24, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 26, 0, 0, 0, 0, - 0, 0, 0, 0, 27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 36, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, - 19, 20, 19, 19, 0, 0, 0, 0, - 21, 36, 36, 36, 0, 0, 0, 4, - 5, 36, 36, 36, 36, 36, 36, 0, - 0, 19, 20, 19, 19, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 5, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 23, 0, 0, 0, 0, 0, 0, 0, - 0, 24, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 26, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, - 0 -}; - -static const int smtp_received_parser_start = 1; -static const int smtp_received_parser_first_final = 1780; -static const int smtp_received_parser_error = 0; - -static const int smtp_received_parser_en_main = 1; - - -#line 240 "../rspamd/src/ragel/smtp_received_parser.rl" - -static int -rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t len, struct received_header *rh) -{ - struct rspamd_email_address for_addr, *addr; - const char *real_domain_start, *real_domain_end, - *real_ip_start, *real_ip_end, - *reported_domain_start, *reported_domain_end, - *reported_ip_start, *reported_ip_end, - *ip_start, *ip_end; - const char *p = data, *pe = data + len, *eof; - int cs, in_v6 = 0; - - memset (rh, 0, sizeof (*rh)); - real_domain_start = NULL; - real_domain_end = NULL; - real_ip_start = NULL; - real_ip_end = NULL; - reported_domain_start = NULL; - reported_domain_end = NULL; - reported_ip_start = NULL; - reported_ip_end = NULL; - ip_start = NULL; - ip_end = NULL; - rh->type = RSPAMD_RECEIVED_UNKNOWN; - - memset (&for_addr, 0, sizeof (for_addr)); - addr = &for_addr; - eof = pe; - - -#line 6219 "../rspamd/src/libmime/parsers/smtp_received_parser.c" - { - cs = smtp_received_parser_start; - } - -#line 271 "../rspamd/src/ragel/smtp_received_parser.rl" - -#line 6226 "../rspamd/src/libmime/parsers/smtp_received_parser.c" - { - int _klen; - const char *_keys; - int _trans; - - if ( p == pe ) - goto _test_eof; - if ( cs == 0 ) - goto _out; -_resume: - _keys = _smtp_received_parser_trans_keys + _smtp_received_parser_key_offsets[cs]; - _trans = _smtp_received_parser_index_offsets[cs]; - - _klen = _smtp_received_parser_single_lengths[cs]; - if ( _klen > 0 ) { - const char *_lower = _keys; - const char *_mid; - const char *_upper = _keys + _klen - 1; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (*p) < *_mid ) - _upper = _mid - 1; - else if ( (*p) > *_mid ) - _lower = _mid + 1; - else { - _trans += (unsigned int)(_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += _klen; - } - - _klen = _smtp_received_parser_range_lengths[cs]; - if ( _klen > 0 ) { - const char *_lower = _keys; - const char *_mid; - const char *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (*p) < _mid[0] ) - _upper = _mid - 2; - else if ( (*p) > _mid[1] ) - _lower = _mid + 2; - else { - _trans += (unsigned int)((_mid - _keys)>>1); - goto _match; - } - } - _trans += _klen; - } - -_match: - _trans = _smtp_received_parser_indicies[_trans]; - cs = _smtp_received_parser_trans_targs[_trans]; - - if ( _smtp_received_parser_trans_actions[_trans] == 0 ) - goto _again; - - switch ( _smtp_received_parser_trans_actions[_trans] ) { - case 24: -#line 6 "../rspamd/src/ragel/smtp_received_parser.rl" - { - in_v6 = 1; - ip_start = p; - } - break; - case 25: -#line 14 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (!in_v6) { - ip_start = p; - } - } - break; - case 9: -#line 25 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->user = p; - } - break; - case 11: -#line 29 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->user) { - addr->user_len = p - addr->user; - } - } - break; - case 17: -#line 35 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->domain = p; - } - break; - case 19: -#line 45 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->domain = p; - addr->flags |= RSPAMD_EMAIL_ADDR_IP; - } - break; - case 21: -#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } - break; - case 13: -#line 56 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; - } - break; - case 12: -#line 60 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_QUOTED; - } - break; - case 16: -#line 79 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->addr = p; - } - break; - case 30: -#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->addr) { - addr->addr_len = p - addr->addr; - } - } - break; - case 4: -#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_start = p; - } - break; - case 36: -#line 92 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_end = p; - } - break; - case 5: -#line 102 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_ip_start = p; - } - break; - case 37: -#line 105 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (ip_start && ip_end && ip_end > ip_start) { - real_ip_start = ip_start; - real_ip_end = ip_end; - } - else { - real_ip_end = p; - } - - ip_start = NULL; - ip_end = NULL; - } - break; - case 38: -#line 160 "../rspamd/src/ragel/smtp_received_parser.rl" - { - guint len; - - if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { - len = real_domain_end - real_domain_start; - rh->by_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->by_hostname, real_domain_start, len + 1); - } - else if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { - len = reported_domain_end - reported_domain_start; - rh->by_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->by_hostname, reported_domain_start, len + 1); - } - } - break; - case 39: -#line 175 "../rspamd/src/ragel/smtp_received_parser.rl" - { - guint len; - - if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { - len = real_domain_end - real_domain_start; - rh->real_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->real_hostname, real_domain_start, len + 1); - } - if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { - len = reported_domain_end - reported_domain_start; - rh->from_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->from_hostname, reported_domain_start, len + 1); - } - if (real_ip_end && real_ip_start && real_ip_end > real_ip_start) { - len = real_ip_end - real_ip_start; - rh->real_ip = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->real_ip, real_ip_start, len + 1); - } - if (reported_ip_end && reported_ip_start && reported_ip_end > reported_ip_start) { - len = reported_ip_end - reported_ip_start; - rh->from_ip = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->from_ip, reported_ip_start, len + 1); - } - - if (rh->real_ip && !rh->from_ip) { - rh->from_ip = rh->real_ip; - } - if (rh->real_hostname && !rh->from_hostname) { - rh->from_hostname = rh->real_hostname; - } - - if (rh->real_ip) { - if (rspamd_parse_inet_address (&rh->addr, rh->real_ip, strlen (rh->real_ip))) { - rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t)rspamd_inet_address_destroy, rh->addr); - } - } - } - break; - case 35: -#line 217 "../rspamd/src/ragel/smtp_received_parser.rl" - { - rh->type = RSPAMD_RECEIVED_SMTP; - } - break; - case 32: -#line 220 "../rspamd/src/ragel/smtp_received_parser.rl" - { - rh->type = RSPAMD_RECEIVED_ESMTPS; - } - break; - case 31: -#line 223 "../rspamd/src/ragel/smtp_received_parser.rl" - { - rh->type = RSPAMD_RECEIVED_ESMTP; - } - break; - case 34: -#line 226 "../rspamd/src/ragel/smtp_received_parser.rl" - { - rh->type = RSPAMD_RECEIVED_LMTP; - } - break; - case 33: -#line 229 "../rspamd/src/ragel/smtp_received_parser.rl" - { - rh->type = RSPAMD_RECEIVED_IMAP; - } - break; - case 27: -#line 10 "../rspamd/src/ragel/smtp_received_parser.rl" - { - in_v6 = 0; - ip_end = p; - } -#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } - break; - case 23: -#line 19 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (!in_v6) { - ip_end = p; - } - } -#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } - break; - case 10: -#line 25 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->user = p; - } -#line 29 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->user) { - addr->user_len = p - addr->user; - } - } - break; - case 28: -#line 39 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } -#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->addr) { - addr->addr_len = p - addr->addr; - } - } - break; - case 20: -#line 45 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->domain = p; - addr->flags |= RSPAMD_EMAIL_ADDR_IP; - } -#line 14 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (!in_v6) { - ip_start = p; - } - } - break; - case 14: -#line 56 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH; - } -#line 29 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->user) { - addr->user_len = p - addr->user; - } - } - break; - case 29: -#line 75 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->flags |= RSPAMD_EMAIL_ADDR_BRACED; - } -#line 213 "../rspamd/src/ragel/smtp_received_parser.rl" - { - - } - break; - case 15: -#line 79 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->addr = p; - } -#line 25 "../rspamd/src/ragel/smtp_received_parser.rl" - { - addr->user = p; - } - break; - case 22: -#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->addr) { - addr->addr_len = p - addr->addr; - } - } -#line 213 "../rspamd/src/ragel/smtp_received_parser.rl" - { - - } - break; - case 2: -#line 134 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_start = NULL; - real_domain_end = NULL; - real_ip_start = NULL; - real_ip_end = NULL; - reported_domain_start = NULL; - reported_domain_end = NULL; - reported_ip_start = NULL; - reported_ip_end = NULL; - ip_start = NULL; - ip_end = NULL; - } -#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_start = p; - } - break; - case 7: -#line 147 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_start = NULL; - real_domain_end = NULL; - real_ip_start = NULL; - real_ip_end = NULL; - reported_domain_start = NULL; - reported_domain_end = NULL; - reported_ip_start = NULL; - reported_ip_end = NULL; - ip_start = NULL; - ip_end = NULL; - } -#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_start = p; - } - break; - case 26: -#line 19 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (!in_v6) { - ip_end = p; - } - } -#line 10 "../rspamd/src/ragel/smtp_received_parser.rl" - { - in_v6 = 0; - ip_end = p; - } -#line 50 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } - break; - case 18: -#line 39 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->domain) { - addr->domain_len = p - addr->domain; - } - } -#line 83 "../rspamd/src/ragel/smtp_received_parser.rl" - { - if (addr->addr) { - addr->addr_len = p - addr->addr; - } - } -#line 213 "../rspamd/src/ragel/smtp_received_parser.rl" - { - - } - break; - case 8: -#line 92 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_end = p; - } -#line 98 "../rspamd/src/ragel/smtp_received_parser.rl" - { - reported_domain_end = p; - } -#line 160 "../rspamd/src/ragel/smtp_received_parser.rl" - { - guint len; - - if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { - len = real_domain_end - real_domain_start; - rh->by_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->by_hostname, real_domain_start, len + 1); - } - else if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { - len = reported_domain_end - reported_domain_start; - rh->by_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->by_hostname, reported_domain_start, len + 1); - } - } - break; - case 3: -#line 92 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_end = p; - } -#line 98 "../rspamd/src/ragel/smtp_received_parser.rl" - { - reported_domain_end = p; - } -#line 175 "../rspamd/src/ragel/smtp_received_parser.rl" - { - guint len; - - if (real_domain_end && real_domain_start && real_domain_end > real_domain_start) { - len = real_domain_end - real_domain_start; - rh->real_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->real_hostname, real_domain_start, len + 1); - } - if (reported_domain_end && reported_domain_start && reported_domain_end > reported_domain_start) { - len = reported_domain_end - reported_domain_start; - rh->from_hostname = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->from_hostname, reported_domain_start, len + 1); - } - if (real_ip_end && real_ip_start && real_ip_end > real_ip_start) { - len = real_ip_end - real_ip_start; - rh->real_ip = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->real_ip, real_ip_start, len + 1); - } - if (reported_ip_end && reported_ip_start && reported_ip_end > reported_ip_start) { - len = reported_ip_end - reported_ip_start; - rh->from_ip = rspamd_mempool_alloc (task->task_pool, len + 1); - rspamd_strlcpy (rh->from_ip, reported_ip_start, len + 1); - } - - if (rh->real_ip && !rh->from_ip) { - rh->from_ip = rh->real_ip; - } - if (rh->real_hostname && !rh->from_hostname) { - rh->from_hostname = rh->real_hostname; - } - - if (rh->real_ip) { - if (rspamd_parse_inet_address (&rh->addr, rh->real_ip, strlen (rh->real_ip))) { - rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t)rspamd_inet_address_destroy, rh->addr); - } - } - } - break; - case 1: -#line 134 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_start = NULL; - real_domain_end = NULL; - real_ip_start = NULL; - real_ip_end = NULL; - reported_domain_start = NULL; - reported_domain_end = NULL; - reported_ip_start = NULL; - reported_ip_end = NULL; - ip_start = NULL; - ip_end = NULL; - } -#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_start = p; - } -#line 95 "../rspamd/src/ragel/smtp_received_parser.rl" - { - reported_domain_start = p; - } - break; - case 6: -#line 147 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_start = NULL; - real_domain_end = NULL; - real_ip_start = NULL; - real_ip_end = NULL; - reported_domain_start = NULL; - reported_domain_end = NULL; - reported_ip_start = NULL; - reported_ip_end = NULL; - ip_start = NULL; - ip_end = NULL; - } -#line 89 "../rspamd/src/ragel/smtp_received_parser.rl" - { - real_domain_start = p; - } -#line 95 "../rspamd/src/ragel/smtp_received_parser.rl" - { - reported_domain_start = p; - } - break; -#line 6793 "../rspamd/src/libmime/parsers/smtp_received_parser.c" - } - -_again: - if ( cs == 0 ) - goto _out; - if ( ++p != pe ) - goto _resume; - _test_eof: {} - _out: {} - } - -#line 272 "../rspamd/src/ragel/smtp_received_parser.rl" - - return cs; -} diff --git a/src/libmime/smtp_parsers.h b/src/libmime/smtp_parsers.h new file mode 100644 index 000000000..62e7738e3 --- /dev/null +++ b/src/libmime/smtp_parsers.h @@ -0,0 +1,29 @@ +/*- + * Copyright 2016 Vsevolod Stakhov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef SRC_LIBMIME_SMTP_PARSERS_H_ +#define SRC_LIBMIME_SMTP_PARSERS_H_ + +#include "config.h" +#include "email_addr.h" +#include "task.h" +#include "message.h" + +int rspamd_smtp_recieved_parse (struct rspamd_task *task, + const char *data, size_t len, struct received_header *rh); +int rspamd_smtp_addr_parse (const char *data, size_t len, + struct rspamd_email_address *addr); + +#endif /* SRC_LIBMIME_SMTP_PARSERS_H_ */ diff --git a/src/ragel/smtp_addr_parser.rl b/src/ragel/smtp_addr_parser.rl index 70f9c3ca0..7e8498966 100644 --- a/src/ragel/smtp_addr_parser.rl +++ b/src/ragel/smtp_addr_parser.rl @@ -76,9 +76,11 @@ main := SMTPAddr; }%% +#include "smtp_parsers.h" + %% write data; -static int +int rspamd_smtp_addr_parse (const char *data, size_t len, struct rspamd_email_address *addr) { const char *p = data, *pe = data + len, *eof; diff --git a/src/ragel/smtp_received_parser.rl b/src/ragel/smtp_received_parser.rl index 339326900..5170c2806 100644 --- a/src/ragel/smtp_received_parser.rl +++ b/src/ragel/smtp_received_parser.rl @@ -236,9 +236,11 @@ }%% +#include "smtp_parsers.h" + %% write data; -static int +int rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t len, struct received_header *rh) { struct rspamd_email_address for_addr, *addr; -- cgit v1.2.3 From 4effc0640c5a8d40b347c446b6b4c2ac4e936bb2 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 20:36:33 +0100 Subject: [Feature] Simplify machines by assuming that headers are unfolded --- src/ragel/smtp_whitespace.rl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ragel/smtp_whitespace.rl b/src/ragel/smtp_whitespace.rl index 5bac17a4e..635d47c92 100644 --- a/src/ragel/smtp_whitespace.rl +++ b/src/ragel/smtp_whitespace.rl @@ -23,7 +23,8 @@ Atom = atext+; Dot_string = Atom ("." Atom)*; dot_atom_text = atext+ ("." atext+)*; - FWS = ((WSP* CRLF)? WSP+); + #FWS = ((WSP* CRLF)? WSP+); + FWS = WSP+; # We work with unfolded headers, so we can simplify machine comment = "(" (FWS? ctext)* FWS? ")"; CFWS = ((FWS? comment)+ FWS?) | FWS; -- cgit v1.2.3 From 3c967aea98e39d0834a9588e84b465116a764cb2 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 20:36:50 +0100 Subject: [Feature] Improve ragel build target --- CMakeLists.txt | 6 +++--- FindRagel.cmake | 33 ++++++++++----------------------- src/CMakeLists.txt | 15 +++++++++++---- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ebef8a1ce..84a3f5005 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -729,11 +729,11 @@ CHECK_C_COMPILER_FLAG(-Wunused-variable SUPPORT_WUNUSED_VAR) CHECK_C_COMPILER_FLAG(-Wno-pointer-sign SUPPORT_WPOINTER_SIGN) CHECK_C_COMPILER_FLAG(-Wstrict-prototypes SUPPORT_WSTRICT_PROTOTYPES) CHECK_C_COMPILER_FLAG(-pedantic SUPPORT_PEDANTIC_FLAG) -CHECK_C_COMPILER_FLAG(-pedantic SUPPORT_PEDANTIC_FLAG) +CHECK_C_COMPILER_FLAG(-Wno-unused-const-variable SUPPORT_WNO_UNUSED_CONST) # GCC 6 specific CHECK_C_COMPILER_FLAG(-Wnull-dereference SUPPORT_WNULL_DEREFERENCE) CHECK_C_COMPILER_FLAG(-Wduplicated-cond SUPPORT_WDUPLICATED_COND) -CHECK_C_COMPILER_FLAG(-Wno-unused-const-variable SUPPORT_WNO_UNUSED_CONST) + IF(NOT "${CMAKE_C_COMPILER_ID}" MATCHES SunPro) CHECK_C_COMPILER_FLAG("-std=c11" SUPPORT_STD11_FLAG) CHECK_C_COMPILER_FLAG("-std=c99" SUPPORT_STD99_FLAG) @@ -775,7 +775,7 @@ IF(SUPPORT_WLOGICAL_OP) SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wlogical-op") ENDIF() IF(SUPPORT_WNO_UNUSED_CONST) - SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wunused-const-variable") + SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-unused-const-variable") ENDIF() IF(SUPPORT_STD11_FLAG) SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -std=c11") diff --git a/FindRagel.cmake b/FindRagel.cmake index 7b4534a80..b6f7fc2e1 100644 --- a/FindRagel.cmake +++ b/FindRagel.cmake @@ -7,8 +7,8 @@ # # If ragel is found, the module defines the macros: # -# RAGEL_TARGET( -# [COMPILE_FLAGS ]) +# RAGEL_TARGET( INPUTS OUTPUT +# [COMPILE_FLAGS ] [DEPENDS ]) # # which will create a custom rule to generate a state machine. is # the path to a Ragel file. is the name of the source file @@ -69,33 +69,20 @@ ${RAGEL_version_error}") # RAGEL_TARGET (public macro) #============================================================ # - macro(RAGEL_TARGET Name Input Output) - set(RAGEL_TARGET_usage - "RAGEL_TARGET( [COMPILE_FLAGS ]") - if(${ARGC} GREATER 3) - if(${ARGC} EQUAL 5) - if("${ARGV3}" STREQUAL "COMPILE_FLAGS") - set(RAGEL_EXECUTABLE_opts "${ARGV4}") - separate_arguments(RAGEL_EXECUTABLE_opts) - else() - message(SEND_ERROR ${RAGEL_TARGET_usage}) - endif() - else() - message(SEND_ERROR ${RAGEL_TARGET_usage}) - endif() - endif() - - add_custom_command(OUTPUT ${Output} + macro(RAGEL_TARGET Name) + CMAKE_PARSE_ARGUMENTS(RAGEL "" "OUTPUT" + "INPUTS;DEPENDS;COMPILE_FLAGS" ${ARGN}) + add_custom_command(OUTPUT ${RAGEL_OUTPUT} COMMAND ${RAGEL_EXECUTABLE} - ARGS ${RAGEL_EXECUTABLE_opts} -o${Output} ${Input} - DEPENDS ${Input} + ARGS ${RAGEL_EXECUTABLE_opts} -o${RAGEL_OUTPUT} ${RAGEL_INPUTS} + DEPENDS ${RAGEL_INPUTS} ${RAGEL_DEPENDS} COMMENT "[RAGEL][${Name}] Compiling state machine with Ragel ${RAGEL_VERSION}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set(RAGEL_${Name}_DEFINED TRUE) - set(RAGEL_${Name}_OUTPUTS ${Output}) - set(RAGEL_${Name}_INPUT ${Input}) + set(RAGEL_${Name}_OUTPUTS ${RAGEL_OUTPUT}) + set(RAGEL_${Name}_INPUT ${RAGEL_INPUTS}) set(RAGEL_${Name}_COMPILE_FLAGS ${RAGEL_EXECUTABLE_opts}) endmacro() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c9f99a7a5..d4765ce79 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -102,12 +102,19 @@ ENDIF() AddModules(MODULES_LIST WORKERS_LIST) LIST(LENGTH PLUGINSSRC RSPAMD_MODULES_NUM) +SET(RAGEL_DEPENDS "${CMAKE_SOURCE_DIR}/src/ragel/smtp_address.rl" + "${CMAKE_SOURCE_DIR}/src/ragel/smtp_date.rl" + "${CMAKE_SOURCE_DIR}/src/ragel/smtp_ip.rl" + "${CMAKE_SOURCE_DIR}/src/ragel/smtp_whitespace.rl" + "${CMAKE_SOURCE_DIR}/src/ragel/smtp_received.rl") RAGEL_TARGET(ragel_smtp_addr - ragel/smtp_addr_parser.rl - ${CMAKE_CURRENT_BINARY_DIR}/smtp_addr_parser.rl.c) + INPUTS ragel/smtp_addr_parser.rl + DEPENDS ${RAGEL_DEPENDS} + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/smtp_addr_parser.rl.c) RAGEL_TARGET(ragel_smtp_received - ragel/smtp_received_parser.rl - ${CMAKE_CURRENT_BINARY_DIR}/smtp_received_parser.rl.c) + INPUTS ragel/smtp_received_parser.rl + DEPENDS ${RAGEL_DEPENDS} + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/smtp_received_parser.rl.c) ######################### LINK SECTION ############################### ADD_LIBRARY(rspamd-server STATIC ${RSPAMD_CRYPTOBOX} ${RSPAMD_UTIL} ${RSPAMD_LUA} ${RSPAMD_SERVER} -- cgit v1.2.3 From 1de3b213131faf3e4cf4864f93e52739f4865e13 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 20:55:39 +0100 Subject: [Fix] Fix build --- .travis.yml | 2 +- src/CMakeLists.txt | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index cf1a0b50f..d2c8bf754 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ language: c before_script: - sudo apt-get update -qq - - sudo apt-get install -qq cmake libevent-dev libglib2.0-dev libgmime-2.6-dev libluajit-5.1-dev liblua5.1-0-dev libpcre3-dev libsqlite3-dev libmagic-dev + - sudo apt-get install -qq cmake libevent-dev libglib2.0-dev libgmime-2.6-dev libluajit-5.1-dev liblua5.1-0-dev libpcre3-dev libsqlite3-dev libmagic-dev ragel make libssl-dev # - echo $TRAVIS_OS_NAME # - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq ; fi # - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq cmake libevent-dev libglib2.0-dev libgmime-2.6-dev libluajit-5.1-dev libpcre3-dev libsqlite3-dev libhiredis-dev ; fi diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d4765ce79..b9accae30 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -117,9 +117,15 @@ RAGEL_TARGET(ragel_smtp_received OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/smtp_received_parser.rl.c) ######################### LINK SECTION ############################### -ADD_LIBRARY(rspamd-server STATIC ${RSPAMD_CRYPTOBOX} ${RSPAMD_UTIL} ${RSPAMD_LUA} ${RSPAMD_SERVER} - ${RSPAMD_STAT} ${RSPAMD_MIME} - ${CMAKE_CURRENT_BINARY_DIR}/modules.c ${PLUGINSSRC} +ADD_LIBRARY(rspamd-server STATIC + ${RSPAMD_CRYPTOBOX} + ${RSPAMD_UTIL} + ${RSPAMD_LUA} + ${RSPAMD_SERVER} + ${RSPAMD_STAT} + ${RSPAMD_MIME} + ${CMAKE_CURRENT_BINARY_DIR}/modules.c + ${PLUGINSSRC} "${RAGEL_ragel_smtp_addr_OUTPUTS}" "${RAGEL_ragel_smtp_received_OUTPUTS}") TARGET_LINK_LIBRARIES(rspamd-server rspamd-http-parser) @@ -130,6 +136,7 @@ TARGET_LINK_LIBRARIES(rspamd-server lcbtrie) IF (ENABLE_CLANG_PLUGIN MATCHES "ON") ADD_DEPENDENCIES(rspamd-server rspamd-clang) ENDIF() +ADD_DEPENDENCIES(rspamd-server rspamd_lua_preprocess) ADD_EXECUTABLE(rspamd ${RSPAMDSRC} ${CMAKE_CURRENT_BINARY_DIR}/workers.c) SET_TARGET_PROPERTIES(rspamd PROPERTIES LINKER_LANGUAGE C) -- cgit v1.2.3 From 1c356c51a97e023e8fc936d46477233e5d65cc5b Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 22:40:31 +0100 Subject: [Minor] Add a simple received parser benchmark routine --- FindRagel.cmake | 4 +- src/CMakeLists.txt | 2 + utils/CMakeLists.txt | 15 +++++++- utils/received_parser_bench.c | 90 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 utils/received_parser_bench.c diff --git a/FindRagel.cmake b/FindRagel.cmake index b6f7fc2e1..a058b7fb1 100644 --- a/FindRagel.cmake +++ b/FindRagel.cmake @@ -74,7 +74,7 @@ ${RAGEL_version_error}") "INPUTS;DEPENDS;COMPILE_FLAGS" ${ARGN}) add_custom_command(OUTPUT ${RAGEL_OUTPUT} COMMAND ${RAGEL_EXECUTABLE} - ARGS ${RAGEL_EXECUTABLE_opts} -o${RAGEL_OUTPUT} ${RAGEL_INPUTS} + ARGS ${RAGEL_COMPILE_FLAGS} -o${RAGEL_OUTPUT} ${RAGEL_INPUTS} DEPENDS ${RAGEL_INPUTS} ${RAGEL_DEPENDS} COMMENT "[RAGEL][${Name}] Compiling state machine with Ragel ${RAGEL_VERSION}" @@ -83,7 +83,7 @@ ${RAGEL_version_error}") set(RAGEL_${Name}_DEFINED TRUE) set(RAGEL_${Name}_OUTPUTS ${RAGEL_OUTPUT}) set(RAGEL_${Name}_INPUT ${RAGEL_INPUTS}) - set(RAGEL_${Name}_COMPILE_FLAGS ${RAGEL_EXECUTABLE_opts}) + set(RAGEL_${Name}_COMPILE_FLAGS ${RAGEL_COMPILE_FLAGS}) endmacro() endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b9accae30..55e76fcfa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -110,10 +110,12 @@ SET(RAGEL_DEPENDS "${CMAKE_SOURCE_DIR}/src/ragel/smtp_address.rl" RAGEL_TARGET(ragel_smtp_addr INPUTS ragel/smtp_addr_parser.rl DEPENDS ${RAGEL_DEPENDS} + COMPILE_FLAGS -T1 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/smtp_addr_parser.rl.c) RAGEL_TARGET(ragel_smtp_received INPUTS ragel/smtp_received_parser.rl DEPENDS ${RAGEL_DEPENDS} + COMPILE_FLAGS -T1 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/smtp_received_parser.rl.c) ######################### LINK SECTION ############################### diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 672325924..e0bb5c886 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -1,5 +1,6 @@ SET(UTILSERVERSRC rspamd_http_server.c) SET(UTILBENCHSRC rspamd_http_bench.c) +SET(RECVBENCHSRC received_parser_bench.c) ADD_EXECUTABLE(rspamd-http-server ${UTILSERVERSRC}) SET_TARGET_PROPERTIES(rspamd-http-server PROPERTIES LINKER_LANGUAGE C) @@ -9,13 +10,25 @@ TARGET_LINK_LIBRARIES(rspamd-http-server ${RSPAMD_REQUIRED_LIBRARIES}) ADD_EXECUTABLE(rspamd-http-bench ${UTILBENCHSRC}) SET_TARGET_PROPERTIES(rspamd-http-bench PROPERTIES LINKER_LANGUAGE C) -TARGET_LINK_LIBRARIES(rspamd-http-bench rspamd-server) TARGET_LINK_LIBRARIES(rspamd-http-bench rspamd-http-parser) +TARGET_LINK_LIBRARIES(rspamd-http-bench rspamd-server) TARGET_LINK_LIBRARIES(rspamd-http-bench ${RSPAMD_REQUIRED_LIBRARIES}) +ADD_EXECUTABLE(rspamd-received-bench ${RECVBENCHSRC}) +SET_TARGET_PROPERTIES(rspamd-received-bench PROPERTIES LINKER_LANGUAGE C) +TARGET_LINK_LIBRARIES(rspamd-received-bench rspamd-server) +IF (ENABLE_SNOWBALL MATCHES "ON") + TARGET_LINK_LIBRARIES(rspamd-received-bench stemmer) +ENDIF() +IF(ENABLE_HIREDIS MATCHES "ON") + TARGET_LINK_LIBRARIES(rspamd-received-bench rspamd-hiredis) +ENDIF() +TARGET_LINK_LIBRARIES(rspamd-received-bench ${RSPAMD_REQUIRED_LIBRARIES}) + IF (ENABLE_HYPERSCAN MATCHES "ON") SET_TARGET_PROPERTIES(rspamd-http-bench PROPERTIES LINKER_LANGUAGE CXX) SET_TARGET_PROPERTIES(rspamd-http-server PROPERTIES LINKER_LANGUAGE CXX) + SET_TARGET_PROPERTIES(rspamd-received-bench PROPERTIES LINKER_LANGUAGE CXX) ENDIF() # Redirector diff --git a/utils/received_parser_bench.c b/utils/received_parser_bench.c new file mode 100644 index 000000000..65c656741 --- /dev/null +++ b/utils/received_parser_bench.c @@ -0,0 +1,90 @@ +/*- + * Copyright 2016 Vsevolod Stakhov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "config.h" +#include "printf.h" +#include "message.h" +#include "smtp_parsers.h" + +static gdouble total_time = 0; +static gint total_parsed = 0; + +static void +rspamd_process_file (const gchar *fname) +{ + struct rspamd_task *task; + GIOChannel *f; + GError *err = NULL; + GString *buf; + struct received_header rh; + gdouble t1, t2; + + f = g_io_channel_new_file (fname, "r", &err); + + if (!f) { + rspamd_fprintf (stderr, "cannot open %s: %e\n", fname, err); + g_error_free (err); + + return; + } + + g_io_channel_set_encoding (f, NULL, NULL); + buf = g_string_sized_new (8192); + task = g_malloc0 (sizeof (task)); + task->task_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "test"); + + while (g_io_channel_read_line_string (f, buf, NULL, &err) + == G_IO_STATUS_NORMAL) { + + while (buf->len > 0 && g_ascii_isspace (buf->str[buf->len - 1])) { + buf->len --; + } + + t1 = rspamd_get_virtual_ticks (); + rspamd_smtp_recieved_parse (task, buf->str, buf->len, &rh); + t2 = rspamd_get_virtual_ticks (); + + total_time += t2 - t1; + total_parsed ++; + } + + if (err) { + rspamd_fprintf (stderr, "cannot read %s: %e\n", fname, err); + g_error_free (err); + } + + g_io_channel_unref (f); + g_string_free (buf, TRUE); + rspamd_mempool_delete (task->task_pool); + g_free (task); +} + +int +main (int argc, char **argv) +{ + gint i; + + for (i = 1; i < argc; i ++) { + if (argv[i]) { + rspamd_process_file (argv[i]); + } + } + + rspamd_printf ("Parsed %d received headers in %.3f seconds\n", + total_parsed, total_time); + + return 0; +} -- cgit v1.2.3 From eb1eaf0f1020c582f25bc0fdbbe61a0850a895ca Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 23:05:07 +0100 Subject: [Minor] Fix memory allocation --- utils/received_parser_bench.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/received_parser_bench.c b/utils/received_parser_bench.c index 65c656741..4979d858a 100644 --- a/utils/received_parser_bench.c +++ b/utils/received_parser_bench.c @@ -43,7 +43,7 @@ rspamd_process_file (const gchar *fname) g_io_channel_set_encoding (f, NULL, NULL); buf = g_string_sized_new (8192); - task = g_malloc0 (sizeof (task)); + task = g_malloc0 (sizeof (*task)); task->task_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "test"); while (g_io_channel_read_line_string (f, buf, NULL, &err) -- cgit v1.2.3 From b4b74e7d0531a414c93d4416fb7e4176c0a8fca7 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 23:09:24 +0100 Subject: [Minor] Add some more stats --- utils/received_parser_bench.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/utils/received_parser_bench.c b/utils/received_parser_bench.c index 4979d858a..18c48ee10 100644 --- a/utils/received_parser_bench.c +++ b/utils/received_parser_bench.c @@ -21,6 +21,10 @@ static gdouble total_time = 0; static gint total_parsed = 0; +static gint total_valid = 0; +static gint total_real_ip = 0; +static gint total_real_host = 0; +static gint total_known_proto = 0; static void rspamd_process_file (const gchar *fname) @@ -59,6 +63,20 @@ rspamd_process_file (const gchar *fname) total_time += t2 - t1; total_parsed ++; + + if (rh.addr) { + total_real_ip ++; + } + if (rh.real_hostname) { + total_real_host ++; + } + if (rh.type != RSPAMD_RECEIVED_UNKNOWN) { + total_known_proto ++; + } + + if (rh.by_hostname) { + total_valid ++; + } } if (err) { @@ -83,8 +101,13 @@ main (int argc, char **argv) } } - rspamd_printf ("Parsed %d received headers in %.3f seconds\n", - total_parsed, total_time); + rspamd_printf ("Parsed %d received headers in %.3f seconds\n" + "Total valid (has by part): %d\n" + "Total real ip: %d\n" + "Total real host: %d\n" + "Total known proto: %d\n", + total_parsed, total_time, + total_valid, total_real_ip, total_real_host, total_known_proto); return 0; } -- cgit v1.2.3 From 5a70a9191f3d0901f03372fabec66634618c91a4 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 15 Jun 2016 08:33:26 +0100 Subject: [Feature] Parse received date and ESMTPA proto --- src/libmime/message.h | 3 ++- src/lua/lua_task.c | 6 ++++-- src/ragel/smtp_received.rl | 10 ++++++++-- src/ragel/smtp_received_parser.rl | 22 +++++++++++++++++++++- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/libmime/message.h b/src/libmime/message.h index 026233f3c..cacb4287b 100644 --- a/src/libmime/message.h +++ b/src/libmime/message.h @@ -59,6 +59,7 @@ struct mime_text_part { enum rspamd_received_type { RSPAMD_RECEIVED_SMTP = 0, RSPAMD_RECEIVED_ESMTP, + RSPAMD_RECEIVED_ESMTPA, RSPAMD_RECEIVED_ESMTPS, RSPAMD_RECEIVED_LMTP, RSPAMD_RECEIVED_IMAP, @@ -72,8 +73,8 @@ struct received_header { gchar *real_ip; gchar *by_hostname; rspamd_inet_addr_t *addr; + time_t timestamp; enum rspamd_received_type type; - gint is_error; }; struct raw_header { diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index cbcaf2ed5..bc31640fa 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -1436,8 +1436,7 @@ lua_task_get_received_headers (lua_State * L) for (i = 0; i < task->received->len; i ++) { rh = g_ptr_array_index (task->received, i); - if (rh->is_error || G_UNLIKELY ( - rh->from_ip == NULL && + if (G_UNLIKELY (rh->from_ip == NULL && rh->real_ip == NULL && rh->real_hostname == NULL && rh->by_hostname == NULL)) { @@ -1463,6 +1462,9 @@ lua_task_get_received_headers (lua_State * L) case RSPAMD_RECEIVED_ESMTPS: proto = "esmtps"; break; + case RSPAMD_RECEIVED_ESMTPA: + proto = "esmtpa"; + break; case RSPAMD_RECEIVED_LMTP: proto = "lmtp"; break; diff --git a/src/ragel/smtp_received.rl b/src/ragel/smtp_received.rl index 235c54906..02e850c9b 100644 --- a/src/ragel/smtp_received.rl +++ b/src/ragel/smtp_received.rl @@ -11,7 +11,13 @@ Addtl_Link = Atom; Link = "TCP" | Addtl_Link; Attdl_Protocol = Atom; - Protocol = "ESMTP" %ESMTP_proto | "SMTP" %SMTP_proto | "ESMTPS" %ESMTPS_proto | "LMTP" %LMTP_proto | "IMAP" %IMAP_proto | Attdl_Protocol; + Protocol = "ESMTP" %ESMTP_proto | + "SMTP" %SMTP_proto | + "ESMTPS" %ESMTPS_proto | + "ESMTPA" %ESMTPA_proto | + "LMTP" %LMTP_proto | + "IMAP" %IMAP_proto | + Attdl_Protocol; TCP_info = address_literal >Real_IP_Start %Real_IP_End | ( Domain >Real_Domain_Start %Real_Domain_End FWS address_literal >Real_IP_Start %Real_IP_End ); @@ -34,6 +40,6 @@ For = CFWS "FOR"i FWS ( Path | Mailbox ) %For_End; Additional_Registered_Clauses = CFWS Atom FWS String; Opt_info = Via? With? ID? For? Additional_Registered_Clauses?; - Received = From_domain By_domain Opt_info CFWS? ";" FWS date_time; + Received = From_domain By_domain Opt_info CFWS? ";" FWS date_time >Date_Start %Date_End; }%% diff --git a/src/ragel/smtp_received_parser.rl b/src/ragel/smtp_received_parser.rl index 5170c2806..7161eab96 100644 --- a/src/ragel/smtp_received_parser.rl +++ b/src/ragel/smtp_received_parser.rl @@ -220,6 +220,9 @@ action ESMTPS_proto { rh->type = RSPAMD_RECEIVED_ESMTPS; } + action ESMTPA_proto { + rh->type = RSPAMD_RECEIVED_ESMTPA; + } action ESMTP_proto { rh->type = RSPAMD_RECEIVED_ESMTP; } @@ -230,6 +233,22 @@ rh->type = RSPAMD_RECEIVED_IMAP; } + action Date_Start { + date_start = p; + } + action Date_End { + if (date_start && p > date_start) { + guint len; + char *tdate; + + len = p - date_start; + tdate = g_malloc (len + 1); + rspamd_strlcpy (tdate, date_start, len + 1); + rh->timestamp = g_mime_utils_header_decode_date (tdate, NULL); + g_free (tdate); + } + } + include smtp_received "smtp_received.rl"; main := Received; @@ -248,7 +267,7 @@ rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t l *real_ip_start, *real_ip_end, *reported_domain_start, *reported_domain_end, *reported_ip_start, *reported_ip_end, - *ip_start, *ip_end; + *ip_start, *ip_end, *date_start; const char *p = data, *pe = data + len, *eof; int cs, in_v6 = 0; @@ -263,6 +282,7 @@ rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t l reported_ip_end = NULL; ip_start = NULL; ip_end = NULL; + date_start = NULL; rh->type = RSPAMD_RECEIVED_UNKNOWN; memset (&for_addr, 0, sizeof (for_addr)); -- cgit v1.2.3 From 9aad3e020ba34916fd680fc157923d5d6906e1a2 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 15 Jun 2016 09:21:03 +0100 Subject: [Feature] Parse received timestamp --- src/lua/lua_task.c | 5 +++++ src/ragel/smtp_date.rl | 8 ++++---- src/ragel/smtp_received.rl | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index bc31640fa..38402039b 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -1478,6 +1478,11 @@ lua_task_get_received_headers (lua_State * L) } lua_pushstring (L, proto); lua_settable (L, -3); + + lua_pushstring (L, "timestamp"); + lua_pushnumber (L, rh->timestamp); + lua_settable (L, -3); + rspamd_lua_table_set (L, "by_hostname", rh->by_hostname); lua_rawseti (L, -2, k ++); } diff --git a/src/ragel/smtp_date.rl b/src/ragel/smtp_date.rl index d2efe61a6..da5872439 100644 --- a/src/ragel/smtp_date.rl +++ b/src/ragel/smtp_date.rl @@ -11,7 +11,7 @@ day_name = "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun"; day_of_week = FWS? day_name; - day = FWS? digit_2+ FWS; + day = FWS? digit{1,2} FWS; month = "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun" | "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec"; @@ -20,8 +20,8 @@ hour = digit_2; minute = digit_2; second = digit_2; - time_of_day = hour ":" minute ( ":" second ); - zone = (FWS ( "+" |"_" ) digit_4); + time_of_day = hour ":" minute (":" second )?; + zone = FWS ("+" | "-") >Sign_Start %Sign_End digit_4; time = time_of_day zone; - date_time = (day_of_week ",")? date time CFWS?; + date_time = (day_of_week ",")? date time; }%% \ No newline at end of file diff --git a/src/ragel/smtp_received.rl b/src/ragel/smtp_received.rl index 02e850c9b..8e1825855 100644 --- a/src/ragel/smtp_received.rl +++ b/src/ragel/smtp_received.rl @@ -40,6 +40,6 @@ For = CFWS "FOR"i FWS ( Path | Mailbox ) %For_End; Additional_Registered_Clauses = CFWS Atom FWS String; Opt_info = Via? With? ID? For? Additional_Registered_Clauses?; - Received = From_domain By_domain Opt_info CFWS? ";" FWS date_time >Date_Start %Date_End; + Received = From_domain By_domain Opt_info CFWS? ";" FWS date_time >Date_Start %Date_End CFWS?; }%% -- cgit v1.2.3 From e3866554181f3afc44afcd3cbd24fc2d4aac7f2d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 15 Jun 2016 09:26:38 +0100 Subject: [Fix] Fix parser --- src/ragel/smtp_date.rl | 2 +- utils/received_parser_bench.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/ragel/smtp_date.rl b/src/ragel/smtp_date.rl index da5872439..eb5d0cdc5 100644 --- a/src/ragel/smtp_date.rl +++ b/src/ragel/smtp_date.rl @@ -21,7 +21,7 @@ minute = digit_2; second = digit_2; time_of_day = hour ":" minute (":" second )?; - zone = FWS ("+" | "-") >Sign_Start %Sign_End digit_4; + zone = FWS ("+" | "-") digit_4; time = time_of_day zone; date_time = (day_of_week ",")? date time; }%% \ No newline at end of file diff --git a/utils/received_parser_bench.c b/utils/received_parser_bench.c index 18c48ee10..4f6a073fd 100644 --- a/utils/received_parser_bench.c +++ b/utils/received_parser_bench.c @@ -25,6 +25,7 @@ static gint total_valid = 0; static gint total_real_ip = 0; static gint total_real_host = 0; static gint total_known_proto = 0; +static gint total_known_ts = 0; static void rspamd_process_file (const gchar *fname) @@ -77,6 +78,10 @@ rspamd_process_file (const gchar *fname) if (rh.by_hostname) { total_valid ++; } + + if (rh.timestamp != 0) { + total_known_ts ++; + } } if (err) { @@ -105,9 +110,12 @@ main (int argc, char **argv) "Total valid (has by part): %d\n" "Total real ip: %d\n" "Total real host: %d\n" - "Total known proto: %d\n", + "Total known proto: %d\n" + "Total known timestamp: %d\n", total_parsed, total_time, - total_valid, total_real_ip, total_real_host, total_known_proto); + total_valid, total_real_ip, + total_real_host, total_known_proto, + total_known_ts); return 0; } -- cgit v1.2.3 From 8e1fa66e450862d085165f0425a48a219ac974ad Mon Sep 17 00:00:00 2001 From: Alexander Moisseev Date: Wed, 15 Jun 2016 17:54:26 +0300 Subject: [Minor] Add `application/octet-stream` mime type for `pdf` extension The `application/octet-stream` mime type is commonly used for `pdf` files by variety of automated mailing systems. --- conf/modules.d/mime_types.conf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/modules.d/mime_types.conf b/conf/modules.d/mime_types.conf index eb00e04c7..e4c80e0a1 100644 --- a/conf/modules.d/mime_types.conf +++ b/conf/modules.d/mime_types.conf @@ -27,6 +27,9 @@ mime_types { "text/plain", "text/rfc822-headers" ]; - pdf = "application/pdf"; + pdf = [ + "application/octet-stream", + "application/pdf" + ]; } } -- cgit v1.2.3 From 64f5a8946087eca07abab3356dfc8fa339cdd6b4 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 15 Jun 2016 16:49:23 +0100 Subject: [Fix] Fix parsing of nested braces in SMTP comments --- src/ragel/smtp_received.rl | 12 ++++++++++++ src/ragel/smtp_received_parser.rl | 14 ++++++++++++-- src/ragel/smtp_whitespace.rl | 3 --- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/ragel/smtp_received.rl b/src/ragel/smtp_received.rl index 8e1825855..67a52e7cf 100644 --- a/src/ragel/smtp_received.rl +++ b/src/ragel/smtp_received.rl @@ -25,6 +25,11 @@ ( Domain >Reported_Domain_Start %Reported_Domain_End FWS "(" TCP_info ")" ) | # Here domain is something specified by remote side ( address_literal >Real_Domain_Start %Real_Domain_End FWS "(" TCP_info ")" ); + ccontent = ctext | FWS | '(' @{ fcall balanced_ccontent; }; + balanced_ccontent := ccontent* ')' @{ fret; }; + comment = "(" (FWS? ccontent)* FWS? ")"; + CFWS = ((FWS? comment)+ FWS?) | FWS; + From_domain = "FROM"i FWS Extended_Domain >From_Start %From_End; By_domain = CFWS "BY"i FWS Extended_Domain >By_Start %By_End; @@ -42,4 +47,11 @@ Opt_info = Via? With? ID? For? Additional_Registered_Clauses?; Received = From_domain By_domain Opt_info CFWS? ";" FWS date_time >Date_Start %Date_End CFWS?; + prepush { + if (top >= st_storage.size) { + st_storage.data = realloc (st_storage.data, (top + 1) * 2); + g_assert (st_storage.data != NULL); + stack = st_storage.data; + } + } }%% diff --git a/src/ragel/smtp_received_parser.rl b/src/ragel/smtp_received_parser.rl index 7161eab96..bfd32eaaa 100644 --- a/src/ragel/smtp_received_parser.rl +++ b/src/ragel/smtp_received_parser.rl @@ -269,8 +269,14 @@ rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t l *reported_ip_start, *reported_ip_end, *ip_start, *ip_end, *date_start; const char *p = data, *pe = data + len, *eof; - int cs, in_v6 = 0; - + int cs, in_v6 = 0, *stack = NULL; + gsize top = 0; + struct _ragel_st_storage { + int *data; + gsize size; + } st_storage; + + memset (&st_storage, 0, sizeof (st_storage)); memset (rh, 0, sizeof (*rh)); real_domain_start = NULL; real_domain_end = NULL; @@ -292,5 +298,9 @@ rspamd_smtp_recieved_parse (struct rspamd_task *task, const char *data, size_t l %% write init; %% write exec; + if (st_storage.data) { + free (st_storage.data); + } + return cs; } diff --git a/src/ragel/smtp_whitespace.rl b/src/ragel/smtp_whitespace.rl index 635d47c92..3b8563e8b 100644 --- a/src/ragel/smtp_whitespace.rl +++ b/src/ragel/smtp_whitespace.rl @@ -25,7 +25,4 @@ dot_atom_text = atext+ ("." atext+)*; #FWS = ((WSP* CRLF)? WSP+); FWS = WSP+; # We work with unfolded headers, so we can simplify machine - - comment = "(" (FWS? ctext)* FWS? ")"; - CFWS = ((FWS? comment)+ FWS?) | FWS; }%% \ No newline at end of file -- cgit v1.2.3 From 03ff229b475f33081610ebff7e2256d2cac98a9d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 15 Jun 2016 17:08:43 +0100 Subject: [Feature] Further relax parser --- src/ragel/smtp_received.rl | 8 +++++--- utils/received_parser_bench.c | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ragel/smtp_received.rl b/src/ragel/smtp_received.rl index 67a52e7cf..f4a0ed7ba 100644 --- a/src/ragel/smtp_received.rl +++ b/src/ragel/smtp_received.rl @@ -23,7 +23,8 @@ ( Domain >Real_Domain_Start %Real_Domain_End FWS address_literal >Real_IP_Start %Real_IP_End ); Extended_Domain = Domain >Real_Domain_Start %Real_Domain_End | # Used to be a real domain ( Domain >Reported_Domain_Start %Reported_Domain_End FWS "(" TCP_info ")" ) | # Here domain is something specified by remote side - ( address_literal >Real_Domain_Start %Real_Domain_End FWS "(" TCP_info ")" ); + ( address_literal >Real_Domain_Start %Real_Domain_End FWS "(" TCP_info ")" ) | + address_literal >Real_IP_Start %Real_IP_End; # Not RFC conforming, but many MTA try this ccontent = ctext | FWS | '(' @{ fcall balanced_ccontent; }; balanced_ccontent := ccontent* ')' @{ fret; }; @@ -31,7 +32,7 @@ CFWS = ((FWS? comment)+ FWS?) | FWS; From_domain = "FROM"i FWS Extended_Domain >From_Start %From_End; - By_domain = CFWS "BY"i FWS Extended_Domain >By_Start %By_End; + By_domain = "BY"i FWS Extended_Domain >By_Start %By_End; Via = CFWS "VIA"i FWS Link; With = CFWS "WITH"i FWS Protocol; @@ -45,7 +46,8 @@ For = CFWS "FOR"i FWS ( Path | Mailbox ) %For_End; Additional_Registered_Clauses = CFWS Atom FWS String; Opt_info = Via? With? ID? For? Additional_Registered_Clauses?; - Received = From_domain By_domain Opt_info CFWS? ";" FWS date_time >Date_Start %Date_End CFWS?; + # Here we make From part optional just because many received headers lack it + Received = From_domain? CFWS? By_domain? CFWS? Opt_info CFWS? ";" FWS date_time >Date_Start %Date_End CFWS?; prepush { if (top >= st_storage.size) { diff --git a/utils/received_parser_bench.c b/utils/received_parser_bench.c index 4f6a073fd..cb304b631 100644 --- a/utils/received_parser_bench.c +++ b/utils/received_parser_bench.c @@ -75,7 +75,7 @@ rspamd_process_file (const gchar *fname) total_known_proto ++; } - if (rh.by_hostname) { + if (rh.by_hostname || rh.timestamp > 0) { total_valid ++; } -- cgit v1.2.3 From f166c85751692f0a317b0eb129e6ed0557e281a4 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 15 Jun 2016 17:42:45 +0100 Subject: [Fix] Fix stack growing --- src/ragel/smtp_received.rl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ragel/smtp_received.rl b/src/ragel/smtp_received.rl index f4a0ed7ba..dd2212de3 100644 --- a/src/ragel/smtp_received.rl +++ b/src/ragel/smtp_received.rl @@ -51,7 +51,8 @@ prepush { if (top >= st_storage.size) { - st_storage.data = realloc (st_storage.data, (top + 1) * 2); + st_storage.size = (top + 1) * 2; + st_storage.data = realloc (st_storage.data, st_storage.size * sizeof (int)); g_assert (st_storage.data != NULL); stack = st_storage.data; } -- cgit v1.2.3 From 4cd5cfe03ca6b315ea35a89df9f32b12d37fe694 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 15 Jun 2016 17:42:56 +0100 Subject: [Feature] Add ESMTPSA received type --- src/libmime/message.h | 1 + src/lua/lua_task.c | 5 ++++- src/ragel/smtp_received.rl | 1 + src/ragel/smtp_received_parser.rl | 3 +++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/libmime/message.h b/src/libmime/message.h index cacb4287b..619154c6b 100644 --- a/src/libmime/message.h +++ b/src/libmime/message.h @@ -61,6 +61,7 @@ enum rspamd_received_type { RSPAMD_RECEIVED_ESMTP, RSPAMD_RECEIVED_ESMTPA, RSPAMD_RECEIVED_ESMTPS, + RSPAMD_RECEIVED_ESMTPSA, RSPAMD_RECEIVED_LMTP, RSPAMD_RECEIVED_IMAP, RSPAMD_RECEIVED_UNKNOWN diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index 38402039b..15b0ae0b7 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -1439,7 +1439,7 @@ lua_task_get_received_headers (lua_State * L) if (G_UNLIKELY (rh->from_ip == NULL && rh->real_ip == NULL && rh->real_hostname == NULL && - rh->by_hostname == NULL)) { + rh->by_hostname == NULL && rh->timestamp == 0)) { continue; } @@ -1465,6 +1465,9 @@ lua_task_get_received_headers (lua_State * L) case RSPAMD_RECEIVED_ESMTPA: proto = "esmtpa"; break; + case RSPAMD_RECEIVED_ESMTPSA: + proto = "esmtpsa"; + break; case RSPAMD_RECEIVED_LMTP: proto = "lmtp"; break; diff --git a/src/ragel/smtp_received.rl b/src/ragel/smtp_received.rl index dd2212de3..e005dcc9c 100644 --- a/src/ragel/smtp_received.rl +++ b/src/ragel/smtp_received.rl @@ -15,6 +15,7 @@ "SMTP" %SMTP_proto | "ESMTPS" %ESMTPS_proto | "ESMTPA" %ESMTPA_proto | + "ESMTPSA" %ESMTPSA_proto | "LMTP" %LMTP_proto | "IMAP" %IMAP_proto | Attdl_Protocol; diff --git a/src/ragel/smtp_received_parser.rl b/src/ragel/smtp_received_parser.rl index bfd32eaaa..b2c73cab3 100644 --- a/src/ragel/smtp_received_parser.rl +++ b/src/ragel/smtp_received_parser.rl @@ -226,6 +226,9 @@ action ESMTP_proto { rh->type = RSPAMD_RECEIVED_ESMTP; } + action ESMTPSA_proto { + rh->type = RSPAMD_RECEIVED_ESMTPSA; + } action LMTP_proto { rh->type = RSPAMD_RECEIVED_LMTP; } -- cgit v1.2.3 From 7f1e0f5893b2a6e21aaa39b5e82c4aa576653ce8 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 09:53:40 +0100 Subject: [Feature] Try to read on fuzzy timeout to avoid fake timeouts --- src/plugins/fuzzy_check.c | 163 +++++++++++++++++++++++++++++----------------- 1 file changed, 104 insertions(+), 59 deletions(-) diff --git a/src/plugins/fuzzy_check.c b/src/plugins/fuzzy_check.c index f71c1bf81..a37eea148 100644 --- a/src/plugins/fuzzy_check.c +++ b/src/plugins/fuzzy_check.c @@ -1465,18 +1465,97 @@ fuzzy_insert_result (struct fuzzy_client_session *session, } } +static gint +fuzzy_check_try_read (struct fuzzy_client_session *session) +{ + struct rspamd_task *task; + const struct rspamd_fuzzy_reply *rep; + struct rspamd_fuzzy_cmd *cmd = NULL; + guint i; + gint r, ret; + guchar buf[2048], *p; + + task = session->task; + + if ((r = read (session->fd, buf, sizeof (buf) - 1)) == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) { + return 0; + } + else { + return -1; + } + } + else { + p = buf; + + ret = 0; + + while ((rep = fuzzy_process_reply (&p, &r, + session->commands, session->rule, &cmd)) != NULL) { + if (rep->prob > 0.5) { + if (rep->flag & (1U << 31)) { + /* Multi-flag */ + for (i = 0; i < 31; i ++) { + if ((1U << i) & rep->flag) { + fuzzy_insert_result (session, rep, cmd, i + 1); + } + } + } + else { + fuzzy_insert_result (session, rep, cmd, rep->flag); + } + } + else if (rep->value == 403) { + msg_info_task ( + "fuzzy check error for %d: forbidden", + rep->flag); + } + else if (rep->value != 0) { + msg_info_task ( + "fuzzy check error for %d: unknown error (%d)", + rep->flag, + rep->value); + } + + ret = 1; + } + } + + return ret; +} + +static gboolean +fuzzy_check_session_is_completed (struct fuzzy_client_session *session) +{ + struct fuzzy_cmd_io *io; + guint nreplied = 0, i; + + rspamd_upstream_ok (session->server); + + for (i = 0; i < session->commands->len; i++) { + io = g_ptr_array_index (session->commands, i); + + if (io->flags & FUZZY_CMD_FLAG_REPLIED) { + nreplied++; + } + } + + if (nreplied == session->commands->len) { + rspamd_session_remove_event (session->task->s, fuzzy_io_fin, session); + + return TRUE; + } + + return FALSE; +} + /* Fuzzy check callback */ static void fuzzy_check_io_callback (gint fd, short what, void *arg) { struct fuzzy_client_session *session = arg; - const struct rspamd_fuzzy_reply *rep; struct rspamd_task *task; - guchar buf[2048], *p; - struct fuzzy_cmd_io *io; - struct rspamd_fuzzy_cmd *cmd = NULL; struct event_base *ev_base; - guint i; gint r; enum { @@ -1489,45 +1568,18 @@ fuzzy_check_io_callback (gint fd, short what, void *arg) if ((what & EV_READ) || session->state == 1) { /* Try to read reply */ - if ((r = read (fd, buf, sizeof (buf) - 1)) == -1) { - if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) { - event_add (&session->ev, NULL); - return; - } - } - else { - p = buf; - ret = return_want_more; + r = fuzzy_check_try_read (session); - while ((rep = fuzzy_process_reply (&p, &r, - session->commands, session->rule, &cmd)) != NULL) { - if (rep->prob > 0.5) { - if (rep->flag & (1U << 31)) { - /* Multi-flag */ - for (i = 0; i < 31; i ++) { - if ((1U << i) & rep->flag) { - fuzzy_insert_result (session, rep, cmd, i + 1); - } - } - } - else { - fuzzy_insert_result (session, rep, cmd, rep->flag); - } - } - else if (rep->value == 403) { - msg_info_task ( - "fuzzy check error for %d: forbidden", - rep->flag); - } - else if (rep->value != 0) { - msg_info_task ( - "fuzzy check error for %d: unknown error (%d)", - rep->flag, - rep->value); - } - - ret = return_finished; - } + switch (r) { + case 0: + ret = return_want_more; + break; + case 1: + ret = return_finished; + break; + default: + ret = return_error; + break; } } else if (what & EV_WRITE) { @@ -1565,25 +1617,11 @@ fuzzy_check_io_callback (gint fd, short what, void *arg) } else { /* Read something from network */ - rspamd_upstream_ok (session->server); - guint nreplied = 0; - - for (i = 0; i < session->commands->len; i++) { - io = g_ptr_array_index (session->commands, i); - - if (io->flags & FUZZY_CMD_FLAG_REPLIED) { - nreplied++; - } - } - - if (nreplied == session->commands->len) { - rspamd_session_remove_event (session->task->s, fuzzy_io_fin, session); - } - else { + if (!fuzzy_check_session_is_completed (session)) { /* Need to read more */ ev_base = event_get_base (&session->ev); event_del (&session->ev); - event_set (&session->ev, fd, EV_READ, + event_set (&session->ev, session->fd, EV_READ, fuzzy_check_io_callback, session); event_base_set (ev_base, &session->ev); event_add (&session->ev, NULL); @@ -1601,6 +1639,13 @@ fuzzy_check_timer_callback (gint fd, short what, void *arg) task = session->task; + /* We might be here because of other checks being slow */ + if (fuzzy_check_try_read (session) > 0) { + if (fuzzy_check_session_is_completed (session)) { + return; + } + } + if (session->retransmits >= fuzzy_module_ctx->retransmits) { msg_err_task ("got IO timeout with server %s, after %d retransmits", rspamd_upstream_name (session->server), -- cgit v1.2.3 From e4f16f2eaa5b32eef75076e86a3ccf0d79b3aa08 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 12:07:08 +0100 Subject: [Minor] Add some more tests --- test/lua/unit/expressions.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/lua/unit/expressions.lua b/test/lua/unit/expressions.lua index f2c4014b5..1e5d09cb5 100644 --- a/test/lua/unit/expressions.lua +++ b/test/lua/unit/expressions.lua @@ -93,7 +93,9 @@ context("Rspamd expressions", function() {'F && ((A + B + C + D) > 1)', 0}, {'(E) && ((B + B + B + B) >= 1)', 0}, {'!!C', 1}, - {'(B) & (D) & ((G) | (H) | (I) | (A))', 0} + {'(B) & (D) & ((G) | (H) | (I) | (A))', 0}, + {'A & C & (!D || !C || !E)', 1}, + {'A & C & !(D || C || E)', 0}, } for _,c in ipairs(cases) do local expr,err = rspamd_expression.create(c[1], @@ -102,8 +104,8 @@ context("Rspamd expressions", function() assert_not_nil(expr, "Cannot parse " .. c[1]) --print(expr) res = expr:process(atoms) - assert_equal(res, c[2], string.format("Processed expr '%s' returned '%d', expected: '%d'", - expr:to_string(), res, c[2])) + assert_equal(res, c[2], string.format("Processed expr '%s'{%s} returned '%d', expected: '%d'", + expr:to_string(), c[1], res, c[2])) end pool:destroy() -- cgit v1.2.3 From 32affb821c02201db7f30c5d8206439932e084be Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 12:07:18 +0100 Subject: [Fix] Fix redis timeout events handling --- src/libstat/backends/redis_backend.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index a2924d054..5f6eecdcf 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -705,17 +705,19 @@ rspamd_redis_timeout (gint fd, short what, gpointer d) task = rt->task; + REF_RETAIN (rt); msg_err_task_check ("connection to redis server %s timed out", rspamd_upstream_name (rt->selected)); rspamd_upstream_fail (rt->selected); - if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { + if (rt->conn_state == RSPAMD_REDIS_CONNECTED) { rspamd_session_remove_event (task->s, rspamd_redis_fin, rt); } rt->conn_state = RSPAMD_REDIS_TIMEDOUT; redisAsyncFree (rt->redis); rt->redis = NULL; + REF_RELEASE (rt); } /* Called when we have connected to the redis server and got stats */ @@ -1088,6 +1090,10 @@ rspamd_redis_init (struct rspamd_stat_ctx *ctx, static void rspamd_redis_runtime_dtor (struct redis_stat_runtime *rt) { + if (event_get_base (&rt->timeout_event)) { + event_del (&rt->timeout_event); + } + g_slice_free1 (sizeof (*rt), rt); } -- cgit v1.2.3 From a9adc939cca0c13bba0790748b573d225483ff1d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 12:18:07 +0100 Subject: [Fix] Another try to fix redis mess --- src/libstat/backends/redis_backend.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index 5f6eecdcf..cd18e8277 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -50,7 +50,8 @@ struct redis_stat_ctx { enum rspamd_redis_connection_state { RSPAMD_REDIS_DISCONNECTED = 0, RSPAMD_REDIS_CONNECTED, - RSPAMD_REDIS_TIMEDOUT + RSPAMD_REDIS_TIMEDOUT, + RSPAMD_REDIS_TERMINATED }; struct redis_stat_runtime { @@ -679,7 +680,7 @@ rspamd_redis_fin (gpointer data) struct redis_stat_runtime *rt = REDIS_RUNTIME (data); if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { - rt->conn_state = RSPAMD_REDIS_DISCONNECTED; + rt->conn_state = RSPAMD_REDIS_TERMINATED; event_del (&rt->timeout_event); REF_RELEASE (rt); } @@ -691,7 +692,7 @@ rspamd_redis_fin_learn (gpointer data) struct redis_stat_runtime *rt = REDIS_RUNTIME (data); if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { - rt->conn_state = RSPAMD_REDIS_DISCONNECTED; + rt->conn_state = RSPAMD_REDIS_TERMINATED; event_del (&rt->timeout_event); REF_RELEASE (rt); } @@ -710,7 +711,7 @@ rspamd_redis_timeout (gint fd, short what, gpointer d) rspamd_upstream_name (rt->selected)); rspamd_upstream_fail (rt->selected); - if (rt->conn_state == RSPAMD_REDIS_CONNECTED) { + if (rt->conn_state != RSPAMD_REDIS_TERMINATED) { rspamd_session_remove_event (task->s, rspamd_redis_fin, rt); } @@ -731,7 +732,7 @@ rspamd_redis_connected (redisAsyncContext *c, gpointer r, gpointer priv) task = rt->task; - if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { + if (rt->conn_state == RSPAMD_REDIS_TERMINATED) { /* Task has disappeared already */ REF_RELEASE (rt); return; @@ -799,7 +800,7 @@ rspamd_redis_processed (redisAsyncContext *c, gpointer r, gpointer priv) task = rt->task; - if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { + if (rt->conn_state == RSPAMD_REDIS_TERMINATED) { /* Task has disappeared already */ REF_RELEASE (rt); return; @@ -885,7 +886,7 @@ rspamd_redis_learned (redisAsyncContext *c, gpointer r, gpointer priv) task = rt->task; - if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { + if (rt->conn_state == RSPAMD_REDIS_TERMINATED) { /* Task has disappeared already */ REF_RELEASE (rt); return; @@ -904,7 +905,7 @@ rspamd_redis_learned (redisAsyncContext *c, gpointer r, gpointer priv) if (rt->conn_state == RSPAMD_REDIS_CONNECTED) { redisAsyncFree (rt->redis); - rt->conn_state = RSPAMD_REDIS_DISCONNECTED; + rt->conn_state = RSPAMD_REDIS_TERMINATED; } REF_RELEASE (rt); @@ -1238,7 +1239,7 @@ rspamd_redis_finalize_process (struct rspamd_task *task, gpointer runtime, redisAsyncFree (rt->redis); rt->redis = NULL; - rt->conn_state = RSPAMD_REDIS_DISCONNECTED; + rt->conn_state = RSPAMD_REDIS_TERMINATED; REF_RELEASE (rt); } @@ -1257,7 +1258,7 @@ rspamd_redis_learn_tokens (struct rspamd_task *task, GPtrArray *tokens, rspamd_token_t *tok; gint ret; - if (rt->conn_state != RSPAMD_REDIS_DISCONNECTED) { + if (rt->conn_state == RSPAMD_REDIS_CONNECTED) { /* We are likely in some bad state */ msg_err_task ("invalid state for function: %d", rt->conn_state); @@ -1377,7 +1378,7 @@ rspamd_redis_finalize_learn (struct rspamd_task *task, gpointer runtime, redisAsyncFree (rt->redis); rt->redis = NULL; - rt->conn_state = RSPAMD_REDIS_DISCONNECTED; + rt->conn_state = RSPAMD_REDIS_TERMINATED; REF_RELEASE (rt); } } @@ -1435,7 +1436,7 @@ rspamd_redis_get_stat (gpointer runtime, redisAsyncFree (rt->redis); rt->redis = NULL; - rt->conn_state = RSPAMD_REDIS_DISCONNECTED; + rt->conn_state = RSPAMD_REDIS_TERMINATED; } if (st->stat) { -- cgit v1.2.3 From cb4e67963b6e5a4c58c77e39c10517d0ba3af068 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 12:33:06 +0100 Subject: [Fix] Fix state on timeout --- src/libstat/backends/redis_backend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index cd18e8277..cb7f0f75b 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -715,7 +715,7 @@ rspamd_redis_timeout (gint fd, short what, gpointer d) rspamd_session_remove_event (task->s, rspamd_redis_fin, rt); } - rt->conn_state = RSPAMD_REDIS_TIMEDOUT; + rt->conn_state = RSPAMD_REDIS_TERMINATED; redisAsyncFree (rt->redis); rt->redis = NULL; REF_RELEASE (rt); -- cgit v1.2.3 From 8031433c33fb57fe274d3f14dba3a8671295882e Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 12:44:18 +0100 Subject: [Fix] Set terminated state before calling of async free --- src/libstat/backends/redis_backend.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index cb7f0f75b..275487a95 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -904,8 +904,8 @@ rspamd_redis_learned (redisAsyncContext *c, gpointer r, gpointer priv) } if (rt->conn_state == RSPAMD_REDIS_CONNECTED) { - redisAsyncFree (rt->redis); rt->conn_state = RSPAMD_REDIS_TERMINATED; + redisAsyncFree (rt->redis); } REF_RELEASE (rt); @@ -1236,11 +1236,10 @@ rspamd_redis_finalize_process (struct rspamd_task *task, gpointer runtime, if (rt->conn_state == RSPAMD_REDIS_CONNECTED) { event_del (&rt->timeout_event); - redisAsyncFree (rt->redis); - rt->redis = NULL; - rt->conn_state = RSPAMD_REDIS_TERMINATED; + redisAsyncFree (rt->redis); + rt->redis = NULL; REF_RELEASE (rt); } } @@ -1375,10 +1374,9 @@ rspamd_redis_finalize_learn (struct rspamd_task *task, gpointer runtime, if (rt->conn_state == RSPAMD_REDIS_CONNECTED) { event_del (&rt->timeout_event); + rt->conn_state = RSPAMD_REDIS_TERMINATED; redisAsyncFree (rt->redis); rt->redis = NULL; - - rt->conn_state = RSPAMD_REDIS_TERMINATED; REF_RELEASE (rt); } } @@ -1433,10 +1431,9 @@ rspamd_redis_get_stat (gpointer runtime, if (rt->redis) { event_del (&rt->timeout_event); + rt->conn_state = RSPAMD_REDIS_TERMINATED; redisAsyncFree (rt->redis); rt->redis = NULL; - - rt->conn_state = RSPAMD_REDIS_TERMINATED; } if (st->stat) { -- cgit v1.2.3 From 6b70e518c1f17e93fe77bddb3f866d3d9b615be1 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 13:08:56 +0100 Subject: [Fix] Another try to fix redis states --- src/libstat/backends/redis_backend.c | 40 +++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index 275487a95..4b11aca5a 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -50,6 +50,7 @@ struct redis_stat_ctx { enum rspamd_redis_connection_state { RSPAMD_REDIS_DISCONNECTED = 0, RSPAMD_REDIS_CONNECTED, + RSPAMD_REDIS_REQUEST_SENT, RSPAMD_REDIS_TIMEDOUT, RSPAMD_REDIS_TERMINATED }; @@ -679,7 +680,7 @@ rspamd_redis_fin (gpointer data) { struct redis_stat_runtime *rt = REDIS_RUNTIME (data); - if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { + if (rt->conn_state == RSPAMD_REDIS_TERMINATED) { rt->conn_state = RSPAMD_REDIS_TERMINATED; event_del (&rt->timeout_event); REF_RELEASE (rt); @@ -691,7 +692,7 @@ rspamd_redis_fin_learn (gpointer data) { struct redis_stat_runtime *rt = REDIS_RUNTIME (data); - if (rt->conn_state != RSPAMD_REDIS_CONNECTED) { + if (rt->conn_state == RSPAMD_REDIS_TERMINATED) { rt->conn_state = RSPAMD_REDIS_TERMINATED; event_del (&rt->timeout_event); REF_RELEASE (rt); @@ -711,7 +712,7 @@ rspamd_redis_timeout (gint fd, short what, gpointer d) rspamd_upstream_name (rt->selected)); rspamd_upstream_fail (rt->selected); - if (rt->conn_state != RSPAMD_REDIS_TERMINATED) { + if (rt->conn_state == RSPAMD_REDIS_REQUEST_SENT) { rspamd_session_remove_event (task->s, rspamd_redis_fin, rt); } @@ -866,6 +867,8 @@ rspamd_redis_processed (redisAsyncContext *c, gpointer r, gpointer priv) else { rspamd_session_remove_event (task->s, rspamd_redis_fin, rt); } + + rt->conn_state = RSPAMD_REDIS_CONNECTED; } else { msg_err_task ("error getting reply from redis server %s: %s", @@ -903,7 +906,7 @@ rspamd_redis_learned (redisAsyncContext *c, gpointer r, gpointer priv) rspamd_session_remove_event (task->s, rspamd_redis_fin_learn, rt); } - if (rt->conn_state == RSPAMD_REDIS_CONNECTED) { + if (rt->conn_state != RSPAMD_REDIS_TERMINATED) { rt->conn_state = RSPAMD_REDIS_TERMINATED; redisAsyncFree (rt->redis); } @@ -1152,20 +1155,22 @@ rspamd_redis_runtime (struct rspamd_task *task, g_assert (rt->redis != NULL); redisLibeventAttach (rt->redis, task->ev_base); - rspamd_session_add_event (task->s, rspamd_redis_fin, rt, - rspamd_redis_stat_quark ()); + rspamd_redis_maybe_auth (ctx, rt->redis); - /* Now check stats */ - event_set (&rt->timeout_event, -1, EV_TIMEOUT, rspamd_redis_timeout, rt); - event_base_set (task->ev_base, &rt->timeout_event); - double_to_tv (ctx->timeout, &tv); - event_add (&rt->timeout_event, &tv); - /* Cleared by timeout */ - REF_RETAIN (rt); + if (redisAsyncCommand (rt->redis, rspamd_redis_connected, rt, "HGET %s %s", + rt->redis_object_expanded, "learns") == REDIS_OK) { + rt->conn_state = RSPAMD_REDIS_REQUEST_SENT; - rspamd_redis_maybe_auth (ctx, rt->redis); - redisAsyncCommand (rt->redis, rspamd_redis_connected, rt, "HGET %s %s", - rt->redis_object_expanded, "learns"); + rspamd_session_add_event (task->s, rspamd_redis_fin, rt, + rspamd_redis_stat_quark ()); + + event_set (&rt->timeout_event, -1, EV_TIMEOUT, rspamd_redis_timeout, rt); + event_base_set (task->ev_base, &rt->timeout_event); + double_to_tv (ctx->timeout, &tv); + event_add (&rt->timeout_event, &tv); + /* Cleared by timeout */ + REF_RETAIN (rt); + } return rt; } @@ -1212,6 +1217,7 @@ rspamd_redis_process_tokens (struct rspamd_task *task, ret = redisAsyncFormattedCommand (rt->redis, rspamd_redis_processed, rt, query->str, query->len); if (ret == REDIS_OK) { + rt->conn_state = RSPAMD_REDIS_REQUEST_SENT; rspamd_session_add_event (task->s, rspamd_redis_fin, rt, rspamd_redis_stat_quark ()); /* Reset timeout */ @@ -1234,7 +1240,7 @@ rspamd_redis_finalize_process (struct rspamd_task *task, gpointer runtime, { struct redis_stat_runtime *rt = REDIS_RUNTIME (runtime); - if (rt->conn_state == RSPAMD_REDIS_CONNECTED) { + if (rt->conn_state != RSPAMD_REDIS_TERMINATED) { event_del (&rt->timeout_event); rt->conn_state = RSPAMD_REDIS_TERMINATED; -- cgit v1.2.3 From 2fb4f616ceb7d4121b3a1cbad591e1fa68d71475 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 13:47:18 +0100 Subject: [Fix] More and more fixes to redis states --- src/libstat/backends/redis_backend.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index 4b11aca5a..d4097fff3 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -712,12 +712,16 @@ rspamd_redis_timeout (gint fd, short what, gpointer d) rspamd_upstream_name (rt->selected)); rspamd_upstream_fail (rt->selected); - if (rt->conn_state == RSPAMD_REDIS_REQUEST_SENT) { + if (rt->conn_state == RSPAMD_REDIS_REQUEST_SENT && rt->task) { rspamd_session_remove_event (task->s, rspamd_redis_fin, rt); } rt->conn_state = RSPAMD_REDIS_TERMINATED; - redisAsyncFree (rt->redis); + + if (rt->redis) { + redisAsyncFree (rt->redis); + } + rt->redis = NULL; REF_RELEASE (rt); } @@ -1436,6 +1440,9 @@ rspamd_redis_get_stat (gpointer runtime, st = rt->ctx->stat_elt->ud; if (rt->redis) { + if (rt->conn_state == RSPAMD_REDIS_REQUEST_SENT && rt->task) { + rspamd_session_remove_event (rt->task->s, rspamd_redis_fin, rt); + } event_del (&rt->timeout_event); rt->conn_state = RSPAMD_REDIS_TERMINATED; redisAsyncFree (rt->redis); -- cgit v1.2.3 From 1a5e9eb0d746468340e29f291ea5488ff0946c97 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 14:54:19 +0100 Subject: [Fix] Fix descriptors leak on shmem detaching --- src/libutil/http.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libutil/http.c b/src/libutil/http.c index 7196c9221..42d91b5cb 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -1524,6 +1524,12 @@ rspamd_http_detach_shared (struct rspamd_http_message *msg) { rspamd_fstring_t *cpy_str; + if (msg->body_buf.c.shared.shm_fd != -1) { + close (msg->body_buf.c.shared.shm_fd); + } + + REF_RELEASE (msg->body_buf.c.shared.name); + cpy_str = rspamd_fstring_new_init (msg->body_buf.begin, msg->body_buf.len); rspamd_http_message_set_body_from_fstring_steal (msg, cpy_str); } -- cgit v1.2.3 From 253bad00ac438c3683f971b94c9a11bd76e06594 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 15:11:41 +0100 Subject: [Feature] Use one pass to remove newlines and store their positions --- src/libmime/message.c | 45 ++++++++++++++++++++++++++------------------- src/libmime/message.h | 1 + 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/libmime/message.c b/src/libmime/message.c index 978ab566f..db7cc6a53 100644 --- a/src/libmime/message.c +++ b/src/libmime/message.c @@ -670,23 +670,37 @@ rspamd_normalize_text_part (struct rspamd_task *task, #endif /* Strip newlines */ part->stripped_content = g_byte_array_sized_new (part->content->len); + part->newlines = g_ptr_array_sized_new (128); p = part->content->data; c = p; end = p + part->content->len; while (p < end) { - if (*p == '\r' || *p == '\n') { + p = memchr (c, '\n', end - c); + + if (p) { if (p > c) { g_byte_array_append (part->stripped_content, c, p - c); } + /* As it could cause reallocation, we initially store offsets */ + g_ptr_array_add (part->newlines, + GUINT_TO_POINTER (part->stripped_content->len)); + part->nlines ++; + p ++; + while (p < end && (*p == '\r' || *p == '\n')) { + if (*p == '\n') { + part->nlines ++; + } + p ++; } c = p; } else { - p ++; + p = end; + break; } } @@ -694,9 +708,18 @@ rspamd_normalize_text_part (struct rspamd_task *task, g_byte_array_append (part->stripped_content, c, p - c); } + /* Now convert offsets to real pointers for convenience */ + for (i = 0; i < part->newlines->len; i ++) { + guint off = GPOINTER_TO_UINT (g_ptr_array_index (part->newlines, i)); + g_ptr_array_index (part->newlines, i) = part->stripped_content->data + off; + } + rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t) free_byte_array_callback, part->stripped_content); + rspamd_mempool_add_destructor (task->task_pool, + (rspamd_mempool_destruct_t) rspamd_ptr_array_free_hard, + part->newlines); /* Ugly workaround */ part->normalized_words = rspamd_tokenize_text (part->content->data, @@ -844,8 +867,7 @@ process_text_part (struct rspamd_task *task, gboolean is_empty) { struct mime_text_part *text_part; - const gchar *cd, *p, *c; - guint remain; + const gchar *cd; /* Skip attachments */ #ifndef GMIME24 @@ -964,21 +986,6 @@ process_text_part (struct rspamd_task *task, detect_text_language (text_part); rspamd_normalize_text_part (task, text_part); - /* Calculate number of lines */ - p = text_part->content->data; - remain = text_part->content->len; - c = p; - - while (p != NULL && remain > 0) { - p = memchr (c, '\n', remain); - - if (p != NULL) { - text_part->nlines ++; - remain -= p - c + 1; - c = p + 1; - } - } - if (!IS_PART_HTML (text_part)) { rspamd_url_text_extract (task->task_pool, task, text_part, FALSE); } diff --git a/src/libmime/message.h b/src/libmime/message.h index 619154c6b..8017514f3 100644 --- a/src/libmime/message.h +++ b/src/libmime/message.h @@ -46,6 +46,7 @@ struct mime_text_part { GByteArray *orig; GByteArray *content; GByteArray *stripped_content; /**< no newlines or html tags */ + GPtrArray *newlines; /**< positions of newlines in text */ struct html_content *html; GList *urls_offset; /**< list of offsets of urls */ GMimeObject *parent; -- cgit v1.2.3 From 8a0160f2825fbec8a9b1c8361f15a372b221245d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 15:35:16 +0100 Subject: [Fix] One more try to fix redis --- src/libstat/backends/redis_backend.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index d4097fff3..8aed06994 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -680,7 +680,7 @@ rspamd_redis_fin (gpointer data) { struct redis_stat_runtime *rt = REDIS_RUNTIME (data); - if (rt->conn_state == RSPAMD_REDIS_TERMINATED) { + if (rt->conn_state != RSPAMD_REDIS_TERMINATED) { rt->conn_state = RSPAMD_REDIS_TERMINATED; event_del (&rt->timeout_event); REF_RELEASE (rt); @@ -692,7 +692,7 @@ rspamd_redis_fin_learn (gpointer data) { struct redis_stat_runtime *rt = REDIS_RUNTIME (data); - if (rt->conn_state == RSPAMD_REDIS_TERMINATED) { + if (rt->conn_state != RSPAMD_REDIS_TERMINATED) { rt->conn_state = RSPAMD_REDIS_TERMINATED; event_del (&rt->timeout_event); REF_RELEASE (rt); -- cgit v1.2.3 From b5e5f65db8fffaa291cc3953ee970161288954b6 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 16:16:12 +0100 Subject: [Fix] More fixes about shared memory in proxy --- src/libutil/http.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/libutil/http.c b/src/libutil/http.c index 42d91b5cb..30ec29b61 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -1526,6 +1526,7 @@ rspamd_http_detach_shared (struct rspamd_http_message *msg) if (msg->body_buf.c.shared.shm_fd != -1) { close (msg->body_buf.c.shared.shm_fd); + msg->body_buf.c.shared.shm_fd = -1; } REF_RELEASE (msg->body_buf.c.shared.name); @@ -2314,27 +2315,26 @@ rspamd_http_message_append_body (struct rspamd_http_message *msg, return FALSE; } - /* Unmap as we need another size of segment */ - if (msg->body_buf.str) { - munmap (msg->body_buf.str, msg->body_buf.len); - } - /* Check if we need to grow */ - if (st.st_size - msg->body_buf.len < len) { + if (st.st_size < msg->body_buf.len + len) { /* Need to grow */ newlen = rspamd_fstring_suggest_size (msg->body_buf.len, st.st_size, len); + /* Unmap as we need another size of segment */ + if (msg->body_buf.str != MAP_FAILED) { + munmap (msg->body_buf.str, st.st_size); + } if (ftruncate (storage->shared.shm_fd, newlen) == -1) { return FALSE; } - } - - msg->body_buf.str = mmap (NULL, msg->body_buf.len + len, - PROT_WRITE|PROT_READ, MAP_SHARED, storage->shared.shm_fd, 0); - if (msg->body_buf.str == MAP_FAILED) { - return FALSE; + msg->body_buf.str = mmap (NULL, newlen, + PROT_WRITE|PROT_READ, MAP_SHARED, + storage->shared.shm_fd, 0); + if (msg->body_buf.str == MAP_FAILED) { + return FALSE; + } } memcpy (msg->body_buf.str + msg->body_buf.len, data, len); @@ -2645,6 +2645,7 @@ rspamd_http_router_try_file (struct rspamd_http_connection_entry *entry, reply_msg->code = 200; if (!rspamd_http_message_set_body_from_fd (reply_msg, fd)) { + close (fd); return FALSE; } -- cgit v1.2.3 From 22ea8ed50625034fdac55f74f92f2c65b32b4145 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 18:18:18 +0100 Subject: [Fix] Strip '\r\n' properly --- src/libmime/message.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libmime/message.c b/src/libmime/message.c index db7cc6a53..f6d07ab09 100644 --- a/src/libmime/message.c +++ b/src/libmime/message.c @@ -679,6 +679,10 @@ rspamd_normalize_text_part (struct rspamd_task *task, p = memchr (c, '\n', end - c); if (p) { + if (*(p - 1) == '\r') { + p --; + } + if (p > c) { g_byte_array_append (part->stripped_content, c, p - c); } -- cgit v1.2.3 From 5e87d49bc798d06a698db4735129f514b88be503 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jun 2016 18:18:36 +0100 Subject: [Fix] Fix detection of URLs in text parts --- src/libmime/message.c | 2 +- src/libserver/url.c | 99 ++++++++++++++++++++++++++++++++++++++++++--------- src/libserver/url.h | 2 +- src/lua/lua_url.c | 2 +- 4 files changed, 86 insertions(+), 19 deletions(-) diff --git a/src/libmime/message.c b/src/libmime/message.c index f6d07ab09..da9ded5ee 100644 --- a/src/libmime/message.c +++ b/src/libmime/message.c @@ -1588,7 +1588,7 @@ rspamd_message_parse (struct rspamd_task *task) rh = cur->data; p = rh->decoded; len = strlen (p); - rspamd_url_find_multiple (task->task_pool, p, len, FALSE, + rspamd_url_find_multiple (task->task_pool, p, len, FALSE, NULL, rspamd_url_task_callback, task); } diff --git a/src/libserver/url.c b/src/libserver/url.c index 70a5f3c9b..068057cd7 100644 --- a/src/libserver/url.c +++ b/src/libserver/url.c @@ -54,6 +54,8 @@ typedef struct url_match_s { gsize m_len; const gchar *pattern; const gchar *prefix; + const gchar *newline_pos; + const gchar *prev_newline_pos; gboolean add_prefix; gchar st; } url_match_t; @@ -156,6 +158,8 @@ struct url_callback_data { rspamd_mempool_t *pool; gint len; gboolean is_html; + guint newline_idx; + GPtrArray *newlines; const gchar *start; const gchar *fin; const gchar *end; @@ -1744,14 +1748,21 @@ url_tld_start (struct url_callback_data *cb, /* Try to find the start of the url by finding any non-urlsafe character or whitespace/punctuation */ while (p >= cb->begin) { - if (!is_domain (*p) || g_ascii_isspace (*p) || is_url_start (*p)) { - if (!is_url_start (*p) && !g_ascii_isspace (*p)) { + if (!is_domain (*p) || g_ascii_isspace (*p) || is_url_start (*p) || + p == match->prev_newline_pos) { + if (!is_url_start (*p) && !g_ascii_isspace (*p) && + p != match->prev_newline_pos) { return FALSE; } - match->st = *p; + if (p != match->prev_newline_pos) { + match->st = *p; - p++; + p++; + } + else { + match->st = '\n'; + } if (!g_ascii_isalnum (*p)) { /* Urls cannot start with strange symbols */ @@ -1801,7 +1812,8 @@ url_tld_end (struct url_callback_data *cb, match->m_len = p - match->m_begin; return TRUE; } - else if (*p == '/' || *p == ':' || is_url_end (*p)) { + else if (*p == '/' || *p == ':' || is_url_end (*p) || + (match->st != '<' && p == match->newline_pos)) { /* Parse arguments, ports by normal way by url default function */ p = match->m_begin; /* Check common prefix */ @@ -1838,7 +1850,8 @@ url_web_start (struct url_callback_data *cb, (g_ascii_strncasecmp (pos, "www", 3) == 0 || g_ascii_strncasecmp (pos, "ftp", 3) == 0)) { - if (!is_url_start (*(pos - 1)) && !g_ascii_isspace (*(pos - 1))) { + if (!is_url_start (*(pos - 1)) && !g_ascii_isspace (*(pos - 1)) && + pos - 1 != match->prev_newline_pos) { return FALSE; } } @@ -1866,8 +1879,14 @@ url_web_end (struct url_callback_data *cb, url_match_t *match) { const gchar *last = NULL; + gint len = cb->end - pos; + + if (match->newline_pos && match->st != '<') { + /* We should also limit our match end to the newline */ + len = MIN (len, match->newline_pos - pos); + } - if (rspamd_web_parse (NULL, pos, cb->end - pos, &last, FALSE) != 0) { + if (rspamd_web_parse (NULL, pos, len, &last, FALSE) != 0) { return FALSE; } @@ -1921,10 +1940,16 @@ url_email_end (struct url_callback_data *cb, { const gchar *last = NULL; struct http_parser_url u; + gint len = cb->end - pos; + + if (match->newline_pos && match->st != '<') { + /* We should also limit our match end to the newline */ + len = MIN (len, match->newline_pos - pos); + } if (!match->prefix || match->prefix[0] == '\0') { /* We have mailto:// at the beginning */ - if (rspamd_mailto_parse (&u, pos, cb->end - pos, &last, FALSE) != 0) { + if (rspamd_mailto_parse (&u, pos, len, &last, FALSE) != 0) { return FALSE; } @@ -1992,12 +2017,13 @@ url_email_end (struct url_callback_data *cb, static gboolean rspamd_url_trie_is_match (struct url_matcher *matcher, const gchar *pos, - const gchar *end) + const gchar *end, const gchar *newline_pos) { if (matcher->flags & URL_FLAG_TLD_MATCH) { /* Immediately check pos for valid chars */ if (pos < end) { - if (!g_ascii_isspace (*pos) && *pos != '/' && *pos != '?' && + if (pos != newline_pos && !g_ascii_isspace (*pos) + && *pos != '/' && *pos != '?' && *pos != ':' && !is_url_end (*pos)) { if (*pos == '.') { /* We allow . at the end of the domain however */ @@ -2030,7 +2056,7 @@ rspamd_url_trie_callback (struct rspamd_multipattern *mp, { struct url_matcher *matcher; url_match_t m; - const gchar *pos; + const gchar *pos, *newline_pos = NULL; struct url_callback_data *cb = context; matcher = &g_array_index (url_scanner->matchers, struct url_matcher, @@ -2042,16 +2068,36 @@ rspamd_url_trie_callback (struct rspamd_multipattern *mp, } pos = text + match_pos; + memset (&m, 0, sizeof (m)); m.m_begin = text + match_start; m.m_len = match_pos - match_start; - if (!rspamd_url_trie_is_match (matcher, pos, cb->end)) { + if (cb->newlines && cb->newlines->len > 0) { + newline_pos = g_ptr_array_index (cb->newlines, cb->newline_idx); + + while (pos > newline_pos && cb->newline_idx < cb->newlines->len) { + cb->newline_idx ++; + newline_pos = g_ptr_array_index (cb->newlines, cb->newline_idx); + } + + if (pos > newline_pos) { + newline_pos = NULL; + } + + if (cb->newline_idx > 0) { + m.prev_newline_pos = g_ptr_array_index (cb->newlines, + cb->newline_idx - 1); + } + } + + if (!rspamd_url_trie_is_match (matcher, pos, cb->end, newline_pos)) { return 0; } m.pattern = matcher->pattern; m.prefix = matcher->prefix; m.add_prefix = FALSE; + m.newline_pos = newline_pos; pos = cb->begin + match_start; if (matcher->start (cb, pos, &m) && @@ -2127,7 +2173,7 @@ rspamd_url_trie_generic_callback_common (struct rspamd_multipattern *mp, struct rspamd_url *url; struct url_matcher *matcher; url_match_t m; - const gchar *pos; + const gchar *pos, *newline_pos = NULL; struct url_callback_data *cb = context; gint rc; rspamd_mempool_t *pool; @@ -2141,9 +2187,28 @@ rspamd_url_trie_generic_callback_common (struct rspamd_multipattern *mp, return 0; } + memset (&m, 0, sizeof (m)); pos = text + match_pos; - if (!rspamd_url_trie_is_match (matcher, pos, text + len)) { + /* Find the next newline after our pos */ + if (cb->newlines && cb->newlines->len > 0) { + newline_pos = g_ptr_array_index (cb->newlines, cb->newline_idx); + + while (pos > newline_pos && cb->newline_idx < cb->newlines->len) { + cb->newline_idx ++; + newline_pos = g_ptr_array_index (cb->newlines, cb->newline_idx); + } + + if (pos > newline_pos) { + newline_pos = NULL; + } + if (cb->newline_idx > 0) { + m.prev_newline_pos = g_ptr_array_index (cb->newlines, + cb->newline_idx - 1); + } + } + + if (!rspamd_url_trie_is_match (matcher, pos, text + len, newline_pos)) { return 0; } @@ -2153,6 +2218,7 @@ rspamd_url_trie_generic_callback_common (struct rspamd_multipattern *mp, m.add_prefix = FALSE; m.m_begin = text + match_start; m.m_len = match_pos - match_start; + m.newline_pos = newline_pos; if (matcher->start (cb, pos, &m) && matcher->end (cb, pos, &m)) { @@ -2310,7 +2376,7 @@ rspamd_url_text_extract (rspamd_mempool_t *pool, mcbd.part = part; rspamd_url_find_multiple (task->task_pool, part->stripped_content->data, - part->stripped_content->len, is_html, + part->stripped_content->len, is_html, part->newlines, rspamd_url_text_part_callback, &mcbd); /* Handle offsets of this part */ @@ -2323,7 +2389,7 @@ rspamd_url_text_extract (rspamd_mempool_t *pool, void rspamd_url_find_multiple (rspamd_mempool_t *pool, const gchar *in, - gsize inlen, gboolean is_html, + gsize inlen, gboolean is_html, GPtrArray *nlines, url_insert_function func, gpointer ud) { struct url_callback_data cb; @@ -2342,6 +2408,7 @@ rspamd_url_find_multiple (rspamd_mempool_t *pool, const gchar *in, cb.funcd = ud; cb.func = func; + cb.newlines = nlines; rspamd_multipattern_lookup (url_scanner->search_trie, in, inlen, diff --git a/src/libserver/url.h b/src/libserver/url.h index f42ab5dde..36fbb2c76 100644 --- a/src/libserver/url.h +++ b/src/libserver/url.h @@ -136,7 +136,7 @@ typedef void (*url_insert_function) (struct rspamd_url *url, * @param ud */ void rspamd_url_find_multiple (rspamd_mempool_t *pool, const gchar *in, - gsize inlen, gboolean is_html, + gsize inlen, gboolean is_html, GPtrArray *nlines, url_insert_function func, gpointer ud); /** * Search for a single url in text and call `func` for each url found diff --git a/src/lua/lua_url.c b/src/lua/lua_url.c index af49624b9..9c43494ad 100644 --- a/src/lua/lua_url.c +++ b/src/lua/lua_url.c @@ -537,7 +537,7 @@ lua_url_all (lua_State *L) if (text != NULL) { lua_newtable (L); - rspamd_url_find_multiple (pool, text, length, FALSE, + rspamd_url_find_multiple (pool, text, length, FALSE, NULL, lua_url_table_inserter, L); } -- cgit v1.2.3