diff --git a/changelog b/changelog index b2ef533b..9be12684 100644 --- a/changelog +++ b/changelog @@ -75,6 +75,11 @@ feature. Input sanitization added to the js. 7) client connections attempted when no ah is free no longer fail, they are just deferred until an ah becomes available. +8) The test client pays attention to if you give it an http:/ or https:// +protocol string to its argument in URL format. If so, it stays in http[s] +client mode and doesn't upgrade to ws[s], allowing you to do generic http client +operations. + User API additions ------------------ @@ -125,6 +130,24 @@ this generates this kind of timestamp for use as logging preamble lwsts[13116]: [2016/01/25 14:52:52:8386] NOTICE: Initial logging level 7 +5) struct lws_client_connect_info has a new member + + const char *method + +If it's NULL, then everything happens as before, lws_client_connect_via_info() +makes a ws or wss connection to the address given. + +If you set method to a valid http method like "GET", though, then this method +is used and the connection remains in http[s], it's not upgraded to ws[s]. + +So with this, you can perform http[s] client operations as well as ws[s] ones. + +There are 4 new related callbacks + + LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44, + LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45, + LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46, + LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47, v1.7.0 diff --git a/lib/client-handshake.c b/lib/client-handshake.c index aaeb335d..d1baa0eb 100644 --- a/lib/client-handshake.c +++ b/lib/client-handshake.c @@ -383,7 +383,7 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) wsi->context = i->context; /* assert the mode and union status (hdr) clearly */ - lws_union_transition(wsi, LWSCM_HTTP_SERVING); + lws_union_transition(wsi, LWSCM_HTTP_CLIENT); wsi->sock = LWS_SOCK_INVALID; /* 1) fill up the wsi with stuff from the connect_info as far as it @@ -417,6 +417,11 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) goto bail; } #endif + wsi->protocol = &i->context->protocols[0]; + if (wsi && !wsi->user_space && i->userdata) { + wsi->user_space_externally_allocated = 1; + wsi->user_space = i->userdata; + } /* 2) stash the things from connect_info that we can't process without * an ah. Because if no ah, we will go on the ah waiting list and @@ -432,6 +437,7 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) wsi->u.hdr.stash->origin[0] = '\0'; wsi->u.hdr.stash->protocol[0] = '\0'; + wsi->u.hdr.stash->method[0] = '\0'; strncpy(wsi->u.hdr.stash->address, i->address, sizeof(wsi->u.hdr.stash->address) - 1); @@ -445,12 +451,16 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) if (i->protocol) strncpy(wsi->u.hdr.stash->protocol, i->protocol, sizeof(wsi->u.hdr.stash->protocol) - 1); + if (i->method) + strncpy(wsi->u.hdr.stash->method, i->method, + sizeof(wsi->u.hdr.stash->method) - 1); wsi->u.hdr.stash->address[sizeof(wsi->u.hdr.stash->address) - 1] = '\0'; wsi->u.hdr.stash->path[sizeof(wsi->u.hdr.stash->path) - 1] = '\0'; wsi->u.hdr.stash->host[sizeof(wsi->u.hdr.stash->host) - 1] = '\0'; wsi->u.hdr.stash->origin[sizeof(wsi->u.hdr.stash->origin) - 1] = '\0'; wsi->u.hdr.stash->protocol[sizeof(wsi->u.hdr.stash->protocol) - 1] = '\0'; + wsi->u.hdr.stash->method[sizeof(wsi->u.hdr.stash->method) - 1] = '\0'; /* if we went on the waiting list, no probs just return the wsi * when we get the ah, now or later, he will call @@ -503,6 +513,10 @@ lws_client_connect_via_info2(struct lws *wsi) if (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS, stash->protocol)) goto bail1; + if (stash->method[0]) + if (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_METHOD, + stash->method)) + goto bail1; lws_free_set_NULL(wsi->u.hdr.stash); diff --git a/lib/client.c b/lib/client.c index 94497e94..bb84d172 100644 --- a/lib/client.c +++ b/lib/client.c @@ -492,6 +492,51 @@ strtolower(char *s) } } +/** + * lws_http_transaction_completed() - wait for new http transaction or close + * @wsi: websocket connection + * + * Returns 1 if the HTTP connection must close now + * Returns 0 and resets connection to wait for new HTTP header / + * transaction if possible + */ + +LWS_VISIBLE int LWS_WARN_UNUSED_RESULT +lws_http_transaction_completed_client(struct lws *wsi) +{ + lwsl_debug("%s: wsi %p\n", __func__, wsi); + /* if we can't go back to accept new headers, drop the connection */ + if (wsi->u.http.connection_type != HTTP_CONNECTION_KEEP_ALIVE) { + lwsl_info("%s: %p: close connection\n", __func__, wsi); + return 1; + } + + /* otherwise set ourselves up ready to go again */ + wsi->state = LWSS_CLIENT_HTTP_ESTABLISHED; + wsi->mode = LWSCM_HTTP_CLIENT_ACCEPTED; + wsi->u.http.content_length = 0; + wsi->hdr_parsing_completed = 0; + + /* He asked for it to stay alive indefinitely */ + lws_set_timeout(wsi, NO_PENDING_TIMEOUT, 0); + + /* + * As client, nothing new is going to come until we ask for it + * we can drop the ah, if any + */ + if (wsi->u.hdr.ah) { + wsi->u.hdr.ah->rxpos = wsi->u.hdr.ah->rxlen; + lws_header_table_detach(wsi, 0); + } + + /* If we're (re)starting on headers, need other implied init */ + wsi->u.hdr.ues = URIES_IDLE; + + lwsl_info("%s: %p: keep-alive await new transaction\n", __func__, wsi); + + return 0; +} + int lws_client_interpret_server_handshake(struct lws *wsi) { @@ -499,6 +544,7 @@ lws_client_interpret_server_handshake(struct lws *wsi) struct lws_context *context = wsi->context; int close_reason = LWS_CLOSE_STATUS_PROTOCOL_ERR; const char *pc, *prot, *ads = NULL, *path; + struct allocated_headers *ah; char *p; #ifndef LWS_NO_EXTENSIONS struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi]; @@ -512,11 +558,41 @@ lws_client_interpret_server_handshake(struct lws *wsi) void *v; #endif + if (!wsi->do_ws) { + /* we are being an http client... + */ + ah = wsi->u.hdr.ah; + lws_union_transition(wsi, LWSCM_HTTP_CLIENT_ACCEPTED); + wsi->state = LWSS_CLIENT_HTTP_ESTABLISHED; + wsi->u.http.ah = ah; + } + /* * well, what the server sent looked reasonable for syntax. * Now let's confirm it sent all the necessary headers + * + * http (non-ws) client will expect something like this + * + * HTTP/1.0.200 + * server:.libwebsockets + * content-type:.text/html + * content-length:.17703 + * set-cookie:.test=LWS_1456736240_336776_COOKIE;Max-Age=360000 + * + * + * */ + + wsi->u.http.connection_type = HTTP_CONNECTION_KEEP_ALIVE; p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP); + if (wsi->do_ws && !p) { + lwsl_info("no URI\n"); + goto bail3; + } + if (!p) { + p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP1_0); + wsi->u.http.connection_type = HTTP_CONNECTION_CLOSE; + } if (!p) { lwsl_info("no URI\n"); goto bail3; @@ -539,6 +615,56 @@ lws_client_interpret_server_handshake(struct lws *wsi) } return 0; } + + if (!wsi->do_ws) { + if (n != 200) { + lwsl_notice("Connection failed with code %d", n); + goto bail2; + } + + /* allocate the per-connection user memory (if any) */ + if (lws_ensure_user_space(wsi)) { + lwsl_err("Problem allocating wsi user mem\n"); + goto bail2; + } + + if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_CONTENT_LENGTH)) { + wsi->u.http.content_length = + atoi(lws_hdr_simple_ptr(wsi, + WSI_TOKEN_HTTP_CONTENT_LENGTH)); + lwsl_notice("%s: incoming content length %d\n", __func__, + wsi->u.http.content_length); + wsi->u.http.content_remain = wsi->u.http.content_length; + } else /* can't do 1.1 without a content length */ + wsi->u.http.connection_type = HTTP_CONNECTION_CLOSE; + + /* + * we seem to be good to go, give client last chance to check + * headers and OK it + */ + if (wsi->protocol->callback(wsi, LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH, + wsi->user_space, NULL, 0)) + goto bail2; + + /* clear his proxy connection timeout */ + lws_set_timeout(wsi, NO_PENDING_TIMEOUT, 0); + + wsi->rxflow_change_to = LWS_RXFLOW_ALLOW; + + /* call him back to inform him he is up */ + if (wsi->protocol->callback(wsi, + LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP, + wsi->user_space, NULL, 0)) + goto bail3; + + /* free up his parsing allocations */ + lws_header_table_detach(wsi, 0); + + lwsl_notice("%s: client connection up\n", __func__); + + return 0; + } + if (lws_hdr_total_length(wsi, WSI_TOKEN_ACCEPT) == 0) { lwsl_info("no ACCEPT\n"); isErrorCodeReceived = 1; @@ -887,39 +1013,36 @@ lws_generate_client_handshake(struct lws *wsi, char *pkt) { char buf[128], hash[20], key_b64[40], *p = pkt; struct lws_context *context = wsi->context; + const char *meth; int n; #ifndef LWS_NO_EXTENSIONS const struct lws_extension *ext; int ext_count = 0; #endif - /* - * create the random key - */ - n = lws_get_random(context, hash, 16); - if (n != 16) { - lwsl_err("Unable to read from random dev %s\n", - SYSTEM_RANDOM_FILEPATH); - lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS); - return NULL; + meth = lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_METHOD); + if (!meth) { + meth = "GET"; + wsi->do_ws = 1; + } else + wsi->do_ws = 0; + + if (wsi->do_ws) { + /* + * create the random key + */ + n = lws_get_random(context, hash, 16); + if (n != 16) { + lwsl_err("Unable to read from random dev %s\n", + SYSTEM_RANDOM_FILEPATH); + lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS); + return NULL; + } + + lws_b64_encode_string(hash, 16, key_b64, sizeof(key_b64)); } - lws_b64_encode_string(hash, 16, key_b64, sizeof(key_b64)); - /* - * 00 example client handshake - * - * GET /socket.io/websocket HTTP/1.1 - * Upgrade: WebSocket - * Connection: Upgrade - * Host: 127.0.0.1:9999 - * Origin: http://127.0.0.1 - * Sec-WebSocket-Key1: 1 0 2#0W 9 89 7 92 ^ - * Sec-WebSocket-Key2: 7 7Y 4328 B2v[8(z1 - * Cookie: socketio=websocket - * - * (Á®Ä0¶†≥ - * * 04 example client handshake * * GET /chat HTTP/1.1 @@ -932,7 +1055,7 @@ lws_generate_client_handshake(struct lws *wsi, char *pkt) * Sec-WebSocket-Version: 4 */ - p += sprintf(p, "GET %s HTTP/1.1\x0d\x0a", + p += sprintf(p, "%s %s HTTP/1.1\x0d\x0a", meth, lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_URI)); p += sprintf(p, "Pragma: no-cache\x0d\x0a" @@ -940,65 +1063,79 @@ lws_generate_client_handshake(struct lws *wsi, char *pkt) p += sprintf(p, "Host: %s\x0d\x0a", lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_HOST)); - p += sprintf(p, "Upgrade: websocket\x0d\x0a" - "Connection: Upgrade\x0d\x0a" - "Sec-WebSocket-Key: "); - strcpy(p, key_b64); - p += strlen(key_b64); - p += sprintf(p, "\x0d\x0a"); + if (lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_ORIGIN)) p += sprintf(p, "Origin: http://%s\x0d\x0a", lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_ORIGIN)); - if (lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS)) - p += sprintf(p, "Sec-WebSocket-Protocol: %s\x0d\x0a", - lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS)); + if (wsi->do_ws) { + p += sprintf(p, "Upgrade: websocket\x0d\x0a" + "Connection: Upgrade\x0d\x0a" + "Sec-WebSocket-Key: "); + strcpy(p, key_b64); + p += strlen(key_b64); + p += sprintf(p, "\x0d\x0a"); + if (lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS)) + p += sprintf(p, "Sec-WebSocket-Protocol: %s\x0d\x0a", + lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS)); - /* tell the server what extensions we could support */ + /* tell the server what extensions we could support */ - p += sprintf(p, "Sec-WebSocket-Extensions: "); + p += sprintf(p, "Sec-WebSocket-Extensions: "); #ifndef LWS_NO_EXTENSIONS - ext = context->extensions; - while (ext && ext->callback) { - n = lws_ext_cb_all_exts(context, wsi, - LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION, - (char *)ext->name, 0); - if (n) { /* an extension vetos us */ - lwsl_ext("ext %s vetoed\n", (char *)ext->name); + ext = context->extensions; + while (ext && ext->callback) { + n = lws_ext_cb_all_exts(context, wsi, + LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION, + (char *)ext->name, 0); + if (n) { /* an extension vetos us */ + lwsl_ext("ext %s vetoed\n", (char *)ext->name); + ext++; + continue; + } + n = context->protocols[0].callback(wsi, + LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED, + wsi->user_space, (char *)ext->name, 0); + + /* + * zero return from callback means + * go ahead and allow the extension, + * it's what we get if the callback is + * unhandled + */ + + if (n) { + ext++; + continue; + } + + /* apply it */ + + if (ext_count) + *p++ = ','; + p += sprintf(p, "%s", ext->client_offer); + ext_count++; + ext++; - continue; } - n = context->protocols[0].callback(wsi, - LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED, - wsi->user_space, (char *)ext->name, 0); - - /* - * zero return from callback means - * go ahead and allow the extension, - * it's what we get if the callback is - * unhandled - */ - - if (n) { - ext++; - continue; - } - - /* apply it */ - - if (ext_count) - *p++ = ','; - p += sprintf(p, "%s", ext->client_offer); - ext_count++; - - ext++; - } #endif - p += sprintf(p, "\x0d\x0a"); + p += sprintf(p, "\x0d\x0a"); - if (wsi->ietf_spec_revision) - p += sprintf(p, "Sec-WebSocket-Version: %d\x0d\x0a", - wsi->ietf_spec_revision); + if (wsi->ietf_spec_revision) + p += sprintf(p, "Sec-WebSocket-Version: %d\x0d\x0a", + wsi->ietf_spec_revision); + + /* prepare the expected server accept response */ + + key_b64[39] = '\0'; /* enforce composed length below buf sizeof */ + n = sprintf(buf, "%s258EAFA5-E914-47DA-95CA-C5AB0DC85B11", key_b64); + + lws_SHA1((unsigned char *)buf, n, (unsigned char *)hash); + + lws_b64_encode_string(hash, 20, + wsi->u.hdr.ah->initial_handshake_hash_base64, + sizeof(wsi->u.hdr.ah->initial_handshake_hash_base64)); + } /* give userland a chance to append, eg, cookies */ @@ -1007,17 +1144,6 @@ lws_generate_client_handshake(struct lws *wsi, char *pkt) p += sprintf(p, "\x0d\x0a"); - /* prepare the expected server accept response */ - - key_b64[39] = '\0'; /* enforce composed length below buf sizeof */ - n = sprintf(buf, "%s258EAFA5-E914-47DA-95CA-C5AB0DC85B11", key_b64); - - lws_SHA1((unsigned char *)buf, n, (unsigned char *)hash); - - lws_b64_encode_string(hash, 20, - wsi->u.hdr.ah->initial_handshake_hash_base64, - sizeof(wsi->u.hdr.ah->initial_handshake_hash_base64)); - return p; } diff --git a/lib/lextable-strings.h b/lib/lextable-strings.h index 52ed26b7..6a5a267e 100644 --- a/lib/lextable-strings.h +++ b/lib/lextable-strings.h @@ -88,6 +88,7 @@ static const char *set[] = { "proxy ", "x-real-ip:", + "http/1.0 ", "", /* not matchable */ diff --git a/lib/lextable.h b/lib/lextable.h index c7f02e55..23e526d6 100644 --- a/lib/lextable.h +++ b/lib/lextable.h @@ -6,28 +6,28 @@ 0x75 /* 'u' */, 0x81, 0x00 /* (to 0x0090 state 34) */, 0x73 /* 's' */, 0x97, 0x00 /* (to 0x00A9 state 48) */, 0x0D /* '.' */, 0xD0, 0x00 /* (to 0x00E5 state 68) */, - 0x61 /* 'a' */, 0x22, 0x01 /* (to 0x013A state 129) */, - 0x69 /* 'i' */, 0x61, 0x01 /* (to 0x017C state 163) */, - 0x64 /* 'd' */, 0x0A, 0x02 /* (to 0x0228 state 265) */, - 0x72 /* 'r' */, 0x13, 0x02 /* (to 0x0234 state 270) */, - 0x3A /* ':' */, 0x44, 0x02 /* (to 0x0268 state 299) */, - 0x65 /* 'e' */, 0xD5, 0x02 /* (to 0x02FC state 414) */, - 0x66 /* 'f' */, 0xF1, 0x02 /* (to 0x031B state 430) */, - 0x6C /* 'l' */, 0x13, 0x03 /* (to 0x0340 state 463) */, - 0x6D /* 'm' */, 0x36, 0x03 /* (to 0x0366 state 489) */, - 0x74 /* 't' */, 0xA5, 0x03 /* (to 0x03D8 state 583) */, - 0x76 /* 'v' */, 0xC0, 0x03 /* (to 0x03F6 state 611) */, - 0x77 /* 'w' */, 0xCD, 0x03 /* (to 0x0406 state 619) */, - 0x78 /* 'x' */, 0xF4, 0x03 /* (to 0x0430 state 655) */, + 0x61 /* 'a' */, 0x28, 0x01 /* (to 0x0140 state 129) */, + 0x69 /* 'i' */, 0x67, 0x01 /* (to 0x0182 state 163) */, + 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) */, 0x08, /* fail */ /* pos 0040: 1 */ 0xE5 /* 'e' -> */, /* pos 0041: 2 */ 0xF4 /* 't' -> */, /* pos 0042: 3 */ 0xA0 /* ' ' -> */, /* pos 0043: 4 */ 0x00, 0x00 /* - terminal marker 0 - */, /* pos 0045: 5 */ 0x6F /* 'o' */, 0x0D, 0x00 /* (to 0x0052 state 6) */, - 0x72 /* 'r' */, 0x86, 0x01 /* (to 0x01CE state 211) */, - 0x61 /* 'a' */, 0xCD, 0x03 /* (to 0x0418 state 636) */, - 0x75 /* 'u' */, 0xCF, 0x03 /* (to 0x041D state 640) */, + 0x72 /* 'r' */, 0x8C, 0x01 /* (to 0x01D4 state 211) */, + 0x61 /* 'a' */, 0xD3, 0x03 /* (to 0x041E state 636) */, + 0x75 /* 'u' */, 0xD5, 0x03 /* (to 0x0423 state 640) */, 0x08, /* fail */ /* pos 0052: 6 */ 0xF3 /* 's' -> */, /* pos 0053: 7 */ 0xF4 /* 't' -> */, @@ -51,13 +51,13 @@ /* pos 006f: 21 */ 0xBA /* ':' -> */, /* pos 0070: 22 */ 0x00, 0x03 /* - terminal marker 3 - */, /* pos 0072: 23 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0079 state 24) */, - 0x61 /* 'a' */, 0x66, 0x01 /* (to 0x01DB state 217) */, + 0x61 /* 'a' */, 0x6C, 0x01 /* (to 0x01E1 state 217) */, 0x08, /* fail */ /* pos 0079: 24 */ 0x6E /* 'n' */, 0x07, 0x00 /* (to 0x0080 state 25) */, - 0x6F /* 'o' */, 0x7B, 0x01 /* (to 0x01F7 state 243) */, + 0x6F /* 'o' */, 0x81, 0x01 /* (to 0x01FD state 243) */, 0x08, /* fail */ /* pos 0080: 25 */ 0x6E /* 'n' */, 0x07, 0x00 /* (to 0x0087 state 26) */, - 0x74 /* 't' */, 0x7A, 0x01 /* (to 0x01FD state 248) */, + 0x74 /* 't' */, 0x80, 0x01 /* (to 0x0203 state 248) */, 0x08, /* fail */ /* pos 0087: 26 */ 0xE5 /* 'e' -> */, /* pos 0088: 27 */ 0xE3 /* 'c' -> */, @@ -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' */, 0x58, 0x03 /* (to 0x03EB state 601) */, - 0x72 /* 'r' */, 0x90, 0x03 /* (to 0x0426 state 647) */, + 0x73 /* 's' */, 0x5E, 0x03 /* (to 0x03F1 state 601) */, + 0x72 /* 'r' */, 0x96, 0x03 /* (to 0x042C state 647) */, 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' */, 0x12, 0x03 /* (to 0x03BE state 558) */, + 0x74 /* 't' */, 0x18, 0x03 /* (to 0x03C4 state 558) */, 0x08, /* fail */ /* pos 00b0: 49 */ 0x63 /* 'c' */, 0x0A, 0x00 /* (to 0x00BA state 50) */, - 0x72 /* 'r' */, 0xFB, 0x02 /* (to 0x03AE state 544) */, - 0x74 /* 't' */, 0xFE, 0x02 /* (to 0x03B4 state 549) */, + 0x72 /* 'r' */, 0x01, 0x03 /* (to 0x03B4 state 544) */, + 0x74 /* 't' */, 0x04, 0x03 /* (to 0x03BA state 549) */, 0x08, /* fail */ /* pos 00ba: 50 */ 0xAD /* '-' -> */, /* pos 00bb: 51 */ 0xF7 /* 'w' -> */, @@ -108,8 +108,8 @@ 0x70 /* 'p' */, 0x38, 0x00 /* (to 0x0106 state 88) */, 0x61 /* 'a' */, 0x3F, 0x00 /* (to 0x0110 state 97) */, 0x6E /* 'n' */, 0x44, 0x00 /* (to 0x0118 state 104) */, - 0x76 /* 'v' */, 0x80, 0x01 /* (to 0x0257 state 284) */, - 0x6F /* 'o' */, 0x86, 0x01 /* (to 0x0260 state 292) */, + 0x76 /* 'v' */, 0x86, 0x01 /* (to 0x025D state 284) */, + 0x6F /* 'o' */, 0x8C, 0x01 /* (to 0x0266 state 292) */, 0x08, /* fail */ /* pos 00de: 62 */ 0xF2 /* 'r' -> */, /* pos 00df: 63 */ 0xE1 /* 'a' -> */, @@ -134,7 +134,7 @@ /* pos 00f5: 82 */ 0xF9 /* 'y' -> */, /* pos 00f6: 83 */ 0x31 /* '1' */, 0x0A, 0x00 /* (to 0x0100 state 84) */, 0x32 /* '2' */, 0x0A, 0x00 /* (to 0x0103 state 86) */, - 0x3A /* ':' */, 0x59, 0x01 /* (to 0x0255 state 283) */, + 0x3A /* ':' */, 0x5F, 0x01 /* (to 0x025B state 283) */, 0x08, /* fail */ /* pos 0100: 84 */ 0xBA /* ':' -> */, /* pos 0101: 85 */ 0x00, 0x0A /* - terminal marker 10 - */, @@ -165,615 +165,619 @@ /* pos 011f: 110 */ 0xF4 /* 't' -> */, /* pos 0120: 111 */ 0xF0 /* 'p' -> */, /* pos 0121: 112 */ 0x2F /* '/' */, 0x07, 0x00 /* (to 0x0128 state 113) */, - 0x32 /* '2' */, 0x0A, 0x00 /* (to 0x012E state 118) */, + 0x32 /* '2' */, 0x10, 0x00 /* (to 0x0134 state 118) */, 0x08, /* fail */ /* pos 0128: 113 */ 0xB1 /* '1' -> */, /* pos 0129: 114 */ 0xAE /* '.' -> */, -/* pos 012a: 115 */ 0xB1 /* '1' -> */, -/* pos 012b: 116 */ 0xA0 /* ' ' -> */, -/* pos 012c: 117 */ 0x00, 0x0F /* - terminal marker 15 - */, -/* pos 012e: 118 */ 0xAD /* '-' -> */, -/* pos 012f: 119 */ 0xF3 /* 's' -> */, -/* pos 0130: 120 */ 0xE5 /* 'e' -> */, -/* pos 0131: 121 */ 0xF4 /* 't' -> */, -/* pos 0132: 122 */ 0xF4 /* 't' -> */, -/* pos 0133: 123 */ 0xE9 /* 'i' -> */, -/* pos 0134: 124 */ 0xEE /* 'n' -> */, -/* pos 0135: 125 */ 0xE7 /* 'g' -> */, -/* pos 0136: 126 */ 0xF3 /* 's' -> */, -/* pos 0137: 127 */ 0xBA /* ':' -> */, -/* pos 0138: 128 */ 0x00, 0x10 /* - terminal marker 16 - */, -/* pos 013a: 129 */ 0x63 /* 'c' */, 0x0D, 0x00 /* (to 0x0147 state 130) */, - 0x75 /* 'u' */, 0xAC, 0x00 /* (to 0x01E9 state 230) */, - 0x67 /* 'g' */, 0x82, 0x01 /* (to 0x02C2 state 363) */, - 0x6C /* 'l' */, 0x83, 0x01 /* (to 0x02C6 state 366) */, +/* pos 012a: 115 */ 0x31 /* '1' */, 0x07, 0x00 /* (to 0x0131 state 116) */, + 0x30 /* '0' */, 0x14, 0x03 /* (to 0x0441 state 665) */, 0x08, /* fail */ -/* pos 0147: 130 */ 0xE3 /* 'c' -> */, -/* pos 0148: 131 */ 0xE5 /* 'e' -> */, -/* pos 0149: 132 */ 0x70 /* 'p' */, 0x07, 0x00 /* (to 0x0150 state 133) */, - 0x73 /* 's' */, 0x0E, 0x00 /* (to 0x015A state 136) */, +/* pos 0131: 116 */ 0xA0 /* ' ' -> */, +/* pos 0132: 117 */ 0x00, 0x0F /* - terminal marker 15 - */, +/* pos 0134: 118 */ 0xAD /* '-' -> */, +/* pos 0135: 119 */ 0xF3 /* 's' -> */, +/* pos 0136: 120 */ 0xE5 /* 'e' -> */, +/* pos 0137: 121 */ 0xF4 /* 't' -> */, +/* pos 0138: 122 */ 0xF4 /* 't' -> */, +/* pos 0139: 123 */ 0xE9 /* 'i' -> */, +/* pos 013a: 124 */ 0xEE /* 'n' -> */, +/* pos 013b: 125 */ 0xE7 /* 'g' -> */, +/* pos 013c: 126 */ 0xF3 /* 's' -> */, +/* pos 013d: 127 */ 0xBA /* ':' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 0150: 133 */ 0xF4 /* 't' -> */, -/* pos 0151: 134 */ 0x3A /* ':' */, 0x07, 0x00 /* (to 0x0158 state 135) */, - 0x2D /* '-' */, 0x59, 0x00 /* (to 0x01AD state 192) */, +/* pos 014d: 130 */ 0xE3 /* 'c' -> */, +/* pos 014e: 131 */ 0xE5 /* 'e' -> */, +/* pos 014f: 132 */ 0x70 /* 'p' */, 0x07, 0x00 /* (to 0x0156 state 133) */, + 0x73 /* 's' */, 0x0E, 0x00 /* (to 0x0160 state 136) */, 0x08, /* fail */ -/* pos 0158: 135 */ 0x00, 0x11 /* - terminal marker 17 - */, -/* pos 015a: 136 */ 0xF3 /* 's' -> */, -/* pos 015b: 137 */ 0xAD /* '-' -> */, -/* pos 015c: 138 */ 0xE3 /* 'c' -> */, -/* pos 015d: 139 */ 0xEF /* 'o' -> */, -/* pos 015e: 140 */ 0xEE /* 'n' -> */, -/* pos 015f: 141 */ 0xF4 /* 't' -> */, -/* pos 0160: 142 */ 0xF2 /* 'r' -> */, -/* pos 0161: 143 */ 0xEF /* 'o' -> */, -/* pos 0162: 144 */ 0xEC /* 'l' -> */, -/* pos 0163: 145 */ 0xAD /* '-' -> */, -/* pos 0164: 146 */ 0x72 /* 'r' */, 0x07, 0x00 /* (to 0x016B state 147) */, - 0x61 /* 'a' */, 0x4D, 0x01 /* (to 0x02B4 state 350) */, +/* pos 0156: 133 */ 0xF4 /* 't' -> */, +/* pos 0157: 134 */ 0x3A /* ':' */, 0x07, 0x00 /* (to 0x015E state 135) */, + 0x2D /* '-' */, 0x59, 0x00 /* (to 0x01B3 state 192) */, 0x08, /* fail */ -/* pos 016b: 147 */ 0xE5 /* 'e' -> */, -/* pos 016c: 148 */ 0xF1 /* 'q' -> */, -/* pos 016d: 149 */ 0xF5 /* 'u' -> */, -/* pos 016e: 150 */ 0xE5 /* 'e' -> */, -/* pos 016f: 151 */ 0xF3 /* 's' -> */, -/* pos 0170: 152 */ 0xF4 /* 't' -> */, -/* pos 0171: 153 */ 0xAD /* '-' -> */, -/* pos 0172: 154 */ 0xE8 /* 'h' -> */, -/* pos 0173: 155 */ 0xE5 /* 'e' -> */, -/* pos 0174: 156 */ 0xE1 /* 'a' -> */, -/* pos 0175: 157 */ 0xE4 /* 'd' -> */, -/* pos 0176: 158 */ 0xE5 /* 'e' -> */, -/* pos 0177: 159 */ 0xF2 /* 'r' -> */, -/* pos 0178: 160 */ 0xF3 /* 's' -> */, -/* pos 0179: 161 */ 0xBA /* ':' -> */, -/* pos 017a: 162 */ 0x00, 0x12 /* - terminal marker 18 - */, -/* pos 017c: 163 */ 0xE6 /* 'f' -> */, -/* pos 017d: 164 */ 0xAD /* '-' -> */, -/* pos 017e: 165 */ 0x6D /* 'm' */, 0x0D, 0x00 /* (to 0x018B state 166) */, - 0x6E /* 'n' */, 0x20, 0x00 /* (to 0x01A1 state 181) */, - 0x72 /* 'r' */, 0xA3, 0x01 /* (to 0x0327 state 440) */, - 0x75 /* 'u' */, 0xA7, 0x01 /* (to 0x032E state 446) */, +/* pos 015e: 135 */ 0x00, 0x11 /* - terminal marker 17 - */, +/* pos 0160: 136 */ 0xF3 /* 's' -> */, +/* pos 0161: 137 */ 0xAD /* '-' -> */, +/* pos 0162: 138 */ 0xE3 /* 'c' -> */, +/* pos 0163: 139 */ 0xEF /* 'o' -> */, +/* pos 0164: 140 */ 0xEE /* 'n' -> */, +/* pos 0165: 141 */ 0xF4 /* 't' -> */, +/* pos 0166: 142 */ 0xF2 /* 'r' -> */, +/* pos 0167: 143 */ 0xEF /* 'o' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 018b: 166 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0192 state 167) */, - 0x61 /* 'a' */, 0x93, 0x01 /* (to 0x0321 state 435) */, +/* pos 0171: 147 */ 0xE5 /* 'e' -> */, +/* pos 0172: 148 */ 0xF1 /* 'q' -> */, +/* pos 0173: 149 */ 0xF5 /* 'u' -> */, +/* pos 0174: 150 */ 0xE5 /* 'e' -> */, +/* pos 0175: 151 */ 0xF3 /* 's' -> */, +/* pos 0176: 152 */ 0xF4 /* 't' -> */, +/* pos 0177: 153 */ 0xAD /* '-' -> */, +/* pos 0178: 154 */ 0xE8 /* 'h' -> */, +/* pos 0179: 155 */ 0xE5 /* 'e' -> */, +/* pos 017a: 156 */ 0xE1 /* 'a' -> */, +/* pos 017b: 157 */ 0xE4 /* 'd' -> */, +/* pos 017c: 158 */ 0xE5 /* 'e' -> */, +/* pos 017d: 159 */ 0xF2 /* 'r' -> */, +/* pos 017e: 160 */ 0xF3 /* 's' -> */, +/* pos 017f: 161 */ 0xBA /* ':' -> */, +/* pos 0180: 162 */ 0x00, 0x12 /* - terminal marker 18 - */, +/* pos 0182: 163 */ 0xE6 /* 'f' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 0192: 167 */ 0xE4 /* 'd' -> */, -/* pos 0193: 168 */ 0xE9 /* 'i' -> */, -/* pos 0194: 169 */ 0xE6 /* 'f' -> */, -/* pos 0195: 170 */ 0xE9 /* 'i' -> */, -/* pos 0196: 171 */ 0xE5 /* 'e' -> */, -/* pos 0197: 172 */ 0xE4 /* 'd' -> */, -/* pos 0198: 173 */ 0xAD /* '-' -> */, -/* pos 0199: 174 */ 0xF3 /* 's' -> */, -/* pos 019a: 175 */ 0xE9 /* 'i' -> */, -/* pos 019b: 176 */ 0xEE /* 'n' -> */, -/* pos 019c: 177 */ 0xE3 /* 'c' -> */, -/* pos 019d: 178 */ 0xE5 /* 'e' -> */, -/* pos 019e: 179 */ 0xBA /* ':' -> */, -/* pos 019f: 180 */ 0x00, 0x13 /* - terminal marker 19 - */, -/* pos 01a1: 181 */ 0xEF /* 'o' -> */, -/* pos 01a2: 182 */ 0xEE /* 'n' -> */, -/* pos 01a3: 183 */ 0xE5 /* 'e' -> */, -/* pos 01a4: 184 */ 0xAD /* '-' -> */, -/* pos 01a5: 185 */ 0xED /* 'm' -> */, -/* pos 01a6: 186 */ 0xE1 /* 'a' -> */, -/* pos 01a7: 187 */ 0xF4 /* 't' -> */, -/* pos 01a8: 188 */ 0xE3 /* 'c' -> */, -/* pos 01a9: 189 */ 0xE8 /* 'h' -> */, -/* pos 01aa: 190 */ 0xBA /* ':' -> */, -/* pos 01ab: 191 */ 0x00, 0x14 /* - terminal marker 20 - */, -/* pos 01ad: 192 */ 0x65 /* 'e' */, 0x0D, 0x00 /* (to 0x01BA state 193) */, - 0x6C /* 'l' */, 0x14, 0x00 /* (to 0x01C4 state 202) */, - 0x63 /* 'c' */, 0xF0, 0x00 /* (to 0x02A3 state 335) */, - 0x72 /* 'r' */, 0xF6, 0x00 /* (to 0x02AC state 343) */, +/* pos 0191: 166 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0198 state 167) */, + 0x61 /* 'a' */, 0x93, 0x01 /* (to 0x0327 state 435) */, 0x08, /* fail */ -/* pos 01ba: 193 */ 0xEE /* 'n' -> */, -/* pos 01bb: 194 */ 0xE3 /* 'c' -> */, -/* pos 01bc: 195 */ 0xEF /* 'o' -> */, -/* pos 01bd: 196 */ 0xE4 /* 'd' -> */, -/* pos 01be: 197 */ 0xE9 /* 'i' -> */, -/* pos 01bf: 198 */ 0xEE /* 'n' -> */, -/* pos 01c0: 199 */ 0xE7 /* 'g' -> */, -/* pos 01c1: 200 */ 0xBA /* ':' -> */, -/* pos 01c2: 201 */ 0x00, 0x15 /* - terminal marker 21 - */, -/* pos 01c4: 202 */ 0xE1 /* 'a' -> */, -/* pos 01c5: 203 */ 0xEE /* 'n' -> */, -/* pos 01c6: 204 */ 0xE7 /* 'g' -> */, -/* pos 01c7: 205 */ 0xF5 /* 'u' -> */, -/* pos 01c8: 206 */ 0xE1 /* 'a' -> */, -/* pos 01c9: 207 */ 0xE7 /* 'g' -> */, -/* pos 01ca: 208 */ 0xE5 /* 'e' -> */, -/* pos 01cb: 209 */ 0xBA /* ':' -> */, -/* pos 01cc: 210 */ 0x00, 0x16 /* - terminal marker 22 - */, -/* pos 01ce: 211 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x01D5 state 212) */, - 0x6F /* 'o' */, 0xA3, 0x01 /* (to 0x0374 state 502) */, +/* pos 0198: 167 */ 0xE4 /* 'd' -> */, +/* pos 0199: 168 */ 0xE9 /* 'i' -> */, +/* pos 019a: 169 */ 0xE6 /* 'f' -> */, +/* pos 019b: 170 */ 0xE9 /* 'i' -> */, +/* pos 019c: 171 */ 0xE5 /* 'e' -> */, +/* pos 019d: 172 */ 0xE4 /* 'd' -> */, +/* pos 019e: 173 */ 0xAD /* '-' -> */, +/* pos 019f: 174 */ 0xF3 /* 's' -> */, +/* pos 01a0: 175 */ 0xE9 /* 'i' -> */, +/* pos 01a1: 176 */ 0xEE /* 'n' -> */, +/* pos 01a2: 177 */ 0xE3 /* 'c' -> */, +/* pos 01a3: 178 */ 0xE5 /* 'e' -> */, +/* pos 01a4: 179 */ 0xBA /* ':' -> */, +/* pos 01a5: 180 */ 0x00, 0x13 /* - terminal marker 19 - */, +/* pos 01a7: 181 */ 0xEF /* 'o' -> */, +/* pos 01a8: 182 */ 0xEE /* 'n' -> */, +/* pos 01a9: 183 */ 0xE5 /* 'e' -> */, +/* pos 01aa: 184 */ 0xAD /* '-' -> */, +/* pos 01ab: 185 */ 0xED /* 'm' -> */, +/* pos 01ac: 186 */ 0xE1 /* 'a' -> */, +/* pos 01ad: 187 */ 0xF4 /* 't' -> */, +/* pos 01ae: 188 */ 0xE3 /* 'c' -> */, +/* pos 01af: 189 */ 0xE8 /* 'h' -> */, +/* pos 01b0: 190 */ 0xBA /* ':' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 01d5: 212 */ 0xE7 /* 'g' -> */, -/* pos 01d6: 213 */ 0xED /* 'm' -> */, -/* pos 01d7: 214 */ 0xE1 /* 'a' -> */, -/* pos 01d8: 215 */ 0xBA /* ':' -> */, -/* pos 01d9: 216 */ 0x00, 0x17 /* - terminal marker 23 - */, -/* pos 01db: 217 */ 0xE3 /* 'c' -> */, -/* pos 01dc: 218 */ 0xE8 /* 'h' -> */, -/* pos 01dd: 219 */ 0xE5 /* 'e' -> */, -/* pos 01de: 220 */ 0xAD /* '-' -> */, -/* pos 01df: 221 */ 0xE3 /* 'c' -> */, -/* pos 01e0: 222 */ 0xEF /* 'o' -> */, -/* pos 01e1: 223 */ 0xEE /* 'n' -> */, -/* pos 01e2: 224 */ 0xF4 /* 't' -> */, -/* pos 01e3: 225 */ 0xF2 /* 'r' -> */, -/* pos 01e4: 226 */ 0xEF /* 'o' -> */, -/* pos 01e5: 227 */ 0xEC /* 'l' -> */, -/* pos 01e6: 228 */ 0xBA /* ':' -> */, -/* pos 01e7: 229 */ 0x00, 0x18 /* - terminal marker 24 - */, -/* pos 01e9: 230 */ 0xF4 /* 't' -> */, -/* pos 01ea: 231 */ 0xE8 /* 'h' -> */, -/* pos 01eb: 232 */ 0xEF /* 'o' -> */, -/* pos 01ec: 233 */ 0xF2 /* 'r' -> */, -/* pos 01ed: 234 */ 0xE9 /* 'i' -> */, -/* pos 01ee: 235 */ 0xFA /* 'z' -> */, -/* pos 01ef: 236 */ 0xE1 /* 'a' -> */, -/* pos 01f0: 237 */ 0xF4 /* 't' -> */, -/* pos 01f1: 238 */ 0xE9 /* 'i' -> */, -/* pos 01f2: 239 */ 0xEF /* 'o' -> */, -/* pos 01f3: 240 */ 0xEE /* 'n' -> */, -/* pos 01f4: 241 */ 0xBA /* ':' -> */, -/* pos 01f5: 242 */ 0x00, 0x19 /* - terminal marker 25 - */, -/* pos 01f7: 243 */ 0xEB /* 'k' -> */, -/* pos 01f8: 244 */ 0xE9 /* 'i' -> */, -/* pos 01f9: 245 */ 0xE5 /* 'e' -> */, -/* pos 01fa: 246 */ 0xBA /* ':' -> */, -/* pos 01fb: 247 */ 0x00, 0x1A /* - terminal marker 26 - */, -/* pos 01fd: 248 */ 0xE5 /* 'e' -> */, -/* pos 01fe: 249 */ 0xEE /* 'n' -> */, -/* pos 01ff: 250 */ 0xF4 /* 't' -> */, -/* pos 0200: 251 */ 0xAD /* '-' -> */, -/* pos 0201: 252 */ 0x6C /* 'l' */, 0x10, 0x00 /* (to 0x0211 state 253) */, - 0x74 /* 't' */, 0x1E, 0x00 /* (to 0x0222 state 260) */, - 0x64 /* 'd' */, 0xC5, 0x00 /* (to 0x02CC state 371) */, - 0x65 /* 'e' */, 0xCF, 0x00 /* (to 0x02D9 state 383) */, - 0x72 /* 'r' */, 0xE8, 0x00 /* (to 0x02F5 state 408) */, +/* pos 01c0: 193 */ 0xEE /* 'n' -> */, +/* pos 01c1: 194 */ 0xE3 /* 'c' -> */, +/* pos 01c2: 195 */ 0xEF /* 'o' -> */, +/* pos 01c3: 196 */ 0xE4 /* 'd' -> */, +/* pos 01c4: 197 */ 0xE9 /* 'i' -> */, +/* pos 01c5: 198 */ 0xEE /* 'n' -> */, +/* pos 01c6: 199 */ 0xE7 /* 'g' -> */, +/* pos 01c7: 200 */ 0xBA /* ':' -> */, +/* pos 01c8: 201 */ 0x00, 0x15 /* - terminal marker 21 - */, +/* pos 01ca: 202 */ 0xE1 /* 'a' -> */, +/* pos 01cb: 203 */ 0xEE /* 'n' -> */, +/* pos 01cc: 204 */ 0xE7 /* 'g' -> */, +/* pos 01cd: 205 */ 0xF5 /* 'u' -> */, +/* pos 01ce: 206 */ 0xE1 /* 'a' -> */, +/* pos 01cf: 207 */ 0xE7 /* 'g' -> */, +/* pos 01d0: 208 */ 0xE5 /* 'e' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 0211: 253 */ 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x021B state 254) */, - 0x61 /* 'a' */, 0xCF, 0x00 /* (to 0x02E3 state 392) */, - 0x6F /* 'o' */, 0xD5, 0x00 /* (to 0x02EC state 400) */, +/* pos 01db: 212 */ 0xE7 /* 'g' -> */, +/* pos 01dc: 213 */ 0xED /* 'm' -> */, +/* pos 01dd: 214 */ 0xE1 /* 'a' -> */, +/* pos 01de: 215 */ 0xBA /* ':' -> */, +/* pos 01df: 216 */ 0x00, 0x17 /* - terminal marker 23 - */, +/* pos 01e1: 217 */ 0xE3 /* 'c' -> */, +/* pos 01e2: 218 */ 0xE8 /* 'h' -> */, +/* pos 01e3: 219 */ 0xE5 /* 'e' -> */, +/* pos 01e4: 220 */ 0xAD /* '-' -> */, +/* pos 01e5: 221 */ 0xE3 /* 'c' -> */, +/* pos 01e6: 222 */ 0xEF /* 'o' -> */, +/* pos 01e7: 223 */ 0xEE /* 'n' -> */, +/* pos 01e8: 224 */ 0xF4 /* 't' -> */, +/* pos 01e9: 225 */ 0xF2 /* 'r' -> */, +/* pos 01ea: 226 */ 0xEF /* 'o' -> */, +/* pos 01eb: 227 */ 0xEC /* 'l' -> */, +/* pos 01ec: 228 */ 0xBA /* ':' -> */, +/* pos 01ed: 229 */ 0x00, 0x18 /* - terminal marker 24 - */, +/* pos 01ef: 230 */ 0xF4 /* 't' -> */, +/* pos 01f0: 231 */ 0xE8 /* 'h' -> */, +/* pos 01f1: 232 */ 0xEF /* 'o' -> */, +/* pos 01f2: 233 */ 0xF2 /* 'r' -> */, +/* pos 01f3: 234 */ 0xE9 /* 'i' -> */, +/* pos 01f4: 235 */ 0xFA /* 'z' -> */, +/* pos 01f5: 236 */ 0xE1 /* 'a' -> */, +/* pos 01f6: 237 */ 0xF4 /* 't' -> */, +/* pos 01f7: 238 */ 0xE9 /* 'i' -> */, +/* pos 01f8: 239 */ 0xEF /* 'o' -> */, +/* pos 01f9: 240 */ 0xEE /* 'n' -> */, +/* pos 01fa: 241 */ 0xBA /* ':' -> */, +/* pos 01fb: 242 */ 0x00, 0x19 /* - terminal marker 25 - */, +/* pos 01fd: 243 */ 0xEB /* 'k' -> */, +/* pos 01fe: 244 */ 0xE9 /* 'i' -> */, +/* pos 01ff: 245 */ 0xE5 /* 'e' -> */, +/* pos 0200: 246 */ 0xBA /* ':' -> */, +/* pos 0201: 247 */ 0x00, 0x1A /* - terminal marker 26 - */, +/* pos 0203: 248 */ 0xE5 /* 'e' -> */, +/* pos 0204: 249 */ 0xEE /* 'n' -> */, +/* pos 0205: 250 */ 0xF4 /* 't' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 021b: 254 */ 0xEE /* 'n' -> */, -/* pos 021c: 255 */ 0xE7 /* 'g' -> */, -/* pos 021d: 256 */ 0xF4 /* 't' -> */, -/* pos 021e: 257 */ 0xE8 /* 'h' -> */, -/* pos 021f: 258 */ 0xBA /* ':' -> */, -/* pos 0220: 259 */ 0x00, 0x1B /* - terminal marker 27 - */, -/* pos 0222: 260 */ 0xF9 /* 'y' -> */, -/* pos 0223: 261 */ 0xF0 /* 'p' -> */, -/* pos 0224: 262 */ 0xE5 /* 'e' -> */, -/* pos 0225: 263 */ 0xBA /* ':' -> */, -/* pos 0226: 264 */ 0x00, 0x1C /* - terminal marker 28 - */, -/* pos 0228: 265 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x022F state 266) */, - 0x65 /* 'e' */, 0xF5, 0x01 /* (to 0x0420 state 642) */, +/* 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) */, 0x08, /* fail */ -/* pos 022f: 266 */ 0xF4 /* 't' -> */, -/* pos 0230: 267 */ 0xE5 /* 'e' -> */, -/* pos 0231: 268 */ 0xBA /* ':' -> */, -/* pos 0232: 269 */ 0x00, 0x1D /* - terminal marker 29 - */, -/* pos 0234: 270 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x023B state 271) */, - 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x0241 state 276) */, +/* pos 0221: 254 */ 0xEE /* 'n' -> */, +/* pos 0222: 255 */ 0xE7 /* 'g' -> */, +/* pos 0223: 256 */ 0xF4 /* 't' -> */, +/* pos 0224: 257 */ 0xE8 /* 'h' -> */, +/* pos 0225: 258 */ 0xBA /* ':' -> */, +/* pos 0226: 259 */ 0x00, 0x1B /* - terminal marker 27 - */, +/* pos 0228: 260 */ 0xF9 /* 'y' -> */, +/* pos 0229: 261 */ 0xF0 /* 'p' -> */, +/* pos 022a: 262 */ 0xE5 /* 'e' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 023b: 271 */ 0xEE /* 'n' -> */, -/* pos 023c: 272 */ 0xE7 /* 'g' -> */, -/* pos 023d: 273 */ 0xE5 /* 'e' -> */, -/* pos 023e: 274 */ 0xBA /* ':' -> */, -/* pos 023f: 275 */ 0x00, 0x1E /* - terminal marker 30 - */, -/* pos 0241: 276 */ 0x66 /* 'f' */, 0x07, 0x00 /* (to 0x0248 state 277) */, - 0x74 /* 't' */, 0x5F, 0x01 /* (to 0x03A3 state 534) */, +/* pos 0235: 266 */ 0xF4 /* 't' -> */, +/* pos 0236: 267 */ 0xE5 /* 'e' -> */, +/* pos 0237: 268 */ 0xBA /* ':' -> */, +/* pos 0238: 269 */ 0x00, 0x1D /* - terminal marker 29 - */, +/* pos 023a: 270 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0241 state 271) */, + 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x0247 state 276) */, 0x08, /* fail */ -/* pos 0248: 277 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x024F state 278) */, - 0x72 /* 'r' */, 0x52, 0x01 /* (to 0x039D state 529) */, +/* pos 0241: 271 */ 0xEE /* 'n' -> */, +/* pos 0242: 272 */ 0xE7 /* 'g' -> */, +/* pos 0243: 273 */ 0xE5 /* 'e' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 024f: 278 */ 0xF2 /* 'r' -> */, -/* pos 0250: 279 */ 0xE5 /* 'e' -> */, -/* pos 0251: 280 */ 0xF2 /* 'r' -> */, -/* pos 0252: 281 */ 0xBA /* ':' -> */, -/* pos 0253: 282 */ 0x00, 0x1F /* - terminal marker 31 - */, -/* pos 0255: 283 */ 0x00, 0x20 /* - terminal marker 32 - */, -/* pos 0257: 284 */ 0xE5 /* 'e' -> */, -/* pos 0258: 285 */ 0xF2 /* 'r' -> */, -/* pos 0259: 286 */ 0xF3 /* 's' -> */, -/* pos 025a: 287 */ 0xE9 /* 'i' -> */, -/* pos 025b: 288 */ 0xEF /* 'o' -> */, -/* pos 025c: 289 */ 0xEE /* 'n' -> */, -/* pos 025d: 290 */ 0xBA /* ':' -> */, -/* pos 025e: 291 */ 0x00, 0x21 /* - terminal marker 33 - */, -/* pos 0260: 292 */ 0xF2 /* 'r' -> */, -/* pos 0261: 293 */ 0xE9 /* 'i' -> */, -/* pos 0262: 294 */ 0xE7 /* 'g' -> */, -/* pos 0263: 295 */ 0xE9 /* 'i' -> */, -/* pos 0264: 296 */ 0xEE /* 'n' -> */, -/* pos 0265: 297 */ 0xBA /* ':' -> */, -/* pos 0266: 298 */ 0x00, 0x22 /* - terminal marker 34 - */, -/* pos 0268: 299 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x0275 state 300) */, - 0x6D /* 'm' */, 0x15, 0x00 /* (to 0x0280 state 310) */, - 0x70 /* 'p' */, 0x1A, 0x00 /* (to 0x0288 state 317) */, - 0x73 /* 's' */, 0x1D, 0x00 /* (to 0x028E state 322) */, +/* pos 024e: 277 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0255 state 278) */, + 0x72 /* 'r' */, 0x52, 0x01 /* (to 0x03A3 state 529) */, 0x08, /* fail */ -/* pos 0275: 300 */ 0xF5 /* 'u' -> */, -/* pos 0276: 301 */ 0xF4 /* 't' -> */, -/* pos 0277: 302 */ 0xE8 /* 'h' -> */, -/* pos 0278: 303 */ 0xEF /* 'o' -> */, -/* pos 0279: 304 */ 0xF2 /* 'r' -> */, -/* pos 027a: 305 */ 0xE9 /* 'i' -> */, -/* pos 027b: 306 */ 0xF4 /* 't' -> */, -/* pos 027c: 307 */ 0xF9 /* 'y' -> */, -/* pos 027d: 308 */ 0xBA /* ':' -> */, -/* pos 027e: 309 */ 0x00, 0x23 /* - terminal marker 35 - */, -/* pos 0280: 310 */ 0xE5 /* 'e' -> */, -/* pos 0281: 311 */ 0xF4 /* 't' -> */, -/* pos 0282: 312 */ 0xE8 /* 'h' -> */, -/* pos 0283: 313 */ 0xEF /* 'o' -> */, -/* pos 0284: 314 */ 0xE4 /* 'd' -> */, -/* pos 0285: 315 */ 0xBA /* ':' -> */, -/* pos 0286: 316 */ 0x00, 0x24 /* - terminal marker 36 - */, -/* pos 0288: 317 */ 0xE1 /* 'a' -> */, -/* pos 0289: 318 */ 0xF4 /* 't' -> */, -/* pos 028a: 319 */ 0xE8 /* 'h' -> */, -/* pos 028b: 320 */ 0xBA /* ':' -> */, -/* pos 028c: 321 */ 0x00, 0x25 /* - terminal marker 37 - */, -/* pos 028e: 322 */ 0x63 /* 'c' */, 0x07, 0x00 /* (to 0x0295 state 323) */, - 0x74 /* 't' */, 0x0B, 0x00 /* (to 0x029C state 329) */, +/* pos 0255: 278 */ 0xF2 /* 'r' -> */, +/* pos 0256: 279 */ 0xE5 /* 'e' -> */, +/* pos 0257: 280 */ 0xF2 /* 'r' -> */, +/* pos 0258: 281 */ 0xBA /* ':' -> */, +/* pos 0259: 282 */ 0x00, 0x1F /* - terminal marker 31 - */, +/* pos 025b: 283 */ 0x00, 0x20 /* - terminal marker 32 - */, +/* pos 025d: 284 */ 0xE5 /* 'e' -> */, +/* pos 025e: 285 */ 0xF2 /* 'r' -> */, +/* pos 025f: 286 */ 0xF3 /* 's' -> */, +/* pos 0260: 287 */ 0xE9 /* 'i' -> */, +/* pos 0261: 288 */ 0xEF /* 'o' -> */, +/* pos 0262: 289 */ 0xEE /* 'n' -> */, +/* pos 0263: 290 */ 0xBA /* ':' -> */, +/* pos 0264: 291 */ 0x00, 0x21 /* - terminal marker 33 - */, +/* pos 0266: 292 */ 0xF2 /* 'r' -> */, +/* pos 0267: 293 */ 0xE9 /* 'i' -> */, +/* pos 0268: 294 */ 0xE7 /* 'g' -> */, +/* pos 0269: 295 */ 0xE9 /* 'i' -> */, +/* pos 026a: 296 */ 0xEE /* 'n' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 0295: 323 */ 0xE8 /* 'h' -> */, -/* pos 0296: 324 */ 0xE5 /* 'e' -> */, -/* pos 0297: 325 */ 0xED /* 'm' -> */, -/* pos 0298: 326 */ 0xE5 /* 'e' -> */, -/* pos 0299: 327 */ 0xBA /* ':' -> */, -/* pos 029a: 328 */ 0x00, 0x26 /* - terminal marker 38 - */, -/* pos 029c: 329 */ 0xE1 /* 'a' -> */, -/* pos 029d: 330 */ 0xF4 /* 't' -> */, -/* pos 029e: 331 */ 0xF5 /* 'u' -> */, -/* pos 029f: 332 */ 0xF3 /* 's' -> */, -/* pos 02a0: 333 */ 0xBA /* ':' -> */, -/* pos 02a1: 334 */ 0x00, 0x27 /* - terminal marker 39 - */, -/* pos 02a3: 335 */ 0xE8 /* 'h' -> */, -/* pos 02a4: 336 */ 0xE1 /* 'a' -> */, -/* pos 02a5: 337 */ 0xF2 /* 'r' -> */, -/* pos 02a6: 338 */ 0xF3 /* 's' -> */, -/* pos 02a7: 339 */ 0xE5 /* 'e' -> */, -/* pos 02a8: 340 */ 0xF4 /* 't' -> */, -/* pos 02a9: 341 */ 0xBA /* ':' -> */, -/* pos 02aa: 342 */ 0x00, 0x28 /* - terminal marker 40 - */, -/* pos 02ac: 343 */ 0xE1 /* 'a' -> */, -/* pos 02ad: 344 */ 0xEE /* 'n' -> */, -/* pos 02ae: 345 */ 0xE7 /* 'g' -> */, -/* pos 02af: 346 */ 0xE5 /* 'e' -> */, -/* pos 02b0: 347 */ 0xF3 /* 's' -> */, -/* pos 02b1: 348 */ 0xBA /* ':' -> */, -/* pos 02b2: 349 */ 0x00, 0x29 /* - terminal marker 41 - */, -/* pos 02b4: 350 */ 0xEC /* 'l' -> */, -/* pos 02b5: 351 */ 0xEC /* 'l' -> */, -/* pos 02b6: 352 */ 0xEF /* 'o' -> */, -/* pos 02b7: 353 */ 0xF7 /* 'w' -> */, -/* pos 02b8: 354 */ 0xAD /* '-' -> */, -/* pos 02b9: 355 */ 0xEF /* 'o' -> */, -/* pos 02ba: 356 */ 0xF2 /* 'r' -> */, -/* pos 02bb: 357 */ 0xE9 /* 'i' -> */, -/* pos 02bc: 358 */ 0xE7 /* 'g' -> */, -/* pos 02bd: 359 */ 0xE9 /* 'i' -> */, -/* pos 02be: 360 */ 0xEE /* 'n' -> */, -/* pos 02bf: 361 */ 0xBA /* ':' -> */, -/* pos 02c0: 362 */ 0x00, 0x2A /* - terminal marker 42 - */, -/* pos 02c2: 363 */ 0xE5 /* 'e' -> */, -/* pos 02c3: 364 */ 0xBA /* ':' -> */, -/* pos 02c4: 365 */ 0x00, 0x2B /* - terminal marker 43 - */, -/* pos 02c6: 366 */ 0xEC /* 'l' -> */, -/* pos 02c7: 367 */ 0xEF /* 'o' -> */, -/* pos 02c8: 368 */ 0xF7 /* 'w' -> */, -/* pos 02c9: 369 */ 0xBA /* ':' -> */, -/* pos 02ca: 370 */ 0x00, 0x2C /* - terminal marker 44 - */, -/* pos 02cc: 371 */ 0xE9 /* 'i' -> */, -/* pos 02cd: 372 */ 0xF3 /* 's' -> */, -/* pos 02ce: 373 */ 0xF0 /* 'p' -> */, -/* pos 02cf: 374 */ 0xEF /* 'o' -> */, -/* pos 02d0: 375 */ 0xF3 /* 's' -> */, -/* pos 02d1: 376 */ 0xE9 /* 'i' -> */, -/* pos 02d2: 377 */ 0xF4 /* 't' -> */, -/* pos 02d3: 378 */ 0xE9 /* 'i' -> */, -/* pos 02d4: 379 */ 0xEF /* 'o' -> */, -/* pos 02d5: 380 */ 0xEE /* 'n' -> */, -/* pos 02d6: 381 */ 0xBA /* ':' -> */, -/* pos 02d7: 382 */ 0x00, 0x2D /* - terminal marker 45 - */, -/* pos 02d9: 383 */ 0xEE /* 'n' -> */, -/* pos 02da: 384 */ 0xE3 /* 'c' -> */, -/* pos 02db: 385 */ 0xEF /* 'o' -> */, -/* pos 02dc: 386 */ 0xE4 /* 'd' -> */, -/* pos 02dd: 387 */ 0xE9 /* 'i' -> */, -/* pos 02de: 388 */ 0xEE /* 'n' -> */, -/* pos 02df: 389 */ 0xE7 /* 'g' -> */, -/* pos 02e0: 390 */ 0xBA /* ':' -> */, -/* pos 02e1: 391 */ 0x00, 0x2E /* - terminal marker 46 - */, -/* pos 02e3: 392 */ 0xEE /* 'n' -> */, -/* pos 02e4: 393 */ 0xE7 /* 'g' -> */, -/* pos 02e5: 394 */ 0xF5 /* 'u' -> */, -/* pos 02e6: 395 */ 0xE1 /* 'a' -> */, -/* pos 02e7: 396 */ 0xE7 /* 'g' -> */, -/* pos 02e8: 397 */ 0xE5 /* 'e' -> */, -/* pos 02e9: 398 */ 0xBA /* ':' -> */, -/* pos 02ea: 399 */ 0x00, 0x2F /* - terminal marker 47 - */, -/* pos 02ec: 400 */ 0xE3 /* 'c' -> */, -/* pos 02ed: 401 */ 0xE1 /* 'a' -> */, -/* pos 02ee: 402 */ 0xF4 /* 't' -> */, -/* pos 02ef: 403 */ 0xE9 /* 'i' -> */, -/* pos 02f0: 404 */ 0xEF /* 'o' -> */, -/* pos 02f1: 405 */ 0xEE /* 'n' -> */, -/* pos 02f2: 406 */ 0xBA /* ':' -> */, -/* pos 02f3: 407 */ 0x00, 0x30 /* - terminal marker 48 - */, -/* pos 02f5: 408 */ 0xE1 /* 'a' -> */, -/* pos 02f6: 409 */ 0xEE /* 'n' -> */, -/* pos 02f7: 410 */ 0xE7 /* 'g' -> */, -/* pos 02f8: 411 */ 0xE5 /* 'e' -> */, -/* pos 02f9: 412 */ 0xBA /* ':' -> */, -/* pos 02fa: 413 */ 0x00, 0x31 /* - terminal marker 49 - */, -/* pos 02fc: 414 */ 0x74 /* 't' */, 0x07, 0x00 /* (to 0x0303 state 415) */, - 0x78 /* 'x' */, 0x09, 0x00 /* (to 0x0308 state 419) */, +/* pos 027b: 300 */ 0xF5 /* 'u' -> */, +/* pos 027c: 301 */ 0xF4 /* 't' -> */, +/* pos 027d: 302 */ 0xE8 /* 'h' -> */, +/* pos 027e: 303 */ 0xEF /* 'o' -> */, +/* pos 027f: 304 */ 0xF2 /* 'r' -> */, +/* 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 0303: 415 */ 0xE1 /* 'a' -> */, -/* pos 0304: 416 */ 0xE7 /* 'g' -> */, -/* pos 0305: 417 */ 0xBA /* ':' -> */, -/* pos 0306: 418 */ 0x00, 0x32 /* - terminal marker 50 - */, -/* pos 0308: 419 */ 0xF0 /* 'p' -> */, -/* pos 0309: 420 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0310 state 421) */, - 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0315 state 425) */, +/* 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 02d2: 371 */ 0xE9 /* 'i' -> */, +/* pos 02d3: 372 */ 0xF3 /* 's' -> */, +/* pos 02d4: 373 */ 0xF0 /* 'p' -> */, +/* 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 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 0310: 421 */ 0xE3 /* 'c' -> */, -/* pos 0311: 422 */ 0xF4 /* 't' -> */, -/* pos 0312: 423 */ 0xBA /* ':' -> */, -/* pos 0313: 424 */ 0x00, 0x33 /* - terminal marker 51 - */, -/* pos 0315: 425 */ 0xF2 /* 'r' -> */, -/* pos 0316: 426 */ 0xE5 /* 'e' -> */, -/* pos 0317: 427 */ 0xF3 /* 's' -> */, -/* pos 0318: 428 */ 0xBA /* ':' -> */, -/* pos 0319: 429 */ 0x00, 0x34 /* - terminal marker 52 - */, -/* pos 031b: 430 */ 0xF2 /* 'r' -> */, -/* pos 031c: 431 */ 0xEF /* 'o' -> */, -/* pos 031d: 432 */ 0xED /* 'm' -> */, -/* pos 031e: 433 */ 0xBA /* ':' -> */, -/* pos 031f: 434 */ 0x00, 0x35 /* - terminal marker 53 - */, -/* pos 0321: 435 */ 0xF4 /* 't' -> */, -/* pos 0322: 436 */ 0xE3 /* 'c' -> */, -/* pos 0323: 437 */ 0xE8 /* 'h' -> */, -/* pos 0324: 438 */ 0xBA /* ':' -> */, -/* pos 0325: 439 */ 0x00, 0x36 /* - terminal marker 54 - */, -/* pos 0327: 440 */ 0xE1 /* 'a' -> */, -/* pos 0328: 441 */ 0xEE /* 'n' -> */, -/* pos 0329: 442 */ 0xE7 /* 'g' -> */, -/* pos 032a: 443 */ 0xE5 /* 'e' -> */, -/* pos 032b: 444 */ 0xBA /* ':' -> */, -/* pos 032c: 445 */ 0x00, 0x37 /* - terminal marker 55 - */, -/* pos 032e: 446 */ 0xEE /* 'n' -> */, -/* pos 032f: 447 */ 0xED /* 'm' -> */, -/* pos 0330: 448 */ 0xEF /* 'o' -> */, -/* pos 0331: 449 */ 0xE4 /* 'd' -> */, -/* pos 0332: 450 */ 0xE9 /* 'i' -> */, -/* pos 0333: 451 */ 0xE6 /* 'f' -> */, -/* pos 0334: 452 */ 0xE9 /* 'i' -> */, -/* pos 0335: 453 */ 0xE5 /* 'e' -> */, -/* pos 0336: 454 */ 0xE4 /* 'd' -> */, -/* pos 0337: 455 */ 0xAD /* '-' -> */, -/* pos 0338: 456 */ 0xF3 /* 's' -> */, -/* pos 0339: 457 */ 0xE9 /* 'i' -> */, -/* pos 033a: 458 */ 0xEE /* 'n' -> */, -/* pos 033b: 459 */ 0xE3 /* 'c' -> */, -/* pos 033c: 460 */ 0xE5 /* 'e' -> */, -/* pos 033d: 461 */ 0xBA /* ':' -> */, -/* pos 033e: 462 */ 0x00, 0x38 /* - terminal marker 56 - */, -/* pos 0340: 463 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x034A state 464) */, - 0x69 /* 'i' */, 0x15, 0x00 /* (to 0x0358 state 477) */, - 0x6F /* 'o' */, 0x17, 0x00 /* (to 0x035D state 481) */, +/* 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 034a: 464 */ 0xF3 /* 's' -> */, -/* pos 034b: 465 */ 0xF4 /* 't' -> */, -/* pos 034c: 466 */ 0xAD /* '-' -> */, -/* pos 034d: 467 */ 0xED /* 'm' -> */, -/* pos 034e: 468 */ 0xEF /* 'o' -> */, -/* pos 034f: 469 */ 0xE4 /* 'd' -> */, -/* pos 0350: 470 */ 0xE9 /* 'i' -> */, -/* pos 0351: 471 */ 0xE6 /* 'f' -> */, -/* pos 0352: 472 */ 0xE9 /* 'i' -> */, -/* pos 0353: 473 */ 0xE5 /* 'e' -> */, -/* pos 0354: 474 */ 0xE4 /* 'd' -> */, -/* pos 0355: 475 */ 0xBA /* ':' -> */, -/* pos 0356: 476 */ 0x00, 0x39 /* - terminal marker 57 - */, -/* pos 0358: 477 */ 0xEE /* 'n' -> */, -/* pos 0359: 478 */ 0xEB /* 'k' -> */, -/* pos 035a: 479 */ 0xBA /* ':' -> */, -/* pos 035b: 480 */ 0x00, 0x3A /* - terminal marker 58 - */, -/* pos 035d: 481 */ 0xE3 /* 'c' -> */, -/* pos 035e: 482 */ 0xE1 /* 'a' -> */, -/* pos 035f: 483 */ 0xF4 /* 't' -> */, -/* pos 0360: 484 */ 0xE9 /* 'i' -> */, -/* pos 0361: 485 */ 0xEF /* 'o' -> */, -/* pos 0362: 486 */ 0xEE /* 'n' -> */, -/* pos 0363: 487 */ 0xBA /* ':' -> */, -/* pos 0364: 488 */ 0x00, 0x3B /* - terminal marker 59 - */, -/* pos 0366: 489 */ 0xE1 /* 'a' -> */, -/* pos 0367: 490 */ 0xF8 /* 'x' -> */, -/* pos 0368: 491 */ 0xAD /* '-' -> */, -/* pos 0369: 492 */ 0xE6 /* 'f' -> */, -/* pos 036a: 493 */ 0xEF /* 'o' -> */, -/* pos 036b: 494 */ 0xF2 /* 'r' -> */, -/* pos 036c: 495 */ 0xF7 /* 'w' -> */, -/* pos 036d: 496 */ 0xE1 /* 'a' -> */, -/* pos 036e: 497 */ 0xF2 /* 'r' -> */, -/* pos 036f: 498 */ 0xE4 /* 'd' -> */, -/* pos 0370: 499 */ 0xF3 /* 's' -> */, -/* pos 0371: 500 */ 0xBA /* ':' -> */, -/* pos 0372: 501 */ 0x00, 0x3C /* - terminal marker 60 - */, -/* pos 0374: 502 */ 0xF8 /* 'x' -> */, -/* pos 0375: 503 */ 0xF9 /* 'y' -> */, -/* pos 0376: 504 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x037D state 505) */, - 0x20 /* ' ' */, 0xB5, 0x00 /* (to 0x042E state 654) */, +/* 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 0337: 449 */ 0xE4 /* 'd' -> */, +/* pos 0338: 450 */ 0xE9 /* 'i' -> */, +/* pos 0339: 451 */ 0xE6 /* 'f' -> */, +/* 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 037d: 505 */ 0xE1 /* 'a' -> */, -/* pos 037e: 506 */ 0xF5 /* 'u' -> */, -/* pos 037f: 507 */ 0xF4 /* 't' -> */, -/* pos 0380: 508 */ 0xE8 /* 'h' -> */, -/* pos 0381: 509 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0388 state 510) */, - 0x6F /* 'o' */, 0x0E, 0x00 /* (to 0x0392 state 519) */, +/* 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 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 0388: 510 */ 0xEE /* 'n' -> */, -/* pos 0389: 511 */ 0xF4 /* 't' -> */, -/* pos 038a: 512 */ 0xE9 /* 'i' -> */, -/* pos 038b: 513 */ 0xE3 /* 'c' -> */, -/* pos 038c: 514 */ 0xE1 /* 'a' -> */, -/* pos 038d: 515 */ 0xF4 /* 't' -> */, -/* pos 038e: 516 */ 0xE5 /* 'e' -> */, -/* pos 038f: 517 */ 0xBA /* ':' -> */, -/* pos 0390: 518 */ 0x00, 0x3D /* - terminal marker 61 - */, -/* pos 0392: 519 */ 0xF2 /* 'r' -> */, -/* pos 0393: 520 */ 0xE9 /* 'i' -> */, -/* pos 0394: 521 */ 0xFA /* 'z' -> */, -/* pos 0395: 522 */ 0xE1 /* 'a' -> */, -/* pos 0396: 523 */ 0xF4 /* 't' -> */, -/* pos 0397: 524 */ 0xE9 /* 'i' -> */, -/* pos 0398: 525 */ 0xEF /* 'o' -> */, -/* pos 0399: 526 */ 0xEE /* 'n' -> */, -/* pos 039a: 527 */ 0xBA /* ':' -> */, -/* pos 039b: 528 */ 0x00, 0x3E /* - terminal marker 62 - */, -/* pos 039d: 529 */ 0xE5 /* 'e' -> */, -/* pos 039e: 530 */ 0xF3 /* 's' -> */, -/* pos 039f: 531 */ 0xE8 /* 'h' -> */, -/* pos 03a0: 532 */ 0xBA /* ':' -> */, -/* pos 03a1: 533 */ 0x00, 0x3F /* - terminal marker 63 - */, -/* pos 03a3: 534 */ 0xF2 /* 'r' -> */, -/* pos 03a4: 535 */ 0xF9 /* 'y' -> */, -/* pos 03a5: 536 */ 0xAD /* '-' -> */, -/* pos 03a6: 537 */ 0xE1 /* 'a' -> */, -/* pos 03a7: 538 */ 0xE6 /* 'f' -> */, -/* pos 03a8: 539 */ 0xF4 /* 't' -> */, -/* pos 03a9: 540 */ 0xE5 /* 'e' -> */, -/* pos 03aa: 541 */ 0xF2 /* 'r' -> */, -/* pos 03ab: 542 */ 0xBA /* ':' -> */, -/* pos 03ac: 543 */ 0x00, 0x40 /* - terminal marker 64 - */, -/* pos 03ae: 544 */ 0xF6 /* 'v' -> */, -/* pos 03af: 545 */ 0xE5 /* 'e' -> */, -/* pos 03b0: 546 */ 0xF2 /* 'r' -> */, -/* pos 03b1: 547 */ 0xBA /* ':' -> */, -/* pos 03b2: 548 */ 0x00, 0x41 /* - terminal marker 65 - */, -/* pos 03b4: 549 */ 0xAD /* '-' -> */, -/* pos 03b5: 550 */ 0xE3 /* 'c' -> */, -/* pos 03b6: 551 */ 0xEF /* 'o' -> */, -/* pos 03b7: 552 */ 0xEF /* 'o' -> */, -/* pos 03b8: 553 */ 0xEB /* 'k' -> */, -/* pos 03b9: 554 */ 0xE9 /* 'i' -> */, -/* pos 03ba: 555 */ 0xE5 /* 'e' -> */, -/* pos 03bb: 556 */ 0xBA /* ':' -> */, -/* pos 03bc: 557 */ 0x00, 0x42 /* - terminal marker 66 - */, -/* pos 03be: 558 */ 0xF2 /* 'r' -> */, -/* pos 03bf: 559 */ 0xE9 /* 'i' -> */, -/* pos 03c0: 560 */ 0xE3 /* 'c' -> */, -/* pos 03c1: 561 */ 0xF4 /* 't' -> */, -/* pos 03c2: 562 */ 0xAD /* '-' -> */, -/* pos 03c3: 563 */ 0xF4 /* 't' -> */, -/* pos 03c4: 564 */ 0xF2 /* 'r' -> */, -/* pos 03c5: 565 */ 0xE1 /* 'a' -> */, -/* pos 03c6: 566 */ 0xEE /* 'n' -> */, -/* pos 03c7: 567 */ 0xF3 /* 's' -> */, -/* pos 03c8: 568 */ 0xF0 /* 'p' -> */, -/* pos 03c9: 569 */ 0xEF /* 'o' -> */, -/* pos 03ca: 570 */ 0xF2 /* 'r' -> */, -/* pos 03cb: 571 */ 0xF4 /* 't' -> */, -/* pos 03cc: 572 */ 0xAD /* '-' -> */, -/* pos 03cd: 573 */ 0xF3 /* 's' -> */, -/* pos 03ce: 574 */ 0xE5 /* 'e' -> */, -/* pos 03cf: 575 */ 0xE3 /* 'c' -> */, -/* pos 03d0: 576 */ 0xF5 /* 'u' -> */, -/* pos 03d1: 577 */ 0xF2 /* 'r' -> */, -/* pos 03d2: 578 */ 0xE9 /* 'i' -> */, -/* pos 03d3: 579 */ 0xF4 /* 't' -> */, -/* pos 03d4: 580 */ 0xF9 /* 'y' -> */, -/* pos 03d5: 581 */ 0xBA /* ':' -> */, -/* pos 03d6: 582 */ 0x00, 0x43 /* - terminal marker 67 - */, -/* pos 03d8: 583 */ 0xF2 /* 'r' -> */, -/* pos 03d9: 584 */ 0xE1 /* 'a' -> */, -/* pos 03da: 585 */ 0xEE /* 'n' -> */, -/* pos 03db: 586 */ 0xF3 /* 's' -> */, -/* pos 03dc: 587 */ 0xE6 /* 'f' -> */, -/* pos 03dd: 588 */ 0xE5 /* 'e' -> */, -/* pos 03de: 589 */ 0xF2 /* 'r' -> */, -/* pos 03df: 590 */ 0xAD /* '-' -> */, -/* pos 03e0: 591 */ 0xE5 /* 'e' -> */, -/* pos 03e1: 592 */ 0xEE /* 'n' -> */, -/* pos 03e2: 593 */ 0xE3 /* 'c' -> */, -/* pos 03e3: 594 */ 0xEF /* 'o' -> */, -/* pos 03e4: 595 */ 0xE4 /* 'd' -> */, -/* pos 03e5: 596 */ 0xE9 /* 'i' -> */, -/* pos 03e6: 597 */ 0xEE /* 'n' -> */, -/* pos 03e7: 598 */ 0xE7 /* 'g' -> */, -/* pos 03e8: 599 */ 0xBA /* ':' -> */, -/* pos 03e9: 600 */ 0x00, 0x44 /* - terminal marker 68 - */, -/* pos 03eb: 601 */ 0xE5 /* 'e' -> */, -/* pos 03ec: 602 */ 0xF2 /* 'r' -> */, -/* pos 03ed: 603 */ 0xAD /* '-' -> */, -/* pos 03ee: 604 */ 0xE1 /* 'a' -> */, -/* pos 03ef: 605 */ 0xE7 /* 'g' -> */, -/* pos 03f0: 606 */ 0xE5 /* 'e' -> */, -/* pos 03f1: 607 */ 0xEE /* 'n' -> */, -/* pos 03f2: 608 */ 0xF4 /* 't' -> */, -/* pos 03f3: 609 */ 0xBA /* ':' -> */, -/* pos 03f4: 610 */ 0x00, 0x45 /* - terminal marker 69 - */, -/* pos 03f6: 611 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x03FD state 612) */, - 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0402 state 616) */, +/* 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 03fd: 612 */ 0xF2 /* 'r' -> */, -/* pos 03fe: 613 */ 0xF9 /* 'y' -> */, -/* pos 03ff: 614 */ 0xBA /* ':' -> */, -/* pos 0400: 615 */ 0x00, 0x46 /* - terminal marker 70 - */, -/* pos 0402: 616 */ 0xE1 /* 'a' -> */, -/* pos 0403: 617 */ 0xBA /* ':' -> */, -/* pos 0404: 618 */ 0x00, 0x47 /* - terminal marker 71 - */, -/* pos 0406: 619 */ 0xF7 /* 'w' -> */, -/* pos 0407: 620 */ 0xF7 /* 'w' -> */, -/* pos 0408: 621 */ 0xAD /* '-' -> */, -/* pos 0409: 622 */ 0xE1 /* 'a' -> */, -/* pos 040a: 623 */ 0xF5 /* 'u' -> */, -/* pos 040b: 624 */ 0xF4 /* 't' -> */, -/* pos 040c: 625 */ 0xE8 /* 'h' -> */, -/* pos 040d: 626 */ 0xE5 /* 'e' -> */, -/* pos 040e: 627 */ 0xEE /* 'n' -> */, -/* pos 040f: 628 */ 0xF4 /* 't' -> */, -/* pos 0410: 629 */ 0xE9 /* 'i' -> */, -/* pos 0411: 630 */ 0xE3 /* 'c' -> */, -/* pos 0412: 631 */ 0xE1 /* 'a' -> */, -/* pos 0413: 632 */ 0xF4 /* 't' -> */, -/* pos 0414: 633 */ 0xE5 /* 'e' -> */, -/* pos 0415: 634 */ 0xBA /* ':' -> */, -/* pos 0416: 635 */ 0x00, 0x48 /* - terminal marker 72 - */, -/* pos 0418: 636 */ 0xF4 /* 't' -> */, -/* pos 0419: 637 */ 0xE3 /* 'c' -> */, -/* pos 041a: 638 */ 0xE8 /* 'h' -> */, -/* pos 041b: 639 */ 0x00, 0x49 /* - terminal marker 73 - */, -/* pos 041d: 640 */ 0xF4 /* 't' -> */, -/* pos 041e: 641 */ 0x00, 0x4A /* - terminal marker 74 - */, -/* pos 0420: 642 */ 0xEC /* 'l' -> */, -/* pos 0421: 643 */ 0xE5 /* 'e' -> */, -/* pos 0422: 644 */ 0xF4 /* 't' -> */, -/* pos 0423: 645 */ 0xE5 /* 'e' -> */, -/* pos 0424: 646 */ 0x00, 0x4B /* - terminal marker 75 - */, -/* pos 0426: 647 */ 0xE9 /* 'i' -> */, -/* pos 0427: 648 */ 0xAD /* '-' -> */, -/* pos 0428: 649 */ 0xE1 /* 'a' -> */, -/* pos 0429: 650 */ 0xF2 /* 'r' -> */, -/* pos 042a: 651 */ 0xE7 /* 'g' -> */, -/* pos 042b: 652 */ 0xF3 /* 's' -> */, -/* pos 042c: 653 */ 0x00, 0x4C /* - terminal marker 76 - */, -/* pos 042e: 654 */ 0x00, 0x4D /* - terminal marker 77 - */, -/* pos 0430: 655 */ 0xAD /* '-' -> */, -/* pos 0431: 656 */ 0xF2 /* 'r' -> */, -/* pos 0432: 657 */ 0xE5 /* 'e' -> */, -/* pos 0433: 658 */ 0xE1 /* 'a' -> */, -/* pos 0434: 659 */ 0xEC /* 'l' -> */, -/* pos 0435: 660 */ 0xAD /* '-' -> */, -/* pos 0436: 661 */ 0xE9 /* 'i' -> */, -/* pos 0437: 662 */ 0xF0 /* 'p' -> */, -/* pos 0438: 663 */ 0xBA /* ':' -> */, -/* pos 0439: 664 */ 0x00, 0x4E /* - terminal marker 78 - */, -/* total size 1083 bytes */ +/* 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 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 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 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 */ diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index 257d6b41..cb2b09ba 100644 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -219,6 +219,9 @@ lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason) if (wsi->mode == LWSCM_HTTP_SERVING) context->protocols[0].callback(wsi, LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0); + if (wsi->mode == LWSCM_HTTP_CLIENT) + context->protocols[0].callback(wsi, LWS_CALLBACK_CLOSED_CLIENT_HTTP, + wsi->user_space, NULL, 0); /* * are his extensions okay with him closing? Eg he might be a mux diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index 5755b872..6bb4a80a 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -349,6 +349,10 @@ enum lws_callback_reasons { LWS_CALLBACK_CGI_TERMINATED = 41, LWS_CALLBACK_CGI_STDIN_DATA = 42, LWS_CALLBACK_CGI_STDIN_COMPLETED = 43, + LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44, + LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45, + LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46, + LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47, /****** add new things just above ---^ ******/ @@ -610,6 +614,7 @@ enum lws_token_indexes { WSI_TOKEN_HTTP_URI_ARGS = 76, WSI_TOKEN_PROXY = 77, WSI_TOKEN_HTTP_X_REAL_IP = 78, + WSI_TOKEN_HTTP1_0 = 79, /****** add new things just above ---^ ******/ @@ -621,6 +626,7 @@ enum lws_token_indexes { _WSI_TOKEN_CLIENT_URI, _WSI_TOKEN_CLIENT_HOST, _WSI_TOKEN_CLIENT_ORIGIN, + _WSI_TOKEN_CLIENT_METHOD, /* always last real token index*/ WSI_TOKEN_COUNT, @@ -1393,6 +1399,8 @@ struct lws_context_creation_info { * @ietf_version_or_minus_one: currently leave at 0 or -1 * @userdata: if non-NULL, use this as wsi user_data instead of malloc it * @client_exts: array of extensions that may be used on connection + * @method: if non-NULL, do this http method instead of ws[s] upgrade. + * use "GET" to be a simple http client connection */ struct lws_client_connect_info { @@ -1407,6 +1415,7 @@ struct lws_client_connect_info { int ietf_version_or_minus_one; void *userdata; const struct lws_extension *client_exts; + const char *method; /* Add new things just above here ---^ * This is part of the ABI, don't needlessly break compatibility diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index 8fe072df..4a9a92b4 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -349,6 +349,7 @@ enum lws_connection_states { LWSS_HTTP_BODY, LWSS_DEAD_SOCKET, LWSS_ESTABLISHED, + LWSS_CLIENT_HTTP_ESTABLISHED, LWSS_CLIENT_UNCONNECTED, LWSS_RETURNED_CLOSE_ALREADY, LWSS_AWAITING_CLOSE_ACK, @@ -410,7 +411,9 @@ enum lws_rx_parse_state { enum connection_mode { LWSCM_HTTP_SERVING, + LWSCM_HTTP_CLIENT, /* we are client to someone else's server */ LWSCM_HTTP_SERVING_ACCEPTED, /* actual HTTP service going on */ + LWSCM_HTTP_CLIENT_ACCEPTED, /* actual HTTP service going on */ LWSCM_PRE_WS_SERVING_ACCEPT, LWSCM_WS_SERVING, @@ -787,6 +790,18 @@ enum uri_esc_states { * used interchangeably to access the same data */ + +#ifndef LWS_NO_CLIENT +struct client_info_stash { + char address[256]; + char path[1024]; + char host[256]; + char origin[256]; + char protocol[256]; + char method[16]; +}; +#endif + struct _lws_header_related { /* MUST be first in struct */ struct allocated_headers *ah; @@ -976,17 +991,6 @@ struct _lws_http2_related { #endif -#ifndef LWS_NO_CLIENT -struct client_info_stash { - char address[256]; - char path[1024]; - char host[256]; - char origin[256]; - char protocol[256]; -}; -#endif - - struct _lws_websocket_related { /* cheapest way to deal with ah overlap with ws union transition */ struct _lws_header_related hdr; @@ -1112,6 +1116,9 @@ struct lws { unsigned int socket_is_permanently_unusable:1; unsigned int rxflow_change_to:2; unsigned int more_rx_waiting:1; /* has to live here since ah may stick to end */ +#ifndef LWS_NO_CLIENT + unsigned int do_ws:1; /* whether we are doing http or ws flow */ +#endif #ifndef LWS_NO_EXTENSIONS unsigned int extension_data_pending:1; #endif diff --git a/lib/service.c b/lib/service.c index c665f117..bbd0719d 100644 --- a/lib/service.c +++ b/lib/service.c @@ -602,9 +602,13 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int t switch (wsi->mode) { case LWSCM_HTTP_SERVING: + case LWSCM_HTTP_CLIENT: case LWSCM_HTTP_SERVING_ACCEPTED: case LWSCM_SERVER_LISTENER: case LWSCM_SSL_ACK_PENDING: + if (wsi->state == LWSS_CLIENT_HTTP_ESTABLISHED) { + goto handled; + } n = lws_server_socket_service(context, wsi, pollfd); if (n) /* closed by above */ return 1; @@ -616,6 +620,7 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int t case LWSCM_WS_SERVING: case LWSCM_WS_CLIENT: case LWSCM_HTTP2_SERVING: + case LWSCM_HTTP_CLIENT_ACCEPTED: /* 1: something requested a callback when it was OK to write */ @@ -739,6 +744,7 @@ read: eff_buf.token = (char *)pt->serv_buf; } + /* * give any active extensions a chance to munge the buffer * before parse. We pass in a pointer to an lws_tokens struct @@ -751,6 +757,34 @@ read: * used then so it is efficient. */ drain: + if (wsi->mode == LWSCM_HTTP_CLIENT_ACCEPTED) { + lwsl_notice("%s: calling LWS_CALLBACK_RECEIVE_CLIENT_HTTP, " + "rem %d len %d\n", __func__, + wsi->u.http.content_remain, eff_buf.token_len); + if (wsi->u.http.content_remain < eff_buf.token_len) + n = wsi->u.http.content_remain; + else + n = eff_buf.token_len; + if (user_callback_handle_rxflow(wsi->protocol->callback, + wsi, LWS_CALLBACK_RECEIVE_CLIENT_HTTP, + wsi->user_space, (void *)eff_buf.token, + eff_buf.token_len)) + goto close_and_handled; + wsi->u.http.content_remain -= n; + if (wsi->u.http.content_remain) + goto handled; + + lwsl_notice("%s: client http receved all content\n", + __func__); + if (user_callback_handle_rxflow(wsi->protocol->callback, + wsi, LWS_CALLBACK_COMPLETED_CLIENT_HTTP, + wsi->user_space, NULL, 0)) + goto close_and_handled; + + if (wsi->u.http.connection_type == HTTP_CONNECTION_CLOSE) + goto close_and_handled; + goto handled; + } do { more = 0; diff --git a/libwebsockets-api-doc.html b/libwebsockets-api-doc.html index e4f422ab..eae14036 100644 --- a/libwebsockets-api-doc.html +++ b/libwebsockets-api-doc.html @@ -133,6 +133,22 @@ protocol supported, or the specific protocol ordinal This function creates a connection to a remote server
+Returns 1 if the HTTP connection must close now +Returns 0 and resets connection to wait for new HTTP header / +transaction if possible ++