You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pe...@apache.org on 2026/08/10 04:38:46 UTC

(celix) 16/35: Fix corrupted Ragel-generated state machine tables in SMTP address validator and update email format tests

This is an automated email from the ASF dual-hosted git repository.

PengZheng pushed a commit to branch feature/json-schema
in repository https://gitbox.apache.org/repos/asf/celix.git

commit 23d738f559fc81db0a83f7c26638c1a52290a10e
Author: PengZheng <ho...@gmail.com>
AuthorDate: Fri Aug 7 19:31:13 2026 +0800

    Fix corrupted Ragel-generated state machine tables in SMTP address validator and update email format tests
---
 .../gtest/src/test_format_check_extended.cpp       |  17 +-
 libs/jansson_ext/gtest/src/test_suite.cpp          |   3 -
 .../jansson_ext/src/celix_smtp_address_validator.c | 249 ++++++++++++---------
 3 files changed, 153 insertions(+), 116 deletions(-)

diff --git a/libs/jansson_ext/gtest/src/test_format_check_extended.cpp b/libs/jansson_ext/gtest/src/test_format_check_extended.cpp
index b330cedae..f3630d1d0 100644
--- a/libs/jansson_ext/gtest/src/test_format_check_extended.cpp
+++ b/libs/jansson_ext/gtest/src/test_format_check_extended.cpp
@@ -101,24 +101,25 @@ TEST(FormatCheckTest, Time) {
  */
 
 TEST(FormatCheckTest, Email) {
-    /* NOTE: The Ragel-generated SMTP address validator (celix_smtp_address_validator.c)
-     * returns false for EVERY input — verified empirically with a probe harness, and
-     * consistent with the JSON Schema Test Suite treating email.json as expected-fail.
-     * The OK return path of check_email is therefore unreachable until the validator
-     * is fixed (separate investigation comparing with pboettch/json-schema-validator).
-     * Non-ASCII input fails earlier in is_ascii and is covered here. */
+    /* Valid ASCII address */
+    EXPECT_EQ(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_email("joe.bloggs@example.com"));
+    EXPECT_EQ(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_email("a@b.com"));
+    /* Non-ASCII input fails the is_ascii pre-check */
+    EXPECT_NE(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_email("\xc3\xbc@example.com")); /* ü@example.com */
+    /* Clearly invalid inputs */
     EXPECT_NE(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_email("not-an-email"));
     EXPECT_NE(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_email("user@"));
     EXPECT_NE(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_email("@example.com"));
-    EXPECT_NE(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_email("\xc3\xbc@example.com")); /* ü@example.com — non-ASCII */
 }
 
 /* ── International Email (RFC 6531) ──────────────────────────────────────── */
 
 TEST(FormatCheckTest, IdnEmail) {
+    /* No is_ascii pre-check — UTF-8 addresses are passed to the SMTP validator */
+    EXPECT_EQ(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_idn_email("joe.bloggs@example.com"));
+    EXPECT_EQ(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_idn_email("\xc3\xbc@example.com"));
     EXPECT_NE(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_idn_email("not-an-email"));
     EXPECT_NE(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_idn_email("user@"));
-    EXPECT_NE(CELIX_JANSSON_SCHEMA_OK, celix_jansson_check_idn_email("\xc3\xbc@example.com"));
 }
 
 /* ── Hostname (RFC 3986 Appendix A labels) ──────────────────────────────── */
diff --git a/libs/jansson_ext/gtest/src/test_suite.cpp b/libs/jansson_ext/gtest/src/test_suite.cpp
index 185e4bca3..0da3dfcd9 100644
--- a/libs/jansson_ext/gtest/src/test_suite.cpp
+++ b/libs/jansson_ext/gtest/src/test_suite.cpp
@@ -44,9 +44,6 @@ static bool is_expected_fail(const std::string& fn) {
                                  "unicode",
                                  "content",
                                  "zeroTerminatedFloats",
-                                 /* Format checkers with known limitations */
-                                 "email",
-                                 "idn-email",
                                  "ref.json",
                                  NULL};
     for (const char** p = list; *p; p++)
diff --git a/libs/jansson_ext/src/celix_smtp_address_validator.c b/libs/jansson_ext/src/celix_smtp_address_validator.c
index 0b8ade938..48c23c7f6 100644
--- a/libs/jansson_ext/src/celix_smtp_address_validator.c
+++ b/libs/jansson_ext/src/celix_smtp_address_validator.c
@@ -19,7 +19,15 @@
 #include "celix_smtp_address_validator.h"
 
 /*
- * Ragel-generated state machine tables — verbatim from the original.
+ * Ragel-generated state machine tables.
+ *
+ * The _address_trans_keys and _address_cond_actions tables were corrupted in
+ * the C port of this machine (an 8-byte fragment inserted into trans_keys at
+ * offset 642, and the EOF actions for final states 196/197 changed from
+ * no-op to "result = false").  The values here are taken from the working
+ * C++ original (Gene Hightower's smtp-address-validator.cpp, MIT licensed,
+ * as vendored in https://github.com/pboettch/json-schema-validator); all
+ * other tables and the execution loop are unchanged from that source.
  *
  * Portions of this file were originally derived from Gene Hightower's
  * MIT-licensed smtp-address-validator.cpp, available at:
@@ -42,76 +50,76 @@ static const short _address_key_offsets[] = {
     1359, 1361, 1363, 1365, 1367, 1368, 1370, 1388, 0};
 
 static const signed char _address_trans_keys[] = {
-    -32,  -19,  -16, -12,  34,   45,   61,  63,   -62, -33,  -31, -17,  -15,  -13,  33,   39,   42,   43,  47,   57,
-    65,   90,   94,  126,  -128, -65,  -32, -19,  -16, -12,  33,  46,   61,   64,   -62,  -33,  -31,  -17, -15,  -13,
-    35,   39,   42,  43,   45,   57,   63,  90,   94,  126,  -96, -65,  -128, -65,  -128, -97,  -112, -65, -128, -65,
-    -128, -113, -32, -19,  -16,  -12,  33,  45,   61,  63,   -62, -33,  -31,  -17,  -15,  -13,  35,   39,  42,   43,
-    47,   57,   65,  90,   94,   126,  -32, -19,  -16, -12,  91,  -62,  -33,  -31,  -17,  -15,  -13,  48,  57,   65,
-    90,   97,   122, -128, -65,  -96,  -65, -128, -65, -128, -97, -112, -65,  -128, -65,  -128, -113, -32, -19,  -16,
-    -12,  45,   -62, -33,  -31,  -17,  -15, -13,  48,  57,   65,  90,   97,   122,  -32,  -19,  -16,  -12, -62,  -33,
-    -31,  -17,  -15, -13,  48,   57,   65,  90,   97,  122,  45,  48,   49,   50,   73,   51,   57,   65,  90,   97,
-    122,  45,   48,  57,   65,   90,   97,  122,  45,  58,   48,  57,   65,   90,   97,   122,  33,   90,  94,   126,
-    93,   45,   46,  58,   48,   57,   65,  90,   97,  122,  48,  49,   50,   51,   57,   46,   48,   49,  50,   51,
-    57,   46,   48,  49,   50,   51,   57,  93,   48,  57,   93,  48,   57,   53,   93,   48,   52,   54,  57,   93,
-    48,   53,   46,  48,   57,   46,   48,  57,   46,  53,   48,  52,   54,   57,   46,   48,   53,   46,  48,   57,
-    46,   48,   57,  46,   53,   48,   52,  54,   57,  46,   48,  53,   45,   46,   58,   48,   57,   65,  90,   97,
-    122,  45,   46,  58,   48,   57,   65,  90,   97,  122,  45,  46,   53,   58,   48,   52,   54,   57,  65,   90,
-    97,   122,  45,  46,   58,   48,   53,  54,   57,  65,   90,  97,   122,  45,   58,   80,   48,   57,  65,   90,
-    97,   122,  45,  58,   118,  48,   57,  65,   90,  97,   122, 45,   54,   58,   48,   57,   65,   90,  97,   122,
-    45,   58,   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,  48,   57,  65,   70,  97,   102,  58,   48,   57,   65,   70,  97,   102,
-    58,   48,   57,  65,   70,   97,   102, 58,   58,  48,   57,  65,   70,   97,   102,  58,   48,   57,  65,   70,
-    97,   102,  58,  48,   57,   65,   70,  97,   102, 58,   48,  57,   65,   70,   97,   102,  58,   58,  48,   57,
-    65,   70,   97,  102,  58,   48,   57,  65,   70,  97,   102, 58,   48,   57,   65,   70,   97,   102, 58,   48,
-    57,   65,   70,  97,   102,  58,   58,  48,   57,  65,   70,  97,   102,  58,   48,   57,   65,   70,  97,   102,
-    58,   48,   57,  65,   70,   97,   102, 58,   48,  57,   65,  70,   97,   102,  58,   58,   48,   57,  65,   70,
-    97,   102,  58,  48,   57,   65,   70,  97,   102, 58,   48,  57,   65,   70,   97,   102,  58,   48,  57,   65,
-    70,   97,   102, 58,   58,   48,   57,  65,   70,  97,   102, 58,   48,   57,   65,   70,   97,   102, 58,   48,
-    57,   65,   70,  97,   102,  58,   48,  57,   65,  70,   97,  102,  58,   48,   49,   50,   58,   51,  57,   65,
-    70,   97,   102, 46,   58,   48,   57,  65,   70,  97,   102, 58,   48,   57,   65,   70,   97,   102, 58,   48,
-    57,   65,   70,  97,   102,  58,   48,  57,   65,  70,   97,  102,  93,   48,   57,   65,   70,   97,  102,  93,
-    48,   57,   65,  70,   97,   102,  93,  48,   57,  65,   70,  97,   102,  46,   58,   48,   57,   65,  70,   97,
-    102,  46,   58,  48,   57,   65,   70,  97,   102, 46,   58,  48,   57,   65,   70,   97,   102,  46,  53,   58,
-    48,   52,   54,  57,   65,   70,   97,  102,  46,  58,   48,  53,   54,   57,   65,   70,   97,   102, 46,   58,
-    48,   57,   65,  70,   97,   102,  46,  58,   48,  57,   65,  70,   97,   102,  93,   48,   57,   65,  70,   97,
-    102,  58,   93,  48,   57,   65,   70,  97,   102, 58,   93,  48,   57,   65,   70,   97,   102,  58,  93,   48,
-    57,   65,   70,  97,   102,  58,   93,  48,   57,  65,   70,  97,   102,  58,   93,   48,   57,   65,  70,   97,
-    102,  58,   93,  48,   57,   65,   70,  97,   102, 58,   93,  48,   57,   65,   70,   97,   102,  58,  93,   48,
-    57,   65,   70,  97,   102,  58,   93,  48,   57,  65,   70,  97,   102,  58,   93,   48,   57,   65,  70,   97,
-    102,  58,   93,  48,   57,   65,   70,  97,   102, 58,   93,  48,   57,   65,   70,   97,   102,  58,  93,   48,
-    57,   65,   70,  97,   102,  58,   93,  48,   57,  65,   70,  97,   102,  58,   93,   48,   57,   65,  70,   97,
-    102,  58,   93,  48,   57,   65,   70,  97,   102, 58,   93,  48,   57,   65,   70,   97,   102,  58,  93,   48,
-    57,   65,   70,  97,   102,  58,   93,  48,   57,  65,   70,  97,   102,  58,   93,   48,   57,   65,  70,   97,
-    102,  58,   93,  58,   48,   57,   65,  70,   97,  102,  48,  49,   50,   93,   51,   57,   65,   70,  97,   102,
-    46,   58,   93,  48,   57,   65,   70,  97,   102, 58,   93,  48,   57,   65,   70,   97,   102,  58,  93,   48,
-    57,   65,   70,  97,   102,  58,   93,  48,   49,  50,   51,  57,   65,   70,   97,   102,  46,   58,  93,   48,
-    57,   65,   70,  97,   102,  58,   93,  48,   57,  65,   70,  97,   102,  58,   93,   48,   57,   65,  70,   97,
-    102,  58,   93,  48,   49,   50,   51,  57,   65,  70,   97,  102,  46,   58,   93,   48,   57,   65,  70,   97,
-    102,  58,   93,  48,   57,   65,   70,  97,   102, 58,   93,  48,   57,   65,   70,   97,   102,  58,  93,   48,
-    49,   50,   51,  57,   65,   70,   97,  102,  46,  58,   93,  48,   57,   65,   70,   97,   102,  58,  93,   48,
-    57,   65,   70,  97,   102,  58,   93,  48,   57,  65,   70,  97,   102,  58,   93,   48,   49,   50,  51,   57,
-    65,   70,   97,  102,  46,   58,   93,  48,   57,  65,   70,  97,   102,  46,   58,   93,   48,   57,  65,   70,
-    97,   102,  46,  58,   93,   48,   57,  65,   70,  97,   102, 46,   58,   93,   48,   57,   65,   70,  97,   102,
-    46,   53,   58,  93,   48,   52,   54,  57,   65,  70,   97,  102,  46,   58,   93,   48,   53,   54,  57,   65,
-    70,   97,   102, 46,   58,   93,   48,  57,   65,  70,   97,  102,  46,   58,   93,   48,   57,   65,  70,   97,
-    102,  46,   58,  93,   48,   57,   65,  70,   97,  102,  46,  58,   93,   48,   57,   65,   70,   97,  102,  46,
-    58,   93,   48,  57,   65,   70,   97,  102,  46,  53,   58,  93,   48,   52,   54,   57,   65,   70,  97,   102,
-    46,   58,   93,  48,   53,   54,   57,  65,   70,  97,   102, 46,   58,   93,   48,   57,   65,   70,  97,   102,
-    46,   58,   93,  48,   57,   65,   70,  97,   102, 58,   93,  48,   57,   65,   70,   97,   102,  46,  58,   93,
-    48,   57,   65,  70,   97,   102,  46,  58,   93,  48,   57,  65,   70,   97,   102,  46,   58,   93,  48,   57,
-    65,   70,   97,  102,  46,   53,   58,  93,   48,  52,   54,  57,   65,   70,   97,   102,  46,   58,  93,   48,
-    53,   54,   57,  65,   70,   97,   102, 46,   58,  93,   48,  57,   65,   70,   97,   102,  46,   58,  93,   48,
-    57,   65,   70,  97,   102,  58,   93,  48,   57,  65,   70,  97,   102,  46,   58,   93,   48,   57,  65,   70,
-    97,   102,  46,  58,   93,   48,   57,  65,   70,  97,   102, 46,   58,   93,   48,   57,   65,   70,  97,   102,
-    46,   53,   58,  93,   48,   52,   54,  57,   65,  70,   97,  102,  46,   58,   93,   48,   53,   54,  57,   65,
-    70,   97,   102, 46,   58,   93,   48,  57,   65,  70,   97,  102,  46,   58,   93,   48,   57,   65,  70,   97,
-    102,  58,   93,  48,   57,   65,   70,  97,   102, 46,   58,  93,   48,   57,   65,   70,   97,   102, 46,   58,
-    93,   48,   57,  65,   70,   97,   102, 46,   58,  93,   48,  57,   65,   70,   97,   102,  46,   53,  58,   93,
-    48,   52,   54,  57,   65,   70,   97,  102,  46,  58,   93,  48,   53,   54,   57,   65,   70,   97,  102,  46,
-    58,   93,   48,  57,   65,   70,   97,  102,  46,  58,   93,  48,   57,   65,   70,   97,   102,  58,  93,   48,
-    57,   65,   70,  97,   102,  58,   93,  -32,  -19, -16,  -12, 34,   92,   -62,  -33,  -31,  -17,  -15, -13,  32,
-    126,  -128, -65, -96,  -65,  -128, -65, -128, -97, -112, -65, -128, -65,  -128, -113, 64,   32,   126, -32,  -19,
-    -16,  -12,  45,  46,   -62,  -33,  -31, -17,  -15, -13,  48,  57,   65,   90,   97,   122,  0};
+     -32,  -19,  -16,  -12,   34,   45,   61,   63,  -62,  -33,  -31,  -17,  -15,  -13,   33,   39,   42,   43,   47,   57,
+      65,   90,   94,  126, -128,  -65,  -32,  -19,  -16,  -12,   33,   46,   61,   64,  -62,  -33,  -31,  -17,  -15,  -13,
+      35,   39,   42,   43,   45,   57,   63,   90,   94,  126,  -96,  -65, -128,  -65, -128,  -97, -112,  -65, -128,  -65,
+    -128, -113,  -32,  -19,  -16,  -12,   33,   45,   61,   63,  -62,  -33,  -31,  -17,  -15,  -13,   35,   39,   42,   43,
+      47,   57,   65,   90,   94,  126,  -32,  -19,  -16,  -12,   91,  -62,  -33,  -31,  -17,  -15,  -13,   48,   57,   65,
+      90,   97,  122, -128,  -65,  -96,  -65, -128,  -65, -128,  -97, -112,  -65, -128,  -65, -128, -113,  -32,  -19,  -16,
+     -12,   45,  -62,  -33,  -31,  -17,  -15,  -13,   48,   57,   65,   90,   97,  122,  -32,  -19,  -16,  -12,  -62,  -33,
+     -31,  -17,  -15,  -13,   48,   57,   65,   90,   97,  122,   45,   48,   49,   50,   73,   51,   57,   65,   90,   97,
+     122,   45,   48,   57,   65,   90,   97,  122,   45,   58,   48,   57,   65,   90,   97,  122,   33,   90,   94,  126,
+      93,   45,   46,   58,   48,   57,   65,   90,   97,  122,   48,   49,   50,   51,   57,   46,   48,   49,   50,   51,
+      57,   46,   48,   49,   50,   51,   57,   93,   48,   57,   93,   48,   57,   53,   93,   48,   52,   54,   57,   93,
+      48,   53,   46,   48,   57,   46,   48,   57,   46,   53,   48,   52,   54,   57,   46,   48,   53,   46,   48,   57,
+      46,   48,   57,   46,   53,   48,   52,   54,   57,   46,   48,   53,   45,   46,   58,   48,   57,   65,   90,   97,
+     122,   45,   46,   58,   48,   57,   65,   90,   97,  122,   45,   46,   53,   58,   48,   52,   54,   57,   65,   90,
+      97,  122,   45,   46,   58,   48,   53,   54,   57,   65,   90,   97,  122,   45,   58,   80,   48,   57,   65,   90,
+      97,  122,   45,   58,  118,   48,   57,   65,   90,   97,  122,   45,   54,   58,   48,   57,   65,   90,   97,  122,
+      45,   58,   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,   48,   57,   65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,
+      58,   48,   57,   65,   70,   97,  102,   58,   58,   48,   57,   65,   70,   97,  102,   58,   48,   57,   65,   70,
+      97,  102,   58,   48,   57,   65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,   58,   58,   48,   57,
+      65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,   58,   48,
+      57,   65,   70,   97,  102,   58,   58,   48,   57,   65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,
+      58,   48,   57,   65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,   58,   58,   48,   57,   65,   70,
+      97,  102,   58,   48,   57,   65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,   58,   48,   57,   65,
+      70,   97,  102,   58,   58,   48,   57,   65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,   58,   48,
+      57,   65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,   58,   48,   49,   50,   58,   51,   57,   65,
+      70,   97,  102,   46,   58,   48,   57,   65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,   58,   48,
+      57,   65,   70,   97,  102,   58,   48,   57,   65,   70,   97,  102,   93,   48,   57,   65,   70,   97,  102,   93,
+      48,   57,   65,   70,   97,  102,   93,   48,   57,   65,   70,   97,  102,   46,   58,   48,   57,   65,   70,   97,
+     102,   46,   58,   48,   57,   65,   70,   97,  102,   46,   58,   48,   57,   65,   70,   97,  102,   46,   53,   58,
+      48,   52,   54,   57,   65,   70,   97,  102,   46,   58,   48,   53,   54,   57,   65,   70,   97,  102,   46,   58,
+      48,   57,   65,   70,   97,  102,   46,   58,   48,   57,   65,   70,   97,  102,   93,   48,   57,   65,   70,   97,
+     102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,
+      57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,
+     102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,
+      57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,
+     102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,
+      57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,
+     102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,
+      57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   58,   48,   57,   65,   70,
+      97,  102,   48,   49,   50,   93,   51,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,
+     102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,
+      49,   50,   51,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,
+      57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   49,   50,   51,   57,
+      65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,
+     102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   49,   50,   51,   57,   65,   70,   97,  102,
+      46,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,
+      57,   65,   70,   97,  102,   58,   93,   48,   49,   50,   51,   57,   65,   70,   97,  102,   46,   58,   93,   48,
+      57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,
+      70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,   53,   58,   93,   48,   52,   54,   57,
+      65,   70,   97,  102,   46,   58,   93,   48,   53,   54,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,
+      65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,
+      97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,
+      46,   53,   58,   93,   48,   52,   54,   57,   65,   70,   97,  102,   46,   58,   93,   48,   53,   54,   57,   65,
+      70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,
+     102,   58,   93,   48,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,   58,
+      93,   48,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,   53,   58,   93,
+      48,   52,   54,   57,   65,   70,   97,  102,   46,   58,   93,   48,   53,   54,   57,   65,   70,   97,  102,   46,
+      58,   93,   48,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,
+      57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,
+      70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,   53,   58,   93,   48,   52,   54,   57,
+      65,   70,   97,  102,   46,   58,   93,   48,   53,   54,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,
+      65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,
+     102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,   46,
+      58,   93,   48,   57,   65,   70,   97,  102,   46,   53,   58,   93,   48,   52,   54,   57,   65,   70,   97,  102,
+      46,   58,   93,   48,   53,   54,   57,   65,   70,   97,  102,   46,   58,   93,   48,   57,   65,   70,   97,  102,
+      46,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,   48,   57,   65,   70,   97,  102,   58,   93,  -32,
+     -19,  -16,  -12,   34,   92,  -62,  -33,  -31,  -17,  -15,  -13,   32,  126, -128,  -65,  -96,  -65, -128,  -65, -128,
+     -97, -112,  -65, -128,  -65, -128, -113,   64,   32,  126,  -32,  -19,  -16,  -12,   45,   46,  -62,  -33,  -31,  -17,
+     -15,  -13,   48,   57,   65,   90,   97,  122,    0};
 
 static const signed char _address_single_lengths[] = {
     0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 8, 5, 0, 0, 0, 0, 0, 0, 0, 5, 4, 5, 1, 2, 0, 1, 3, 3, 1, 3, 1, 3, 1, 1,
@@ -201,40 +209,71 @@ static const short _address_cond_targs[] = {
     180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 0};
 
 static const signed char _address_cond_actions[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3,
-    0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
-    3, 1, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3,
-    0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 3, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0,
-    3, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 1, 0, 3, 1, 0, 3, 0, 1, 0, 0, 3, 1, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 3,
-    0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
-    0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0,
-    0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3,
-    0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0,
-    3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0,
-    0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 3, 1, 0, 0, 0, 3, 1, 0, 0, 0, 3, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0,
-    0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 1,
-    0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 3, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0,
-    0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 3, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 3, 0,
-    0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 3, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0,
-    0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0,
-    1, 0, 0, 0, 3, 0, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 3, 0,
-    0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,
-    0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0,
-    0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0,
-    0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0,
-    3, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0,
-    1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0,
-    1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0,
-    0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3,
-    0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 3,
-    0, 0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
-    3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0};
+       0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    3,    0,    3,    0,
+       0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    3,    0,    3,    0,    3,
+       0,    3,    0,    3,    0,    3,    0,    3,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    0,    0,    0,    1,    1,    1,    3,    1,    3,    0,
+       3,    0,    3,    0,    3,    0,    3,    0,    3,    0,    3,    0,    0,    0,    0,    0,    0,    0,    0,    1,
+       1,    1,    3,    0,    0,    0,    0,    0,    0,    0,    1,    1,    1,    3,    0,    0,    0,    0,    0,    0,
+       0,    0,    3,    0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    3,    0,    0,    3,    1,    3,    0,
+       0,    0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    3,    0,    0,    0,    0,    3,    0,    3,
+       0,    0,    0,    0,    3,    1,    0,    3,    1,    0,    3,    0,    1,    0,    0,    3,    1,    0,    3,    0,
+       0,    3,    0,    0,    3,    0,    0,    0,    0,    3,    0,    0,    3,    0,    0,    3,    0,    0,    3,    0,
+       0,    0,    0,    3,    0,    0,    3,    0,    0,    0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    0,
+       3,    0,    0,    0,    0,    0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    0,    0,    3,    0,    0,
+       0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    0,    3,    0,
+       0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    0,    0,    0,    0,    3,    0,    1,    0,    0,    0,
+       3,    0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    3,    0,    0,    0,    0,    3,    0,    0,
+       0,    0,    3,    0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    3,    0,    0,    0,    0,    3,
+       0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    3,    0,    0,    0,
+       0,    3,    0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    3,    0,
+       0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,
+       3,    0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    0,    0,    0,    3,    0,    0,    0,    0,
+       3,    0,    3,    0,    0,    0,    0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    3,    0,    0,    0,
+       0,    3,    0,    0,    0,    0,    3,    0,    3,    0,    0,    0,    3,    1,    0,    0,    0,    3,    1,    0,
+       0,    0,    3,    1,    0,    0,    0,    3,    0,    0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    3,
+       0,    0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    0,
+       3,    0,    0,    0,    0,    0,    3,    0,    0,    0,    0,    0,    3,    1,    0,    0,    0,    3,    0,    1,
+       0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    3,    0,
+       0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,
+       3,    0,    1,    3,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,
+       0,    1,    0,    0,    0,    3,    0,    1,    3,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,
+       1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    3,    0,    0,    0,    3,    0,    1,
+       0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    3,    0,
+       0,    0,    0,    3,    0,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,
+       1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    3,    0,    0,    0,    0,    0,    0,
+       3,    0,    0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,
+       0,    1,    3,    0,    0,    0,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    1,    0,
+       0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    3,    0,    0,    0,    0,    0,    0,    3,    0,
+       0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,    1,
+       3,    0,    0,    0,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,
+       0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    0,    1,
+       0,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,
+       0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,
+       3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    0,    1,    0,    0,    0,    0,    3,    0,    0,    1,
+       0,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,
+       1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,
+       0,    1,    0,    0,    0,    3,    0,    0,    0,    1,    0,    0,    0,    0,    3,    0,    0,    1,    0,    0,
+       0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    1,    0,
+       0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,
+       0,    0,    0,    3,    0,    0,    0,    1,    0,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    0,
+       3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,
+       3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,
+       0,    3,    0,    0,    0,    1,    0,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    0,    3,    0,
+       0,    1,    0,    0,    0,    3,    0,    0,    1,    0,    0,    0,    3,    0,    1,    0,    0,    0,    3,    0,
+       1,    3,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    3,    0,    3,    0,    3,    0,    3,    0,
+       3,    0,    3,    0,    3,    0,    3,    0,    3,    0,    3,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       1,    1,    1,    3,    3,    0,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+       3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+       3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+       3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+       3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+       3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+       3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+       3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+       3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+       3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+       3,    0,    0,    0};
 
 static const short _address_eof_trans[] = {
     1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104,