From 22d6f39e7fb270d0c011bae820d2f8adc8b19061 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Sun, 10 Apr 2016 09:33:54 +0800 Subject: [PATCH] http2 update integration https://github.com/warmcat/libwebsockets/issues/489 This 1) fixes the vhost changes on master 2) works around the ah pool changes 3) fixes some other build problems that appeared 4) hacks out physical flow control for internal streams 5) updates the advertised protocol to h2 needed by, eg, chrome 51 That gets it able to serve small (<4K, ie, one packet) files over http2 Signed-off-by: Andy Green --- README.build.md | 6 + lib/daemonize.c | 13 +- lib/handshake.c | 6 +- lib/hpack.c | 33 +- lib/http2.c | 13 +- lib/lextable-strings.h | 10 +- lib/lextable.h | 799 +++++++++++++++--------------- lib/lws-plat-unix.c | 4 +- lib/output.c | 2 +- lib/pollfd.c | 5 + lib/private-libwebsockets.h | 4 +- lib/server.c | 66 +-- lib/ssl-http2.c | 8 +- lib/ssl-server.c | 2 +- lib/ssl.c | 8 + lwsws/main.c | 3 + plugins/protocol_dumb_increment.c | 1 + plugins/protocol_lws_mirror.c | 1 + plugins/protocol_lws_status.c | 1 + 19 files changed, 517 insertions(+), 468 deletions(-) diff --git a/README.build.md b/README.build.md index b188a59f..7c1d4b0a 100644 --- a/README.build.md +++ b/README.build.md @@ -86,6 +86,12 @@ Building on Unix: $ LD_LIBRARY_PATH=/usr/local/ssl/lib libwebsockets-test-server --ssl ``` + To get it to build on latest openssl (2016-04-10) it needed this approach + + ```bash + cmake .. -DLWS_WITH_HTTP2=1 -DLWS_OPENSSL_INCLUDE_DIRS=/usr/local/include/openssl -DLWS_OPENSSL_LIBRARIES="/usr/local/lib64/libssl.so;/usr/local/lib64/libcrypto.so" + ``` + **NOTE5**: To build with debug info and _DEBUG for lower priority debug messages compiled in, use diff --git a/lib/daemonize.c b/lib/daemonize.c index 79139fc4..5fbd60a7 100644 --- a/lib/daemonize.c +++ b/lib/daemonize.c @@ -143,19 +143,8 @@ lws_daemonize(const char *_lock_path) } /* If we got a good PID, then we can exit the parent process. */ - if (pid_daemon > 0) { - - /* - * Wait for confirmation signal from the child via - * SIGCHILD / USR1, or for two seconds to elapse - * (SIGALRM). pause() should not return. - */ - alarm(2); - - pause(); - /* should not be reachable */ + if (pid_daemon > 0) exit(0); - } /* At this point we are executing as the child process */ parent = getppid(); diff --git a/lib/handshake.c b/lib/handshake.c index d2dd4c76..584b34b5 100644 --- a/lib/handshake.c +++ b/lib/handshake.c @@ -66,7 +66,7 @@ lws_read(struct lws *wsi, unsigned char *buf, size_t len) int body_chunk_len; size_t n; - lwsl_debug("%s: incoming len %d\n", __func__, (int)len); + lwsl_debug("%s: incoming len %d state %d\n", __func__, (int)len, wsi->state); switch (wsi->state) { #ifdef LWS_USE_HTTP2 @@ -87,8 +87,10 @@ lws_read(struct lws *wsi, unsigned char *buf, size_t len) /* account for what we're using in rxflow buffer */ if (wsi->rxflow_buffer) wsi->rxflow_pos++; - if (lws_http2_parser(wsi, buf[n++])) + if (lws_http2_parser(wsi, buf[n++])) { + lwsl_debug("%s: http2_parser bailed\n", __func__); goto bail; + } } break; #endif diff --git a/lib/hpack.c b/lib/hpack.c index 2c5b1d94..a205cbc1 100644 --- a/lib/hpack.c +++ b/lib/hpack.c @@ -199,11 +199,15 @@ static int lws_frag_start(struct lws *wsi, int hdr_token_idx) { struct allocated_headers * ah = wsi->u.http2.http.ah; - if (!hdr_token_idx) + if (!hdr_token_idx) { + lwsl_err("%s: zero hdr_token_idx\n", __func__); return 1; + } - if (ah->nfrag >= ARRAY_SIZE(ah->frag_index)) + if (ah->nfrag >= ARRAY_SIZE(ah->frag_index)) { + lwsl_err("%s: frag index %d too big\n", __func__, ah->nfrag); return 1; + } ah->frags[ah->nfrag].offset = ah->pos; ah->frags[ah->nfrag].len = 0; @@ -355,6 +359,8 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) unsigned char c1; int n; + lwsl_debug(" state %d\n", wsi->u.http2.hpack); + switch (wsi->u.http2.hpack) { case HPKS_OPT_PADDING: wsi->u.http2.padding = c; @@ -388,6 +394,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) if (c & 0x80) { /* indexed header field only */ /* just a possibly-extended integer */ wsi->u.http2.hpack_type = HPKT_INDEXED_HDR_7; + lwsl_debug("HKPS_TYPE setting header_index %d\n", c & 0x7f); wsi->u.http2.header_index = c & 0x7f; if ((c & 0x7f) == 0x7f) { wsi->u.http2.hpack_len = c & 0x7f; @@ -395,6 +402,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) wsi->u.http2.hpack = HPKS_IDX_EXT; break; } + lwsl_debug("HKPS_TYPE: %d\n", c & 0x7f); if (lws_write_indexed_hdr(wsi, c & 0x7f)) return 1; /* stay at same state */ @@ -406,6 +414,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) * H + possibly-extended value length * literal value */ + lwsl_debug("HKPS_TYPE 2 setting header_index %d\n", 0); wsi->u.http2.header_index = 0; if (c == 0x40) { /* literal name */ wsi->u.http2.hpack_type = HPKT_LITERAL_HDR_VALUE_INCR; @@ -421,6 +430,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) wsi->u.http2.hpack = HPKS_IDX_EXT; break; } + lwsl_debug("HKPS_TYPE 3 setting header_index %d\n", c & 0x3f); wsi->u.http2.header_index = c & 0x3f; wsi->u.http2.value = 1; wsi->u.http2.hpack = HPKS_HLEN; @@ -439,6 +449,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) wsi->u.http2.value = 0; break; } + //lwsl_debug("indexed\n"); /* indexed name */ wsi->u.http2.hpack_type = HPKT_INDEXED_HDR_4_VALUE; wsi->u.http2.header_index = 0; @@ -448,6 +459,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) wsi->u.http2.hpack = HPKS_IDX_EXT; break; } + //lwsl_err("HKPS_TYPE 5 setting header_index %d\n", c & 0xf); wsi->u.http2.header_index = c & 0xf; wsi->u.http2.value = 1; wsi->u.http2.hpack = HPKS_HLEN; @@ -475,11 +487,14 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) if (!(c & 0x80)) { switch (wsi->u.http2.hpack_type) { case HPKT_INDEXED_HDR_7: + //lwsl_err("HKPS_IDX_EXT hdr idx %d\n", wsi->u.http2.hpack_len); if (lws_write_indexed_hdr(wsi, wsi->u.http2.hpack_len)) return 1; wsi->u.http2.hpack = HPKS_TYPE; break; default: + // lwsl_err("HKPS_IDX_EXT setting header_index %d\n", + // wsi->u.http2.hpack_len); wsi->u.http2.header_index = wsi->u.http2.hpack_len; wsi->u.http2.value = 1; wsi->u.http2.hpack = HPKS_HLEN; @@ -495,10 +510,13 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) if (wsi->u.http2.hpack_len < 0x7f) { pre_data: if (wsi->u.http2.value) { + if (wsi->u.http2.header_index) if (lws_frag_start(wsi, lws_token_from_index(wsi, wsi->u.http2.header_index, - NULL, NULL))) + NULL, NULL))) { + // lwsl_notice("%s: hlen failed\n", __func__); return 1; + } } else wsi->u.hdr.parser_state = WSI_TOKEN_NAME_PART; wsi->u.http2.hpack = HPKS_DATA; @@ -539,8 +557,9 @@ pre_data: c1 = c; } if (wsi->u.http2.value) { /* value */ - if (lws_frag_append(wsi, c1)) - return 1; + if (wsi->u.http2.header_index) + if (lws_frag_append(wsi, c1)) + return 1; } else { /* name */ if (lws_parse(wsi, c1)) return 1; @@ -566,7 +585,7 @@ pre_data: if (wsi->u.http2.value) { if (lws_frag_end(wsi)) return 1; - + // lwsl_err("data\n"); lws_dump_header(wsi, lws_token_from_index( wsi, wsi->u.http2.header_index, NULL, NULL)); @@ -576,7 +595,7 @@ pre_data: else wsi->u.http2.hpack = HPKS_TYPE; } else { /* name */ - if (wsi->u.hdr.parser_state < WSI_TOKEN_COUNT) + //if (wsi->u.hdr.parser_state < WSI_TOKEN_COUNT) wsi->u.http2.value = 1; wsi->u.http2.hpack = HPKS_HLEN; diff --git a/lib/http2.c b/lib/http2.c index 224668bd..317b8dda 100644 --- a/lib/http2.c +++ b/lib/http2.c @@ -242,8 +242,15 @@ lws_http2_parser(struct lws *wsi, unsigned char c) case LWS_HTTP2_FRAME_TYPE_CONTINUATION: case LWS_HTTP2_FRAME_TYPE_HEADERS: lwsl_info(" %02X\n", c); - if (lws_hpack_interpret(wsi->u.http2.stream_wsi, c)) + if (!wsi->u.http2.stream_wsi->u.hdr.ah) + if (lws_header_table_attach(wsi->u.http2.stream_wsi, 0)) { + lwsl_err("%s: Failed to get ah\n", __func__); + return 1; + } + if (lws_hpack_interpret(wsi->u.http2.stream_wsi, c)) { + lwsl_notice("%s: lws_hpack_interpret failed\n", __func__); return 1; + } break; case LWS_HTTP2_FRAME_TYPE_GOAWAY: if (wsi->u.http2.count >= 5 && wsi->u.http2.count <= 8) { @@ -376,9 +383,11 @@ lws_http2_parser(struct lws *wsi, unsigned char c) lwsl_info("LWS_HTTP2_FRAME_TYPE_HEADERS: stream_id = %d\n", wsi->u.http2.stream_id); if (!wsi->u.http2.stream_id) return 1; - if (!wsi->u.http2.stream_wsi) + if (!wsi->u.http2.stream_wsi) { wsi->u.http2.stream_wsi = lws_create_server_child_wsi(wsi->vhost, wsi, wsi->u.http2.stream_id); + wsi->u.http2.stream_wsi->http2_substream = 1; + } /* END_STREAM means after servicing this, close the stream */ wsi->u.http2.END_STREAM = !!(wsi->u.http2.flags & LWS_HTTP2_FLAG_END_STREAM); diff --git a/lib/lextable-strings.h b/lib/lextable-strings.h index 6a5a267e..24940803 100644 --- a/lib/lextable-strings.h +++ b/lib/lextable-strings.h @@ -40,11 +40,11 @@ static const char *set[] = { "sec-websocket-version:", "sec-websocket-origin:", - ":authority:", - ":method:", - ":path:", - ":scheme:", - ":status:", + ":authority", + ":method", + ":path", + ":scheme", + ":status", "accept-charset:", "accept-ranges:", diff --git a/lib/lextable.h b/lib/lextable.h index 23e526d6..520cfa38 100644 --- a/lib/lextable.h +++ b/lib/lextable.h @@ -11,14 +11,14 @@ 0x64 /* 'd' */, 0x10, 0x02 /* (to 0x022E state 265) */, 0x72 /* 'r' */, 0x19, 0x02 /* (to 0x023A state 270) */, 0x3A /* ':' */, 0x4A, 0x02 /* (to 0x026E state 299) */, - 0x65 /* 'e' */, 0xDB, 0x02 /* (to 0x0302 state 414) */, - 0x66 /* 'f' */, 0xF7, 0x02 /* (to 0x0321 state 430) */, - 0x6C /* 'l' */, 0x19, 0x03 /* (to 0x0346 state 463) */, - 0x6D /* 'm' */, 0x3C, 0x03 /* (to 0x036C state 489) */, - 0x74 /* 't' */, 0xAB, 0x03 /* (to 0x03DE state 583) */, - 0x76 /* 'v' */, 0xC6, 0x03 /* (to 0x03FC state 611) */, - 0x77 /* 'w' */, 0xD3, 0x03 /* (to 0x040C state 619) */, - 0x78 /* 'x' */, 0xFA, 0x03 /* (to 0x0436 state 655) */, + 0x65 /* 'e' */, 0xD6, 0x02 /* (to 0x02FD state 409) */, + 0x66 /* 'f' */, 0xF2, 0x02 /* (to 0x031C state 425) */, + 0x6C /* 'l' */, 0x14, 0x03 /* (to 0x0341 state 458) */, + 0x6D /* 'm' */, 0x37, 0x03 /* (to 0x0367 state 484) */, + 0x74 /* 't' */, 0xA6, 0x03 /* (to 0x03D9 state 578) */, + 0x76 /* 'v' */, 0xC1, 0x03 /* (to 0x03F7 state 606) */, + 0x77 /* 'w' */, 0xCE, 0x03 /* (to 0x0407 state 614) */, + 0x78 /* 'x' */, 0xF5, 0x03 /* (to 0x0431 state 650) */, 0x08, /* fail */ /* pos 0040: 1 */ 0xE5 /* 'e' -> */, /* pos 0041: 2 */ 0xF4 /* 't' -> */, @@ -26,8 +26,8 @@ /* pos 0043: 4 */ 0x00, 0x00 /* - terminal marker 0 - */, /* pos 0045: 5 */ 0x6F /* 'o' */, 0x0D, 0x00 /* (to 0x0052 state 6) */, 0x72 /* 'r' */, 0x8C, 0x01 /* (to 0x01D4 state 211) */, - 0x61 /* 'a' */, 0xD3, 0x03 /* (to 0x041E state 636) */, - 0x75 /* 'u' */, 0xD5, 0x03 /* (to 0x0423 state 640) */, + 0x61 /* 'a' */, 0xCE, 0x03 /* (to 0x0419 state 631) */, + 0x75 /* 'u' */, 0xD0, 0x03 /* (to 0x041E state 635) */, 0x08, /* fail */ /* pos 0052: 6 */ 0xF3 /* 's' -> */, /* pos 0053: 7 */ 0xF4 /* 't' -> */, @@ -68,8 +68,8 @@ /* pos 008d: 32 */ 0xBA /* ':' -> */, /* pos 008e: 33 */ 0x00, 0x04 /* - terminal marker 4 - */, /* pos 0090: 34 */ 0x70 /* 'p' */, 0x0A, 0x00 /* (to 0x009A state 35) */, - 0x73 /* 's' */, 0x5E, 0x03 /* (to 0x03F1 state 601) */, - 0x72 /* 'r' */, 0x96, 0x03 /* (to 0x042C state 647) */, + 0x73 /* 's' */, 0x59, 0x03 /* (to 0x03EC state 596) */, + 0x72 /* 'r' */, 0x91, 0x03 /* (to 0x0427 state 642) */, 0x08, /* fail */ /* pos 009a: 35 */ 0xE7 /* 'g' -> */, /* pos 009b: 36 */ 0xF2 /* 'r' -> */, @@ -85,11 +85,11 @@ /* pos 00a6: 46 */ 0xBA /* ':' -> */, /* pos 00a7: 47 */ 0x00, 0x06 /* - terminal marker 6 - */, /* pos 00a9: 48 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x00B0 state 49) */, - 0x74 /* 't' */, 0x18, 0x03 /* (to 0x03C4 state 558) */, + 0x74 /* 't' */, 0x13, 0x03 /* (to 0x03BF state 553) */, 0x08, /* fail */ /* pos 00b0: 49 */ 0x63 /* 'c' */, 0x0A, 0x00 /* (to 0x00BA state 50) */, - 0x72 /* 'r' */, 0x01, 0x03 /* (to 0x03B4 state 544) */, - 0x74 /* 't' */, 0x04, 0x03 /* (to 0x03BA state 549) */, + 0x72 /* 'r' */, 0xFC, 0x02 /* (to 0x03AF state 539) */, + 0x74 /* 't' */, 0xFF, 0x02 /* (to 0x03B5 state 544) */, 0x08, /* fail */ /* pos 00ba: 50 */ 0xAD /* '-' -> */, /* pos 00bb: 51 */ 0xF7 /* 'w' -> */, @@ -170,7 +170,7 @@ /* pos 0128: 113 */ 0xB1 /* '1' -> */, /* pos 0129: 114 */ 0xAE /* '.' -> */, /* pos 012a: 115 */ 0x31 /* '1' */, 0x07, 0x00 /* (to 0x0131 state 116) */, - 0x30 /* '0' */, 0x14, 0x03 /* (to 0x0441 state 665) */, + 0x30 /* '0' */, 0x0F, 0x03 /* (to 0x043C state 660) */, 0x08, /* fail */ /* pos 0131: 116 */ 0xA0 /* ' ' -> */, /* pos 0132: 117 */ 0x00, 0x0F /* - terminal marker 15 - */, @@ -187,8 +187,8 @@ /* pos 013e: 128 */ 0x00, 0x10 /* - terminal marker 16 - */, /* pos 0140: 129 */ 0x63 /* 'c' */, 0x0D, 0x00 /* (to 0x014D state 130) */, 0x75 /* 'u' */, 0xAC, 0x00 /* (to 0x01EF state 230) */, - 0x67 /* 'g' */, 0x82, 0x01 /* (to 0x02C8 state 363) */, - 0x6C /* 'l' */, 0x83, 0x01 /* (to 0x02CC state 366) */, + 0x67 /* 'g' */, 0x7D, 0x01 /* (to 0x02C3 state 358) */, + 0x6C /* 'l' */, 0x7E, 0x01 /* (to 0x02C7 state 361) */, 0x08, /* fail */ /* pos 014d: 130 */ 0xE3 /* 'c' -> */, /* pos 014e: 131 */ 0xE5 /* 'e' -> */, @@ -211,7 +211,7 @@ /* pos 0168: 144 */ 0xEC /* 'l' -> */, /* pos 0169: 145 */ 0xAD /* '-' -> */, /* pos 016a: 146 */ 0x72 /* 'r' */, 0x07, 0x00 /* (to 0x0171 state 147) */, - 0x61 /* 'a' */, 0x4D, 0x01 /* (to 0x02BA state 350) */, + 0x61 /* 'a' */, 0x48, 0x01 /* (to 0x02B5 state 345) */, 0x08, /* fail */ /* pos 0171: 147 */ 0xE5 /* 'e' -> */, /* pos 0172: 148 */ 0xF1 /* 'q' -> */, @@ -233,11 +233,11 @@ /* pos 0183: 164 */ 0xAD /* '-' -> */, /* pos 0184: 165 */ 0x6D /* 'm' */, 0x0D, 0x00 /* (to 0x0191 state 166) */, 0x6E /* 'n' */, 0x20, 0x00 /* (to 0x01A7 state 181) */, - 0x72 /* 'r' */, 0xA3, 0x01 /* (to 0x032D state 440) */, - 0x75 /* 'u' */, 0xA7, 0x01 /* (to 0x0334 state 446) */, + 0x72 /* 'r' */, 0x9E, 0x01 /* (to 0x0328 state 435) */, + 0x75 /* 'u' */, 0xA2, 0x01 /* (to 0x032F state 441) */, 0x08, /* fail */ /* pos 0191: 166 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0198 state 167) */, - 0x61 /* 'a' */, 0x93, 0x01 /* (to 0x0327 state 435) */, + 0x61 /* 'a' */, 0x8E, 0x01 /* (to 0x0322 state 430) */, 0x08, /* fail */ /* pos 0198: 167 */ 0xE4 /* 'd' -> */, /* pos 0199: 168 */ 0xE9 /* 'i' -> */, @@ -266,8 +266,8 @@ /* pos 01b1: 191 */ 0x00, 0x14 /* - terminal marker 20 - */, /* pos 01b3: 192 */ 0x65 /* 'e' */, 0x0D, 0x00 /* (to 0x01C0 state 193) */, 0x6C /* 'l' */, 0x14, 0x00 /* (to 0x01CA state 202) */, - 0x63 /* 'c' */, 0xF0, 0x00 /* (to 0x02A9 state 335) */, - 0x72 /* 'r' */, 0xF6, 0x00 /* (to 0x02B2 state 343) */, + 0x63 /* 'c' */, 0xEB, 0x00 /* (to 0x02A4 state 330) */, + 0x72 /* 'r' */, 0xF1, 0x00 /* (to 0x02AD state 338) */, 0x08, /* fail */ /* pos 01c0: 193 */ 0xEE /* 'n' -> */, /* pos 01c1: 194 */ 0xE3 /* 'c' -> */, @@ -288,7 +288,7 @@ /* pos 01d1: 209 */ 0xBA /* ':' -> */, /* pos 01d2: 210 */ 0x00, 0x16 /* - terminal marker 22 - */, /* pos 01d4: 211 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x01DB state 212) */, - 0x6F /* 'o' */, 0xA3, 0x01 /* (to 0x037A state 502) */, + 0x6F /* 'o' */, 0x9E, 0x01 /* (to 0x0375 state 497) */, 0x08, /* fail */ /* pos 01db: 212 */ 0xE7 /* 'g' -> */, /* pos 01dc: 213 */ 0xED /* 'm' -> */, @@ -332,13 +332,13 @@ /* pos 0206: 251 */ 0xAD /* '-' -> */, /* pos 0207: 252 */ 0x6C /* 'l' */, 0x10, 0x00 /* (to 0x0217 state 253) */, 0x74 /* 't' */, 0x1E, 0x00 /* (to 0x0228 state 260) */, - 0x64 /* 'd' */, 0xC5, 0x00 /* (to 0x02D2 state 371) */, - 0x65 /* 'e' */, 0xCF, 0x00 /* (to 0x02DF state 383) */, - 0x72 /* 'r' */, 0xE8, 0x00 /* (to 0x02FB state 408) */, + 0x64 /* 'd' */, 0xC0, 0x00 /* (to 0x02CD state 366) */, + 0x65 /* 'e' */, 0xCA, 0x00 /* (to 0x02DA state 378) */, + 0x72 /* 'r' */, 0xE3, 0x00 /* (to 0x02F6 state 403) */, 0x08, /* fail */ /* pos 0217: 253 */ 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x0221 state 254) */, - 0x61 /* 'a' */, 0xCF, 0x00 /* (to 0x02E9 state 392) */, - 0x6F /* 'o' */, 0xD5, 0x00 /* (to 0x02F2 state 400) */, + 0x61 /* 'a' */, 0xCA, 0x00 /* (to 0x02E4 state 387) */, + 0x6F /* 'o' */, 0xD0, 0x00 /* (to 0x02ED state 395) */, 0x08, /* fail */ /* pos 0221: 254 */ 0xEE /* 'n' -> */, /* pos 0222: 255 */ 0xE7 /* 'g' -> */, @@ -352,7 +352,7 @@ /* pos 022b: 263 */ 0xBA /* ':' -> */, /* pos 022c: 264 */ 0x00, 0x1C /* - terminal marker 28 - */, /* pos 022e: 265 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0235 state 266) */, - 0x65 /* 'e' */, 0xF5, 0x01 /* (to 0x0426 state 642) */, + 0x65 /* 'e' */, 0xF0, 0x01 /* (to 0x0421 state 637) */, 0x08, /* fail */ /* pos 0235: 266 */ 0xF4 /* 't' -> */, /* pos 0236: 267 */ 0xE5 /* 'e' -> */, @@ -367,10 +367,10 @@ /* pos 0244: 274 */ 0xBA /* ':' -> */, /* pos 0245: 275 */ 0x00, 0x1E /* - terminal marker 30 - */, /* pos 0247: 276 */ 0x66 /* 'f' */, 0x07, 0x00 /* (to 0x024E state 277) */, - 0x74 /* 't' */, 0x5F, 0x01 /* (to 0x03A9 state 534) */, + 0x74 /* 't' */, 0x5A, 0x01 /* (to 0x03A4 state 529) */, 0x08, /* fail */ /* pos 024e: 277 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0255 state 278) */, - 0x72 /* 'r' */, 0x52, 0x01 /* (to 0x03A3 state 529) */, + 0x72 /* 'r' */, 0x4D, 0x01 /* (to 0x039E state 524) */, 0x08, /* fail */ /* pos 0255: 278 */ 0xF2 /* 'r' -> */, /* pos 0256: 279 */ 0xE5 /* 'e' -> */, @@ -394,9 +394,9 @@ /* pos 026b: 297 */ 0xBA /* ':' -> */, /* pos 026c: 298 */ 0x00, 0x22 /* - terminal marker 34 - */, /* pos 026e: 299 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x027B state 300) */, - 0x6D /* 'm' */, 0x15, 0x00 /* (to 0x0286 state 310) */, - 0x70 /* 'p' */, 0x1A, 0x00 /* (to 0x028E state 317) */, - 0x73 /* 's' */, 0x1D, 0x00 /* (to 0x0294 state 322) */, + 0x6D /* 'm' */, 0x14, 0x00 /* (to 0x0285 state 309) */, + 0x70 /* 'p' */, 0x18, 0x00 /* (to 0x028C state 315) */, + 0x73 /* 's' */, 0x1A, 0x00 /* (to 0x0291 state 319) */, 0x08, /* fail */ /* pos 027b: 300 */ 0xF5 /* 'u' -> */, /* pos 027c: 301 */ 0xF4 /* 't' -> */, @@ -406,378 +406,373 @@ /* pos 0280: 305 */ 0xE9 /* 'i' -> */, /* pos 0281: 306 */ 0xF4 /* 't' -> */, /* pos 0282: 307 */ 0xF9 /* 'y' -> */, -/* pos 0283: 308 */ 0xBA /* ':' -> */, -/* pos 0284: 309 */ 0x00, 0x23 /* - terminal marker 35 - */, -/* pos 0286: 310 */ 0xE5 /* 'e' -> */, -/* pos 0287: 311 */ 0xF4 /* 't' -> */, -/* pos 0288: 312 */ 0xE8 /* 'h' -> */, -/* pos 0289: 313 */ 0xEF /* 'o' -> */, -/* pos 028a: 314 */ 0xE4 /* 'd' -> */, -/* pos 028b: 315 */ 0xBA /* ':' -> */, -/* pos 028c: 316 */ 0x00, 0x24 /* - terminal marker 36 - */, -/* pos 028e: 317 */ 0xE1 /* 'a' -> */, -/* pos 028f: 318 */ 0xF4 /* 't' -> */, -/* pos 0290: 319 */ 0xE8 /* 'h' -> */, -/* pos 0291: 320 */ 0xBA /* ':' -> */, -/* pos 0292: 321 */ 0x00, 0x25 /* - terminal marker 37 - */, -/* pos 0294: 322 */ 0x63 /* 'c' */, 0x07, 0x00 /* (to 0x029B state 323) */, - 0x74 /* 't' */, 0x0B, 0x00 /* (to 0x02A2 state 329) */, - 0x08, /* fail */ -/* pos 029b: 323 */ 0xE8 /* 'h' -> */, -/* pos 029c: 324 */ 0xE5 /* 'e' -> */, -/* pos 029d: 325 */ 0xED /* 'm' -> */, -/* pos 029e: 326 */ 0xE5 /* 'e' -> */, -/* pos 029f: 327 */ 0xBA /* ':' -> */, -/* pos 02a0: 328 */ 0x00, 0x26 /* - terminal marker 38 - */, -/* pos 02a2: 329 */ 0xE1 /* 'a' -> */, -/* pos 02a3: 330 */ 0xF4 /* 't' -> */, -/* pos 02a4: 331 */ 0xF5 /* 'u' -> */, -/* pos 02a5: 332 */ 0xF3 /* 's' -> */, -/* pos 02a6: 333 */ 0xBA /* ':' -> */, -/* pos 02a7: 334 */ 0x00, 0x27 /* - terminal marker 39 - */, -/* pos 02a9: 335 */ 0xE8 /* 'h' -> */, -/* pos 02aa: 336 */ 0xE1 /* 'a' -> */, -/* pos 02ab: 337 */ 0xF2 /* 'r' -> */, -/* pos 02ac: 338 */ 0xF3 /* 's' -> */, -/* pos 02ad: 339 */ 0xE5 /* 'e' -> */, -/* pos 02ae: 340 */ 0xF4 /* 't' -> */, -/* pos 02af: 341 */ 0xBA /* ':' -> */, -/* pos 02b0: 342 */ 0x00, 0x28 /* - terminal marker 40 - */, -/* pos 02b2: 343 */ 0xE1 /* 'a' -> */, -/* pos 02b3: 344 */ 0xEE /* 'n' -> */, -/* pos 02b4: 345 */ 0xE7 /* 'g' -> */, -/* pos 02b5: 346 */ 0xE5 /* 'e' -> */, -/* pos 02b6: 347 */ 0xF3 /* 's' -> */, -/* pos 02b7: 348 */ 0xBA /* ':' -> */, -/* pos 02b8: 349 */ 0x00, 0x29 /* - terminal marker 41 - */, -/* pos 02ba: 350 */ 0xEC /* 'l' -> */, -/* pos 02bb: 351 */ 0xEC /* 'l' -> */, -/* pos 02bc: 352 */ 0xEF /* 'o' -> */, -/* pos 02bd: 353 */ 0xF7 /* 'w' -> */, -/* pos 02be: 354 */ 0xAD /* '-' -> */, -/* pos 02bf: 355 */ 0xEF /* 'o' -> */, -/* pos 02c0: 356 */ 0xF2 /* 'r' -> */, -/* pos 02c1: 357 */ 0xE9 /* 'i' -> */, -/* pos 02c2: 358 */ 0xE7 /* 'g' -> */, -/* pos 02c3: 359 */ 0xE9 /* 'i' -> */, -/* pos 02c4: 360 */ 0xEE /* 'n' -> */, -/* pos 02c5: 361 */ 0xBA /* ':' -> */, -/* pos 02c6: 362 */ 0x00, 0x2A /* - terminal marker 42 - */, -/* pos 02c8: 363 */ 0xE5 /* 'e' -> */, -/* pos 02c9: 364 */ 0xBA /* ':' -> */, -/* pos 02ca: 365 */ 0x00, 0x2B /* - terminal marker 43 - */, -/* pos 02cc: 366 */ 0xEC /* 'l' -> */, -/* pos 02cd: 367 */ 0xEF /* 'o' -> */, -/* pos 02ce: 368 */ 0xF7 /* 'w' -> */, -/* pos 02cf: 369 */ 0xBA /* ':' -> */, -/* pos 02d0: 370 */ 0x00, 0x2C /* - terminal marker 44 - */, +/* pos 0283: 308 */ 0x00, 0x23 /* - terminal marker 35 - */, +/* pos 0285: 309 */ 0xE5 /* 'e' -> */, +/* pos 0286: 310 */ 0xF4 /* 't' -> */, +/* pos 0287: 311 */ 0xE8 /* 'h' -> */, +/* pos 0288: 312 */ 0xEF /* 'o' -> */, +/* pos 0289: 313 */ 0xE4 /* 'd' -> */, +/* pos 028a: 314 */ 0x00, 0x24 /* - terminal marker 36 - */, +/* pos 028c: 315 */ 0xE1 /* 'a' -> */, +/* pos 028d: 316 */ 0xF4 /* 't' -> */, +/* pos 028e: 317 */ 0xE8 /* 'h' -> */, +/* pos 028f: 318 */ 0x00, 0x25 /* - terminal marker 37 - */, +/* pos 0291: 319 */ 0x63 /* 'c' */, 0x07, 0x00 /* (to 0x0298 state 320) */, + 0x74 /* 't' */, 0x0A, 0x00 /* (to 0x029E state 325) */, + 0x08, /* fail */ +/* pos 0298: 320 */ 0xE8 /* 'h' -> */, +/* pos 0299: 321 */ 0xE5 /* 'e' -> */, +/* pos 029a: 322 */ 0xED /* 'm' -> */, +/* pos 029b: 323 */ 0xE5 /* 'e' -> */, +/* pos 029c: 324 */ 0x00, 0x26 /* - terminal marker 38 - */, +/* pos 029e: 325 */ 0xE1 /* 'a' -> */, +/* pos 029f: 326 */ 0xF4 /* 't' -> */, +/* pos 02a0: 327 */ 0xF5 /* 'u' -> */, +/* pos 02a1: 328 */ 0xF3 /* 's' -> */, +/* pos 02a2: 329 */ 0x00, 0x27 /* - terminal marker 39 - */, +/* pos 02a4: 330 */ 0xE8 /* 'h' -> */, +/* pos 02a5: 331 */ 0xE1 /* 'a' -> */, +/* pos 02a6: 332 */ 0xF2 /* 'r' -> */, +/* pos 02a7: 333 */ 0xF3 /* 's' -> */, +/* pos 02a8: 334 */ 0xE5 /* 'e' -> */, +/* pos 02a9: 335 */ 0xF4 /* 't' -> */, +/* pos 02aa: 336 */ 0xBA /* ':' -> */, +/* pos 02ab: 337 */ 0x00, 0x28 /* - terminal marker 40 - */, +/* pos 02ad: 338 */ 0xE1 /* 'a' -> */, +/* pos 02ae: 339 */ 0xEE /* 'n' -> */, +/* pos 02af: 340 */ 0xE7 /* 'g' -> */, +/* pos 02b0: 341 */ 0xE5 /* 'e' -> */, +/* pos 02b1: 342 */ 0xF3 /* 's' -> */, +/* pos 02b2: 343 */ 0xBA /* ':' -> */, +/* pos 02b3: 344 */ 0x00, 0x29 /* - terminal marker 41 - */, +/* pos 02b5: 345 */ 0xEC /* 'l' -> */, +/* pos 02b6: 346 */ 0xEC /* 'l' -> */, +/* pos 02b7: 347 */ 0xEF /* 'o' -> */, +/* pos 02b8: 348 */ 0xF7 /* 'w' -> */, +/* pos 02b9: 349 */ 0xAD /* '-' -> */, +/* pos 02ba: 350 */ 0xEF /* 'o' -> */, +/* pos 02bb: 351 */ 0xF2 /* 'r' -> */, +/* pos 02bc: 352 */ 0xE9 /* 'i' -> */, +/* pos 02bd: 353 */ 0xE7 /* 'g' -> */, +/* pos 02be: 354 */ 0xE9 /* 'i' -> */, +/* pos 02bf: 355 */ 0xEE /* 'n' -> */, +/* pos 02c0: 356 */ 0xBA /* ':' -> */, +/* pos 02c1: 357 */ 0x00, 0x2A /* - terminal marker 42 - */, +/* pos 02c3: 358 */ 0xE5 /* 'e' -> */, +/* pos 02c4: 359 */ 0xBA /* ':' -> */, +/* pos 02c5: 360 */ 0x00, 0x2B /* - terminal marker 43 - */, +/* pos 02c7: 361 */ 0xEC /* 'l' -> */, +/* pos 02c8: 362 */ 0xEF /* 'o' -> */, +/* pos 02c9: 363 */ 0xF7 /* 'w' -> */, +/* pos 02ca: 364 */ 0xBA /* ':' -> */, +/* pos 02cb: 365 */ 0x00, 0x2C /* - terminal marker 44 - */, +/* pos 02cd: 366 */ 0xE9 /* 'i' -> */, +/* pos 02ce: 367 */ 0xF3 /* 's' -> */, +/* pos 02cf: 368 */ 0xF0 /* 'p' -> */, +/* pos 02d0: 369 */ 0xEF /* 'o' -> */, +/* pos 02d1: 370 */ 0xF3 /* 's' -> */, /* pos 02d2: 371 */ 0xE9 /* 'i' -> */, -/* pos 02d3: 372 */ 0xF3 /* 's' -> */, -/* pos 02d4: 373 */ 0xF0 /* 'p' -> */, +/* pos 02d3: 372 */ 0xF4 /* 't' -> */, +/* pos 02d4: 373 */ 0xE9 /* 'i' -> */, /* pos 02d5: 374 */ 0xEF /* 'o' -> */, -/* pos 02d6: 375 */ 0xF3 /* 's' -> */, -/* pos 02d7: 376 */ 0xE9 /* 'i' -> */, -/* pos 02d8: 377 */ 0xF4 /* 't' -> */, -/* pos 02d9: 378 */ 0xE9 /* 'i' -> */, -/* pos 02da: 379 */ 0xEF /* 'o' -> */, -/* pos 02db: 380 */ 0xEE /* 'n' -> */, -/* pos 02dc: 381 */ 0xBA /* ':' -> */, -/* pos 02dd: 382 */ 0x00, 0x2D /* - terminal marker 45 - */, +/* pos 02d6: 375 */ 0xEE /* 'n' -> */, +/* pos 02d7: 376 */ 0xBA /* ':' -> */, +/* pos 02d8: 377 */ 0x00, 0x2D /* - terminal marker 45 - */, +/* pos 02da: 378 */ 0xEE /* 'n' -> */, +/* pos 02db: 379 */ 0xE3 /* 'c' -> */, +/* pos 02dc: 380 */ 0xEF /* 'o' -> */, +/* pos 02dd: 381 */ 0xE4 /* 'd' -> */, +/* pos 02de: 382 */ 0xE9 /* 'i' -> */, /* pos 02df: 383 */ 0xEE /* 'n' -> */, -/* pos 02e0: 384 */ 0xE3 /* 'c' -> */, -/* pos 02e1: 385 */ 0xEF /* 'o' -> */, -/* pos 02e2: 386 */ 0xE4 /* 'd' -> */, -/* pos 02e3: 387 */ 0xE9 /* 'i' -> */, -/* pos 02e4: 388 */ 0xEE /* 'n' -> */, -/* pos 02e5: 389 */ 0xE7 /* 'g' -> */, -/* pos 02e6: 390 */ 0xBA /* ':' -> */, -/* pos 02e7: 391 */ 0x00, 0x2E /* - terminal marker 46 - */, -/* pos 02e9: 392 */ 0xEE /* 'n' -> */, -/* pos 02ea: 393 */ 0xE7 /* 'g' -> */, -/* pos 02eb: 394 */ 0xF5 /* 'u' -> */, -/* pos 02ec: 395 */ 0xE1 /* 'a' -> */, -/* pos 02ed: 396 */ 0xE7 /* 'g' -> */, -/* pos 02ee: 397 */ 0xE5 /* 'e' -> */, -/* pos 02ef: 398 */ 0xBA /* ':' -> */, -/* pos 02f0: 399 */ 0x00, 0x2F /* - terminal marker 47 - */, -/* pos 02f2: 400 */ 0xE3 /* 'c' -> */, -/* pos 02f3: 401 */ 0xE1 /* 'a' -> */, -/* pos 02f4: 402 */ 0xF4 /* 't' -> */, -/* pos 02f5: 403 */ 0xE9 /* 'i' -> */, -/* pos 02f6: 404 */ 0xEF /* 'o' -> */, -/* pos 02f7: 405 */ 0xEE /* 'n' -> */, -/* pos 02f8: 406 */ 0xBA /* ':' -> */, -/* pos 02f9: 407 */ 0x00, 0x30 /* - terminal marker 48 - */, -/* pos 02fb: 408 */ 0xE1 /* 'a' -> */, -/* pos 02fc: 409 */ 0xEE /* 'n' -> */, -/* pos 02fd: 410 */ 0xE7 /* 'g' -> */, -/* pos 02fe: 411 */ 0xE5 /* 'e' -> */, -/* pos 02ff: 412 */ 0xBA /* ':' -> */, -/* pos 0300: 413 */ 0x00, 0x31 /* - terminal marker 49 - */, -/* pos 0302: 414 */ 0x74 /* 't' */, 0x07, 0x00 /* (to 0x0309 state 415) */, - 0x78 /* 'x' */, 0x09, 0x00 /* (to 0x030E state 419) */, - 0x08, /* fail */ -/* pos 0309: 415 */ 0xE1 /* 'a' -> */, -/* pos 030a: 416 */ 0xE7 /* 'g' -> */, -/* pos 030b: 417 */ 0xBA /* ':' -> */, -/* pos 030c: 418 */ 0x00, 0x32 /* - terminal marker 50 - */, -/* pos 030e: 419 */ 0xF0 /* 'p' -> */, -/* pos 030f: 420 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0316 state 421) */, - 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x031B state 425) */, - 0x08, /* fail */ -/* pos 0316: 421 */ 0xE3 /* 'c' -> */, -/* pos 0317: 422 */ 0xF4 /* 't' -> */, -/* pos 0318: 423 */ 0xBA /* ':' -> */, -/* pos 0319: 424 */ 0x00, 0x33 /* - terminal marker 51 - */, -/* pos 031b: 425 */ 0xF2 /* 'r' -> */, -/* pos 031c: 426 */ 0xE5 /* 'e' -> */, -/* pos 031d: 427 */ 0xF3 /* 's' -> */, -/* pos 031e: 428 */ 0xBA /* ':' -> */, -/* pos 031f: 429 */ 0x00, 0x34 /* - terminal marker 52 - */, -/* pos 0321: 430 */ 0xF2 /* 'r' -> */, -/* pos 0322: 431 */ 0xEF /* 'o' -> */, -/* pos 0323: 432 */ 0xED /* 'm' -> */, -/* pos 0324: 433 */ 0xBA /* ':' -> */, -/* pos 0325: 434 */ 0x00, 0x35 /* - terminal marker 53 - */, -/* pos 0327: 435 */ 0xF4 /* 't' -> */, -/* pos 0328: 436 */ 0xE3 /* 'c' -> */, -/* pos 0329: 437 */ 0xE8 /* 'h' -> */, -/* pos 032a: 438 */ 0xBA /* ':' -> */, -/* pos 032b: 439 */ 0x00, 0x36 /* - terminal marker 54 - */, -/* pos 032d: 440 */ 0xE1 /* 'a' -> */, -/* pos 032e: 441 */ 0xEE /* 'n' -> */, -/* pos 032f: 442 */ 0xE7 /* 'g' -> */, -/* pos 0330: 443 */ 0xE5 /* 'e' -> */, -/* pos 0331: 444 */ 0xBA /* ':' -> */, -/* pos 0332: 445 */ 0x00, 0x37 /* - terminal marker 55 - */, -/* pos 0334: 446 */ 0xEE /* 'n' -> */, -/* pos 0335: 447 */ 0xED /* 'm' -> */, -/* pos 0336: 448 */ 0xEF /* 'o' -> */, +/* pos 02e0: 384 */ 0xE7 /* 'g' -> */, +/* pos 02e1: 385 */ 0xBA /* ':' -> */, +/* pos 02e2: 386 */ 0x00, 0x2E /* - terminal marker 46 - */, +/* pos 02e4: 387 */ 0xEE /* 'n' -> */, +/* pos 02e5: 388 */ 0xE7 /* 'g' -> */, +/* pos 02e6: 389 */ 0xF5 /* 'u' -> */, +/* pos 02e7: 390 */ 0xE1 /* 'a' -> */, +/* pos 02e8: 391 */ 0xE7 /* 'g' -> */, +/* pos 02e9: 392 */ 0xE5 /* 'e' -> */, +/* pos 02ea: 393 */ 0xBA /* ':' -> */, +/* pos 02eb: 394 */ 0x00, 0x2F /* - terminal marker 47 - */, +/* pos 02ed: 395 */ 0xE3 /* 'c' -> */, +/* pos 02ee: 396 */ 0xE1 /* 'a' -> */, +/* pos 02ef: 397 */ 0xF4 /* 't' -> */, +/* pos 02f0: 398 */ 0xE9 /* 'i' -> */, +/* pos 02f1: 399 */ 0xEF /* 'o' -> */, +/* pos 02f2: 400 */ 0xEE /* 'n' -> */, +/* pos 02f3: 401 */ 0xBA /* ':' -> */, +/* pos 02f4: 402 */ 0x00, 0x30 /* - terminal marker 48 - */, +/* pos 02f6: 403 */ 0xE1 /* 'a' -> */, +/* pos 02f7: 404 */ 0xEE /* 'n' -> */, +/* pos 02f8: 405 */ 0xE7 /* 'g' -> */, +/* pos 02f9: 406 */ 0xE5 /* 'e' -> */, +/* pos 02fa: 407 */ 0xBA /* ':' -> */, +/* pos 02fb: 408 */ 0x00, 0x31 /* - terminal marker 49 - */, +/* pos 02fd: 409 */ 0x74 /* 't' */, 0x07, 0x00 /* (to 0x0304 state 410) */, + 0x78 /* 'x' */, 0x09, 0x00 /* (to 0x0309 state 414) */, + 0x08, /* fail */ +/* pos 0304: 410 */ 0xE1 /* 'a' -> */, +/* pos 0305: 411 */ 0xE7 /* 'g' -> */, +/* pos 0306: 412 */ 0xBA /* ':' -> */, +/* pos 0307: 413 */ 0x00, 0x32 /* - terminal marker 50 - */, +/* pos 0309: 414 */ 0xF0 /* 'p' -> */, +/* pos 030a: 415 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0311 state 416) */, + 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0316 state 420) */, + 0x08, /* fail */ +/* pos 0311: 416 */ 0xE3 /* 'c' -> */, +/* pos 0312: 417 */ 0xF4 /* 't' -> */, +/* pos 0313: 418 */ 0xBA /* ':' -> */, +/* pos 0314: 419 */ 0x00, 0x33 /* - terminal marker 51 - */, +/* pos 0316: 420 */ 0xF2 /* 'r' -> */, +/* pos 0317: 421 */ 0xE5 /* 'e' -> */, +/* pos 0318: 422 */ 0xF3 /* 's' -> */, +/* pos 0319: 423 */ 0xBA /* ':' -> */, +/* pos 031a: 424 */ 0x00, 0x34 /* - terminal marker 52 - */, +/* pos 031c: 425 */ 0xF2 /* 'r' -> */, +/* pos 031d: 426 */ 0xEF /* 'o' -> */, +/* pos 031e: 427 */ 0xED /* 'm' -> */, +/* pos 031f: 428 */ 0xBA /* ':' -> */, +/* pos 0320: 429 */ 0x00, 0x35 /* - terminal marker 53 - */, +/* pos 0322: 430 */ 0xF4 /* 't' -> */, +/* pos 0323: 431 */ 0xE3 /* 'c' -> */, +/* pos 0324: 432 */ 0xE8 /* 'h' -> */, +/* pos 0325: 433 */ 0xBA /* ':' -> */, +/* pos 0326: 434 */ 0x00, 0x36 /* - terminal marker 54 - */, +/* pos 0328: 435 */ 0xE1 /* 'a' -> */, +/* pos 0329: 436 */ 0xEE /* 'n' -> */, +/* pos 032a: 437 */ 0xE7 /* 'g' -> */, +/* pos 032b: 438 */ 0xE5 /* 'e' -> */, +/* pos 032c: 439 */ 0xBA /* ':' -> */, +/* pos 032d: 440 */ 0x00, 0x37 /* - terminal marker 55 - */, +/* pos 032f: 441 */ 0xEE /* 'n' -> */, +/* pos 0330: 442 */ 0xED /* 'm' -> */, +/* pos 0331: 443 */ 0xEF /* 'o' -> */, +/* pos 0332: 444 */ 0xE4 /* 'd' -> */, +/* pos 0333: 445 */ 0xE9 /* 'i' -> */, +/* pos 0334: 446 */ 0xE6 /* 'f' -> */, +/* pos 0335: 447 */ 0xE9 /* 'i' -> */, +/* pos 0336: 448 */ 0xE5 /* 'e' -> */, /* pos 0337: 449 */ 0xE4 /* 'd' -> */, -/* pos 0338: 450 */ 0xE9 /* 'i' -> */, -/* pos 0339: 451 */ 0xE6 /* 'f' -> */, +/* pos 0338: 450 */ 0xAD /* '-' -> */, +/* pos 0339: 451 */ 0xF3 /* 's' -> */, /* pos 033a: 452 */ 0xE9 /* 'i' -> */, -/* pos 033b: 453 */ 0xE5 /* 'e' -> */, -/* pos 033c: 454 */ 0xE4 /* 'd' -> */, -/* pos 033d: 455 */ 0xAD /* '-' -> */, -/* pos 033e: 456 */ 0xF3 /* 's' -> */, -/* pos 033f: 457 */ 0xE9 /* 'i' -> */, -/* pos 0340: 458 */ 0xEE /* 'n' -> */, -/* pos 0341: 459 */ 0xE3 /* 'c' -> */, -/* pos 0342: 460 */ 0xE5 /* 'e' -> */, -/* pos 0343: 461 */ 0xBA /* ':' -> */, -/* pos 0344: 462 */ 0x00, 0x38 /* - terminal marker 56 - */, -/* pos 0346: 463 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x0350 state 464) */, - 0x69 /* 'i' */, 0x15, 0x00 /* (to 0x035E state 477) */, - 0x6F /* 'o' */, 0x17, 0x00 /* (to 0x0363 state 481) */, - 0x08, /* fail */ -/* pos 0350: 464 */ 0xF3 /* 's' -> */, -/* pos 0351: 465 */ 0xF4 /* 't' -> */, -/* pos 0352: 466 */ 0xAD /* '-' -> */, -/* pos 0353: 467 */ 0xED /* 'm' -> */, -/* pos 0354: 468 */ 0xEF /* 'o' -> */, +/* pos 033b: 453 */ 0xEE /* 'n' -> */, +/* pos 033c: 454 */ 0xE3 /* 'c' -> */, +/* pos 033d: 455 */ 0xE5 /* 'e' -> */, +/* pos 033e: 456 */ 0xBA /* ':' -> */, +/* pos 033f: 457 */ 0x00, 0x38 /* - terminal marker 56 - */, +/* pos 0341: 458 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x034B state 459) */, + 0x69 /* 'i' */, 0x15, 0x00 /* (to 0x0359 state 472) */, + 0x6F /* 'o' */, 0x17, 0x00 /* (to 0x035E state 476) */, + 0x08, /* fail */ +/* pos 034b: 459 */ 0xF3 /* 's' -> */, +/* pos 034c: 460 */ 0xF4 /* 't' -> */, +/* pos 034d: 461 */ 0xAD /* '-' -> */, +/* pos 034e: 462 */ 0xED /* 'm' -> */, +/* pos 034f: 463 */ 0xEF /* 'o' -> */, +/* pos 0350: 464 */ 0xE4 /* 'd' -> */, +/* pos 0351: 465 */ 0xE9 /* 'i' -> */, +/* pos 0352: 466 */ 0xE6 /* 'f' -> */, +/* pos 0353: 467 */ 0xE9 /* 'i' -> */, +/* pos 0354: 468 */ 0xE5 /* 'e' -> */, /* pos 0355: 469 */ 0xE4 /* 'd' -> */, -/* pos 0356: 470 */ 0xE9 /* 'i' -> */, -/* pos 0357: 471 */ 0xE6 /* 'f' -> */, -/* pos 0358: 472 */ 0xE9 /* 'i' -> */, -/* pos 0359: 473 */ 0xE5 /* 'e' -> */, -/* pos 035a: 474 */ 0xE4 /* 'd' -> */, -/* pos 035b: 475 */ 0xBA /* ':' -> */, -/* pos 035c: 476 */ 0x00, 0x39 /* - terminal marker 57 - */, -/* pos 035e: 477 */ 0xEE /* 'n' -> */, -/* pos 035f: 478 */ 0xEB /* 'k' -> */, -/* pos 0360: 479 */ 0xBA /* ':' -> */, -/* pos 0361: 480 */ 0x00, 0x3A /* - terminal marker 58 - */, -/* pos 0363: 481 */ 0xE3 /* 'c' -> */, -/* pos 0364: 482 */ 0xE1 /* 'a' -> */, -/* pos 0365: 483 */ 0xF4 /* 't' -> */, -/* pos 0366: 484 */ 0xE9 /* 'i' -> */, -/* pos 0367: 485 */ 0xEF /* 'o' -> */, -/* pos 0368: 486 */ 0xEE /* 'n' -> */, -/* pos 0369: 487 */ 0xBA /* ':' -> */, -/* pos 036a: 488 */ 0x00, 0x3B /* - terminal marker 59 - */, -/* pos 036c: 489 */ 0xE1 /* 'a' -> */, -/* pos 036d: 490 */ 0xF8 /* 'x' -> */, -/* pos 036e: 491 */ 0xAD /* '-' -> */, -/* pos 036f: 492 */ 0xE6 /* 'f' -> */, -/* pos 0370: 493 */ 0xEF /* 'o' -> */, -/* pos 0371: 494 */ 0xF2 /* 'r' -> */, -/* pos 0372: 495 */ 0xF7 /* 'w' -> */, -/* pos 0373: 496 */ 0xE1 /* 'a' -> */, -/* pos 0374: 497 */ 0xF2 /* 'r' -> */, -/* pos 0375: 498 */ 0xE4 /* 'd' -> */, -/* pos 0376: 499 */ 0xF3 /* 's' -> */, -/* pos 0377: 500 */ 0xBA /* ':' -> */, -/* pos 0378: 501 */ 0x00, 0x3C /* - terminal marker 60 - */, -/* pos 037a: 502 */ 0xF8 /* 'x' -> */, -/* pos 037b: 503 */ 0xF9 /* 'y' -> */, -/* pos 037c: 504 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x0383 state 505) */, - 0x20 /* ' ' */, 0xB5, 0x00 /* (to 0x0434 state 654) */, - 0x08, /* fail */ -/* pos 0383: 505 */ 0xE1 /* 'a' -> */, -/* pos 0384: 506 */ 0xF5 /* 'u' -> */, -/* pos 0385: 507 */ 0xF4 /* 't' -> */, -/* pos 0386: 508 */ 0xE8 /* 'h' -> */, -/* pos 0387: 509 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x038E state 510) */, - 0x6F /* 'o' */, 0x0E, 0x00 /* (to 0x0398 state 519) */, - 0x08, /* fail */ -/* pos 038e: 510 */ 0xEE /* 'n' -> */, -/* pos 038f: 511 */ 0xF4 /* 't' -> */, -/* pos 0390: 512 */ 0xE9 /* 'i' -> */, -/* pos 0391: 513 */ 0xE3 /* 'c' -> */, -/* pos 0392: 514 */ 0xE1 /* 'a' -> */, -/* pos 0393: 515 */ 0xF4 /* 't' -> */, -/* pos 0394: 516 */ 0xE5 /* 'e' -> */, -/* pos 0395: 517 */ 0xBA /* ':' -> */, -/* pos 0396: 518 */ 0x00, 0x3D /* - terminal marker 61 - */, -/* pos 0398: 519 */ 0xF2 /* 'r' -> */, -/* pos 0399: 520 */ 0xE9 /* 'i' -> */, -/* pos 039a: 521 */ 0xFA /* 'z' -> */, -/* pos 039b: 522 */ 0xE1 /* 'a' -> */, -/* pos 039c: 523 */ 0xF4 /* 't' -> */, -/* pos 039d: 524 */ 0xE9 /* 'i' -> */, -/* pos 039e: 525 */ 0xEF /* 'o' -> */, -/* pos 039f: 526 */ 0xEE /* 'n' -> */, -/* pos 03a0: 527 */ 0xBA /* ':' -> */, -/* pos 03a1: 528 */ 0x00, 0x3E /* - terminal marker 62 - */, -/* pos 03a3: 529 */ 0xE5 /* 'e' -> */, -/* pos 03a4: 530 */ 0xF3 /* 's' -> */, -/* pos 03a5: 531 */ 0xE8 /* 'h' -> */, -/* pos 03a6: 532 */ 0xBA /* ':' -> */, -/* pos 03a7: 533 */ 0x00, 0x3F /* - terminal marker 63 - */, -/* pos 03a9: 534 */ 0xF2 /* 'r' -> */, -/* pos 03aa: 535 */ 0xF9 /* 'y' -> */, -/* pos 03ab: 536 */ 0xAD /* '-' -> */, -/* pos 03ac: 537 */ 0xE1 /* 'a' -> */, -/* pos 03ad: 538 */ 0xE6 /* 'f' -> */, -/* pos 03ae: 539 */ 0xF4 /* 't' -> */, -/* pos 03af: 540 */ 0xE5 /* 'e' -> */, -/* pos 03b0: 541 */ 0xF2 /* 'r' -> */, -/* pos 03b1: 542 */ 0xBA /* ':' -> */, -/* pos 03b2: 543 */ 0x00, 0x40 /* - terminal marker 64 - */, -/* pos 03b4: 544 */ 0xF6 /* 'v' -> */, -/* pos 03b5: 545 */ 0xE5 /* 'e' -> */, -/* pos 03b6: 546 */ 0xF2 /* 'r' -> */, -/* pos 03b7: 547 */ 0xBA /* ':' -> */, -/* pos 03b8: 548 */ 0x00, 0x41 /* - terminal marker 65 - */, -/* pos 03ba: 549 */ 0xAD /* '-' -> */, -/* pos 03bb: 550 */ 0xE3 /* 'c' -> */, -/* pos 03bc: 551 */ 0xEF /* 'o' -> */, -/* pos 03bd: 552 */ 0xEF /* 'o' -> */, -/* pos 03be: 553 */ 0xEB /* 'k' -> */, -/* pos 03bf: 554 */ 0xE9 /* 'i' -> */, -/* pos 03c0: 555 */ 0xE5 /* 'e' -> */, -/* pos 03c1: 556 */ 0xBA /* ':' -> */, -/* pos 03c2: 557 */ 0x00, 0x42 /* - terminal marker 66 - */, -/* pos 03c4: 558 */ 0xF2 /* 'r' -> */, -/* pos 03c5: 559 */ 0xE9 /* 'i' -> */, -/* pos 03c6: 560 */ 0xE3 /* 'c' -> */, -/* pos 03c7: 561 */ 0xF4 /* 't' -> */, -/* pos 03c8: 562 */ 0xAD /* '-' -> */, -/* pos 03c9: 563 */ 0xF4 /* 't' -> */, -/* pos 03ca: 564 */ 0xF2 /* 'r' -> */, -/* pos 03cb: 565 */ 0xE1 /* 'a' -> */, -/* pos 03cc: 566 */ 0xEE /* 'n' -> */, -/* pos 03cd: 567 */ 0xF3 /* 's' -> */, -/* pos 03ce: 568 */ 0xF0 /* 'p' -> */, -/* pos 03cf: 569 */ 0xEF /* 'o' -> */, -/* pos 03d0: 570 */ 0xF2 /* 'r' -> */, -/* pos 03d1: 571 */ 0xF4 /* 't' -> */, -/* pos 03d2: 572 */ 0xAD /* '-' -> */, -/* pos 03d3: 573 */ 0xF3 /* 's' -> */, -/* pos 03d4: 574 */ 0xE5 /* 'e' -> */, -/* pos 03d5: 575 */ 0xE3 /* 'c' -> */, -/* pos 03d6: 576 */ 0xF5 /* 'u' -> */, -/* pos 03d7: 577 */ 0xF2 /* 'r' -> */, -/* pos 03d8: 578 */ 0xE9 /* 'i' -> */, -/* pos 03d9: 579 */ 0xF4 /* 't' -> */, -/* pos 03da: 580 */ 0xF9 /* 'y' -> */, -/* pos 03db: 581 */ 0xBA /* ':' -> */, -/* pos 03dc: 582 */ 0x00, 0x43 /* - terminal marker 67 - */, -/* pos 03de: 583 */ 0xF2 /* 'r' -> */, -/* pos 03df: 584 */ 0xE1 /* 'a' -> */, -/* pos 03e0: 585 */ 0xEE /* 'n' -> */, -/* pos 03e1: 586 */ 0xF3 /* 's' -> */, -/* pos 03e2: 587 */ 0xE6 /* 'f' -> */, -/* pos 03e3: 588 */ 0xE5 /* 'e' -> */, -/* pos 03e4: 589 */ 0xF2 /* 'r' -> */, -/* pos 03e5: 590 */ 0xAD /* '-' -> */, -/* pos 03e6: 591 */ 0xE5 /* 'e' -> */, +/* pos 0356: 470 */ 0xBA /* ':' -> */, +/* pos 0357: 471 */ 0x00, 0x39 /* - terminal marker 57 - */, +/* pos 0359: 472 */ 0xEE /* 'n' -> */, +/* pos 035a: 473 */ 0xEB /* 'k' -> */, +/* pos 035b: 474 */ 0xBA /* ':' -> */, +/* pos 035c: 475 */ 0x00, 0x3A /* - terminal marker 58 - */, +/* pos 035e: 476 */ 0xE3 /* 'c' -> */, +/* pos 035f: 477 */ 0xE1 /* 'a' -> */, +/* pos 0360: 478 */ 0xF4 /* 't' -> */, +/* pos 0361: 479 */ 0xE9 /* 'i' -> */, +/* pos 0362: 480 */ 0xEF /* 'o' -> */, +/* pos 0363: 481 */ 0xEE /* 'n' -> */, +/* pos 0364: 482 */ 0xBA /* ':' -> */, +/* pos 0365: 483 */ 0x00, 0x3B /* - terminal marker 59 - */, +/* pos 0367: 484 */ 0xE1 /* 'a' -> */, +/* pos 0368: 485 */ 0xF8 /* 'x' -> */, +/* pos 0369: 486 */ 0xAD /* '-' -> */, +/* pos 036a: 487 */ 0xE6 /* 'f' -> */, +/* pos 036b: 488 */ 0xEF /* 'o' -> */, +/* pos 036c: 489 */ 0xF2 /* 'r' -> */, +/* pos 036d: 490 */ 0xF7 /* 'w' -> */, +/* pos 036e: 491 */ 0xE1 /* 'a' -> */, +/* pos 036f: 492 */ 0xF2 /* 'r' -> */, +/* pos 0370: 493 */ 0xE4 /* 'd' -> */, +/* pos 0371: 494 */ 0xF3 /* 's' -> */, +/* pos 0372: 495 */ 0xBA /* ':' -> */, +/* pos 0373: 496 */ 0x00, 0x3C /* - terminal marker 60 - */, +/* pos 0375: 497 */ 0xF8 /* 'x' -> */, +/* pos 0376: 498 */ 0xF9 /* 'y' -> */, +/* pos 0377: 499 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x037E state 500) */, + 0x20 /* ' ' */, 0xB5, 0x00 /* (to 0x042F state 649) */, + 0x08, /* fail */ +/* pos 037e: 500 */ 0xE1 /* 'a' -> */, +/* pos 037f: 501 */ 0xF5 /* 'u' -> */, +/* pos 0380: 502 */ 0xF4 /* 't' -> */, +/* pos 0381: 503 */ 0xE8 /* 'h' -> */, +/* pos 0382: 504 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0389 state 505) */, + 0x6F /* 'o' */, 0x0E, 0x00 /* (to 0x0393 state 514) */, + 0x08, /* fail */ +/* pos 0389: 505 */ 0xEE /* 'n' -> */, +/* pos 038a: 506 */ 0xF4 /* 't' -> */, +/* pos 038b: 507 */ 0xE9 /* 'i' -> */, +/* pos 038c: 508 */ 0xE3 /* 'c' -> */, +/* pos 038d: 509 */ 0xE1 /* 'a' -> */, +/* pos 038e: 510 */ 0xF4 /* 't' -> */, +/* pos 038f: 511 */ 0xE5 /* 'e' -> */, +/* pos 0390: 512 */ 0xBA /* ':' -> */, +/* pos 0391: 513 */ 0x00, 0x3D /* - terminal marker 61 - */, +/* pos 0393: 514 */ 0xF2 /* 'r' -> */, +/* pos 0394: 515 */ 0xE9 /* 'i' -> */, +/* pos 0395: 516 */ 0xFA /* 'z' -> */, +/* pos 0396: 517 */ 0xE1 /* 'a' -> */, +/* pos 0397: 518 */ 0xF4 /* 't' -> */, +/* pos 0398: 519 */ 0xE9 /* 'i' -> */, +/* pos 0399: 520 */ 0xEF /* 'o' -> */, +/* pos 039a: 521 */ 0xEE /* 'n' -> */, +/* pos 039b: 522 */ 0xBA /* ':' -> */, +/* pos 039c: 523 */ 0x00, 0x3E /* - terminal marker 62 - */, +/* pos 039e: 524 */ 0xE5 /* 'e' -> */, +/* pos 039f: 525 */ 0xF3 /* 's' -> */, +/* pos 03a0: 526 */ 0xE8 /* 'h' -> */, +/* pos 03a1: 527 */ 0xBA /* ':' -> */, +/* pos 03a2: 528 */ 0x00, 0x3F /* - terminal marker 63 - */, +/* pos 03a4: 529 */ 0xF2 /* 'r' -> */, +/* pos 03a5: 530 */ 0xF9 /* 'y' -> */, +/* pos 03a6: 531 */ 0xAD /* '-' -> */, +/* pos 03a7: 532 */ 0xE1 /* 'a' -> */, +/* pos 03a8: 533 */ 0xE6 /* 'f' -> */, +/* pos 03a9: 534 */ 0xF4 /* 't' -> */, +/* pos 03aa: 535 */ 0xE5 /* 'e' -> */, +/* pos 03ab: 536 */ 0xF2 /* 'r' -> */, +/* pos 03ac: 537 */ 0xBA /* ':' -> */, +/* pos 03ad: 538 */ 0x00, 0x40 /* - terminal marker 64 - */, +/* pos 03af: 539 */ 0xF6 /* 'v' -> */, +/* pos 03b0: 540 */ 0xE5 /* 'e' -> */, +/* pos 03b1: 541 */ 0xF2 /* 'r' -> */, +/* pos 03b2: 542 */ 0xBA /* ':' -> */, +/* pos 03b3: 543 */ 0x00, 0x41 /* - terminal marker 65 - */, +/* pos 03b5: 544 */ 0xAD /* '-' -> */, +/* pos 03b6: 545 */ 0xE3 /* 'c' -> */, +/* pos 03b7: 546 */ 0xEF /* 'o' -> */, +/* pos 03b8: 547 */ 0xEF /* 'o' -> */, +/* pos 03b9: 548 */ 0xEB /* 'k' -> */, +/* pos 03ba: 549 */ 0xE9 /* 'i' -> */, +/* pos 03bb: 550 */ 0xE5 /* 'e' -> */, +/* pos 03bc: 551 */ 0xBA /* ':' -> */, +/* pos 03bd: 552 */ 0x00, 0x42 /* - terminal marker 66 - */, +/* pos 03bf: 553 */ 0xF2 /* 'r' -> */, +/* pos 03c0: 554 */ 0xE9 /* 'i' -> */, +/* pos 03c1: 555 */ 0xE3 /* 'c' -> */, +/* pos 03c2: 556 */ 0xF4 /* 't' -> */, +/* pos 03c3: 557 */ 0xAD /* '-' -> */, +/* pos 03c4: 558 */ 0xF4 /* 't' -> */, +/* pos 03c5: 559 */ 0xF2 /* 'r' -> */, +/* pos 03c6: 560 */ 0xE1 /* 'a' -> */, +/* pos 03c7: 561 */ 0xEE /* 'n' -> */, +/* pos 03c8: 562 */ 0xF3 /* 's' -> */, +/* pos 03c9: 563 */ 0xF0 /* 'p' -> */, +/* pos 03ca: 564 */ 0xEF /* 'o' -> */, +/* pos 03cb: 565 */ 0xF2 /* 'r' -> */, +/* pos 03cc: 566 */ 0xF4 /* 't' -> */, +/* pos 03cd: 567 */ 0xAD /* '-' -> */, +/* pos 03ce: 568 */ 0xF3 /* 's' -> */, +/* pos 03cf: 569 */ 0xE5 /* 'e' -> */, +/* pos 03d0: 570 */ 0xE3 /* 'c' -> */, +/* pos 03d1: 571 */ 0xF5 /* 'u' -> */, +/* pos 03d2: 572 */ 0xF2 /* 'r' -> */, +/* pos 03d3: 573 */ 0xE9 /* 'i' -> */, +/* pos 03d4: 574 */ 0xF4 /* 't' -> */, +/* pos 03d5: 575 */ 0xF9 /* 'y' -> */, +/* pos 03d6: 576 */ 0xBA /* ':' -> */, +/* pos 03d7: 577 */ 0x00, 0x43 /* - terminal marker 67 - */, +/* pos 03d9: 578 */ 0xF2 /* 'r' -> */, +/* pos 03da: 579 */ 0xE1 /* 'a' -> */, +/* pos 03db: 580 */ 0xEE /* 'n' -> */, +/* pos 03dc: 581 */ 0xF3 /* 's' -> */, +/* pos 03dd: 582 */ 0xE6 /* 'f' -> */, +/* pos 03de: 583 */ 0xE5 /* 'e' -> */, +/* pos 03df: 584 */ 0xF2 /* 'r' -> */, +/* pos 03e0: 585 */ 0xAD /* '-' -> */, +/* pos 03e1: 586 */ 0xE5 /* 'e' -> */, +/* pos 03e2: 587 */ 0xEE /* 'n' -> */, +/* pos 03e3: 588 */ 0xE3 /* 'c' -> */, +/* pos 03e4: 589 */ 0xEF /* 'o' -> */, +/* pos 03e5: 590 */ 0xE4 /* 'd' -> */, +/* pos 03e6: 591 */ 0xE9 /* 'i' -> */, /* pos 03e7: 592 */ 0xEE /* 'n' -> */, -/* pos 03e8: 593 */ 0xE3 /* 'c' -> */, -/* pos 03e9: 594 */ 0xEF /* 'o' -> */, -/* pos 03ea: 595 */ 0xE4 /* 'd' -> */, -/* pos 03eb: 596 */ 0xE9 /* 'i' -> */, -/* pos 03ec: 597 */ 0xEE /* 'n' -> */, -/* pos 03ed: 598 */ 0xE7 /* 'g' -> */, -/* pos 03ee: 599 */ 0xBA /* ':' -> */, -/* pos 03ef: 600 */ 0x00, 0x44 /* - terminal marker 68 - */, +/* pos 03e8: 593 */ 0xE7 /* 'g' -> */, +/* pos 03e9: 594 */ 0xBA /* ':' -> */, +/* pos 03ea: 595 */ 0x00, 0x44 /* - terminal marker 68 - */, +/* pos 03ec: 596 */ 0xE5 /* 'e' -> */, +/* pos 03ed: 597 */ 0xF2 /* 'r' -> */, +/* pos 03ee: 598 */ 0xAD /* '-' -> */, +/* pos 03ef: 599 */ 0xE1 /* 'a' -> */, +/* pos 03f0: 600 */ 0xE7 /* 'g' -> */, /* pos 03f1: 601 */ 0xE5 /* 'e' -> */, -/* pos 03f2: 602 */ 0xF2 /* 'r' -> */, -/* pos 03f3: 603 */ 0xAD /* '-' -> */, -/* pos 03f4: 604 */ 0xE1 /* 'a' -> */, -/* pos 03f5: 605 */ 0xE7 /* 'g' -> */, -/* pos 03f6: 606 */ 0xE5 /* 'e' -> */, -/* pos 03f7: 607 */ 0xEE /* 'n' -> */, -/* pos 03f8: 608 */ 0xF4 /* 't' -> */, -/* pos 03f9: 609 */ 0xBA /* ':' -> */, -/* pos 03fa: 610 */ 0x00, 0x45 /* - terminal marker 69 - */, -/* pos 03fc: 611 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0403 state 612) */, - 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0408 state 616) */, - 0x08, /* fail */ -/* pos 0403: 612 */ 0xF2 /* 'r' -> */, -/* pos 0404: 613 */ 0xF9 /* 'y' -> */, -/* pos 0405: 614 */ 0xBA /* ':' -> */, -/* pos 0406: 615 */ 0x00, 0x46 /* - terminal marker 70 - */, -/* pos 0408: 616 */ 0xE1 /* 'a' -> */, -/* pos 0409: 617 */ 0xBA /* ':' -> */, -/* pos 040a: 618 */ 0x00, 0x47 /* - terminal marker 71 - */, -/* pos 040c: 619 */ 0xF7 /* 'w' -> */, -/* pos 040d: 620 */ 0xF7 /* 'w' -> */, -/* pos 040e: 621 */ 0xAD /* '-' -> */, -/* pos 040f: 622 */ 0xE1 /* 'a' -> */, -/* pos 0410: 623 */ 0xF5 /* 'u' -> */, -/* pos 0411: 624 */ 0xF4 /* 't' -> */, -/* pos 0412: 625 */ 0xE8 /* 'h' -> */, -/* pos 0413: 626 */ 0xE5 /* 'e' -> */, -/* pos 0414: 627 */ 0xEE /* 'n' -> */, -/* pos 0415: 628 */ 0xF4 /* 't' -> */, -/* pos 0416: 629 */ 0xE9 /* 'i' -> */, -/* pos 0417: 630 */ 0xE3 /* 'c' -> */, -/* pos 0418: 631 */ 0xE1 /* 'a' -> */, -/* pos 0419: 632 */ 0xF4 /* 't' -> */, -/* pos 041a: 633 */ 0xE5 /* 'e' -> */, -/* pos 041b: 634 */ 0xBA /* ':' -> */, -/* pos 041c: 635 */ 0x00, 0x48 /* - terminal marker 72 - */, -/* pos 041e: 636 */ 0xF4 /* 't' -> */, -/* pos 041f: 637 */ 0xE3 /* 'c' -> */, -/* pos 0420: 638 */ 0xE8 /* 'h' -> */, -/* pos 0421: 639 */ 0x00, 0x49 /* - terminal marker 73 - */, -/* pos 0423: 640 */ 0xF4 /* 't' -> */, -/* pos 0424: 641 */ 0x00, 0x4A /* - terminal marker 74 - */, -/* pos 0426: 642 */ 0xEC /* 'l' -> */, -/* pos 0427: 643 */ 0xE5 /* 'e' -> */, -/* pos 0428: 644 */ 0xF4 /* 't' -> */, -/* pos 0429: 645 */ 0xE5 /* 'e' -> */, -/* pos 042a: 646 */ 0x00, 0x4B /* - terminal marker 75 - */, -/* pos 042c: 647 */ 0xE9 /* 'i' -> */, -/* pos 042d: 648 */ 0xAD /* '-' -> */, -/* pos 042e: 649 */ 0xE1 /* 'a' -> */, -/* pos 042f: 650 */ 0xF2 /* 'r' -> */, -/* pos 0430: 651 */ 0xE7 /* 'g' -> */, -/* pos 0431: 652 */ 0xF3 /* 's' -> */, -/* pos 0432: 653 */ 0x00, 0x4C /* - terminal marker 76 - */, -/* pos 0434: 654 */ 0x00, 0x4D /* - terminal marker 77 - */, +/* pos 03f2: 602 */ 0xEE /* 'n' -> */, +/* pos 03f3: 603 */ 0xF4 /* 't' -> */, +/* pos 03f4: 604 */ 0xBA /* ':' -> */, +/* pos 03f5: 605 */ 0x00, 0x45 /* - terminal marker 69 - */, +/* pos 03f7: 606 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x03FE state 607) */, + 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0403 state 611) */, + 0x08, /* fail */ +/* pos 03fe: 607 */ 0xF2 /* 'r' -> */, +/* pos 03ff: 608 */ 0xF9 /* 'y' -> */, +/* pos 0400: 609 */ 0xBA /* ':' -> */, +/* pos 0401: 610 */ 0x00, 0x46 /* - terminal marker 70 - */, +/* pos 0403: 611 */ 0xE1 /* 'a' -> */, +/* pos 0404: 612 */ 0xBA /* ':' -> */, +/* pos 0405: 613 */ 0x00, 0x47 /* - terminal marker 71 - */, +/* pos 0407: 614 */ 0xF7 /* 'w' -> */, +/* pos 0408: 615 */ 0xF7 /* 'w' -> */, +/* pos 0409: 616 */ 0xAD /* '-' -> */, +/* pos 040a: 617 */ 0xE1 /* 'a' -> */, +/* pos 040b: 618 */ 0xF5 /* 'u' -> */, +/* pos 040c: 619 */ 0xF4 /* 't' -> */, +/* pos 040d: 620 */ 0xE8 /* 'h' -> */, +/* pos 040e: 621 */ 0xE5 /* 'e' -> */, +/* pos 040f: 622 */ 0xEE /* 'n' -> */, +/* pos 0410: 623 */ 0xF4 /* 't' -> */, +/* pos 0411: 624 */ 0xE9 /* 'i' -> */, +/* pos 0412: 625 */ 0xE3 /* 'c' -> */, +/* pos 0413: 626 */ 0xE1 /* 'a' -> */, +/* pos 0414: 627 */ 0xF4 /* 't' -> */, +/* pos 0415: 628 */ 0xE5 /* 'e' -> */, +/* pos 0416: 629 */ 0xBA /* ':' -> */, +/* pos 0417: 630 */ 0x00, 0x48 /* - terminal marker 72 - */, +/* pos 0419: 631 */ 0xF4 /* 't' -> */, +/* pos 041a: 632 */ 0xE3 /* 'c' -> */, +/* pos 041b: 633 */ 0xE8 /* 'h' -> */, +/* pos 041c: 634 */ 0x00, 0x49 /* - terminal marker 73 - */, +/* pos 041e: 635 */ 0xF4 /* 't' -> */, +/* pos 041f: 636 */ 0x00, 0x4A /* - terminal marker 74 - */, +/* pos 0421: 637 */ 0xEC /* 'l' -> */, +/* pos 0422: 638 */ 0xE5 /* 'e' -> */, +/* pos 0423: 639 */ 0xF4 /* 't' -> */, +/* pos 0424: 640 */ 0xE5 /* 'e' -> */, +/* pos 0425: 641 */ 0x00, 0x4B /* - terminal marker 75 - */, +/* pos 0427: 642 */ 0xE9 /* 'i' -> */, +/* pos 0428: 643 */ 0xAD /* '-' -> */, +/* pos 0429: 644 */ 0xE1 /* 'a' -> */, +/* pos 042a: 645 */ 0xF2 /* 'r' -> */, +/* pos 042b: 646 */ 0xE7 /* 'g' -> */, +/* pos 042c: 647 */ 0xF3 /* 's' -> */, +/* pos 042d: 648 */ 0x00, 0x4C /* - terminal marker 76 - */, +/* pos 042f: 649 */ 0x00, 0x4D /* - terminal marker 77 - */, +/* pos 0431: 650 */ 0xAD /* '-' -> */, +/* pos 0432: 651 */ 0xF2 /* 'r' -> */, +/* pos 0433: 652 */ 0xE5 /* 'e' -> */, +/* pos 0434: 653 */ 0xE1 /* 'a' -> */, +/* pos 0435: 654 */ 0xEC /* 'l' -> */, /* pos 0436: 655 */ 0xAD /* '-' -> */, -/* pos 0437: 656 */ 0xF2 /* 'r' -> */, -/* pos 0438: 657 */ 0xE5 /* 'e' -> */, -/* pos 0439: 658 */ 0xE1 /* 'a' -> */, -/* pos 043a: 659 */ 0xEC /* 'l' -> */, -/* pos 043b: 660 */ 0xAD /* '-' -> */, -/* pos 043c: 661 */ 0xE9 /* 'i' -> */, -/* pos 043d: 662 */ 0xF0 /* 'p' -> */, -/* pos 043e: 663 */ 0xBA /* ':' -> */, -/* pos 043f: 664 */ 0x00, 0x4E /* - terminal marker 78 - */, -/* pos 0441: 665 */ 0xA0 /* ' ' -> */, -/* pos 0442: 666 */ 0x00, 0x4F /* - terminal marker 79 - */, -/* total size 1092 bytes */ +/* pos 0437: 656 */ 0xE9 /* 'i' -> */, +/* pos 0438: 657 */ 0xF0 /* 'p' -> */, +/* pos 0439: 658 */ 0xBA /* ':' -> */, +/* pos 043a: 659 */ 0x00, 0x4E /* - terminal marker 78 - */, +/* pos 043c: 660 */ 0xA0 /* ' ' -> */, +/* pos 043d: 661 */ 0x00, 0x4F /* - terminal marker 79 - */, +/* total size 1087 bytes */ diff --git a/lib/lws-plat-unix.c b/lib/lws-plat-unix.c index 880ad85d..abfe72cc 100644 --- a/lib/lws-plat-unix.c +++ b/lib/lws-plat-unix.c @@ -440,12 +440,14 @@ next: #endif +#if 0 static void sigabrt_handler(int x) { printf("%s\n", __func__); //*(char *)0 = 0; } +#endif LWS_VISIBLE int lws_plat_context_early_init(void) @@ -460,7 +462,7 @@ lws_plat_context_early_init(void) signal(SIGPIPE, SIG_IGN); - signal(SIGABRT, sigabrt_handler); +// signal(SIGABRT, sigabrt_handler); return 0; } diff --git a/lib/output.c b/lib/output.c index b527e9c5..d23c3281 100644 --- a/lib/output.c +++ b/lib/output.c @@ -560,7 +560,7 @@ LWS_VISIBLE int lws_serve_http_file_fragment(struct lws *wsi) unsigned long amount; int n, m; - while (!lws_send_pipe_choked(wsi)) { + while (wsi->http2_substream || !lws_send_pipe_choked(wsi)) { if (wsi->trunc_len) { if (lws_issue_raw(wsi, wsi->trunc_alloc + wsi->trunc_offset, diff --git a/lib/pollfd.c b/lib/pollfd.c index 7a4f17e4..9168b9ed 100644 --- a/lib/pollfd.c +++ b/lib/pollfd.c @@ -43,6 +43,10 @@ _lws_change_pollfd(struct lws *wsi, int _and, int _or, struct lws_pollargs *pa) pa->prev_events = pfd->events; pa->events = pfd->events = (pfd->events & ~_and) | _or; + + if (wsi->http2_substream) + return 0; + if (wsi->vhost->protocols[0].callback(wsi, LWS_CALLBACK_CHANGE_MODE_POLL_FD, wsi->user_space, (void *)pa, 0)) { ret = -1; @@ -76,6 +80,7 @@ _lws_change_pollfd(struct lws *wsi, int _and, int _or, struct lws_pollargs *pa) #if LWS_POSIX pa_events = pa->prev_events != pa->events; #endif + if (pa_events) { if (lws_plat_change_pollfd(context, wsi, pfd)) { diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index 0684326d..cff84623 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -392,6 +392,7 @@ enum lws_connection_states { enum http_version { HTTP_VERSION_1_0, HTTP_VERSION_1_1, + HTTP_VERSION_2 }; enum http_connection_type { @@ -1216,6 +1217,7 @@ struct lws { #endif unsigned int hdr_parsing_completed:1; + unsigned int http2_substream:1; unsigned int listener:1; unsigned int user_space_externally_allocated:1; unsigned int socket_is_permanently_unusable:1; @@ -1562,7 +1564,7 @@ lws_ssl_destroy(struct lws_vhost *vhost); #ifdef LWS_USE_HTTP2 LWS_EXTERN void -lws_context_init_http2_ssl(struct lws_context *context); +lws_context_init_http2_ssl(struct lws_vhost *vhost); #else #define lws_context_init_http2_ssl(_a) #endif diff --git a/lib/server.c b/lib/server.c index b28c9bba..aca8ad79 100644 --- a/lib/server.c +++ b/lib/server.c @@ -359,37 +359,41 @@ lws_http_action(struct lws *wsi) wsi->u.http.content_length = atoi(content_length_str); } - /* http_version? Default to 1.0, override with token: */ - request_version = HTTP_VERSION_1_0; - - /* Works for single digit HTTP versions. : */ - http_version_len = lws_hdr_total_length(wsi, WSI_TOKEN_HTTP); - if (http_version_len > 7) { - lws_hdr_copy(wsi, http_version_str, - sizeof(http_version_str) - 1, WSI_TOKEN_HTTP); - if (http_version_str[5] == '1' && http_version_str[7] == '1') - request_version = HTTP_VERSION_1_1; - } - wsi->u.http.request_version = request_version; + if (wsi->http2_substream) { + wsi->u.http.request_version = HTTP_VERSION_2; + } else { + /* http_version? Default to 1.0, override with token: */ + request_version = HTTP_VERSION_1_0; + + /* Works for single digit HTTP versions. : */ + http_version_len = lws_hdr_total_length(wsi, WSI_TOKEN_HTTP); + if (http_version_len > 7) { + lws_hdr_copy(wsi, http_version_str, + sizeof(http_version_str) - 1, WSI_TOKEN_HTTP); + if (http_version_str[5] == '1' && http_version_str[7] == '1') + request_version = HTTP_VERSION_1_1; + } + wsi->u.http.request_version = request_version; - /* HTTP/1.1 defaults to "keep-alive", 1.0 to "close" */ - if (request_version == HTTP_VERSION_1_1) - connection_type = HTTP_CONNECTION_KEEP_ALIVE; - else - connection_type = HTTP_CONNECTION_CLOSE; - - /* Override default if http "Connection:" header: */ - if (lws_hdr_total_length(wsi, WSI_TOKEN_CONNECTION)) { - lws_hdr_copy(wsi, http_conn_str, sizeof(http_conn_str) - 1, - WSI_TOKEN_CONNECTION); - http_conn_str[sizeof(http_conn_str) - 1] = '\0'; - if (!strcasecmp(http_conn_str, "keep-alive")) + /* HTTP/1.1 defaults to "keep-alive", 1.0 to "close" */ + if (request_version == HTTP_VERSION_1_1) connection_type = HTTP_CONNECTION_KEEP_ALIVE; else - if (!strcasecmp(http_conn_str, "close")) - connection_type = HTTP_CONNECTION_CLOSE; + connection_type = HTTP_CONNECTION_CLOSE; + + /* Override default if http "Connection:" header: */ + if (lws_hdr_total_length(wsi, WSI_TOKEN_CONNECTION)) { + lws_hdr_copy(wsi, http_conn_str, sizeof(http_conn_str) - 1, + WSI_TOKEN_CONNECTION); + http_conn_str[sizeof(http_conn_str) - 1] = '\0'; + if (!strcasecmp(http_conn_str, "keep-alive")) + connection_type = HTTP_CONNECTION_KEEP_ALIVE; + else + if (!strcasecmp(http_conn_str, "close")) + connection_type = HTTP_CONNECTION_CLOSE; + } + wsi->u.http.connection_type = connection_type; } - wsi->u.http.connection_type = connection_type; n = wsi->protocol->callback(wsi, LWS_CALLBACK_FILTER_HTTP_CONNECTION, wsi->user_space, uri_ptr, uri_len); @@ -479,6 +483,8 @@ lws_http_action(struct lws *wsi) "http://", "https://" }; + // lwsl_err("inin '%s'\n", s); + if (!lws_hdr_total_length(wsi, WSI_TOKEN_HOST)) goto bail_nuke_ah; if (lws_add_http_header_status(wsi, 301, &p, end)) @@ -550,7 +556,7 @@ lws_http_action(struct lws *wsi) if (!s) s = "index.html"; - + // lwsl_err("okok\n"); n = lws_http_serve(wsi, s, hit->origin); } else @@ -632,8 +638,8 @@ lws_handshake_server(struct lws *wsi, unsigned char **buf, size_t len) } #ifdef LWS_USE_HTTP2 if (!strcasecmp(lws_hdr_simple_ptr(wsi, WSI_TOKEN_UPGRADE), - "h2c-14")) { - lwsl_info("Upgrade to h2c-14\n"); + "h2c")) { + lwsl_info("Upgrade to h2c\n"); goto upgrade_h2c; } #endif diff --git a/lib/ssl-http2.c b/lib/ssl-http2.c index f1344c23..f03ee602 100644 --- a/lib/ssl-http2.c +++ b/lib/ssl-http2.c @@ -87,16 +87,16 @@ alpn_cb(SSL *s, const unsigned char **out, unsigned char *outlen, #endif LWS_VISIBLE void -lws_context_init_http2_ssl(struct lws_context *context) +lws_context_init_http2_ssl(struct lws_vhost *vhost) { #if OPENSSL_VERSION_NUMBER >= 0x10002000L - static struct alpn_ctx protos = { (unsigned char *)"\x05h2-14" + static struct alpn_ctx protos = { (unsigned char *)"\x02h2" "\x08http/1.1", 6 + 9 }; - SSL_CTX_set_next_protos_advertised_cb(context->ssl_ctx, npn_cb, &protos); + SSL_CTX_set_next_protos_advertised_cb(vhost->ssl_ctx, npn_cb, &protos); // ALPN selection callback - SSL_CTX_set_alpn_select_cb(context->ssl_ctx, alpn_cb, &protos); + SSL_CTX_set_alpn_select_cb(vhost->ssl_ctx, alpn_cb, &protos); lwsl_notice(" HTTP2 / ALPN enabled\n"); #else lwsl_notice( diff --git a/lib/ssl-server.c b/lib/ssl-server.c index 55ff61bd..f544fbe9 100644 --- a/lib/ssl-server.c +++ b/lib/ssl-server.c @@ -366,7 +366,7 @@ lws_context_init_server_ssl(struct lws_context_creation_info *info, * If we're supporting HTTP2, initialize that */ - lws_context_init_http2_ssl(context); + lws_context_init_http2_ssl(vhost); } return 0; diff --git a/lib/ssl.c b/lib/ssl.c index 1bb8e0c2..b4722b39 100644 --- a/lib/ssl.c +++ b/lib/ssl.c @@ -98,8 +98,12 @@ lws_ssl_destroy(struct lws_vhost *vhost) #if (OPENSSL_VERSION_NUMBER < 0x01000000) || defined(USE_WOLFSSL) ERR_remove_state(0); +#else +#if (OPENSSL_VERSION_NUMBER >= 0x10100005L) + ERR_remove_thread_state(); #else ERR_remove_thread_state(NULL); +#endif #endif ERR_free_strings(); EVP_cleanup(); @@ -442,8 +446,12 @@ lws_ssl_context_destroy(struct lws_context *context) { #if (OPENSSL_VERSION_NUMBER < 0x01000000) || defined(USE_WOLFSSL) ERR_remove_state(0); +#else +#if (OPENSSL_VERSION_NUMBER >= 0x10100005L) + ERR_remove_thread_state(); #else ERR_remove_thread_state(NULL); +#endif #endif ERR_free_strings(); EVP_cleanup(); diff --git a/lwsws/main.c b/lwsws/main.c index 24fc31d1..8d84552b 100644 --- a/lwsws/main.c +++ b/lwsws/main.c @@ -133,6 +133,7 @@ int main(int argc, char **argv) #ifndef _WIN32 syslog_options &= ~LOG_PERROR; #endif + printf("Daemonizing...\n"); break; #endif case 'd': @@ -159,6 +160,8 @@ int main(int argc, char **argv) fprintf(stderr, "Failed to daemonize\n"); return 10; } + if (daemonize) + lwsl_notice("Daemonized\n"); #endif signal(SIGINT, sighandler); diff --git a/plugins/protocol_dumb_increment.c b/plugins/protocol_dumb_increment.c index f26e5936..711251b5 100644 --- a/plugins/protocol_dumb_increment.c +++ b/plugins/protocol_dumb_increment.c @@ -18,6 +18,7 @@ * Public Domain. */ #include "../lib/libwebsockets.h" +#include struct per_vhost_data__dumb_increment { uv_timer_t timeout_watcher; diff --git a/plugins/protocol_lws_mirror.c b/plugins/protocol_lws_mirror.c index ba656603..05614db9 100644 --- a/plugins/protocol_lws_mirror.c +++ b/plugins/protocol_lws_mirror.c @@ -18,6 +18,7 @@ * Public Domain. */ #include "../lib/libwebsockets.h" +#include /* lws-mirror_protocol */ diff --git a/plugins/protocol_lws_status.c b/plugins/protocol_lws_status.c index fabaf6d0..359fd940 100644 --- a/plugins/protocol_lws_status.c +++ b/plugins/protocol_lws_status.c @@ -19,6 +19,7 @@ */ #include "../lib/libwebsockets.h" #include +#include struct per_session_data__lws_status { struct per_session_data__lws_status *list; -- 2.34.1